/***************************************
- $Header: /home/amb/routino/src/RCS/filedumper.c,v 1.43 2010/05/30 12:52:16 amb Exp $
+ $Header: /home/amb/routino/src/RCS/filedumper.c,v 1.54 2010/09/15 18:19:36 amb Exp $
Memory file dumper.
#include <time.h>
#include "types.h"
-#include "functions.h"
-#include "visualiser.h"
#include "nodes.h"
#include "segments.h"
#include "ways.h"
+
+#include "files.h"
+#include "visualiser.h"
#include "xmlparse.h"
static char *RFC822Date(time_t t);
-static void print_usage(int detail);
+static void print_usage(int detail,const char *argerr,const char *err);
/*++++++++++++++++++++++++++++++++++++++
for(arg=1;arg<argc;arg++)
{
if(!strcmp(argv[arg],"--help"))
- print_usage(1);
+ print_usage(1,NULL,NULL);
else if(!strncmp(argv[arg],"--dir=",6))
dirname=&argv[arg][6];
else if(!strncmp(argv[arg],"--prefix=",9))
else if(!strncmp(argv[arg],"--way=",6))
;
else
- print_usage(0);
+ print_usage(0,argv[arg],NULL);
}
- if(!option_statistics && !option_visualiser && !option_dump && !option_dump_osm)
- print_usage(0);
+ if((option_statistics + option_visualiser + option_dump + option_dump_osm)!=1)
+ print_usage(0,NULL,"Must choose --visualiser, --statistics, --dump or --dump-osm.");
/* Load in the data - Note: No error checking because Load*List() will call exit() in case of an error. */
if(option_visualiser)
{
if(coordcount!=4)
- {
- fprintf(stderr,"The --visualiser option must have --latmin, --latmax, --lonmin, --lonmax.\n");
- exit(1);
- }
+ print_usage(0,NULL,"The --visualiser option must have --latmin, --latmax, --lonmin, --lonmax.\n");
if(!option_data)
- {
- fprintf(stderr,"The --visualiser option must have --data.\n");
- exit(1);
- }
+ print_usage(0,NULL,"The --visualiser option must have --data.\n");
if(!strcmp(option_data,"junctions"))
OutputJunctions(OSMNodes,OSMSegments,OSMWays,latmin,latmax,lonmin,lonmax);
else if(!strcmp(option_data,"length"))
OutputLengthLimits(OSMNodes,OSMSegments,OSMWays,latmin,latmax,lonmin,lonmax);
else
- {
- fprintf(stderr,"Unrecognised data option '%s' with --visualiser.\n",option_data);
- exit(1);
- }
+ print_usage(0,option_data,NULL);
}
/* Print out statistics */
printf("\n");
printf("sizeof(Node) =%9d Bytes\n",sizeof(Node));
- printf("Number =%9d\n",OSMNodes->number);
- printf("Number(super)=%9d\n",OSMNodes->snumber);
+ printf("Number =%9d\n",OSMNodes->file.number);
+ printf("Number(super)=%9d\n",OSMNodes->file.snumber);
printf("\n");
- printf("Lat bins= %4d\n",OSMNodes->latbins);
- printf("Lon bins= %4d\n",OSMNodes->lonbins);
+ printf("Lat bins= %4d\n",OSMNodes->file.latbins);
+ printf("Lon bins= %4d\n",OSMNodes->file.lonbins);
printf("\n");
- printf("Lat zero=%5d (%8.4f deg)\n",OSMNodes->latzero,radians_to_degrees(latlong_to_radians(bin_to_latlong(OSMNodes->latzero))));
- printf("Lon zero=%5d (%8.4f deg)\n",OSMNodes->lonzero,radians_to_degrees(latlong_to_radians(bin_to_latlong(OSMNodes->lonzero))));
+ printf("Lat zero=%5d (%8.4f deg)\n",OSMNodes->file.latzero,radians_to_degrees(latlong_to_radians(bin_to_latlong(OSMNodes->file.latzero))));
+ printf("Lon zero=%5d (%8.4f deg)\n",OSMNodes->file.lonzero,radians_to_degrees(latlong_to_radians(bin_to_latlong(OSMNodes->file.lonzero))));
/* Examine the segments */
printf("\n");
printf("sizeof(Segment)=%9d Bytes\n",sizeof(Segment));
- printf("Number(total) =%9d\n",OSMSegments->number);
- printf("Number(super) =%9d\n",OSMSegments->snumber);
- printf("Number(normal) =%9d\n",OSMSegments->nnumber);
+ printf("Number(total) =%9d\n",OSMSegments->file.number);
+ printf("Number(super) =%9d\n",OSMSegments->file.snumber);
+ printf("Number(normal) =%9d\n",OSMSegments->file.nnumber);
/* Examine the ways */
printf("\n");
printf("sizeof(Way) =%9d Bytes\n",sizeof(Way));
- printf("Number(compacted)=%9d\n",OSMWays->number);
- printf("Number(original) =%9d\n",OSMWays->onumber);
+ printf("Number(compacted)=%9d\n",OSMWays->file.number);
+ printf("Number(original) =%9d\n",OSMWays->file.onumber);
printf("\n");
- printf("Total names =%9ld Bytes\n",(long)buf.st_size-sizeof(Ways)-OSMWays->number*sizeof(Way));
+ printf("Total names =%9ld Bytes\n",(long)buf.st_size-sizeof(Ways)-OSMWays->file.number*sizeof(Way));
printf("\n");
- printf("Included transports: %s\n",AllowedNameList(OSMWays->allow));
- printf("Included properties: %s\n",PropertiesNameList(OSMWays->props));
+ printf("Included transports: %s\n",AllowedNameList(OSMWays->file.allow));
+ printf("Included properties: %s\n",PropertiesNameList(OSMWays->file.props));
}
/* Print out internal data */
for(arg=1;arg<argc;arg++)
if(!strcmp(argv[arg],"--node=all"))
{
- for(item=0;item<OSMNodes->number;item++)
+ for(item=0;item<OSMNodes->file.number;item++)
print_node(OSMNodes,item);
}
else if(!strncmp(argv[arg],"--node=",7))
{
item=atoi(&argv[arg][7]);
- if(item>=0 && item<OSMNodes->number)
+ if(item>=0 && item<OSMNodes->file.number)
print_node(OSMNodes,item);
else
- printf("Invalid node number; minimum=0, maximum=%d.\n",OSMNodes->number-1);
+ printf("Invalid node number; minimum=0, maximum=%d.\n",OSMNodes->file.number-1);
}
else if(!strcmp(argv[arg],"--segment=all"))
{
- for(item=0;item<OSMSegments->number;item++)
+ for(item=0;item<OSMSegments->file.number;item++)
print_segment(OSMSegments,item);
}
else if(!strncmp(argv[arg],"--segment=",10))
{
item=atoi(&argv[arg][10]);
- if(item>=0 && item<OSMSegments->number)
+ if(item>=0 && item<OSMSegments->file.number)
print_segment(OSMSegments,item);
else
- printf("Invalid segment number; minimum=0, maximum=%d.\n",OSMSegments->number-1);
+ printf("Invalid segment number; minimum=0, maximum=%d.\n",OSMSegments->file.number-1);
}
else if(!strcmp(argv[arg],"--way=all"))
{
- for(item=0;item<OSMWays->number;item++)
+ for(item=0;item<OSMWays->file.number;item++)
print_way(OSMWays,item);
}
else if(!strncmp(argv[arg],"--way=",6))
{
item=atoi(&argv[arg][6]);
- if(item>=0 && item<OSMWays->number)
+ if(item>=0 && item<OSMWays->file.number)
print_way(OSMWays,item);
else
- printf("Invalid way number; minimum=0, maximum=%d.\n",OSMWays->number-1);
+ printf("Invalid way number; minimum=0, maximum=%d.\n",OSMWays->file.number-1);
}
}
if(option_dump_osm)
{
if(coordcount>0 && coordcount!=4)
- {
- fprintf(stderr,"The --dump-osm option must have all of --latmin, --latmax, --lonmin, --lonmax or none.\n");
- exit(1);
- }
+ print_usage(0,NULL,"The --dump-osm option must have all of --latmin, --latmax, --lonmin, --lonmax or none.\n");
print_head_osm();
if(coordcount)
{
- int32_t latminbin=latlong_to_bin(radians_to_latlong(latmin))-OSMNodes->latzero;
- int32_t latmaxbin=latlong_to_bin(radians_to_latlong(latmax))-OSMNodes->latzero;
- int32_t lonminbin=latlong_to_bin(radians_to_latlong(lonmin))-OSMNodes->lonzero;
- int32_t lonmaxbin=latlong_to_bin(radians_to_latlong(lonmax))-OSMNodes->lonzero;
+ int32_t latminbin=latlong_to_bin(radians_to_latlong(latmin))-OSMNodes->file.latzero;
+ int32_t latmaxbin=latlong_to_bin(radians_to_latlong(latmax))-OSMNodes->file.latzero;
+ int32_t lonminbin=latlong_to_bin(radians_to_latlong(lonmin))-OSMNodes->file.lonzero;
+ int32_t lonmaxbin=latlong_to_bin(radians_to_latlong(lonmax))-OSMNodes->file.lonzero;
int latb,lonb,llbin;
- index_t node;
+ index_t item,index1,index2;
/* Loop through all of the nodes. */
for(latb=latminbin;latb<=latmaxbin;latb++)
for(lonb=lonminbin;lonb<=lonmaxbin;lonb++)
{
- llbin=lonb*OSMNodes->latbins+latb;
+ llbin=lonb*OSMNodes->file.latbins+latb;
- if(llbin<0 || llbin>(OSMNodes->latbins*OSMNodes->lonbins))
+ if(llbin<0 || llbin>(OSMNodes->file.latbins*OSMNodes->file.lonbins))
continue;
- for(node=OSMNodes->offsets[llbin];node<OSMNodes->offsets[llbin+1];node++)
+ index1=LookupNodeOffset(OSMNodes,llbin);
+ index2=LookupNodeOffset(OSMNodes,llbin+1);
+
+ for(item=index1;item<index2;item++)
{
- double lat=latlong_to_radians(bin_to_latlong(OSMNodes->latzero+latb)+off_to_latlong(OSMNodes->nodes[node].latoffset));
- double lon=latlong_to_radians(bin_to_latlong(OSMNodes->lonzero+lonb)+off_to_latlong(OSMNodes->nodes[node].lonoffset));
+ Node *node=LookupNode(OSMNodes,item,1);
+ double lat=latlong_to_radians(bin_to_latlong(OSMNodes->file.latzero+latb)+off_to_latlong(node->latoffset));
+ double lon=latlong_to_radians(bin_to_latlong(OSMNodes->file.lonzero+lonb)+off_to_latlong(node->lonoffset));
if(lat>latmin && lat<latmax && lon>lonmin && lon<lonmax)
{
Segment *segment;
- print_node_osm(OSMNodes,node);
+ print_node_osm(OSMNodes,item);
- segment=FirstSegment(OSMSegments,OSMNodes,node);
+ segment=FirstSegment(OSMSegments,OSMNodes,item);
while(segment)
{
- if(node>OtherNode(segment,node))
+ if(item>OtherNode(segment,item))
if(!option_no_super || IsNormalSegment(segment))
print_segment_osm(OSMSegments,IndexSegment(OSMSegments,segment),OSMWays);
- segment=NextSegment(OSMSegments,segment,node);
+ segment=NextSegment(OSMSegments,segment,item);
}
}
}
{
index_t item;
- for(item=0;item<OSMNodes->number;item++)
+ for(item=0;item<OSMNodes->file.number;item++)
print_node_osm(OSMNodes,item);
- for(item=0;item<OSMSegments->number;item++)
- if(!option_no_super || IsNormalSegment(LookupSegment(OSMSegments,item)))
+ for(item=0;item<OSMSegments->file.number;item++)
+ if(!option_no_super || IsNormalSegment(LookupSegment(OSMSegments,item,1)))
print_segment_osm(OSMSegments,item,OSMWays);
}
static void print_node(Nodes* nodes,index_t item)
{
- Node *node=LookupNode(nodes,item);
+ Node *node=LookupNode(nodes,item,1);
double latitude,longitude;
GetLatLong(nodes,item,&latitude,&longitude);
printf("Node %d\n",item);
- printf(" firstseg=%d\n",SEGMENT(node->firstseg));
+ printf(" firstseg=%d\n",node->firstseg);
printf(" latoffset=%d lonoffset=%d (latitude=%.6f longitude=%.6f)\n",node->latoffset,node->lonoffset,radians_to_degrees(latitude),radians_to_degrees(longitude));
+ printf(" allow=%02x (%s)\n",node->allow,AllowedNameList(node->allow));
if(IsSuperNode(nodes,item))
printf(" Super-Node\n");
}
static void print_segment(Segments *segments,index_t item)
{
- Segment *segment=LookupSegment(segments,item);
+ Segment *segment=LookupSegment(segments,item,1);
printf("Segment %d\n",item);
printf(" node1=%d node2=%d\n",segment->node1,segment->node2);
static void print_way(Ways *ways,index_t item)
{
- Way *way=LookupWay(ways,item);
+ Way *way=LookupWay(ways,item,1);
printf("Way %d\n",item);
- printf(" name=%s\n",WayNameHighway(ways,way));
+ if(*WayName(ways,way))
+ printf(" name=%s\n",WayName(ways,way));
printf(" type=%02x (%s%s%s)\n",way->type,HighwayName(HIGHWAY(way->type)),way->type&Way_OneWay?",One-Way":"",way->type&Way_Roundabout?",Roundabout":"");
printf(" allow=%02x (%s)\n",way->allow,AllowedNameList(way->allow));
if(way->props)
static void print_node_osm(Nodes* nodes,index_t item)
{
+ Node *node=LookupNode(nodes,item,1);
double latitude,longitude;
GetLatLong(nodes,item,&latitude,&longitude);
if(IsSuperNode(nodes,item))
{
+ int i;
+
printf(" <node id='%lu' lat='%.7f' lon='%.7f' version='1'>\n",(unsigned long)item+1,radians_to_degrees(latitude),radians_to_degrees(longitude));
printf(" <tag k='routino:super' v='yes' />\n");
+
+ for(i=1;i<Transport_Count;i++)
+ if(!(node->allow & ALLOWED(i)))
+ printf(" <tag k='%s' v='no' />\n",TransportName(i));
+
printf(" </node>\n");
}
else
static void print_segment_osm(Segments *segments,index_t item,Ways *ways)
{
- Segment *segment=LookupSegment(segments,item);
- Way *way=LookupWay(ways,segment->way);
+ Segment *segment=LookupSegment(segments,item,1);
+ Way *way=LookupWay(ways,segment->way,1);
int i;
printf(" <way id='%lu' version='1'>\n",(unsigned long)item+1);
printf(" <tag k='highway' v='%s' />\n",HighwayName(HIGHWAY(way->type)));
- if(IsNormalSegment(segment) && WayNamed(ways,way))
- printf(" <tag k='name' v='%s' />\n",ParseXML_Encode_Safe_XML(WayNameHighway(ways,way)));
+ if(IsNormalSegment(segment) && *WayName(ways,way))
+ printf(" <tag k='name' v='%s' />\n",ParseXML_Encode_Safe_XML(WayName(ways,way)));
for(i=1;i<Transport_Count;i++)
if(way->allow & ALLOWED(i))
Print out the usage information.
int detail The level of detail to use - 0 = low, 1 = high.
+
+ const char *argerr The argument that gave the error (if there is one).
+
+ const char *err Other error message (if there is one).
++++++++++++++++++++++++++++++++++++++*/
-static void print_usage(int detail)
+static void print_usage(int detail,const char *argerr,const char *err)
{
fprintf(stderr,
"Usage: filedumper [--help]\n"
" [--latmin=<latmin> --latmax=<latmax>\n"
" --lonmin=<lonmin> --lonmax=<lonmax>]]\n");
+ if(argerr)
+ fprintf(stderr,
+ "\n"
+ "Error with command line parameter: %s\n",argerr);
+
+ if(err)
+ fprintf(stderr,
+ "\n"
+ "Error: %s\n",err);
+
if(detail)
fprintf(stderr,
"\n"