diff options
Diffstat (limited to 'navit/maptool/buffer.c')
-rw-r--r-- | navit/maptool/buffer.c | 120 |
1 files changed, 70 insertions, 50 deletions
diff --git a/navit/maptool/buffer.c b/navit/maptool/buffer.c index 2907b0670..08f65f2b6 100644 --- a/navit/maptool/buffer.c +++ b/navit/maptool/buffer.c @@ -1,6 +1,6 @@ /** * Navit, a modular navigation system. - * Copyright (C) 2005-2011 Navit Team + * Copyright (C) 2005-2018 Navit Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -21,56 +21,76 @@ #include "maptool.h" #include "debug.h" -void -save_buffer(char *filename, struct buffer *b, long long offset) -{ - FILE *f; - f=fopen(filename,"rb+"); - if (! f) - f=fopen(filename,"wb+"); - - dbg_assert(f != NULL); - dbg_assert(fseeko(f, offset, SEEK_SET)==0); - dbg_assert(fwrite(b->base, b->size, 1, f)==1); - fclose(f); -} +/** + * @brief Saves a buffer to a file + * + * This function saves a buffer to a file. + * + * @param filename The name of the while to where the buffer is saved to. + * @param b Buffer which is saved to file. + * @param offset + */ +void save_buffer(char *filename, struct buffer *b, long long offset) { + FILE *f; + f=fopen(filename,"rb+"); + if (! f) + f=fopen(filename,"wb+"); -void -load_buffer(char *filename, struct buffer *b, long long offset, long long size) -{ - FILE *f; - long long len; - dbg_assert(size>=0); - dbg_assert(offset>=0); - if (b->base) - free(b->base); - b->malloced=0; - f=fopen(filename,"rb"); - fseeko(f, 0, SEEK_END); - len=ftello(f); - dbg_assert(len>=0); - if (offset+size > len) { - size=len-offset; - } - b->size=b->malloced=size; - dbg_assert(b->size>0); -#if 0 - fprintf(stderr,"reading "LONGLONG_FMT" bytes from %s of "LONGLONG_FMT" bytes at "LONGLONG_FMT"\n", b->size, filename, len, offset); -#endif - fseeko(f, offset, SEEK_SET); - b->base=malloc(b->size); - dbg_assert(b->base != NULL); - fread(b->base, b->size, 1, f); - fclose(f); + dbg_assert(f != NULL); + dbg_assert(fseeko(f, offset, SEEK_SET)==0); + dbg_assert(fwrite(b->base, b->size, 1, f)==1); + fclose(f); } +/** + * @brief Loads a buffer from a file + * + * This function loads a buffer from a file. + * + * @param filename The name of the while to where the buffer is loaded from. + * @param b Buffer in which file is loaded. + * @param offset + * @return indicator if operation suceeded + */ +int load_buffer(char *filename, struct buffer *b, long long offset, long long size) { + FILE *f; + long long len; + dbg_assert(size>=0); + dbg_assert(offset>=0); + g_free(b->base); + b->malloced=0; + f=fopen(filename,"rb"); + fseeko(f, 0, SEEK_END); + len=ftello(f); + dbg_assert(len>=0); + if (offset+size > len) { + size=len-offset; + } + b->size=b->malloced=size; + dbg_assert(b->size>0); -long long -sizeof_buffer(char *filename) -{ - long long ret; - FILE *f=fopen(filename,"rb"); - fseeko(f, 0, SEEK_END); - ret=ftello(f); - fclose(f); - return ret; + fseeko(f, offset, SEEK_SET); + b->base=g_malloc(b->size); + if (fread(b->base, b->size, 1, f) == 0) { + dbg(lvl_warning, "fread failed"); + fclose(f); + return 0; + } + fclose(f); + return 1; +} +/** + * @brief Determines size of buffer for file + * + * This function determines the size of the buffer required to read a file. + * + * @param filename Name of file for which the required size of the buffer is determined + * @return required size of buffer + */ +long long sizeof_buffer(char *filename) { + long long ret; + FILE *f=fopen(filename,"rb"); + fseeko(f, 0, SEEK_END); + ret=ftello(f); + fclose(f); + return ret; } |