tool: Fixed libcurl source output for multiple operations
authorSteve Holme <steve_holme@hotmail.com>
Sun, 2 Mar 2014 09:28:17 +0000 (09:28 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Sun, 2 Mar 2014 09:44:18 +0000 (09:44 +0000)
Correctly output libcurl source code that includes multiply operations
as specified by --next. Note that each operation evaluates to a single
curl_easy_perform() in source code form.

Also note that the output could be optimised a little so global config
options are only output once rather than per operation as is presently
the case.

src/tool_easysrc.c
src/tool_operate.c

index bf44b1c..3db27bb 100644 (file)
@@ -154,14 +154,16 @@ CURLcode easysrc_perform(void)
 
   CHKRET(easysrc_add(&easysrc_code, ""));
   CHKRET(easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);"));
+  CHKRET(easysrc_add(&easysrc_code, ""));
+
   return CURLE_OK;
 }
 
 CURLcode easysrc_cleanup(void)
 {
-  CHKRET(easysrc_add(&easysrc_code, ""));
   CHKRET(easysrc_add(&easysrc_code, "curl_easy_cleanup(hnd);"));
   CHKRET(easysrc_add(&easysrc_code, "hnd = NULL;"));
+
   return CURLE_OK;
 }
 
index 02841c1..03907e7 100644 (file)
@@ -313,14 +313,6 @@ static CURLcode operate_do(struct GlobalConfig *global,
     }
   }
 
-#ifndef CURL_DISABLE_LIBCURL_OPTION
-  res = easysrc_init();
-  if(res) {
-    helpf(global->errors, "out of memory\n");
-    goto quit_curl;
-  }
-#endif
-
   /* Single header file for all URLs */
   if(config->headerfile) {
     /* open file for output: */
@@ -1760,26 +1752,15 @@ static CURLcode operate_do(struct GlobalConfig *global,
   /* Free list of given URLs */
   clean_getout(config);
 
-#ifndef CURL_DISABLE_LIBCURL_OPTION
-  easysrc_cleanup();
-#endif
-
   hdrcbdata.heads = NULL;
 
   /* Close function-local opened file descriptors */
-
   if(heads.fopened && heads.stream)
     fclose(heads.stream);
+
   if(heads.alloc_filename)
     Curl_safefree(heads.filename);
 
-#ifndef CURL_DISABLE_LIBCURL_OPTION
-  /* Dump the libcurl code if previously enabled.
-     NOTE: that this function relies on config->errors amongst other things
-     so not everything can be closed and cleaned before this is called */
-  dumpeasysrc(global);
-#endif
-
   /* Release metalink related resources here */
   clean_metalink(config);
 
@@ -1827,29 +1808,50 @@ CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
       else
         result = CURLE_FAILED_INIT;
     }
-    /* Perform the main operations */
     else {
-      size_t count = 0;
-      struct OperationConfig *operation = config->first;
+#ifndef CURL_DISABLE_LIBCURL_OPTION
+      /* Initialise the libcurl source output */
+      result = easysrc_init();
+#endif
 
-      /* Get the required aguments for each operation */
-      while(!result && operation) {
-        result = get_args(operation, count++);
+      /* Perform the main operations */
+      if(!result) {
+        size_t count = 0;
+        struct OperationConfig *operation = config->first;
 
-        operation = operation->next;
-      }
+        /* Get the required aguments for each operation */
+        while(!result && operation) {
+          result = get_args(operation, count++);
+
+          operation = operation->next;
+        }
+
+        /* Set the current operation pointer */
+        config->current = config->first;
 
-      /* Set the current operation pointer */
-      config->current = config->first;
+        /* Perform each operation */
+        while(!result && config->current) {
+          result = operate_do(config, config->current);
 
-      /* Perform each operation */
-      while(!result && config->current) {
-        result = operate_do(config, config->current);
+          config->current = config->current->next;
+        }
 
-        config->current = config->current->next;
+#ifndef CURL_DISABLE_LIBCURL_OPTION
+        /* Cleanup the libcurl source output */
+        easysrc_cleanup();
+#endif
       }
+      else
+        helpf(config->errors, "out of memory\n");
     }
   }
 
+#ifndef CURL_DISABLE_LIBCURL_OPTION
+  /* Dump the libcurl code if previously enabled.
+     NOTE: that this function relies on config->errors amongst other things
+     so not everything can be closed and cleaned before this is called */
+  dumpeasysrc(config);
+#endif
+
   return result;
 }