Imported Upstream version 1.5
[routino] / src / filedumper.c
index 463ab19..c1c67ec 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************
- $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"
 
 
@@ -51,7 +52,7 @@ static void print_tail_osm(void);
 
 static char *RFC822Date(time_t t);
 
-static void print_usage(int detail);
+static void print_usage(int detail,const char *argerr,const char *err);
 
 
 /*++++++++++++++++++++++++++++++++++++++
@@ -78,7 +79,7 @@ int main(int argc,char** argv)
  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))
@@ -110,11 +111,11 @@ int main(int argc,char** argv)
     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. */
 
@@ -129,16 +130,10 @@ int main(int argc,char** argv)
  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);
@@ -157,10 +152,7 @@ int main(int argc,char** argv)
     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 */
@@ -200,16 +192,16 @@ int main(int argc,char** argv)
     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 */
 
@@ -219,9 +211,9 @@ int main(int argc,char** argv)
     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 */
 
@@ -231,15 +223,15 @@ int main(int argc,char** argv)
     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 */
@@ -251,45 +243,45 @@ int main(int argc,char** argv)
     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);
          }
    }
 
@@ -298,52 +290,53 @@ int main(int argc,char** argv)
  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);
                      }
                   }
                }
@@ -353,11 +346,11 @@ int main(int argc,char** argv)
       {
        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);
       }
 
@@ -378,14 +371,15 @@ int main(int argc,char** argv)
 
 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");
 }
@@ -401,7 +395,7 @@ static void print_node(Nodes* nodes,index_t item)
 
 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);
@@ -429,10 +423,11 @@ static void print_segment(Segments *segments,index_t item)
 
 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)
@@ -471,14 +466,22 @@ static void print_head_osm(void)
 
 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
@@ -498,8 +501,8 @@ static void print_node_osm(Nodes* nodes,index_t item)
 
 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);
@@ -527,8 +530,8 @@ static void print_segment_osm(Segments *segments,index_t item,Ways *ways)
 
  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))
@@ -612,9 +615,13 @@ static char *RFC822Date(time_t t)
   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"
@@ -630,6 +637,16 @@ static void print_usage(int detail)
          "                              [--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"