Nova versão do IRPF 2021.
[cascardo/declara.git] / lib / cmd.c
1 /*
2  *  Copyright (C) 2015  Thadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License along
15  *  with this program; if not, write to the Free Software Foundation, Inc.,
16  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18
19 #include "cmd.h"
20 #include "pmhash.h"
21 #include "token.h"
22 #include <errno.h>
23 #include <stdlib.h>
24
25 struct pmhash *cmds;
26
27 int cmd_init(void)
28 {
29         cmds = pmhash_new();
30         if (!cmds)
31                 return -errno;
32         return 0;
33 }
34
35 int cmd_add(struct cmd *cmd)
36 {
37         return pmhash_add(&cmds, cmd->name, cmd);
38 }
39
40 int cmd_run(struct declaracao *dec, char *line)
41 {
42         char **args = tokens_new(line);
43         struct cmd *cmd;
44         int r;
45         int argc;
46         if (!args || !args[0])
47                 return -errno;
48         for (argc = 0; args[argc]; argc++);
49         cmd = pmhash_get(cmds, args[0]);
50         if (!cmd || !cmd->run) {
51                 tokens_free(args);
52                 return -EINVAL;
53         }
54         r = cmd->run(dec, args, argc);
55         tokens_free(args);
56         return r;
57 }
58
59 struct cmd * cmd_next(void **iter)
60 {
61         return pmhash_next(cmds, iter);
62 }