git-svn-id: http://ltt.polymtl.ca/svn@381 04897980-b3bd-0310-b5e0-8ef037075253
[lttv.git] / ltt / branches / poly / lttv / option.c
index 3a95a4af9b001c88bcbd475fa5cc8b3ea678df12..590f9deff90b2f71745e4b412890a452263f9e59 100644 (file)
@@ -1,15 +1,19 @@
-#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;
 
@@ -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);
+
+
+}
+
This page took 0.028601 seconds and 4 git commands to generate.