tool_getparam: Added support for parsing of specific URL options
authorSteve Holme <steve_holme@hotmail.com>
Fri, 7 Feb 2014 21:14:43 +0000 (21:14 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Sat, 8 Feb 2014 11:18:25 +0000 (11:18 +0000)
src/tool_cfgable.c
src/tool_cfgable.h
src/tool_getparam.c
src/tool_main.c
tests/data/test815
tests/data/test816

index 6bcf421..aed96a4 100644 (file)
@@ -153,6 +153,21 @@ static void free_config_fields(struct Configurable *config)
 
 void config_free(struct Configurable *config)
 {
-  free_config_fields(config);
-  free(config);
+  struct Configurable *last = config;
+
+  /* Find the last config structure */
+  while(last->next)
+    last = last->next;
+
+  /* Free each of the structures in reverse order */
+  do {
+    struct Configurable *prev = last->prev;
+    if(prev)
+      last->easy = NULL;
+
+    free_config_fields(last);
+    free(last);
+
+    last = prev;
+  } while(last);
 }
index 7ac4df7..6696dfb 100644 (file)
@@ -213,8 +213,11 @@ struct Configurable {
 #ifdef CURLDEBUG
   bool test_event_based;
 #endif
-  char *xoauth2_bearer;     /* XOAUTH2 bearer token */
-}; /* struct Configurable */
+  char *xoauth2_bearer;       /* XOAUTH2 bearer token */
+
+  struct Configurable* prev;
+  struct Configurable* next;  /* Always last in the struct */
+};
 
 void config_init(struct Configurable* config);
 void config_free(struct Configurable* config);
index 2938f88..e9ae792 100644 (file)
@@ -1859,7 +1859,29 @@ ParameterError parse_args(struct Configurable *config, int argc,
   for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
     orig_opt = argv[i];
 
-    if(stillflags && ('-' == argv[i][0])) {
+    if(curlx_strequal(":", argv[i]) &&
+       ((config->url_list && config->url_list->url) || config->list_engines)) {
+
+      /* Allocate the next config */
+      config->next = malloc(sizeof(struct Configurable));
+      if(config->next) {
+        /* Initialise the newly created config */
+        config_init(config->next);
+
+        /* Copy the easy handle */
+        config->next->easy = config->easy;
+
+        /* Move onto the new config */
+        config->next->prev = config;
+        config = config->next;
+
+        /* Reset the flag indicator */
+        stillflags = TRUE;
+      }
+      else
+        result = PARAM_NO_MEM;
+    }
+    else if(stillflags && ('-' == argv[i][0])) {
       char *nextarg;
       bool passarg;
       char *flag = argv[i];
@@ -1886,7 +1908,11 @@ ParameterError parse_args(struct Configurable *config, int argc,
 
   if(result && result != PARAM_HELP_REQUESTED) {
     const char *reason = param2text(result);
-    helpf(config->errors, "option %s: %s\n", orig_opt, reason);
+
+    if(!curlx_strequal(":", orig_opt))
+      helpf(config->errors, "option %s: %s\n", orig_opt, reason);
+    else
+      helpf(config->errors, "%s\n", reason);
   }
 
   return result;
index 9fde718..ecf9f9f 100644 (file)
@@ -196,7 +196,7 @@ int main(int argc, char *argv[])
       tool_pressanykey();
 #endif
 
-    /* Free the config structure */
+    /* Free the config structures */
     config_free(config);
     config = NULL;
   }
index b7f5f49..4ea279c 100644 (file)
@@ -26,7 +26,7 @@ imap
 IMAP delete message (CUSTOMREQUEST)
  </name>
  <command>
-imap://%HOSTIP:%IMAPPORT/815 -X 'STORE 123 +Flags \Deleted' -Q -CLOSE -u user:secret
+imap://%HOSTIP:%IMAPPORT/815 -X 'STORE 123 +Flags \Deleted' -u user:secret : imap://%HOSTIP:%IMAPPORT/815 -X CLOSE
 </command>
 </client>
 
index a5ff2b3..8fede7c 100644 (file)
@@ -29,7 +29,7 @@ imap
 IMAP delete message with confirmation (CUSTOMREQUEST)
  </name>
  <command>
-imap://%HOSTIP:%IMAPPORT/816 -X 'STORE 123 +Flags \Deleted' -Q -EXPUNGE -u user:secret 
+imap://%HOSTIP:%IMAPPORT/816 -X 'STORE 123 +Flags \Deleted' -u user:secret : imap://%HOSTIP:%IMAPPORT/816 -X EXPUNGE
 </command>
 </client>