Adiciona comando de rendimento.
[cascardo/declara.git] / base.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 <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <errno.h>
24 #include "rendimento.h"
25
26 static int set_int(char **args, int argc, int *val)
27 {
28         char *end = NULL;
29         if (argc != 2)
30                 return -EINVAL;
31         errno = 0;
32         *val = strtol(args[1], &end, 0);
33         if (end && *end)
34                 return -EINVAL;
35         if (errno == ERANGE)
36                 return -ERANGE;
37         return 0;
38 }
39
40 static int set_string(char **args, int argc, char **str)
41 {
42         if (argc != 2)
43                 return -EINVAL;
44         *str = strdup(args[1]);
45         if (!*str)
46                 return -errno;
47         return 0;
48 }
49
50 #define SET_INT(attr) \
51 static int run_##attr(struct declaracao *dec, char **args, int argc) \
52 { \
53         int val; \
54         int r = set_int(args, argc, &val); \
55         if (r) \
56                 return r; \
57         dec->attr = val; \
58         return 0; \
59 } \
60 static struct cmd cmd_##attr = { \
61         .name = #attr, \
62         .run = run_##attr, \
63 };
64
65 #define SET_STRING(attr) \
66 static int run_##attr(struct declaracao *dec, char **args, int argc) \
67 { \
68         char *val; \
69         int r = set_string(args, argc, &val); \
70         if (r) \
71                 return r; \
72         dec->attr = val; \
73         return 0; \
74 } \
75 static struct cmd cmd_##attr = { \
76         .name = #attr, \
77         .run = run_##attr, \
78 }
79
80 SET_INT(ano);
81 SET_STRING(cpf);
82 SET_STRING(nome);
83
84 static int run_dump(struct declaracao *dec, char **args, int argc)
85 {
86         printf("ano: %d\n", dec->ano);
87         printf("cpf: %s\n", dec->cpf);
88         printf("nome: %s\n", dec->nome);
89         rendimento_dump(dec);
90         return 0;
91 }
92
93 static struct cmd cmd_dump = {
94         .name = "dump",
95         .run = run_dump,
96 };
97
98 int base_cmd_init(void)
99 {
100         cmd_add(&cmd_dump);
101         cmd_add(&cmd_ano);
102         cmd_add(&cmd_cpf);
103         cmd_add(&cmd_nome);
104         return 0;
105 }