clean todo list
[protos/xbee-avr.git] / parse_atcmd.c
1 /*
2  * Copyright (c) 2011, Olivier MATZ <zer0@droids-corp.org>
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of the University of California, Berkeley nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include <aversive/pgmspace.h>
29
30 #include <stdio.h>
31 #include <inttypes.h>
32 #include <ctype.h>
33 #include <string.h>
34
35 #include <parse.h>
36 #include <xbee.h>
37
38 #include "parse_atcmd.h"
39
40 static int8_t
41 parse_atcmd(PGM_P tk, const char *buf, void *res)
42 {
43         struct xbee_atcmd copy;
44         struct token_atcmd_data ad;
45         const struct xbee_atcmd *cmd;
46         char bufcopy[32];
47         uint8_t token_len = 0;
48
49         memcpy_P(&ad, &((struct token_atcmd *)tk)->atcmd_data, sizeof(ad));
50
51         while (!isendoftoken(buf[token_len]) &&
52                token_len < (sizeof(bufcopy)-1)) {
53                 bufcopy[token_len] = buf[token_len];
54                 token_len++;
55         }
56         bufcopy[token_len] = 0;
57
58         /* XXX should be related to an xbee device */
59         cmd = xbee_atcmd_lookup_desc(bufcopy);
60
61         if (cmd == NULL)
62                 return -1;
63
64         /* command must match flags */
65         memcpy_P(&copy, cmd, sizeof(copy));
66         if ((copy.flags & ad.atcmd_mask) != ad.atcmd_flags)
67                 return -1;
68         /* store the address of object in structure */
69         if (res)
70                 *(const struct xbee_atcmd **)res = cmd;
71
72         return token_len;
73 }
74
75 static int8_t complete_get_nb_atcmd(PGM_P tk)
76 {
77         struct token_atcmd_data ad;
78         const struct xbee_atcmd *cmd;
79         struct xbee_atcmd copy;
80         int8_t cnt = 0;
81
82         memcpy_P(&ad, &((struct token_atcmd *)tk)->atcmd_data, sizeof(ad));
83
84         for (cmd = &xbee_atcmd_list[0], memcpy_P(&copy, cmd, sizeof(copy));
85              copy.name != NULL;
86              cmd++, memcpy_P(&copy, cmd, sizeof(copy))) {
87
88                 if ((copy.flags & ad.atcmd_mask) == ad.atcmd_flags)
89                         cnt++;
90         }
91         return cnt;
92 }
93
94 static int8_t complete_get_elt_atcmd(PGM_P tk, int8_t idx,
95                               char *dstbuf, uint8_t size)
96 {
97         struct token_atcmd_data ad;
98         const struct xbee_atcmd *cmd;
99         struct xbee_atcmd copy;
100         int8_t cnt = 0;
101
102         memcpy_P(&ad, &((struct token_atcmd *)tk)->atcmd_data, sizeof(ad));
103
104         for (cmd = &xbee_atcmd_list[0], memcpy_P(&copy, cmd, sizeof(copy));
105              copy.name != NULL;
106              cmd++, memcpy_P(&copy, cmd, sizeof(copy))) {
107
108                 if ((copy.flags & ad.atcmd_mask) == ad.atcmd_flags) {
109                         if (cnt == idx) {
110                                 memcpy_P(dstbuf, copy.desc, size);
111                                 dstbuf[size-1] = '\0';
112
113                                 return 0;
114                         }
115                         cnt++;
116                 }
117         }
118         return -1;
119 }
120
121 static int8_t
122 help_atcmd(PGM_P tk, char *dstbuf, uint8_t size)
123 {
124         (void)tk;
125         snprintf(dstbuf, size, "ATCMD");
126         return 0;
127 }
128
129 struct token_ops token_atcmd_ops = {
130         .parse = parse_atcmd,
131         .complete_get_nb = complete_get_nb_atcmd,
132         .complete_get_elt = complete_get_elt_atcmd,
133         .get_help = help_atcmd,
134 };