Imported Upstream version 1.5
[routino] / src / nodesx.c
index cc1e0a2..e5f0ae8 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************
- $Header: /home/amb/routino/src/RCS/nodesx.c,v 1.56 2010/04/28 17:27:02 amb Exp $
+ $Header: /home/amb/routino/src/RCS/nodesx.c,v 1.75 2010/10/09 14:14:42 amb Exp $
 
  Extented Node data type functions.
 
 #include <sys/stat.h>
 
 #include "types.h"
-#include "functions.h"
+#include "nodes.h"
+#include "segments.h"
+
 #include "nodesx.h"
 #include "segmentsx.h"
 #include "waysx.h"
-#include "segments.h"
-#include "nodes.h"
 
+#include "types.h"
+
+#include "files.h"
+#include "functions.h"
 
-/* Variables */
 
-/*+ The command line '--slim' option. +*/
-extern int option_slim;
+/* Variables */
 
 /*+ The command line '--tmpdir' option or its default value. +*/
 extern char *option_tmpdirname;
@@ -76,22 +78,28 @@ NodesX *NewNodeList(int append)
  nodesx->filename=(char*)malloc(strlen(option_tmpdirname)+32);
 
  if(append)
-    sprintf(nodesx->filename,"%s/nodes.input.tmp",option_tmpdirname);
+    sprintf(nodesx->filename,"%s/nodesx.input.tmp",option_tmpdirname);
  else
-    sprintf(nodesx->filename,"%s/nodes.%p.tmp",option_tmpdirname,nodesx);
+    sprintf(nodesx->filename,"%s/nodesx.%p.tmp",option_tmpdirname,nodesx);
+
+#if SLIM
+ nodesx->nfilename=(char*)malloc(strlen(option_tmpdirname)+32);
+
+ sprintf(nodesx->nfilename,"%s/nodes.%p.tmp",option_tmpdirname,nodesx);
+#endif
 
  if(append)
    {
     off_t size;
 
-    nodesx->fd=AppendFile(nodesx->filename);
+    nodesx->fd=OpenFileAppend(nodesx->filename);
 
     size=SizeFile(nodesx->filename);
 
     nodesx->xnumber=size/sizeof(NodeX);
    }
  else
-    nodesx->fd=OpenFile(nodesx->filename);
+    nodesx->fd=OpenFileNew(nodesx->filename);
 
  return(nodesx);
 }
@@ -115,8 +123,16 @@ void FreeNodeList(NodesX *nodesx,int keep)
  if(nodesx->idata)
     free(nodesx->idata);
 
+#if !SLIM
  if(nodesx->ndata)
     free(nodesx->ndata);
+#endif
+
+#if SLIM
+ DeleteFile(nodesx->nfilename);
+
+ free(nodesx->nfilename);
+#endif
 
  if(nodesx->super)
     free(nodesx->super);
@@ -129,7 +145,7 @@ void FreeNodeList(NodesX *nodesx,int keep)
 
 
 /*++++++++++++++++++++++++++++++++++++++
-  Append a node to a newly created node list (unsorted).
+  Append a single node to an unsorted node list.
 
   NodesX* nodesx The set of nodes to process.
 
@@ -138,21 +154,24 @@ void FreeNodeList(NodesX *nodesx,int keep)
   double latitude The latitude of the node.
 
   double longitude The longitude of the node.
+
+  allow_t allow The allowed traffic types through the node.
   ++++++++++++++++++++++++++++++++++++++*/
 
-void AppendNode(NodesX* nodesx,node_t id,double latitude,double longitude)
+void AppendNode(NodesX* nodesx,node_t id,double latitude,double longitude,allow_t allow)
 {
  NodeX nodex;
 
- assert(!nodesx->idata);        /* Must not have idata filled in => unsorted */
-
  nodex.id=id;
  nodex.latitude =radians_to_latlong(latitude);
  nodex.longitude=radians_to_latlong(longitude);
+ nodex.allow=allow;
 
  WriteFile(nodesx->fd,&nodex,sizeof(NodeX));
 
  nodesx->xnumber++;
+
+ assert(nodesx->xnumber<NODE_FAKE); /* NODE_FAKE marks the high-water mark for real nodes. */
 }
 
 
