X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Foption.c;h=590f9deff90b2f71745e4b412890a452263f9e59;hb=14963be07f6a9c7c2db0d988f557b870ebd5dead;hp=3a95a4af9b001c88bcbd475fa5cc8b3ea678df12;hpb=dc87756342c051418eccb2b7d932ffa5453c6788;p=lttv.git diff --git a/ltt/branches/poly/lttv/option.c b/ltt/branches/poly/lttv/option.c index 3a95a4af..590f9def 100644 --- a/ltt/branches/poly/lttv/option.c +++ b/ltt/branches/poly/lttv/option.c @@ -1,15 +1,19 @@ -#include +#include +#include #include +#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) +#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) + typedef struct _LttvOption { - const char *long_name; + char *long_name; char char_name; - const char *description; - const char *arg_description; + char *description; + char *arg_description; LttvOptionType t; gpointer p; - LttvOptionHook h; + LttvOptionHook hook; gpointer hook_data; } LttvOption; @@ -35,6 +39,7 @@ free_option(LttvOption *option) void lttv_option_init(int argc, char **argv) { + g_info("Init option.c"); options = g_hash_table_new(g_str_hash, g_str_equal); } @@ -43,10 +48,11 @@ void lttv_option_destroy() { LttvOption option; - GPtrArray list = g_ptr_array_new(); + GPtrArray *list = g_ptr_array_new(); int i; + g_info("Destroy option.c"); g_hash_table_foreach(options, list_options, list); g_hash_table_destroy(options); @@ -64,6 +70,7 @@ void lttv_option_add(const char *long_name, const char char_name, { LttvOption *option; + g_info("Add option %s", long_name); if(g_hash_table_lookup(options, long_name) != NULL) { g_warning("duplicate option"); return; @@ -76,7 +83,7 @@ void lttv_option_add(const char *long_name, const char char_name, option->arg_description = g_strdup(arg_description); option->t = t; option->p = p; - option->h = h; + option->hook = h; option->hook_data = hook_data; g_hash_table_insert(options, option->long_name, option); } @@ -87,6 +94,7 @@ lttv_option_remove(const char *long_name) { LttvOption *option = g_hash_table_lookup(options, long_name); + g_info("Remove option %s", long_name); if(option == NULL) { g_warning("trying to remove unknown option %s", long_name); return; @@ -105,7 +113,7 @@ static struct poptOption endOption = { NULL, '\0', 0, NULL, 0}; static void build_popts(GPtrArray **plist, struct poptOption **ppopts, poptContext *pc, - int argv, char **argv) + int argc, char **argv) { LttvOption *option; @@ -152,7 +160,7 @@ destroy_popts(GPtrArray **plist, struct poptOption **ppopts, poptContext *pc) { g_ptr_array_free(*plist, TRUE); *plist = NULL; g_free(*ppopts); *ppopts = NULL; - poptFreeContext(*c); + poptFreeContext(*pc); } @@ -183,11 +191,17 @@ void lttv_option_parse(int argc, char **argv) if(rc > 0) { option = (LttvOption *)(list->pdata[rc - 1]); - if(option->hook != NULL) option->hook(option->hook_data); + g_info("Option %s encountered", option->long_name); + if(option->hook != NULL) { + g_info("Option %s hook called", option->long_name); + option->hook(option->hook_data); + } i++; } else if(rc == POPT_ERROR_BADOPT && i != first_arg) { + g_info("Option %s not recognized, rescan options with new additions", + poptBadOption(c,0)); /* Perhaps this option is newly added, restart parsing */ @@ -197,7 +211,11 @@ void lttv_option_parse(int argc, char **argv) /* Get back to the same argument */ first_arg = i; - for(i = 0; i < first_arg; i++) poptGetNextOpt(c); + for(i = 0; i < first_arg; i++) { + rc = poptGetNextOpt(c); + option = (LttvOption *)(list->pdata[rc - 1]); + g_info("Option %s rescanned, skipped", option->long_name); + } } else { @@ -214,3 +232,33 @@ void lttv_option_parse(int argc, char **argv) destroy_popts(&list, &popts, &c); } +static void show_help(LttvOption *option) +{ + printf("--%s -%c argument: %s\n" , option->long_name, + option->char_name, + option->arg_description); + printf(" %s\n" , option->description); + +} + +void lttv_option_show_help(void) +{ + LttvOption option; + + GPtrArray *list = g_ptr_array_new(); + + int i; + + g_hash_table_foreach(options, list_options, list); + + printf("Built-in commands available:\n"); + printf("\n"); + + for(i = 0 ; i < list->len ; i++) { + show_help((LttvOption *)list->pdata[i]); + } + g_ptr_array_free(list, TRUE); + + +} +