remove version in all files
[dpdk.git] / lib / librte_cmdline / cmdline_parse.h
1 /*-
2  *   BSD LICENSE
3  * 
4  *   Copyright(c) 2010-2012 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  * 
7  *   Redistribution and use in source and binary forms, with or without 
8  *   modification, are permitted provided that the following conditions 
9  *   are met:
10  * 
11  *     * Redistributions of source code must retain the above copyright 
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright 
14  *       notice, this list of conditions and the following disclaimer in 
15  *       the documentation and/or other materials provided with the 
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its 
18  *       contributors may be used to endorse or promote products derived 
19  *       from this software without specific prior written permission.
20  * 
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  * 
33  */
34
35 /*
36  * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org>
37  * All rights reserved.
38  * Redistribution and use in source and binary forms, with or without
39  * modification, are permitted provided that the following conditions are met:
40  *
41  *     * Redistributions of source code must retain the above copyright
42  *       notice, this list of conditions and the following disclaimer.
43  *     * Redistributions in binary form must reproduce the above copyright
44  *       notice, this list of conditions and the following disclaimer in the
45  *       documentation and/or other materials provided with the distribution.
46  *     * Neither the name of the University of California, Berkeley nor the
47  *       names of its contributors may be used to endorse or promote products
48  *       derived from this software without specific prior written permission.
49  *
50  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
51  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
52  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
53  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
54  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
55  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
56  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
57  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60  */
61
62 #ifndef _CMDLINE_PARSE_H_
63 #define _CMDLINE_PARSE_H_
64
65 #ifdef __cplusplus
66 extern "C" {
67 #endif
68
69 #ifndef offsetof
70 #define offsetof(type, field)  ((size_t) &( ((type *)0)->field) )
71 #endif
72
73 /* return status for parsing */
74 #define CMDLINE_PARSE_SUCCESS        0
75 #define CMDLINE_PARSE_AMBIGUOUS     -1
76 #define CMDLINE_PARSE_NOMATCH       -2
77 #define CMDLINE_PARSE_BAD_ARGS      -3
78
79 /* return status for completion */
80 #define CMDLINE_PARSE_COMPLETE_FINISHED 0
81 #define CMDLINE_PARSE_COMPLETE_AGAIN    1
82 #define CMDLINE_PARSE_COMPLETED_BUFFER  2
83
84 /**
85  * Stores a pointer to the ops struct, and the offset: the place to
86  * write the parsed result in the destination structure.
87  */
88 struct cmdline_token_hdr {
89         struct cmdline_token_ops *ops;
90         unsigned int offset;
91 };
92 typedef struct cmdline_token_hdr cmdline_parse_token_hdr_t;
93
94 /**
95  * A token is defined by this structure.
96  *
97  * parse() takes the token as first argument, then the source buffer
98  * starting at the token we want to parse. The 3rd arg is a pointer
99  * where we store the parsed data (as binary). It returns the number of
100  * parsed chars on success and a negative value on error.
101  *
102  * complete_get_nb() returns the number of possible values for this
103  * token if completion is possible. If it is NULL or if it returns 0,
104  * no completion is possible.
105  *
106  * complete_get_elt() copy in dstbuf (the size is specified in the
107  * parameter) the i-th possible completion for this token.  returns 0
108  * on success or and a negative value on error.
109  *
110  * get_help() fills the dstbuf with the help for the token. It returns
111  * -1 on error and 0 on success.
112  */
113 struct cmdline_token_ops {
114         /** parse(token ptr, buf, res pts) */
115         int (*parse)(cmdline_parse_token_hdr_t *, const char *, void *);
116         /** return the num of possible choices for this token */
117         int (*complete_get_nb)(cmdline_parse_token_hdr_t *);
118         /** return the elt x for this token (token, idx, dstbuf, size) */
119         int (*complete_get_elt)(cmdline_parse_token_hdr_t *, int, char *, unsigned int);
120         /** get help for this token (token, dstbuf, size) */
121         int (*get_help)(cmdline_parse_token_hdr_t *, char *, unsigned int);
122 };
123
124 struct cmdline;
125 /**
126  * Store a instruction, which is a pointer to a callback function and
127  * its parameter that is called when the instruction is parsed, a help
128  * string, and a list of token composing this instruction.
129  */
130 struct cmdline_inst {
131         /* f(parsed_struct, data) */
132         void (*f)(void *, struct cmdline *, void *);
133         void *data;
134         const char *help_str;
135         cmdline_parse_token_hdr_t *tokens[];
136 };
137 typedef struct cmdline_inst cmdline_parse_inst_t;
138
139 /**
140  * A context is identified by its name, and contains a list of
141  * instruction
142  *
143  */
144 typedef cmdline_parse_inst_t *cmdline_parse_ctx_t;
145
146 /**
147  * Try to parse a buffer according to the specified context. The
148  * argument buf must ends with "\n\0". The function returns
149  * CMDLINE_PARSE_AMBIGUOUS, CMDLINE_PARSE_NOMATCH or
150  * CMDLINE_PARSE_BAD_ARGS on error. Else it calls the associated
151  * function (defined in the context) and returns 0
152  * (CMDLINE_PARSE_SUCCESS).
153  */
154 int cmdline_parse(struct cmdline *cl, const char *buf);
155
156 /**
157  * complete() must be called with *state==0 (try to complete) or
158  * with *state==-1 (just display choices), then called without
159  * modifying *state until it returns CMDLINE_PARSE_COMPLETED_BUFFER or
160  * CMDLINE_PARSE_COMPLETED_BUFFER.
161  *
162  * It returns < 0 on error.
163  *
164  * Else it returns:
165  *   - CMDLINE_PARSE_COMPLETED_BUFFER on completion (one possible
166  *     choice). In this case, the chars are appended in dst buffer.
167  *   - CMDLINE_PARSE_COMPLETE_AGAIN if there is several possible
168  *     choices. In this case, you must call the function again,
169  *     keeping the value of state intact.
170  *   - CMDLINE_PARSE_COMPLETED_BUFFER when the iteration is
171  *     finished. The dst is not valid for this last call.
172  *
173  * The returned dst buf ends with \0.
174  */
175 int cmdline_complete(struct cmdline *cl, const char *buf, int *state,
176                      char *dst, unsigned int size);
177
178
179 /* return true if(!c || iscomment(c) || isblank(c) ||
180  * isendofline(c)) */
181 int cmdline_isendoftoken(char c);
182
183 #ifdef __cplusplus
184 }
185 #endif
186
187 #endif /* _CMDLINE_PARSE_H_ */