@@ -166,10 +185,6 @@ void SortNodeList(NodesX* nodesx)
 {
  int fd;
 
- /* Check the start conditions */
-
- assert(!nodesx->idata);        /* Must not have idata filled in => unsorted */
-
  /* Print the start message */
 
  printf("Sorting Nodes");
@@ -182,7 +197,7 @@ void SortNodeList(NodesX* nodesx)
 
  DeleteFile(nodesx->filename);
 
- fd=OpenFile(nodesx->filename);
+ fd=OpenFileNew(nodesx->filename);
 
  /* Allocate the array of indexes */
 
@@ -287,7 +302,7 @@ void SortNodeListGeographically(NodesX* nodesx)
 
  DeleteFile(nodesx->filename);
 
- fd=OpenFile(nodesx->filename);
+ fd=OpenFileNew(nodesx->filename);
 
  /* Sort geographically */
 
@@ -345,7 +360,7 @@ static int sort_by_lat_long(NodeX *a,NodeX *b)
     else
       {
 #ifdef REGRESSION_TESTING
-       // Need this for regression testing because heapsort() is not order
+       // Need this for regression testing because filesort_heapsort() is not order
        // preserving like qsort() is (or was when tested).
 
        index_t a_id=a->id;
@@ -404,8 +419,6 @@ index_t IndexNodeX(NodesX* nodesx,node_t id)
  int end=nodesx->number-1;
  int mid;
 
- assert(nodesx->idata);         /* Must have idata filled in => sorted by id */
-
  /* Binary search - search key exact match only is required.
   *
   *  # <- start  |  Check mid and move start or end if it doesn't match
@@ -450,37 +463,6 @@ index_t IndexNodeX(NodesX* nodesx,node_t id)
 
 
 /*++++++++++++++++++++++++++++++++++++++
-  Lookup a particular node.
-
-  NodeX *LookupNodeX Returns a pointer to the extended node with the specified id.
-
-  NodesX* nodesx The set of nodes to process.
-
-  index_t index The node index to look for.
-
-  int position The position in the cache to use.
-  ++++++++++++++++++++++++++++++++++++++*/
-
-NodeX *LookupNodeX(NodesX* nodesx,index_t index,int position)
-{
- assert(index!=NO_NODE);     /* Must be a valid node */
-
- if(option_slim)
-   {
-    SeekFile(nodesx->fd,index*sizeof(NodeX));
-
-    ReadFile(nodesx->fd,&nodesx->cached[position-1],sizeof(NodeX));
-
-    return(&nodesx->cached[position-1]);
-   }
- else
-   {
-    return(&nodesx->xdata[index]);
-   }
-}
-
-
-/*++++++++++++++++++++++++++++++++++++++
   Remove any nodes that are not part of a highway.
 
   NodesX *nodesx The complete node list.
@@ -496,10 +478,6 @@ void RemoveNonHighwayNodes(NodesX *nodesx,SegmentsX *segmentsx)
  latlong_t lat_min,lat_max,lon_min,lon_max;
  int fd;
 
- /* Check the start conditions */
-
- assert(nodesx->idata);         /* Must have idata filled in => data sorted */
-
  /* Print the start message */
 
  printf("Checking: Nodes=0");
@@ -516,7 +494,7 @@ void RemoveNonHighwayNodes(NodesX *nodesx,SegmentsX *segmentsx)
 
  DeleteFile(nodesx->filename);
 
- fd=OpenFile(nodesx->filename);
+ fd=OpenFileNew(nodesx->filename);
  SeekFile(nodesx->fd,0);
 
  while(!ReadFile(nodesx->fd,&nodex,sizeof(NodeX)))
@@ -598,10 +576,6 @@ void CreateRealNodes(NodesX *nodesx,int iteration)
 {
  index_t i;
 
- /* Check the start conditions */
-
- assert(!nodesx->ndata);        /* Must not have ndata filled in => no real nodes */
-
  /* Print the start message */
 
  printf("Creating Real Nodes: Nodes=0");
@@ -609,27 +583,39 @@ void CreateRealNodes(NodesX *nodesx,int iteration)
 
  /* Map into memory */
 
- if(!option_slim)
-    nodesx->xdata=MapFile(nodesx->filename);
+#if !SLIM
+ nodesx->xdata=MapFile(nodesx->filename);
+#endif
 
- /* Allocate the memory */
+ /* Allocate the memory (or open the file) */
 
+#if !SLIM
  nodesx->ndata=(Node*)malloc(nodesx->number*sizeof(Node));
 
  assert(nodesx->ndata); /* Check malloc() worked */
+#else
+ nodesx->nfd=OpenFileNew(nodesx->nfilename);
+#endif
 
  /* Loop through and allocate. */
 
  for(i=0;i<nodesx->number;i++)
    {
     NodeX *nodex=LookupNodeX(nodesx,i,1);
+    Node  *node =LookupNodeXNode(nodesx,nodex->id,1);
 
-    nodesx->ndata[nodex->id].latoffset=latlong_to_off(nodex->latitude);
-    nodesx->ndata[nodex->id].lonoffset=latlong_to_off(nodex->longitude);
-    nodesx->ndata[nodex->id].firstseg=SEGMENT(NO_SEGMENT);
+    node->latoffset=latlong_to_off(nodex->latitude);
+    node->lonoffset=latlong_to_off(nodex->longitude);
+    node->firstseg=NO_SEGMENT;
+    node->allow=nodex->allow;
+    node->flags=0;
 
     if(nodesx->super[nodex->id]==iteration)
-       nodesx->ndata[nodex->id].firstseg|=NODE_SUPER;
+       node->flags|=NODE_SUPER;
+
+#if SLIM
+    PutBackNodeXNode(nodesx,nodex->id,1);
+#endif
 
     if(!((i+1)%10000))
       {
@@ -645,8 +631,9 @@ void CreateRealNodes(NodesX *nodesx,int iteration)
 
  /* Unmap from memory */
 
- if(!option_slim)
-    nodesx->xdata=UnmapFile(nodesx->filename);
+#if !SLIM
+ nodesx->xdata=UnmapFile(nodesx->filename);
+#endif
 
  /* Print the final message */
 
@@ -667,10 +654,8 @@ void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx)
 {
  index_t i;
 
- /* Check the start conditions */
-
- assert(nodesx->ndata);         /* Must have ndata filled in => real nodes exist */
- assert(segmentsx->sdata);      /* Must have sdata filled in => real segments exist */
+ if(nodesx->number==0 || segmentsx->number==0)
+    return;
 
  /* Print the start message */
 
@@ -679,11 +664,10 @@ void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx)
 
  /* Map into memory */
 
- if(!option_slim)
-   {
-    nodesx->xdata=MapFile(nodesx->filename);
-    segmentsx->xdata=MapFile(segmentsx->filename);
-   }
+#if !SLIM
+ nodesx->xdata=MapFile(nodesx->filename);
+ segmentsx->xdata=MapFile(segmentsx->filename);
+#endif
 
  /* Index the nodes */
 
@@ -692,19 +676,22 @@ void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx)
     SegmentX *segmentx=LookupSegmentX(segmentsx,i,1);
     node_t id1=segmentx->node1;
     node_t id2=segmentx->node2;
-    Node *node1=&nodesx->ndata[id1];
-    Node *node2=&nodesx->ndata[id2];
+    Node *node1=LookupNodeXNode(nodesx,id1,1);
+    Node *node2=LookupNodeXNode(nodesx,id2,2);
 
     /* Check node1 */
 
-    if(SEGMENT(node1->firstseg)==SEGMENT(NO_SEGMENT))
+    if(node1->firstseg==NO_SEGMENT)
       {
-       node1->firstseg^=SEGMENT(NO_SEGMENT);
-       node1->firstseg|=i;
+       node1->firstseg=i;
+
+#if SLIM
+       PutBackNodeXNode(nodesx,id1,1);
+#endif
       }
     else
       {
-       index_t index=SEGMENT(node1->firstseg);
+       index_t index=node1->firstseg;
 
        do
          {
@@ -724,13 +711,20 @@ void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx)
             }
           else
             {
-             if(segmentsx->sdata[index].next2==NO_NODE)
+             Segment *segment=LookupSegmentXSegment(segmentsx,index,1);
+
+             if(segment->next2==NO_NODE)
                {
-                segmentsx->sdata[index].next2=i;
+                segment->next2=i;
+
+#if SLIM
+                PutBackSegmentXSegment(segmentsx,index,1);
+#endif
+
                 break;
                }
              else
-                index=segmentsx->sdata[index].next2;
+                index=segment->next2;
             }
          }
        while(1);
@@ -738,14 +732,17 @@ void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx)
 
     /* Check node2 */
 
-    if(SEGMENT(node2->firstseg)==SEGMENT(NO_SEGMENT))
+    if(node2->firstseg==NO_SEGMENT)
       {
-       node2->firstseg^=SEGMENT(NO_SEGMENT);
-       node2->firstseg|=i;
+       node2->firstseg=i;
+
+#if SLIM
+       PutBackNodeXNode(nodesx,id2,2);
+#endif
       }
     else
       {
-       index_t index=SEGMENT(node2->firstseg);
+       index_t index=node2->firstseg;
 
        do
          {
@@ -765,13 +762,20 @@ void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx)
             }
           else
             {
-             if(segmentsx->sdata[index].next2==NO_NODE)
+             Segment *segment=LookupSegmentXSegment(segmentsx,index,1);
+
+             if(segment->next2==NO_NODE)
                {
-                segmentsx->sdata[index].next2=i;
+                segment->next2=i;
+
+#if SLIM
+                PutBackSegmentXSegment(segmentsx,index,1);
+#endif
+
                 break;
                }
              else
-                index=segmentsx->sdata[index].next2;
+                index=segment->next2;
             }
          }
        while(1);
