X-Git-Url: http://git.droids-corp.org/?p=libcmdline.git;a=blobdiff_plain;f=src%2Flib%2Fcmdline_parse.h;h=5112ab5c9bc04fc3a350ab72545eb05ba209850d;hp=e9e63080a074594f63711ac3336a63e69b6ada99;hb=f32d30f48ddfb55b86efd695e0dd144e9d15401e;hpb=b1d5b169352e57df3fc14c51ffad4b83f3e5613f diff --git a/src/lib/cmdline_parse.h b/src/lib/cmdline_parse.h index e9e6308..5112ab5 100644 --- a/src/lib/cmdline_parse.h +++ b/src/lib/cmdline_parse.h @@ -68,18 +68,6 @@ #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 -#define CMDLINE_PARSE_UNTERMINATED_QUOTE -4 - -/* 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 @@ -97,33 +85,44 @@ 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 + * 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 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_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. * - * complete_get_elt() copy in dstbuf (the size is specified in the - * parameter) the i-th possible completion for this token. Return 0 - * on success or a negative value on error. + * complete_end() is called when the iteration on this token is finished, + * this function should free all things allocated during complete_start(). * - * get_help() fills the dstbuf with the help for the token. It returns + * 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 *, unsigned int); - /** 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 *, + /** prepare a completion on this token */ + int (*complete_start)(cmdline_parse_token_hdr_t *, 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; @@ -146,40 +145,65 @@ 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)) */