X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/4c77d5e0aec3c7aab32965ca4e02abb17bb6108f..2f0aeb51af00c098bdcd016d2fe34c62dd2b74f0:/src/dem.c?ds=inline diff --git a/src/dem.c b/src/dem.c index e8a7698f..c528b817 100644 --- a/src/dem.c +++ b/src/dem.c @@ -1,3 +1,28 @@ +/* + * viking -- GPS Data and Topo Analyzer, Explorer, and Manager + * + * Copyright (C) 2003-2008, Evan Battaglia + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include @@ -6,10 +31,11 @@ #include #include #include +#ifdef HAVE_UNISTD_H #include -#include - +#endif +#include #include #include "dem.h" @@ -266,7 +292,7 @@ static void *unzip_hgt_file(gchar *zip_file, gulong *unzip_size) local_file_header = (struct _lfh *) zip_file; if (local_file_header->sig != 0x04034b50) { - g_warning("%s(): wrong format\n", __PRETTY_FUNCTION__); + g_warning("%s(): wrong format", __PRETTY_FUNCTION__); g_free(unzip_data); goto end; } @@ -285,19 +311,19 @@ end: return(unzip_data); } -static VikDEM *vik_dem_read_srtm_hgt(FILE *f, const gchar *basename, gboolean zip) +static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basename, gboolean zip) { gint i, j; VikDEM *dem; - struct stat stat; off_t file_size; gint16 *dem_mem = NULL; - gint16 *dem_file = NULL; + gchar *dem_file = NULL; const gint num_rows_3sec = 1201; const gint num_rows_1sec = 3601; gint num_rows; - int fd = fileno(f); + GMappedFile *mf; gint arcsec; + GError *error = NULL; dem = g_malloc(sizeof(VikDEM)); @@ -318,19 +344,21 @@ static VikDEM *vik_dem_read_srtm_hgt(FILE *f, const gchar *basename, gboolean zi dem->columns = g_ptr_array_new(); dem->n_columns = 0; - if (fstat(fd, &stat) == -1) - g_error("%s(): fstat failed on %s\n", __PRETTY_FUNCTION__, basename); - if ((dem_file = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *) -1) - g_error("%s(): mmap failed on %s\n", __PRETTY_FUNCTION__, basename); - - file_size = stat.st_size; - dem_mem = dem_file; + if ((mf = g_mapped_file_new(file_name, FALSE, &error)) == NULL) { + g_error(_("Couldn't map file %s: %s"), file_name, error->message); + g_error_free(error); + g_free(dem); + return NULL; + } + file_size = g_mapped_file_get_length(mf); + dem_file = g_mapped_file_get_contents(mf); + if (zip) { void *unzip_mem = NULL; gulong ucsize; - if ((unzip_mem = unzip_hgt_file((gchar *)dem_file, &ucsize)) == NULL) { - munmap(dem_file, file_size); + if ((unzip_mem = unzip_hgt_file(dem_file, &ucsize)) == NULL) { + g_mapped_file_free(mf); g_ptr_array_free(dem->columns, TRUE); g_free(dem); return NULL; @@ -345,9 +373,8 @@ static VikDEM *vik_dem_read_srtm_hgt(FILE *f, const gchar *basename, gboolean zi else if (file_size == (num_rows_1sec * num_rows_1sec * sizeof(gint16))) arcsec = 1; else { - g_warning("%s(): file %s does not have right size\n", __PRETTY_FUNCTION__, basename); - munmap(dem_file, file_size); - g_ptr_array_free(dem->columns, TRUE); + g_warning("%s(): file %s does not have right size", __PRETTY_FUNCTION__, basename); + g_mapped_file_free(mf); g_free(dem); return NULL; } @@ -375,7 +402,7 @@ static VikDEM *vik_dem_read_srtm_hgt(FILE *f, const gchar *basename, gboolean zi if (zip) g_free(dem_mem); - munmap(dem_file, stat.st_size); + g_mapped_file_free(mf); return dem; } @@ -383,7 +410,7 @@ static VikDEM *vik_dem_read_srtm_hgt(FILE *f, const gchar *basename, gboolean zi VikDEM *vik_dem_new_from_file(const gchar *file) { - FILE *f; + FILE *f=NULL; VikDEM *rv; gchar buffer[DEM_BLOCK_SIZE+1]; @@ -392,17 +419,14 @@ VikDEM *vik_dem_new_from_file(const gchar *file) gint cur_row = -1; const gchar *basename = a_file_basename(file); - /* FILE IO */ - f = fopen(file, "r"); - if ( !f ) + if ( g_access ( file, R_OK ) != 0 ) return NULL; if ( (strlen(basename)==11 || ((strlen(basename) == 15) && (basename[11] == '.' && basename[12] == 'z' && basename[13] == 'i' && basename[14] == 'p'))) && basename[7]=='.' && basename[8]=='h' && basename[9]=='g' && basename[10]=='t' && (basename[0] == 'N' || basename[0] == 'S') && (basename[3] == 'E' || basename[3] =='W')) { gboolean is_zip_file = (strlen(basename) == 15); - rv = vik_dem_read_srtm_hgt(f, basename, is_zip_file); - fclose(f); + rv = vik_dem_read_srtm_hgt(file, basename, is_zip_file); return(rv); } @@ -410,6 +434,9 @@ VikDEM *vik_dem_new_from_file(const gchar *file) rv = g_malloc(sizeof(VikDEM)); /* Header */ + f = g_fopen(file, "r"); + if ( !f ) + return NULL; buffer[fread(buffer, 1, DEM_BLOCK_SIZE, f)] = '\0'; if ( ! dem_parse_header ( buffer, rv ) ) { g_free ( rv ); @@ -441,6 +468,7 @@ VikDEM *vik_dem_new_from_file(const gchar *file) /* TODO - class C records (right now says 'Invalid' and dies) */ fclose(f); + f = NULL; /* 24k scale */ if ( rv->horiz_units == VIK_DEM_HORIZ_UTM_METERS && rv->n_columns >= 2 )