2 * Copyright (c) 2005 Christophe Varoqui
13 return (struct key *)MALLOC(sizeof(struct key));
16 static struct handler *
19 return (struct handler *)MALLOC(sizeof(struct handler));
23 add_key (vector vec, char * str, int code, int has_param)
33 kw->has_param = has_param;
34 kw->str = STRDUP(str);
39 if (!vector_alloc_slot(vec))
42 vector_set_slot(vec, kw);
54 add_handler (int fp, int (*fn)(void *, char **, int *, void *))
63 if (!vector_alloc_slot(handlers)) {
68 vector_set_slot(handlers, h);
76 free_key (struct key * kw)
88 free_keys (vector vec)
93 vector_foreach_slot (vec, kw, i)
100 free_handlers (vector vec)
105 vector_foreach_slot (vec, h, i)
115 keys = vector_alloc();
120 r += add_key(keys, "list", LIST, 0);
121 r += add_key(keys, "show", LIST, 0);
122 r += add_key(keys, "add", ADD, 0);
123 r += add_key(keys, "remove", DEL, 0);
124 r += add_key(keys, "del", DEL, 0);
125 r += add_key(keys, "switch", SWITCH, 0);
126 r += add_key(keys, "switchgroup", SWITCH, 0);
127 r += add_key(keys, "suspend", SUSPEND, 0);
128 r += add_key(keys, "resume", RESUME, 0);
129 r += add_key(keys, "reinstate", REINSTATE, 0);
130 r += add_key(keys, "fail", FAIL, 0);
131 r += add_key(keys, "paths", PATHS, 0);
132 r += add_key(keys, "maps", MAPS, 0);
133 r += add_key(keys, "path", PATH, 1);
134 r += add_key(keys, "map", MAP, 1);
135 r += add_key(keys, "group", GROUP, 1);
136 r += add_key(keys, "dump", DUMP, 0);
137 r += add_key(keys, "pathvec", PATHVEC, 0);
138 r += add_key(keys, "reconfigure", RECONFIGURE, 0);
150 find_key (char * str)
153 struct key * kw = NULL;
155 vector_foreach_slot (keys, kw, i)
156 if (strlen(str) == strlen(kw->str) &&
157 !strcmp(kw->str, str))
163 static struct handler *
164 find_handler (int fp)
169 vector_foreach_slot (handlers, h, i)
170 if (h->fingerprint == fp)
177 get_cmdvec (char * cmd)
182 struct key * kw = NULL;
183 struct key * cmdkw = NULL;
186 cmdvec = vector_alloc();
192 fwd = get_word(p, &buff);
202 goto out; /* synthax error */
209 if (!vector_alloc_slot(cmdvec)) {
214 vector_set_slot(cmdvec, cmdkw);
215 cmdkw->code = kw->code;
216 cmdkw->has_param = kw->has_param;
222 fwd = get_word(p, &buff);
240 fingerprint(vector vec)
246 vector_foreach_slot(vec, kw, i)
253 alloc_handlers (void)
255 handlers = vector_alloc();
264 genhelp_sprint_aliases (char * reply, vector keys, struct key * refkw)
269 vector_foreach_slot (keys, kw, i)
270 if (kw->code == refkw->code && kw != refkw)
271 fwd += sprintf(reply, "|%s", kw->str);
277 genhelp_handler (void)
286 reply = MALLOC(INITIAL_REPLY_LEN);
293 vector_foreach_slot (handlers, h, i) {
295 vector_foreach_slot (keys, kw, j) {
296 if ((kw->code & fp)) {
298 p += sprintf(p, " %s", kw->str);
299 p += genhelp_sprint_aliases(p, keys, kw);
302 p += sprintf(p, " $%s", kw->str);
305 p += sprintf(p, "\n");
312 parse_cmd (char * cmd, char ** reply, int * len, void * data)
316 vector cmdvec = get_cmdvec(cmd);
319 *reply = genhelp_handler();
320 *len = strlen(*reply) + 1;
324 h = find_handler(fingerprint(cmdvec));
327 *reply = genhelp_handler();
328 *len = strlen(*reply) + 1;
335 r = h->fn(cmdvec, reply, len, data);
342 get_keyparam (vector v, int code)
347 vector_foreach_slot(v, kw, i)
348 if (kw->code == code)