--- gpl/axl/knife/exarg.c 2011/06/08 07:09:12 1.1.1.1 +++ gpl/axl/knife/exarg.c 2012/02/17 12:50:02 1.1.1.2 @@ -1,4 +1,4 @@ -/** +/** * LibExploreArguments: a library to parse command line options * Copyright (C) 2005 Advanced Software Production Line, S.L. * @@ -451,11 +451,6 @@ char ** exarg_split (const char * chunk, } /** - * @internal Proto-type declaration to avoid gcc complaining. - */ -int vsnprintf(char *str, size_t size, const char *format, va_list ap); - -/** * @internal Allows to calculate the amount of memory required to * store the string that will representing the construction provided * by the printf-like format received and its arguments. @@ -513,21 +508,21 @@ int exarg_vprintf_len (const char * format, va_list ar */ char * exarg_strdup_printfv (char * chunk, va_list args) { - /** IMPLEMENTATION NOTE: place update axl_stream_printf_buffer + /** IMPLEMENTATION NOTE: place update axl_stream_strdup_printfv * code in the case this code is updated **/ #ifndef HAVE_VASPRINTF int size; #endif char * result = NULL; - int new_size = -1; if (chunk == NULL) return NULL; #ifdef HAVE_VASPRINTF /* do the operation using the GNU extension */ - new_size = vasprintf (&result, chunk, args); + if (vasprintf (&result, chunk, args) == -1) + return NULL; #else /* get the amount of memory to be allocated */ size = exarg_vprintf_len (chunk, args); @@ -542,12 +537,12 @@ char * exarg_strdup_printfv (char * chunk, va_list result = exarg_new (char, size + 2); /* copy current size */ -#if defined(OS_WIN32) && ! defined (__GNUC__) - new_size = _vsnprintf_s (result, size + 1, size, chunk, args); -#else - new_size = vsnprintf (result, size + 1, chunk, args); +# if defined(OS_WIN32) && ! defined (__GNUC__) + _vsnprintf_s (result, size + 1, size, chunk, args); +# else + vsnprintf (result, size + 1, chunk, args); +# endif #endif -#endif /* return the result */ return result; } @@ -895,7 +890,7 @@ void exarg_show_usage (int show_header) ExArgNodeOption * node; if (show_header && (__exarg_usage_header && (* __exarg_usage_header))) - printf (__exarg_usage_header); + printf ("%s", __exarg_usage_header); printf ("Usage: %s ", exarg_exec_name); @@ -917,7 +912,7 @@ void exarg_show_usage (int show_header) exarg_free (string_aux); if (show_header && (__exarg_post_usage_header && (* __exarg_post_usage_header))) - printf (__exarg_post_usage_header); + printf ("%s", __exarg_post_usage_header); return; } @@ -1007,12 +1002,12 @@ void __exarg_show_help_foreach (epointer key, epointer return; } -void exarg_show_help () +void exarg_show_help (void) { ExArgNodeOption * node; if (__exarg_help_header && (* __exarg_help_header)) - printf (__exarg_help_header); + printf ("%s", __exarg_help_header); exarg_show_usage (0); @@ -1033,7 +1028,7 @@ void exarg_show_help () printf (" --usage Display brief usage message.\n"); if (__exarg_post_help_header && (* __exarg_post_help_header)) - printf (__exarg_post_help_header); + printf ("%s", __exarg_post_help_header); return; } @@ -1060,7 +1055,7 @@ void exarg_check_argument_value (char ** argv, int ite } -void __exarg_parse_check_non_optional () +void __exarg_parse_check_non_optional (void) { ExArgNodeOption * node = argument_options; @@ -1080,7 +1075,7 @@ void __exarg_parse_check_non_optional () return; } -void __exarg_parse_check_depends () +void __exarg_parse_check_depends (void) { /* first argument */ ExArgNodeOption * node = argument_options; @@ -1848,8 +1843,48 @@ void exarg_define (char * arg_name, /* string value */ node->string_value = value; break; - } + } /* end switch */ } /* end if */ + + /* nothing to do over here */ + return; +} + +/** + * @brief Allows to undef the value associated and the definition + * itself of the option provided (arg_name). + * + * @param arg_name The argument to undef. + */ +void exarg_undef (char * arg_name) +{ + ExArgNodeOption * node; + + /* perform some environment checks */ + if (arg_name == NULL) + return; + + node = exarg_lookup_node (arg_name); + if (node == NULL) + return; + + /* undef the value */ + node->is_defined = 0; + + /* check argument value */ + switch (node->type) { + case EXARG_NONE: + /* nothing to set */ + break; + case EXARG_INT: + /* integer value */ + node->int_value = 0; + break; + case EXARG_STRING: + /* string value */ + node->string_value = NULL; + break; + } /* end switch */ /* nothing to do over here */ return;