@@ -786,11 +790,10 @@ void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx)
 
  /* Unmap from memory */
 
- if(!option_slim)
-   {
-    nodesx->xdata=UnmapFile(nodesx->filename);
-    segmentsx->xdata=UnmapFile(segmentsx->filename);
-   }
+#if !SLIM
+ nodesx->xdata=UnmapFile(nodesx->filename);
+ segmentsx->xdata=UnmapFile(segmentsx->filename);
+#endif
 
  /* Print the final message */
 
@@ -811,13 +814,9 @@ void SaveNodeList(NodesX* nodesx,const char *filename)
 {
  index_t i;
  int fd;
- Nodes *nodes;
+ NodesFile nodesfile={0};
  int super_number=0;
 
- /* Check the start conditions */
-
- assert(nodesx->ndata);         /* Must have ndata filled in => real nodes exist */
-
  /* Print the start message */
 
  printf("Writing Nodes: Nodes=0");
@@ -825,47 +824,24 @@ void SaveNodeList(NodesX* nodesx,const char *filename)
 
  /* Map into memory */
 
- if(!option_slim)
-    nodesx->xdata=MapFile(nodesx->filename);
-
- /* Count the number of super-nodes */
-
- for(i=0;i<nodesx->number;i++)
-    if(nodesx->ndata[i].firstseg&NODE_SUPER)
-       super_number++;
-
- /* Fill in a Nodes structure with the offset of the real data in the file after
-    the Node structure itself. */
-
- nodes=calloc(1,sizeof(Nodes));
-
- assert(nodes); /* Check calloc() worked */
-
- nodes->number=nodesx->number;
- nodes->snumber=super_number;
-
- nodes->latbins=nodesx->latbins;
- nodes->lonbins=nodesx->lonbins;
-
- nodes->latzero=nodesx->latzero;
- nodes->lonzero=nodesx->lonzero;
-
- nodes->data=NULL;
- nodes->offsets=NULL;
- nodes->nodes=NULL;
-
- /* Write out the Nodes structure and then the real data. */
+#if !SLIM
+ nodesx->xdata=MapFile(nodesx->filename);
+#endif
 
- fd=OpenFile(filename);
+ /* Write out the nodes data */
 
- WriteFile(fd,nodes,sizeof(Nodes));
+ fd=OpenFileNew(filename);
 
+ SeekFile(fd,sizeof(NodesFile));
  WriteFile(fd,nodesx->offsets,(nodesx->latbins*nodesx->lonbins+1)*sizeof(index_t));
 
- for(i=0;i<nodes->number;i++)
+ for(i=0;i<nodesx->number;i++)
    {
     NodeX *nodex=LookupNodeX(nodesx,i,1);
-    Node *node=&nodesx->ndata[nodex->id];
+    Node *node=LookupNodeXNode(nodesx,nodex->id,1);
+
+    if(node->flags&NODE_SUPER)
+       super_number++;
 
     WriteFile(fd,node,sizeof(Node));
 
@@ -876,19 +852,30 @@ void SaveNodeList(NodesX* nodesx,const char *filename)
       }
    }
 
+ /* Write out the header structure */
+
+ nodesfile.number=nodesx->number;
+ nodesfile.snumber=super_number;
+
+ nodesfile.latbins=nodesx->latbins;
+ nodesfile.lonbins=nodesx->lonbins;
+
+ nodesfile.latzero=nodesx->latzero;
+ nodesfile.lonzero=nodesx->lonzero;
+
+ SeekFile(fd,0);
+ WriteFile(fd,&nodesfile,sizeof(NodesFile));
+
  CloseFile(fd);
 
  /* Unmap from memory */
 
- if(!option_slim)
-    nodesx->xdata=UnmapFile(nodesx->filename);
+#if !SLIM
+ nodesx->xdata=UnmapFile(nodesx->filename);
+#endif
 
  /* Print the final message */
 
- printf("\rWrote Nodes: Nodes=%d  \n",nodes->number);
+ printf("\rWrote Nodes: Nodes=%d  \n",nodesx->number);
  fflush(stdout);
-
- /* Free the fake Nodes */
-
- free(nodes);
 }