summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vppinfra/format.h4
-rw-r--r--src/vppinfra/unformat.c40
2 files changed, 44 insertions, 0 deletions
diff --git a/src/vppinfra/format.h b/src/vppinfra/format.h
index cf5e1f6dcce..24511735a53 100644
--- a/src/vppinfra/format.h
+++ b/src/vppinfra/format.h
@@ -312,6 +312,10 @@ unformat_function_t unformat_memory_size;
/* Unformat C string array, takes array length as 2nd argument */
unformat_function_t unformat_c_string_array;
+/* Unformat sigle and double quoted string */
+unformat_function_t unformat_single_quoted_string;
+unformat_function_t unformat_double_quoted_string;
+
/* Format base 10 e.g. 100, 100K, 100M, 100G */
u8 *format_base10 (u8 *s, va_list *va);
diff --git a/src/vppinfra/unformat.c b/src/vppinfra/unformat.c
index cea5b677dec..fe1a46e4a12 100644
--- a/src/vppinfra/unformat.c
+++ b/src/vppinfra/unformat.c
@@ -1143,6 +1143,46 @@ unformat_c_string_array (unformat_input_t *input, va_list *va)
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 */