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

Last change on this file since 4361 was 4361, checked in by martinvoosterhout, 13 years ago

Add progress display for final output...

File size: 3.1 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                int count = 0;
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                        count++;
109                        if( (count%1024) == 0 )
110                                fprintf(stderr, "\rExporting segments: %d ", count);
111                        saveSegment(p);
112                }
113                fprintf(stderr, "\rExported segments: %d \n", count);
114        }
115}
116
117void deleteSegment(struct segments * p)
118{
119        rb_delete (segments_table, (const void *) p);
120}
121 
122
123
124struct segments * addSegment(struct nodes * from, struct nodes * to)
125{
126        static long segmentID=0;
127        struct segments * storesegment;
128        struct segments ** p;
129        storesegment = (struct segments *) calloc(1,sizeof(struct segments));
130        if (storesegment==NULL)
131        {
132                fprintf(stderr,"out of memory\n");
133                exit(1);
134        }
135
136
137        segmentID = incr(segmentID);
138        storesegment->ID=segmentID;
139        storesegment->from=from;
140        storesegment->to=to;
141        storesegment->next=NULL;
142        storesegment->ways=NULL;
143        p=(struct segments **) rb_probe (segments_table, storesegment);
144        if (*p!=storesegment)
145        {
146                //item was already in list
147                free(storesegment);
148        }
149        else
150        {               
151                from->segments=attachsegment(from->segments,*p);
152                /*update to node's segment list*/
153                to->segments=attachsegment(to->segments,*p);
154        }
155       
156        return *p;
157}
158
159int compare_segments (const void *pa, const void *pb, void *param)
160{
161        const struct segments * a=pa;
162        const struct segments * b=pb;
163        return (a->ID > b->ID) - (a->ID < b->ID);
164}
165       
166
167
168
169
170void init_segments()
171{
172        if (segments_table==NULL)
173        {
174                segments_table=rb_create (compare_segments, NULL,NULL);
175        }
176        else
177        {
178                printf("error: segments_table is inited twice\n");
179                exit(1);
180        }
181        return;
182};
Note: See TracBrowser for help on using the repository browser.