joystick: axis & button are 16 bit
[protos/xbee.git] / parse_neighbor.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 <stdio.h>
29 #include <inttypes.h>
30 #include <ctype.h>
31 #include <string.h>
32 #include <sys/queue.h>
33
34 #include <cmdline_parse.h>
35
36 #include "xbee_neighbor.h"
37 #include "xbee_atcmd.h"
38 #include "xbee_stats.h"
39 #include "xbee_buf.h"
40 #include "xbee_proto.h"
41 #include "xbee.h"
42
43 #include "parse_neighbor.h"
44
45 static int
46 parse_neighbor(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
47                unsigned ressize)
48 {
49         struct token_neighbor *tk2 = (struct token_neighbor *)tk;
50         struct token_neighbor_data *tkd = &tk2->neighbor_data;
51         struct xbee_dev *dev = *tkd->xbee_dev;
52         struct xbee_neigh *neigh;
53
54         if (res && ressize < sizeof(struct xbee_neigh *))
55                 return -1;
56
57         neigh = xbee_neigh_lookup(dev, buf);
58         if (neigh == NULL) /* not found */
59                 return -1;
60
61         /* store the address of xbee_neigh in structure */
62         if (res)
63                 *(struct xbee_neigh **)res = neigh;
64
65         return 0;
66 }
67
68 static int
69 complete_neighbor_start(cmdline_parse_token_hdr_t *tk,
70                         __attribute__((unused)) const char *tokstr,
71                         void **opaque)
72 {
73         struct token_neighbor *tk2 = (struct token_neighbor *)tk;
74         struct token_neighbor_data *tkd = &tk2->neighbor_data;
75         struct xbee_dev *dev = *tkd->xbee_dev;
76         struct xbee_neigh *neigh;
77
78         neigh = LIST_FIRST(&dev->neigh_list);
79         *opaque = (void *)neigh;
80         if (neigh == NULL)
81                 return -1; /* no completion */
82         return 0;
83 }
84
85 static int
86 complete_neighbor_iterate(cmdline_parse_token_hdr_t *tk, void **opaque,
87                           char *dstbuf, unsigned int size)
88 {
89         struct xbee_neigh *neigh;
90         int len;
91
92         neigh = *opaque;
93         if (neigh == NULL)
94                 return -1;
95
96         len = snprintf(dstbuf, size, "%s", neigh->name);
97         if (len < 0 || len >= size)
98                 return -1;
99
100         strcpy(dstbuf, neigh->name);
101         neigh = LIST_NEXT(neigh, next);
102         *opaque = neigh;
103         return 0;
104 }
105
106
107 static int
108 cmdline_help_neighbor(cmdline_parse_token_hdr_t *tk, char *dstbuf,
109                       unsigned int size)
110 {
111         snprintf(dstbuf, size, "Neighbor");
112         return 0;
113 }
114
115 struct cmdline_token_ops token_neighbor_ops = {
116         .parse = parse_neighbor,
117         .complete_start = complete_neighbor_start,
118         .complete_iterate = complete_neighbor_iterate,
119         .complete_end = NULL,
120         .help = cmdline_help_neighbor,
121 };