source: titan/titan/rcmap.h @ 39231

Last change on this file since 39231 was 23286, checked in by nit, 11 years ago

[titan] cleanup

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