source: subversion/applications/utils/import/and2osm/segments.c @ 4349

Last change on this file since 4349 was 4179, checked in by marc, 13 years ago

add binary tree to nodes, segments and ways

File size: 2.9 KB
Line 
1#include <assert.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include <string.h>
5
6#include "ways.h"
7#include "rb.h"
8#include "osm.h"
9#include "segments.h"
10extern int postgres;
11
12
13/* File descriptor for .osm file. */
14extern FILE *fp;
15
16/* File descriptors for postgres sql files. */
17extern FILE *fp_n;
18extern FILE *fp_nt;
19extern FILE *fp_w;
20extern FILE *fp_wn;
21extern FILE *fp_wt;
22
23
24struct rb_table * segments_table=NULL;
25
26
27
28
29struct attachedWays * attachway(struct attachedWays * p, struct ways * s) {
30        //printf("%p\t%p\n",p,s);
31        if (p==NULL)
32        {
33                p = (struct attachedWays *) calloc(1,sizeof(struct attachedWays));
34                if (p==NULL)
35                {
36                        fprintf(stderr,"out of memory\n");
37                        exit(1);
38                }
39                p->nextWay=NULL;
40                p->way=s;
41        }
42        else
43        {
44                p->nextWay=attachway(p->nextWay,s);
45        }
46        return p;
47}
48
49struct attachedWays * detachway(struct attachedWays * p, struct ways * s) {
50        //printf("%p\t%p\n",p,s);
51        struct attachedWays * rv,*temp;
52        if ((p!=NULL)&&(p->way==s))
53        {
54                //first attached way is way we are looking for
55                rv=p->nextWay;
56                free(p);
57        }
58        else
59        {
60                rv=p;
61                while (p->nextWay!=NULL)
62                {
63                        if (p->nextWay->way==s)
64                        {
65                                temp=p->nextWay;
66                                p->nextWay=p->nextWay->nextWay;
67                                free(temp);
68                                return rv;
69                        }
70                        p=p->nextWay;
71                }       
72        }
73        return rv;
74}
75
76
77
78
79
80
81
82
83
84
85
86
87
88long saveSegment(struct segments *p){
89       
90        assert(fp!=NULL);
91        assert(p!=NULL);
92        assert(p->from!=NULL);
93        assert(p->to!=NULL);
94        if (!postgres)
95                fprintf(fp,"    <segment id=\"%li\" from=\"%li\" to=\"%li\" />\n",p->ID,(p->from)->ID,(p->to)->ID);
96        return 0;
97}
98               
99void saveSegments(){
100        if (!postgres)
101        {
102                       
103                struct rb_traverser tr;
104                struct segments * p;
105                rb_t_init (&tr, segments_table);
106                while ((p=(struct segments *) rb_t_next(&tr))!=NULL)
107                {
108                        saveSegment(p);
109                }
110        }
111}
112
113void deleteSegment(struct segments * p)
114{
115        rb_delete (segments_table, (const void *) p);
116}
117 
118
119
120struct segments * addSegment(struct nodes * from, struct nodes * to)
121{
122        static long segmentID=0;
123        struct segments * storesegment;
124        struct segments ** p;
125        storesegment = (struct segments *) calloc(1,sizeof(struct segments));
126        if (storesegment==NULL)
127        {
128                fprintf(stderr,"out of memory\n");
129                exit(1);
130        }
131
132
133        segmentID = incr(segmentID);
134        storesegment->ID=segmentID;
135        storesegment->from=from;
136        storesegment->to=to;
137        storesegment->next=NULL;
138        storesegment->ways=NULL;
139        p=(struct segments **) rb_probe (segments_table, storesegment);
140        if (*p!=storesegment)
141        {
142                //item was already in list
143                free(storesegment);
144        }
145        else
146        {               
147                from->segments=attachsegment(from->segments,*p);
148                /*update to node's segment list*/
149                to->segments=attachsegment(to->segments,*p);
150        }
151       
152        return *p;
153}
154
155int compare_segments (const void *pa, const void *pb, void *param)
156{
157        const struct segments * a=pa;
158        const struct segments * b=pb;
159        return (a->ID > b->ID) - (a->ID < b->ID);
160}
161       
162
163
164
165
166void init_segments()
167{
168        if (segments_table==NULL)
169        {
170                segments_table=rb_create (compare_segments, NULL,NULL);
171        }
172        else
173        {
174                printf("error: segments_table is inited twice\n");
175                exit(1);
176        }
177        return;
178};
Note: See TracBrowser for help on using the repository browser.