source: subversion/applications/utils/export/osm2pgsql/experimental/keyvals.c @ 2826

Revision 2826, 2.4 KB checked in by jonb, 7 years ago (diff)

osm2pgsql: Mac OS-X and GEOS-3 compatability tweaks

Line 
1/* Common key-value list processing
2 *
3 * Used as a small general purpose store for
4 * tags, segment lists etc
5 *
6 */
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include <assert.h>
11#include "keyvals.h"
12
13
14void initList(struct keyval *head)
15{
16    assert(head);
17
18    head->next = head;
19    head->prev = head;
20    head->key = NULL;
21    head->value = NULL;
22}
23
24void freeItem(struct keyval *p)
25{
26    if (!p) 
27        return;
28
29    free(p->key);
30    free(p->value);
31    free(p);
32}
33
34
35unsigned int countList(struct keyval *head) 
36{
37    struct keyval *p;
38    unsigned int count = 0;     
39
40    if (!head) 
41        return 0;
42
43    p = head->next;
44    while(p != head) {
45        count++;
46        p = p->next;
47    }
48    return count;
49}
50
51int listHasData(struct keyval *head) 
52{
53    if (!head) 
54        return 0;
55
56    return (head->next != head);
57}
58
59
60char *getItem(struct keyval *head, const char *name)
61{
62    struct keyval *p;
63
64    if (!head) 
65        return NULL;
66
67    p = head->next;
68    while(p != head) {
69        if (!strcmp(p->key, name))
70            return p->value;
71        p = p->next;
72    }
73    return NULL;
74}       
75
76
77struct keyval *popItem(struct keyval *head)
78{
79    struct keyval *p;
80
81    if (!head) 
82        return NULL;
83 
84    p = head->next;
85    if (p == head)
86        return NULL;
87
88    head->next = p->next;
89    p->next->prev = head;
90
91    p->next = NULL;
92    p->prev = NULL;
93
94    return p;
95}       
96
97
98void pushItem(struct keyval *head, struct keyval *item)
99{
100    assert(head);
101    assert(item);
102 
103    item->next = head;
104    item->prev = head->prev;
105    head->prev->next = item;
106    head->prev = item;
107}       
108
109int addItem(struct keyval *head, const char *name, const char *value, int noDupe)
110{
111    struct keyval *item;
112
113    assert(head);
114    assert(name);
115    assert(value);
116
117    if (noDupe) {
118        item = head->next;
119        while (item != head) {
120            if (!strcmp(item->value, value) && !strcmp(item->key, name))
121                return 1;
122            item = item->next;
123        }
124    }
125
126    item = malloc(sizeof(struct keyval));
127
128    if (!item) {
129        fprintf(stderr, "Error allocating keyval\n");
130        return 2;
131    }
132
133    item->key   = strdup(name);
134    item->value = strdup(value);
135
136    item->next = head->next;
137    item->prev = head;
138    head->next->prev = item;
139    head->next = item;
140
141    return 0;
142}
143
144void resetList(struct keyval *head) 
145{
146    struct keyval *item;
147       
148    while((item = popItem(head))) 
149        freeItem(item);
150}
151
Note: See TracBrowser for help on using the repository browser.