vppinfra: explicitly export symbols
[vpp.git] / src / vppinfra / unformat.c
index f626f05..4d9679b 100644 (file)
@@ -38,7 +38,7 @@
 #include <vppinfra/format.h>
 
 /* Call user's function to fill input buffer. */
-uword
+__clib_export uword
 _unformat_fill_input (unformat_input_t * i)
 {
   uword l, first_mark;
@@ -87,7 +87,7 @@ is_white_space (uword c)
 }
 
 /* Format function for dumping input stream. */
-u8 *
+__clib_export u8 *
 format_unformat_error (u8 * s, va_list * va)
 {
   unformat_input_t *i = va_arg (*va, unformat_input_t *);
@@ -139,7 +139,7 @@ format_unformat_error (u8 * s, va_list * va)
 }
 
 /* Print everything: not just error context. */
-u8 *
+__clib_export u8 *
 format_unformat_input (u8 * s, va_list * va)
 {
   unformat_input_t *i = va_arg (*va, unformat_input_t *);
@@ -167,7 +167,7 @@ di (unformat_input_t * i)
 #endif
 
 /* Parse delimited vector string.  If string starts with { then string
-   is delimited by balenced parenthesis.  Other string is delimited by
+   is delimited by balanced parenthesis.  Other string is delimited by
    white space.  {} were chosen since they are special to the shell. */
 static uword
 unformat_string (unformat_input_t * input,
@@ -268,7 +268,7 @@ done:
   return 1;
 }
 
-uword
+__clib_export uword
 unformat_hex_string (unformat_input_t * input, va_list * va)
 {
   u8 **hexstring_return = va_arg (*va, u8 **);
@@ -317,14 +317,14 @@ unformat_hex_string (unformat_input_t * input, va_list * va)
 }
 
 /* unformat (input "foo%U", unformat_eof) matches terminal foo only */
-uword
+__clib_export uword
 unformat_eof (unformat_input_t * input, va_list * va)
 {
   return unformat_check_input (input) == UNFORMAT_END_OF_INPUT;
 }
 
 /* Parse a token containing given set of characters. */
-uword
+__clib_export uword
 unformat_token (unformat_input_t * input, va_list * va)
 {
   u8 *token_chars = va_arg (*va, u8 *);
@@ -335,11 +335,17 @@ unformat_token (unformat_input_t * input, va_list * va)
   if (!token_chars)
     token_chars = (u8 *) "a-zA-Z0-9_";
 
-  memset (map, 0, sizeof (map));
+  clib_memset (map, 0, sizeof (map));
   for (s = token_chars; *s;)
     {
-      /* Parse range. */
-      if (s[0] < s[2] && s[1] == '-')
+      /*
+       * Parse range.
+       * The test order is important: s[1] is valid because s[0] != '\0' but
+       * s[2] might not if s[1] == '\0'
+       * Also, if s[1] == '-' but s[2] == '\0' the test s[0] < s[2] will
+       * (correctly) fail
+       */
+      if (s[1] == '-' && s[0] < s[2])
        {
          for (i = s[0]; i <= s[2]; i++)
            map[i] = 1;
@@ -373,7 +379,7 @@ unformat_token (unformat_input_t * input, va_list * va)
 
 /* Unformat (parse) function which reads a %s string and converts it
    to and unformat_input_t. */
-uword
+__clib_export uword
 unformat_input (unformat_input_t * i, va_list * args)
 {
   unformat_input_t *sub_input = va_arg (*args, unformat_input_t *);
@@ -389,7 +395,7 @@ unformat_input (unformat_input_t * i, va_list * args)
 }
 
 /* Parse a line ending with \n and return it. */
-uword
+__clib_export uword
 unformat_line (unformat_input_t * i, va_list * va)
 {
   u8 *line = 0, **result = va_arg (*va, u8 **);
@@ -401,16 +407,17 @@ unformat_line (unformat_input_t * i, va_list * va)
     }
 
   *result = line;
-  return 1;
+  return vec_len (line);
 }
 
 /* Parse a line ending with \n and return it as an unformat_input_t. */
-uword
+__clib_export uword
 unformat_line_input (unformat_input_t * i, va_list * va)
 {
   unformat_input_t *result = va_arg (*va, unformat_input_t *);
   u8 *line;
-  unformat_user (i, unformat_line, &line);
+  if (!unformat_user (i, unformat_line, &line))
+    return 0;
   unformat_init_vector (result, line);
   return 1;
 }
@@ -575,9 +582,9 @@ unformat_float (unformat_input_t * input, va_list * va)
   uword signs[2], sign_index = 0;
   uword n_input = 0;
 
-  memset (values, 0, sizeof (values));
-  memset (n_digits, 0, sizeof (n_digits));
-  memset (signs, 0, sizeof (signs));
+  clib_memset (values, 0, sizeof (values));
+  clib_memset (n_digits, 0, sizeof (n_digits));
+  clib_memset (signs, 0, sizeof (signs));
 
   while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
     {
@@ -810,7 +817,7 @@ do_percent (unformat_input_t * input, va_list * va, const char *f)
   return n ? f : 0;
 }
 
-uword
+__clib_export uword
 unformat_skip_white_space (unformat_input_t * input)
 {
   uword n = 0;
@@ -967,7 +974,7 @@ parse_fail:
   return input_matches_format;
 }
 
-uword
+__clib_export uword
 unformat (unformat_input_t * input, const char *fmt, ...)
 {
   va_list va;
@@ -978,7 +985,7 @@ unformat (unformat_input_t * input, const char *fmt, ...)
   return result;
 }
 
-uword
+__clib_export uword
 unformat_user (unformat_input_t * input, unformat_function_t * func, ...)
 {
   va_list va;
@@ -1002,7 +1009,7 @@ unformat_user (unformat_input_t * input, unformat_function_t * func, ...)
 }
 
 /* Setup for unformat of Unix style command line. */
-void
+__clib_export void
 unformat_init_command_line (unformat_input_t * input, char *argv[])
 {
   uword i;
@@ -1018,7 +1025,7 @@ unformat_init_command_line (unformat_input_t * input, char *argv[])
     }
 }
 
-void
+__clib_export void
 unformat_init_string (unformat_input_t * input, char *string, int string_len)
 {
   unformat_init (input, 0, 0);
@@ -1026,7 +1033,7 @@ unformat_init_string (unformat_input_t * input, char *string, int string_len)
     vec_add (input->buffer, string, string_len);
 }
 
-void
+__clib_export void
 unformat_init_vector (unformat_input_t * input, u8 * vector_string)
 {
   unformat_init (input, 0, 0);
@@ -1036,7 +1043,7 @@ unformat_init_vector (unformat_input_t * input, u8 * vector_string)
 #ifdef CLIB_UNIX
 
 static uword
-unix_file_fill_buffer (unformat_input_t * input)
+clib_file_fill_buffer (unformat_input_t * input)
 {
   int fd = pointer_to_uword (input->fill_buffer_arg);
   uword l, n;
@@ -1053,10 +1060,10 @@ unix_file_fill_buffer (unformat_input_t * input)
     return input->index;
 }
 
-void
-unformat_init_unix_file (unformat_input_t * input, int file_descriptor)
+__clib_export void
+unformat_init_clib_file (unformat_input_t * input, int file_descriptor)
 {
-  unformat_init (input, unix_file_fill_buffer,
+  unformat_init (input, clib_file_fill_buffer,
                 uword_to_pointer (file_descriptor, void *));
 }
 
@@ -1070,6 +1077,30 @@ unformat_init_unix_env (unformat_input_t * input, char *var)
   return val != 0;
 }
 
+__clib_export uword
+unformat_data_size (unformat_input_t * input, va_list * args)
+{
+  u64 _a;
+  u64 *a = va_arg (*args, u64 *);
+  if (unformat (input, "%lluGb", &_a))
+    *a = _a << 30;
+  else if (unformat (input, "%lluG", &_a))
+    *a = _a << 30;
+  else if (unformat (input, "%lluMb", &_a))
+    *a = _a << 20;
+  else if (unformat (input, "%lluM", &_a))
+    *a = _a << 20;
+  else if (unformat (input, "%lluKb", &_a))
+    *a = _a << 10;
+  else if (unformat (input, "%lluK", &_a))
+    *a = _a << 10;
+  else if (unformat (input, "%llu", a))
+    ;
+  else
+    return 0;
+  return 1;
+}
+
 #endif /* CLIB_UNIX */