source: titan/titan/rcmap.h @ 22550

Last change on this file since 22550 was 19467, checked in by nit, 11 years ago

[titan] optimize

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*)calloc(1, 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
26        key = malloc(MINMALLOC);
27        if(key == NULL)
28        {
29                err("no memory");
30                free(newnode);
31                free(name);
32                return NULL;
33        }
34
35        newkey = malloc(MINMALLOC);
36        if(newkey == NULL)
37        {
38                err("no memory");
39                free(newnode);
40                free(name);
41                free(key);
42                return NULL;
43        }
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 = ostrshrink(name);
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, len = 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                len = strlen(fileline) - 1;
121                if(len >= 0 && fileline[len] == '\n')
122                        fileline[len] = '\0';
123                len--;
124                if(len >= 0 && fileline[len] == '\r')
125                        fileline[len] = '\0';
126
127                linecount++;
128
129                if(last == NULL) last = tmplast;
130                last = addrcmap(fileline, linecount, last);
131                if(last != NULL) tmplast = last;
132        }
133
134        free(fileline);
135        fclose(fd);
136        return 0;
137}
138
139void delrcmap(char* name)
140{
141        debug(1000, "in");
142        struct rcmap *node = rcmap, *prev = rcmap;
143
144        while(node != NULL)
145        {
146                if(ostrcmp(node->name, name) == 0)
147                {
148                        if(node == rcmap)
149                                rcmap = node->next;
150                        else
151                                prev->next = node->next;
152
153                        free(node->name);
154                        node->name = NULL;
155
156                        free(node);
157                        node = NULL;
158                        break;
159                }
160
161                prev = node;
162                node = node->next;
163        }
164        debug(1000, "out");
165}
166
167struct rcmap* getrcmap(char* name, int key)
168{
169        debug(1000, "in");
170        struct rcmap *node = rcmap;
171
172        while(node != NULL)
173        {
174                if(ostrcmp(node->name, name) == 0 && node->key == key)
175                {
176                        debug(1000, "out");
177                        return node;
178                }
179
180                node = node->next;
181        }
182        debug(100, "rcmap not found (name=%s, key=%d)", name, key);
183        return NULL;
184}
185
186void freercmap()
187{
188        debug(1000, "in");
189        struct rcmap *node = rcmap, *prev = rcmap;
190
191        while(node != NULL)
192        {
193                prev = node;
194                node = node->next;
195                if(prev != NULL)
196                        delrcmap(prev->name);
197        }
198        debug(1000, "out");
199}
200
201#endif
Note: See TracBrowser for help on using the repository browser.