/[zanavi_public1]/navit/navit/maptool/buffer.c
ZANavi

Diff of /navit/navit/maptool/buffer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 36 Revision 37
1/**
2 * ZANavi, Zoff Android Navigation system.
3 * Copyright (C) 2011-2012 Zoff <zoff@zoff.cc>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
1/** 20/**
2 * Navit, a modular navigation system. 21 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2011 Navit Team 22 * Copyright (C) 2005-2011 Navit Team
4 * 23 *
5 * This program is free software; you can redistribute it and/or 24 * This program is free software; you can redistribute it and/or
22#define _LARGEFILE64_SOURCE 41#define _LARGEFILE64_SOURCE
23#include <stdlib.h> 42#include <stdlib.h>
24#include "maptool.h" 43#include "maptool.h"
25#include "debug.h" 44#include "debug.h"
26 45
27void 46void free_buffer(char *filename, struct buffer *b)
47{
48 if (b->base)
49 {
50 if (verbose_mode) fprintf(stderr, "free_buffer:# freeing(3) buffer #\n");
51
52 if (verbose_mode) fprintf(stderr,"free_buffer:info has b->malloced=%d\n", b->malloced);
53 if (verbose_mode) fprintf(stderr,"free_buffer:info has b->size="LONGLONG_FMT"\n", (size_t)b->size);
54 if (verbose_mode) fprintf(stderr,"free_buffer:info base="LONGLONG_FMT"\n", b->base);
55
56 free(b->base);
57 b->size = 0;
58 b->malloced = 0;
59 b->base = NULL;
60 }
61}
62
28save_buffer(char *filename, struct buffer *b, long long offset) 63void save_buffer(char *filename, struct buffer *b, long long offset)
29{ 64{
30 FILE *f; 65 FILE *f;
31 f=fopen(filename,"rb+"); 66 f = fopen(filename, "rb+");
32 if (! f) 67 if (!f)
68 {
33 f=fopen(filename,"wb+"); 69 f = fopen(filename, "wb+");
70 }
34 71
35 dbg_assert(f != NULL); 72 dbg_assert(f != NULL);
36 73
37 off_t offset_64=(off_t) offset; 74 off_t offset_64 = (off_t) offset;
38 75
39 fprintf(stderr,"save_buffer:seeking bytes in %s to "LONGLONG_FMT"\n", filename, offset_64); 76 if (verbose_mode) fprintf(stderr,"save_buffer:seeking bytes in %s to "LONGLONG_FMT"\n", filename, offset_64);
77 if (verbose_mode) fprintf(stderr,"save_buffer: base "LONGLONG_FMT"\n", b->base);
40 78
41 int ret; 79 int ret;
42 // ret=fseek(f, offset, SEEK_SET); 80 // ret=fseek(f, offset, SEEK_SET);
43 ret=fseeko(f, offset_64, SEEK_SET); 81 ret = fseeko(f, offset_64, SEEK_SET);
44 //fprintf(stderr,"ret.code of seek=%d\n", ret); 82 //fprintf(stderr,"ret.code of seek=%d\n", ret);
45 size_t ret2; 83 size_t ret2;
46 ret2=fwrite(b->base, b->size, 1, f); 84 ret2 = fwrite(b->base, b->size, 1, f);
47 //fprintf(stderr,"ret.code of fwrite=%d\n", ret2); 85 //fprintf(stderr,"ret.code of fwrite=%d\n", ret2);
48 fclose(f); 86 fclose(f);
49} 87}
50 88
51void
52load_buffer(char *filename, struct buffer *b, long long offset, long long size) 89void load_buffer_fp(FILE *f, struct buffer *b, long long offset, long long size)
53{ 90{
54 FILE *f;
55 long long len; 91 long long len;
56 int ret; 92 int ret;
57 93
58 fprintf(stderr,"load_buffer:offset="LONGLONG_FMT" size="LONGLONG_FMT"\n", offset, size); 94 if (verbose_mode) fprintf(stderr,"load_buffer:offset="LONGLONG_FMT" size="LONGLONG_FMT"\n", offset, size);
59 95
60 // fprintf(stderr,"load_buffer 1 buffer ptr=%d\n", b->base); 96 // fprintf(stderr,"load_buffer 1 buffer ptr=%d\n", b->base);
61 97
62 int reuse_buffer=0; 98 int reuse_buffer = 0;
63 99
64 fprintf(stderr,"load_buffer:info has b->malloced=%d\n", b->malloced); 100 if (verbose_mode) fprintf(stderr,"load_buffer:info has b->malloced=%d\n", b->malloced);
65 fprintf(stderr,"load_buffer:info has b->size="LONGLONG_FMT"\n", (size_t)b->size); 101 if (verbose_mode) fprintf(stderr,"load_buffer:info has b->size="LONGLONG_FMT"\n", (size_t)b->size);
66 fprintf(stderr,"load_buffer:info want size="LONGLONG_FMT"\n", size); 102 if (verbose_mode) fprintf(stderr,"load_buffer:info want size="LONGLONG_FMT"\n", size);
103 if (verbose_mode) fprintf(stderr,"load_buffer:info base="LONGLONG_FMT"\n", b->base);
104
67 if (b->base) 105 if (b->base)
68 { 106 {
107#if 0
69 if (size > b->size) 108 if (size > b->size)
70 { 109 {
71 fprintf(stderr,"load_buffer:# freeing buffer #\n"); 110 if (verbose_mode) fprintf(stderr, "load_buffer:# freeing(1) buffer #\n");
72 free(b->base); 111 free(b->base);
73 //fprintf(stderr,"load_buffer 2 buffer ptr=%d\n", b->base); 112 //fprintf(stderr,"load_buffer 2 buffer ptr=%d\n", b->base);
74 b->base=NULL; 113 b->base = NULL;
75 } 114 }
76 else 115 else
77 { 116 {
78 fprintf(stderr,"load_buffer:@ re-using buffer @\n"); 117 if (verbose_mode) fprintf(stderr, "load_buffer:@ re-using buffer @\n");
79 reuse_buffer=1; 118 reuse_buffer = 1;
80 } 119 }
120#endif
121
122#if 1
123 // now always free and malloc a fresh buffer
124 if (verbose_mode) fprintf(stderr, "load_buffer:# freeing(2.a) buffer #\n");
125 free(b->base);
126 if (verbose_mode) fprintf(stderr, "load_buffer:# freeing(2.b) buffer #\n");
127 b->base = NULL;
128#endif
129
81 } 130 }
82 else 131 else
83 { 132 {
84 //fprintf(stderr,"* no buffer to free *\n"); 133 //fprintf(stderr,"* no buffer to free *\n");
85 } 134 }
86 //fprintf(stderr,"load_buffer 3 buffer ptr=%d\n", b->base); 135 //fprintf(stderr,"load_buffer 3 buffer ptr=%d\n", b->base);
87 136
88 if (! reuse_buffer) 137 if (!reuse_buffer)
89 { 138 {
90 b->malloced=0; 139 b->malloced = 0;
91 } 140 }
92 141
93 f=fopen(filename,"rb");
94 fseek(f, 0, SEEK_END); 142 fseek(f, 0, SEEK_END);
95 // len=ftell(f);
96 len=ftello(f); // 64bit 143 len = ftello(f); // 64bit
144 //fprintf(stderr,"filep=%p\n", f);
97 //fprintf(stderr,"load_buffer ftell="LONGLONG_FMT"\n", len); 145 //fprintf(stderr,"load_buffer ftell="LONGLONG_FMT"\n", len);
98 if (offset+size > len) { 146 if (offset + size > len)
147 {
99 size=len-offset; 148 size = len - offset;
100 //fprintf(stderr,"load_buffer new size="LONGLONG_FMT"\n", size); 149 if (verbose_mode) fprintf(stderr,"load_buffer new size="LONGLONG_FMT"\n", size);
101 ret=1; 150 ret = 1;
102 } 151 }
103 152
104 b->size=size; 153 b->size = size;
105 b->malloced=size; 154 b->malloced = size;
106 155
107
108 off_t offset_64=(off_t) offset; 156 off_t offset_64 = (off_t) offset;
109 fprintf(stderr,"load_buffer:reading "LONGLONG_FMT" bytes from %s at "LONGLONG_FMT"\n", b->size, filename, offset_64); 157 if (verbose_mode) fprintf(stderr,"load_buffer:reading "LONGLONG_FMT" bytes at "LONGLONG_FMT"\n", b->size, offset_64);
110 158
111 int ret3; 159 int ret3;
112 // ret3=fseek(f, offset, SEEK_SET);
113 ret3=fseeko(f, offset_64, SEEK_SET); // 64bit 160 ret3 = fseeko(f, offset_64, SEEK_SET); // 64bit
114 //fprintf(stderr,"ret.code of seek=%d\n", ret3);
115 161
116 if (! reuse_buffer) 162 if (!reuse_buffer)
117 { 163 {
118 b->base=malloc((size_t)size); 164 b->base = malloc((size_t) size);
119 fprintf(stderr,"load_buffer:ret.code of malloc=%d\n", b->base); 165 if (verbose_mode) fprintf(stderr, "load_buffer:ret.code of malloc="LONGLONG_FMT"\n", b->base);
120 } 166 }
121 167
122 dbg_assert(b->base != NULL); 168 dbg_assert(b->base != NULL);
123 fread(b->base, b->size, 1, f); 169 fread(b->base, b->size, 1, f);
170}
171
172void load_buffer(char *filename, struct buffer *b, long long offset, long long size)
173{
174 // wrapper for "filename" -> "file pointer"
175 FILE *f;
176
177 f = fopen(filename, "rb");
178 load_buffer_fp(f, b, offset, size);
124 fclose(f); 179 fclose(f);
125} 180}
181

Legend:
Removed from v.36  
changed lines
  Added in v.37

   
Visit the ZANavi Wiki