Check out the latest version of Routino: svn co http://routino.org/svn/trunk routino
Contents of /trunk/src/filedumperx.c
Parent Directory
|
Revision Log
Revision 1405 -
(show annotations)
(download)
(as text)
Thu Jun 20 18:36:47 2013 UTC (11 years, 8 months ago) by amb
File MIME type: text/x-csrc
File size: 9212 byte(s)
Thu Jun 20 18:36:47 2013 UTC (11 years, 8 months ago) by amb
File MIME type: text/x-csrc
File size: 9212 byte(s)
Use the new functions for buffering while reading when looping through files that use the FILESORT_VARINT method of storing data.
1 | /*************************************** |
2 | Memory file dumper for the intermediate files containing parsed data. |
3 | |
4 | Part of the Routino routing software. |
5 | ******************/ /****************** |
6 | This file Copyright 2008-2013 Andrew M. Bishop |
7 | |
8 | This program is free software: you can redistribute it and/or modify |
9 | it under the terms of the GNU Affero General Public License as published by |
10 | the Free Software Foundation, either version 3 of the License, or |
11 | (at your option) any later version. |
12 | |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU Affero General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU Affero General Public License |
19 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
20 | ***************************************/ |
21 | |
22 | |
23 | #include <stdio.h> |
24 | #include <stdlib.h> |
25 | #include <string.h> |
26 | #include <sys/stat.h> |
27 | |
28 | #include "typesx.h" |
29 | #include "nodesx.h" |
30 | #include "waysx.h" |
31 | #include "relationsx.h" |
32 | |
33 | #include "files.h" |
34 | #include "sorting.h" |
35 | |
36 | |
37 | /* Local functions */ |
38 | |
39 | static void print_nodes(const char *filename); |
40 | static void print_ways(const char *filename); |
41 | static void print_route_relations(const char *filename); |
42 | static void print_turn_relations(const char *filename); |
43 | |
44 | static void print_usage(int detail,const char *argerr,const char *err); |
45 | |
46 | |
47 | /*++++++++++++++++++++++++++++++++++++++ |
48 | The main program for the file dumper. |
49 | ++++++++++++++++++++++++++++++++++++++*/ |
50 | |
51 | int main(int argc,char** argv) |
52 | { |
53 | int arg; |
54 | char *dirname=NULL,*prefix=NULL; |
55 | char *nodes_filename,*ways_filename,*route_relations_filename,*turn_relations_filename; |
56 | int option_dump; |
57 | |
58 | /* Parse the command line arguments */ |
59 | |
60 | for(arg=1;arg<argc;arg++) |
61 | { |
62 | if(!strcmp(argv[arg],"--help")) |
63 | print_usage(1,NULL,NULL); |
64 | else if(!strncmp(argv[arg],"--dir=",6)) |
65 | dirname=&argv[arg][6]; |
66 | else if(!strncmp(argv[arg],"--prefix=",9)) |
67 | prefix=&argv[arg][9]; |
68 | else if(!strcmp(argv[arg],"--dump")) |
69 | option_dump=1; |
70 | else if(!strcmp(argv[arg],"--nodes")) |
71 | ; |
72 | else if(!strcmp(argv[arg],"--ways")) |
73 | ; |
74 | else if(!strcmp(argv[arg],"--route-relations")) |
75 | ; |
76 | else if(!strcmp(argv[arg],"--turn-relations")) |
77 | ; |
78 | else |
79 | print_usage(0,argv[arg],NULL); |
80 | } |
81 | |
82 | if((option_dump)!=1) |
83 | print_usage(0,NULL,"Must choose --dump."); |
84 | |
85 | /* Load in the data - Note: No error checking because Load*List() will call exit() in case of an error. */ |
86 | |
87 | nodes_filename=FileName(dirname,prefix,"nodesx.parsed.mem"); |
88 | |
89 | ways_filename=FileName(dirname,prefix,"waysx.parsed.mem"); |
90 | |
91 | route_relations_filename=FileName(dirname,prefix,"relationsx.route.parsed.mem"); |
92 | |
93 | turn_relations_filename=FileName(dirname,prefix,"relationsx.turn.parsed.mem"); |
94 | |
95 | /* Print out internal data (in plain text format) */ |
96 | |
97 | if(option_dump) |
98 | { |
99 | for(arg=1;arg<argc;arg++) |
100 | if(!strcmp(argv[arg],"--nodes")) |
101 | { |
102 | print_nodes(nodes_filename); |
103 | } |
104 | else if(!strcmp(argv[arg],"--ways")) |
105 | { |
106 | print_ways(ways_filename); |
107 | } |
108 | else if(!strcmp(argv[arg],"--route-relations")) |
109 | { |
110 | print_route_relations(route_relations_filename); |
111 | } |
112 | else if(!strcmp(argv[arg],"--turn-relations")) |
113 | { |
114 | print_turn_relations(turn_relations_filename); |
115 | } |
116 | } |
117 | |
118 | return(0); |
119 | } |
120 | |
121 | |
122 | /*++++++++++++++++++++++++++++++++++++++ |
123 | Print out all of the nodes. |
124 | |
125 | const char *filename The name of the file containing the data. |
126 | ++++++++++++++++++++++++++++++++++++++*/ |
127 | |
128 | static void print_nodes(const char *filename) |
129 | { |
130 | off_t size,position=0; |
131 | int fd; |
132 | |
133 | size=SizeFile(filename); |
134 | |
135 | fd=ReOpenFile(filename); |
136 | |
137 | while(position<size) |
138 | { |
139 | NodeX nodex; |
140 | |
141 | ReadFile(fd,&nodex,sizeof(NodeX)); |
142 | |
143 | printf("Node %"Pnode_t"\n",nodex.id); |
144 | printf(" lat=%d lon=%d\n",nodex.latitude,nodex.longitude); |
145 | printf(" allow=%02x\n",nodex.allow); |
146 | printf(" flags=%02x\n",nodex.flags); |
147 | |
148 | position+=sizeof(NodeX); |
149 | } |
150 | |
151 | CloseFile(fd); |
152 | } |
153 | |
154 | |
155 | /*++++++++++++++++++++++++++++++++++++++ |
156 | Print out all of the ways. |
157 | |
158 | const char *filename The name of the file containing the data. |
159 | ++++++++++++++++++++++++++++++++++++++*/ |
160 | |
161 | static void print_ways(const char *filename) |
162 | { |
163 | FILESORT_VARINT waysize; |
164 | int fd; |
165 | |
166 | fd=ReOpenFileBuffered(filename); |
167 | |
168 | while(!ReadFileBuffered(fd,&waysize,FILESORT_VARSIZE)) |
169 | { |
170 | WayX wayx; |
171 | node_t node; |
172 | char *name=NULL; |
173 | size_t malloced=0; |
174 | int first=1; |
175 | |
176 | ReadFileBuffered(fd,&wayx,sizeof(WayX)); |
177 | |
178 | printf("Way %"Pway_t"\n",wayx.id); |
179 | |
180 | while(!ReadFileBuffered(fd,&node,sizeof(node_t)) && node!=NO_NODE_ID) |
181 | { |
182 | if(first) |
183 | printf(" nodes=%"Pnode_t,node); |
184 | else |
185 | printf(",%"Pnode_t,node); |
186 | |
187 | waysize-=sizeof(node_t); |
188 | |
189 | first=0; |
190 | } |
191 | |
192 | printf("\n"); |
193 | |
194 | waysize-=sizeof(node_t)+sizeof(WayX); |
195 | |
196 | if(malloced<waysize) |
197 | { |
198 | malloced=waysize; |
199 | name=(char*)realloc((void*)name,malloced); |
200 | } |
201 | |
202 | ReadFileBuffered(fd,name,waysize); |
203 | |
204 | if(*name) |
205 | printf(" name=%s\n",name); |
206 | printf(" type=%02x\n",wayx.way.type); |
207 | printf(" allow=%02x\n",wayx.way.allow); |
208 | if(wayx.way.props) |
209 | printf(" props=%02x\n",wayx.way.props); |
210 | if(wayx.way.speed) |
211 | printf(" speed=%d\n",wayx.way.speed); |
212 | if(wayx.way.weight) |
213 | printf(" weight=%d\n",wayx.way.weight); |
214 | if(wayx.way.height) |
215 | printf(" height=%d\n",wayx.way.height); |
216 | if(wayx.way.width) |
217 | printf(" width=%d\n",wayx.way.width); |
218 | if(wayx.way.length) |
219 | printf(" length=%d\n",wayx.way.length); |
220 | } |
221 | |
222 | CloseFileBuffered(fd); |
223 | } |
224 | |
225 | |
226 | /*++++++++++++++++++++++++++++++++++++++ |
227 | Print out all of the route relations. |
228 | |
229 | const char *filename The name of the file containing the data. |
230 | ++++++++++++++++++++++++++++++++++++++*/ |
231 | |
232 | static void print_route_relations(const char *filename) |
233 | { |
234 | FILESORT_VARINT relationsize; |
235 | int fd; |
236 | |
237 | fd=ReOpenFileBuffered(filename); |
238 | |
239 | while(!ReadFileBuffered(fd,&relationsize,FILESORT_VARSIZE)) |
240 | { |
241 | RouteRelX relationx; |
242 | node_t nodeid; |
243 | way_t wayid; |
244 | relation_t relationid; |
245 | |
246 | ReadFileBuffered(fd,&relationx,sizeof(RouteRelX)); |
247 | |
248 | printf("Relation %"Prelation_t"\n",relationx.id); |
249 | printf(" routes=%02x\n",relationx.routes); |
250 | |
251 | while(!ReadFileBuffered(fd,&nodeid,sizeof(node_t)) && nodeid!=NO_NODE_ID) |
252 | printf(" node=%"Pnode_t"\n",nodeid); |
253 | |
254 | while(!ReadFileBuffered(fd,&wayid,sizeof(way_t)) && wayid!=NO_WAY_ID); |
255 | printf(" way=%"Pway_t"\n",wayid); |
256 | |
257 | while(!ReadFileBuffered(fd,&relationid,sizeof(relation_t)) && relationid!=NO_RELATION_ID); |
258 | printf(" relation=%"Prelation_t"\n",relationid); |
259 | } |
260 | |
261 | CloseFileBuffered(fd); |
262 | } |
263 | |
264 | |
265 | /*++++++++++++++++++++++++++++++++++++++ |
266 | Print out all of the turn relations. |
267 | |
268 | const char *filename The name of the file containing the data. |
269 | ++++++++++++++++++++++++++++++++++++++*/ |
270 | |
271 | static void print_turn_relations(const char *filename) |
272 | { |
273 | off_t size,position=0; |
274 | int fd; |
275 | |
276 | size=SizeFile(filename); |
277 | |
278 | fd=ReOpenFile(filename); |
279 | |
280 | while(position<size) |
281 | { |
282 | TurnRelX relationx; |
283 | |
284 | ReadFile(fd,&relationx,sizeof(TurnRelX)); |
285 | |
286 | printf("Relation %"Prelation_t"\n",relationx.id); |
287 | printf(" from=%"Pway_t"\n",relationx.from); |
288 | printf(" via=%"Pnode_t"\n",relationx.via); |
289 | printf(" to=%"Pway_t"\n",relationx.to); |
290 | printf(" type=%d\n",relationx.restriction); |
291 | if(relationx.except) |
292 | printf(" except=%02x\n",relationx.except); |
293 | |
294 | position+=sizeof(TurnRelX); |
295 | } |
296 | |
297 | CloseFile(fd); |
298 | } |
299 | |
300 | |
301 | /*++++++++++++++++++++++++++++++++++++++ |
302 | Print out the usage information. |
303 | |
304 | int detail The level of detail to use - 0 = low, 1 = high. |
305 | |
306 | const char *argerr The argument that gave the error (if there is one). |
307 | |
308 | const char *err Other error message (if there is one). |
309 | ++++++++++++++++++++++++++++++++++++++*/ |
310 | |
311 | static void print_usage(int detail,const char *argerr,const char *err) |
312 | { |
313 | fprintf(stderr, |
314 | "Usage: filedumperx [--help]\n" |
315 | " [--dir=<dirname>] [--prefix=<name>]\n" |
316 | " [--dump [--nodes]\n" |
317 | " [--ways]\n" |
318 | " [--route-relations]\n" |
319 | " [--turn-relations]]\n"); |
320 | |
321 | if(argerr) |
322 | fprintf(stderr, |
323 | "\n" |
324 | "Error with command line parameter: %s\n",argerr); |
325 | |
326 | if(err) |
327 | fprintf(stderr, |
328 | "\n" |
329 | "Error: %s\n",err); |
330 | |
331 | if(detail) |
332 | fprintf(stderr, |
333 | "\n" |
334 | "--help Prints this information.\n" |
335 | "\n" |
336 | "--dir=<dirname> The directory containing the routing database.\n" |
337 | "--prefix=<name> The filename prefix for the routing database.\n" |
338 | "\n" |
339 | "--dump Dump the intermediate files after parsing.\n" |
340 | " --nodes * all of the nodes.\n" |
341 | " --ways * all of the ways.\n" |
342 | " --route-relations * all of the route relations.\n" |
343 | " --turn-relations * all of the turn relations.\n"); |
344 | |
345 | exit(!detail); |
346 | } |