source: titan/titan/rcmap.h @ 15272

Last change on this file since 15272 was 10174, checked in by nit, 13 years ago

[titan] fix sort in all lists

File size: 3.2 KB
Line 
1#ifndef RCMAP_H
2#define RCMAP_H
3
4struct rcmap* addrcmap(char *line, int count, struct rcmap* last)
5{
6        debug(1000, "in");
7        struct rcmap *newnode = NULL, *prev = NULL, *node = rcmap;
8        char *name = NULL, *key = NULL, *newkey = NULL;
9        int ret = 0;
10
11        newnode = (struct rcmap*)malloc(sizeof(struct rcmap)); 
12        if(newnode == NULL)
13        {
14                err("no memory");
15                return NULL;
16        }
17
18        name = malloc(MINMALLOC);
19        if(name == NULL)
20        {
21                err("no memory");
22                free(newnode);
23                return NULL;
24        }
25        key = malloc(MINMALLOC);
26        if(key == NULL)
27        {
28                err("no memory");
29                free(newnode);
30                free(name);
31                return NULL;
32        }
33        newkey = malloc(MINMALLOC);
34        if(newkey == NULL)
35        {
36                err("no memory");
37                free(newnode);
38                free(name);
39                free(key);
40                return NULL;
41        }
42
43        memset(newnode, 0, sizeof(struct rcmap));
44
45        ret = sscanf(line, "%[^#]#%[^#]#%[^#]", name, key, newkey);
46        if(ret != 3)
47        {
48                if(count > 0)
49                {
50                        err("rcmap line %d not ok", count);
51                }
52                else
53                {
54                        err("add rcmap");
55                }
56                free(name);
57                free(key);
58                free(newkey);
59                free(newnode);
60                return NULL;
61        }
62
63        newnode->name = ostrcat(name, "", 1, 0);
64        newnode->key = getrcconfigint(key, NULL);
65        free(key); key = NULL;
66        newnode->newkey = getrcconfigint(newkey, NULL);
67        free(newkey); newkey = NULL;
68
69        if(last == NULL)
70        {
71                while(node != NULL && strcoll(newnode->name, node->name) > 0)
72                {
73                        prev = node;
74                        node = node->next;
75                }
76        }
77        else
78        {
79                prev = last;
80                node = last->next;
81        }
82
83        if(prev == NULL)
84                rcmap = newnode;
85        else
86                prev->next = newnode;
87        newnode->next = node;
88
89        debug(1000, "out");
90        return newnode;
91}
92
93int readrcmap(const char* filename)
94{
95        debug(1000, "in");
96        FILE *fd = NULL;
97        char *fileline = NULL;
98        int linecount = 0;
99        struct rcmap* last = NULL, *tmplast = NULL;
100
101        fileline = malloc(MINMALLOC);
102        if(fileline == NULL)
103        {
104                err("no memory");
105                return 1;
106        }
107
108        fd = fopen(filename, "r");
109        if(fd == NULL)
110        {
111                perr("can't open %s", filename);
112                free(fileline);
113                return 1;
114        }
115
116        while(fgets(fileline, MINMALLOC, fd) != NULL)
117        {
118                if(fileline[0] == '#' || fileline[0] == '\n')
119                        continue;
120                if(fileline[strlen(fileline) - 1] == '\n')
121                        fileline[strlen(fileline) - 1] = '\0';
122                if(fileline[strlen(fileline) - 1] == '\r')
123                        fileline[strlen(fileline) - 1] = '\0';
124
125                linecount++;
126
127                if(last == NULL) last = tmplast;
128                last = addrcmap(fileline, linecount, last);
129                if(last != NULL) tmplast = last;
130        }
131
132        free(fileline);
133        fclose(fd);
134        return 0;
135}
136
137void delrcmap(char* name)
138{
139        debug(1000, "in");
140        struct rcmap *node = rcmap, *prev = rcmap;
141
142        while(node != NULL)
143        {
144                if(ostrcmp(node->name, name) == 0)
145                {
146                        if(node == rcmap)
147                                rcmap = node->next;
148                        else
149                                prev->next = node->next;
150
151                        free(node->name);
152                        node->name = NULL;
153
154                        free(node);
155                        node = NULL;
156                        break;
157                }
158
159                prev = node;
160                node = node->next;
161        }
162        debug(1000, "out");
163}
164
165struct rcmap* getrcmap(char* name, int key)
166{
167        debug(1000, "in");
168        struct rcmap *node = rcmap;
169
170        while(node != NULL)
171        {
172                if(ostrcmp(node->name, name) == 0 && node->key == key)
173                {
174                        debug(1000, "out");
175                        return node;
176                }
177
178                node = node->next;
179        }
180        debug(100, "rcmap not found (name=%s, key=%d)", name, key);
181        return NULL;
182}
183
184void freercmap()
185{
186        debug(1000, "in");
187        struct rcmap *node = rcmap, *prev = rcmap;
188
189        while(node != NULL)
190        {
191                prev = node;
192                node = node->next;
193                if(prev != NULL)
194                        delrcmap(prev->name);
195        }
196        debug(1000, "out");
197}
198
199#endif
Note: See TracBrowser for help on using the repository browser.