X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_parse.h;h=6facb9ee19b1225a2cf67035ca66749bf5964885;hb=df9816e5e10b0552c7e29650ee21a79654af67ef;hp=8f79364edd157cae34d99203be9cef424f655c93;hpb=c60ed50ac1449a2b2bccc33598d1f68458a36fb1;p=libcmdline.git diff --git a/src/lib/cmdline_parse.h b/src/lib/cmdline_parse.h index 8f79364..6facb9e 100644 --- a/src/lib/cmdline_parse.h +++ b/src/lib/cmdline_parse.h @@ -1,3 +1,37 @@ +/*- + * Copyright (c) <2010>, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * - Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + /* * Copyright (c) 2009, Olivier MATZ * All rights reserved. @@ -34,16 +68,8 @@ #define offsetof(type, field) ((size_t) &( ((type *)0)->field) ) #endif -/* return status for parsing */ -#define CMDLINE_PARSE_SUCCESS 0 -#define CMDLINE_PARSE_AMBIGUOUS -1 -#define CMDLINE_PARSE_NOMATCH -2 -#define CMDLINE_PARSE_BAD_ARGS -3 - -/* return status for completion */ -#define CMDLINE_PARSE_COMPLETE_FINISHED 0 -#define CMDLINE_PARSE_COMPLETE_AGAIN 1 -#define CMDLINE_PARSE_COMPLETED_BUFFER 2 +#define CMDLINE_MAX_TOKEN_SIZE 128 /* including '\0' */ +#define CMDLINE_MAX_DSTBUF_SIZE 1024 /** * Stores a pointer to the ops struct, and the offset: the place to @@ -59,30 +85,46 @@ typedef struct cmdline_token_hdr cmdline_parse_token_hdr_t; * A token is defined by this structure. * * parse() takes the token as first argument, then the source buffer - * starting at the token we want to parse. The 3rd arg is a pointer - * where we store the parsed data (as binary). It returns the number of - * parsed chars on success and a negative value on error. + * containing the token we want to parse. The 3rd arg is a pointer + * where we store the parsed data (as binary), and the 4th arg is the + * size of this area. It returns 0 on success and a negative value on + * error. * - * complete_get_nb() returns the number of possible values for this - * token if completion is possible. If it is NULL or if it returns 0, - * no completion is possible. + * complete_start() prepares a completion operation. The first + * argument is the token to complete. The second argument is the token + * to complete, and the third arg is an opaque pointer that will be + * given to complete_iterate() function. It can be used to store + * private data for this completion. For each complete_start() call, + * the user must call complete_end() at the end of iterations (if + * defined). Return a negative value if completion is not possible, or + * 0 on success. * - * complete_get_elt() copy in dstbuf (the size is specified in the - * parameter) the i-th possible completion for this token. returns 0 - * on success or and a negative value on error. + * complete_iterate() copy in dstbuf (the size is specified in the + * parameter) the next possible completion for this token. Return 0 on + * success or a negative value on error (or when there is no more + * completion). Refer to cmdline_complete_string_iterate() for an + * example. * - * get_help() fills the dstbuf with the help for the token. It returns + * complete_end() is called when the iteration on this token is finished, + * this function should free all things allocated during complete_start(). + * + * help() fills the dstbuf with the help for the token. It returns * -1 on error and 0 on success. */ struct cmdline_token_ops { /** parse(token ptr, buf, res pts) */ - int (*parse)(cmdline_parse_token_hdr_t *, const char *, void *); - /** return the num of possible choices for this token */ - int (*complete_get_nb)(cmdline_parse_token_hdr_t *); - /** return the elt x for this token (token, idx, dstbuf, size) */ - int (*complete_get_elt)(cmdline_parse_token_hdr_t *, int, char *, unsigned int); + int (*parse)(cmdline_parse_token_hdr_t *, const char *, void *, + unsigned int); + /** prepare a completion on this token */ + int (*complete_start)(cmdline_parse_token_hdr_t *, const char *, + void **); + /** fill dstbuf for this token (token, opaque, dstbuf, size) */ + int (*complete_iterate)(cmdline_parse_token_hdr_t *, void **, char *, + unsigned int); + /* end of completion, used to free the opaque structure */ + void (*complete_end)(cmdline_parse_token_hdr_t *, void **); /** get help for this token (token, dstbuf, size) */ - int (*get_help)(cmdline_parse_token_hdr_t *, char *, unsigned int); + int (*help)(cmdline_parse_token_hdr_t *, char *, unsigned int); }; struct cmdline; @@ -105,43 +147,74 @@ typedef struct cmdline_inst cmdline_parse_inst_t; * instruction * */ -typedef cmdline_parse_inst_t *cmdline_parse_ctx_t; +struct cmdline_parse_ctx { + const char *name; + cmdline_parse_inst_t *insts[]; +}; +typedef struct cmdline_parse_ctx cmdline_parse_ctx_t; + +/* return status for parsing */ +#define CMDLINE_PARSE_SUCCESS 0 +#define CMDLINE_PARSE_EMPTY -1 +#define CMDLINE_PARSE_NOMATCH -2 +#define CMDLINE_PARSE_AMBIGUOUS -3 +#define CMDLINE_PARSE_UNTERMINATED_QUOTE -4 /** * Try to parse a buffer according to the specified context. The - * argument buf must ends with "\n\0". The function returns - * CMDLINE_PARSE_AMBIGUOUS, CMDLINE_PARSE_NOMATCH or - * CMDLINE_PARSE_BAD_ARGS on error. Else it calls the associated - * function (defined in the context) and returns 0 - * (CMDLINE_PARSE_SUCCESS). + * argument linebuf must end with "\n\0". + * + * The function returns: + * - CMDLINE_PARSE_SUCCESS (0) on success + * - CMDLINE_PARSE_EMPTY if there is nothing to parse + * - CMDLINE_PARSE_NOMATCH if line does not match any command + * - CMDLINE_PARSE_AMBIGUOUS if several commands match + * - CMDLINE_PARSE_UNTERMINATED_QUOTE if a quote is used incorrectly */ -int cmdline_parse(struct cmdline *cl, const char *buf); +int cmdline_parse(cmdline_parse_ctx_t *ctx, const char *linebuf, void *opaque); + +/* return status for completion */ +#define CMDLINE_COMPLETE_APPEND 0 +#define CMDLINE_COMPLETE_NONE -1 +#define CMDLINE_COMPLETE_MANY -2 /** - * complete() must be called with *state==0 (try to complete) or - * with *state==-1 (just display choices), then called without - * modifying *state until it returns CMDLINE_PARSE_COMPLETED_BUFFER or - * CMDLINE_PARSE_COMPLETED_BUFFER. - * - * It returns < 0 on error. + * cmdline_complete() tries to complete the buffer given as a parameter. * - * Else it returns: - * - CMDLINE_PARSE_COMPLETED_BUFFER on completion (one possible - * choice). In this case, the chars are appended in dst buffer. - * - CMDLINE_PARSE_COMPLETE_AGAIN if there is several possible - * choices. In this case, you must call the function again, - * keeping the value of state intact. - * - CMDLINE_PARSE_COMPLETED_BUFFER when the iteration is - * finished. The dst is not valid for this last call. - * - * The returned dst buf ends with \0. + * It returns: + * - CMDLINE_COMPLETE_APPEND (0) on success, when a completion is + * done (one possible choice). In this case, the chars are + * appended in dst buffer. + * - CMDLINE_COMPLETE_NONE: error, no possible completion + * - CMDLINE_COMPLETE_MANY: error, many possble completions, need to call + * cmdline_help() function to see all the possibilities. */ -int cmdline_complete(struct cmdline *cl, const char *buf, int *state, +int cmdline_complete(cmdline_parse_ctx_t *ctx, const char *buf, char *dst, unsigned int size); +/** + * callback given to rdline_help() to display the content of the + * help. The first argument is an opaque pointer. The other args + * are buffer and size. + */ +typedef ssize_t (cmdline_write_t)(void *, void *, size_t); + +/** + * Display a contextual help using the write_buf() function pointer + * given as parameter (called with its opaque pointer). The contextual + * help depends on the buffer given. + */ +int cmdline_help(cmdline_parse_ctx_t *ctx, const char *buf, + cmdline_write_t *write_buf, void *opaque); /* return true if(!c || iscomment(c) || isblank(c) || * isendofline(c)) */ int cmdline_isendoftoken(char c); +/* quote a string and escape original quotes */ +int cmdline_quote_token(char *dst, unsigned dstlen, const char *src); + +/* remove quote and stop when we reach the end of token */ +int cmdline_unquote_token(char *dst, unsigned dstlen, const char *src); + #endif /* _CMDLINE_PARSE_H_ */