diff options
Diffstat (limited to 'src/vppinfra/unformat.c')
-rw-r--r-- | src/vppinfra/unformat.c | 147 |
1 files changed, 127 insertions, 20 deletions
diff --git a/src/vppinfra/unformat.c b/src/vppinfra/unformat.c index 172182f8a34..522517888c3 100644 --- a/src/vppinfra/unformat.c +++ b/src/vppinfra/unformat.c @@ -36,6 +36,7 @@ */ #include <vppinfra/format.h> +#include <fcntl.h> /* Call user's function to fill input buffer. */ __clib_export uword @@ -70,22 +71,6 @@ _unformat_fill_input (unformat_input_t * i) return i->index; } -always_inline uword -is_white_space (uword c) -{ - switch (c) - { - case ' ': - case '\t': - case '\n': - case '\r': - return 1; - - default: - return 0; - } -} - /* Format function for dumping input stream. */ __clib_export u8 * format_unformat_error (u8 * s, va_list * va) @@ -968,7 +953,7 @@ parse_fail: if (!input_matches_format) input->index = input->buffer_marks[l - 1]; - _vec_len (input->buffer_marks) = l - 1; + vec_set_len (input->buffer_marks, l - 1); } return input_matches_format; @@ -1003,7 +988,7 @@ unformat_user (unformat_input_t * input, unformat_function_t * func, ...) if (!result && input->index != UNFORMAT_END_OF_INPUT) input->index = input->buffer_marks[l]; - _vec_len (input->buffer_marks) = l; + vec_set_len (input->buffer_marks, l); return result; } @@ -1026,7 +1011,8 @@ unformat_init_command_line (unformat_input_t * input, char *argv[]) } __clib_export void -unformat_init_string (unformat_input_t * input, char *string, int string_len) +unformat_init_string (unformat_input_t *input, const char *string, + int string_len) { unformat_init (input, 0, 0); if (string_len > 0) @@ -1052,7 +1038,7 @@ clib_file_fill_buffer (unformat_input_t * input) vec_resize (input->buffer, 4096); n = read (fd, input->buffer + l, 4096); if (n > 0) - _vec_len (input->buffer) = l + n; + vec_set_len (input->buffer, l + n); if (n <= 0) return UNFORMAT_END_OF_INPUT; @@ -1060,6 +1046,13 @@ clib_file_fill_buffer (unformat_input_t * input) return input->index; } +static void +unformat_close_fd (unformat_input_t *input) +{ + int fd = pointer_to_uword (input->fill_buffer_arg); + close (fd); +} + __clib_export void unformat_init_clib_file (unformat_input_t * input, int file_descriptor) { @@ -1067,6 +1060,31 @@ unformat_init_clib_file (unformat_input_t * input, int file_descriptor) uword_to_pointer (file_descriptor, void *)); } +__clib_export uword +unformat_init_file (unformat_input_t *input, char *fmt, ...) +{ + va_list va; + u8 *path; + int fd; + + va_start (va, fmt); + path = va_format (0, fmt, &va); + va_end (va); + vec_add1 (path, 0); + + fd = open ((char *) path, 0); + vec_free (path); + + if (fd >= 0) + { + unformat_init (input, clib_file_fill_buffer, + uword_to_pointer (fd, void *)); + input->free = unformat_close_fd; + return 1; + } + return 0; +} + /* Take input from Unix environment variable. */ uword unformat_init_unix_env (unformat_input_t * input, char *var) @@ -1101,8 +1119,97 @@ unformat_data_size (unformat_input_t * input, va_list * args) return 1; } +__clib_export uword +unformat_c_string_array (unformat_input_t *input, va_list *va) +{ + char *str = va_arg (*va, char *); + u32 array_len = va_arg (*va, u32); + uword c, rv = 0; + u8 *s = 0; + + if (unformat (input, "%v", &s) == 0) + return 0; + + c = vec_len (s); + + if (c > 0 && c < array_len) + { + clib_memcpy (str, s, c); + str[c] = 0; + rv = 1; + } + + vec_free (s); + return rv; +} + +static uword +__unformat_quoted_string (unformat_input_t *input, u8 **sp, char quote) +{ + u8 *s = 0; + uword c, p = 0; + + while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT) + if (!is_white_space (c)) + break; + + if (c != quote) + return 0; + + while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT) + { + if (c == quote && p != '\\') + { + *sp = s; + return 1; + } + vec_add1 (s, c); + p = c; + } + vec_free (s); + + return 0; +} + +__clib_export uword +unformat_single_quoted_string (unformat_input_t *input, va_list *va) +{ + return __unformat_quoted_string (input, va_arg (*va, u8 **), '\''); +} + +__clib_export uword +unformat_double_quoted_string (unformat_input_t *input, va_list *va) +{ + return __unformat_quoted_string (input, va_arg (*va, u8 **), '"'); +} + #endif /* CLIB_UNIX */ +__clib_export uword +unformat_u8 (unformat_input_t *input, va_list *args) +{ + u8 *d = va_arg (*args, u8 *); + + u32 tmp; + if (!unformat (input, "%u", &tmp) || tmp > CLIB_U8_MAX) + return 0; + + *d = tmp; + return 1; +} + +__clib_export uword +unformat_u16 (unformat_input_t *input, va_list *args) +{ + u16 *d = va_arg (*args, u16 *); + + u32 tmp; + if (!unformat (input, "%u", &tmp) || tmp > CLIB_U16_MAX) + return 0; + + *d = tmp; + return 1; +} /* * fd.io coding-style-patch-verification: ON |