-#include <popt.h>
+#include <popt.h>
+#include <glib.h>
#include <lttv/option.h>
+#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;
void lttv_option_init(int argc, char **argv)
{
+ g_info("Init option.c");
options = g_hash_table_new(g_str_hash, g_str_equal);
}
{
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);
{
LttvOption *option;
+ g_info("Add option %s", long_name);
if(g_hash_table_lookup(options, long_name) != NULL) {
g_warning("duplicate option");
return;
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);
}
{
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;
static void
build_popts(GPtrArray **plist, struct poptOption **ppopts, poptContext *pc,
- int argv, char **argv)
+ int argc, char **argv)
{
LttvOption *option;
{
g_ptr_array_free(*plist, TRUE); *plist = NULL;
g_free(*ppopts); *ppopts = NULL;
- poptFreeContext(*c);
+ poptFreeContext(*pc);
}
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 */
/* 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 {
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);
+
+
+}
+