]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tool_setopt: reduce use of "code hiding" macros
authorDaniel Stenberg <daniel@haxx.se>
Thu, 13 Mar 2025 14:23:17 +0000 (15:23 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 13 Mar 2025 16:25:33 +0000 (17:25 +0100)
CODEx, DATAx, CLEANx, DECLx, REM3, CHKRET are all removed now.

Closes #16709

src/tool_easysrc.c
src/tool_setopt.c

index a623f1961345bc61cd0fb0498e6174b535ee84cb..ea09fd7849098f55b0bcc3632794531679d81db4 100644 (file)
 
 /* global variable definitions, for easy-interface source code generation */
 
-struct slist_wc *easysrc_decl = NULL; /* Variable declarations */
-struct slist_wc *easysrc_data = NULL; /* Build slists, forms etc. */
-struct slist_wc *easysrc_code = NULL; /* Setopt calls */
-struct slist_wc *easysrc_toohard = NULL; /* Unconvertible setopt */
-struct slist_wc *easysrc_clean = NULL;  /* Clean up allocated data */
-int easysrc_mime_count = 0;
-int easysrc_slist_count = 0;
+struct slist_wc *easysrc_decl; /* Variable declarations */
+struct slist_wc *easysrc_data; /* Build slists, forms etc. */
+struct slist_wc *easysrc_code; /* Setopt calls */
+struct slist_wc *easysrc_toohard; /* Unconvertible setopt */
+struct slist_wc *easysrc_clean;  /* Clean up allocated data */
+int easysrc_mime_count;
+int easysrc_slist_count;
 
 static const char *const srchead[]={
   "/********* Sample code generated by the curl command line tool **********",
@@ -123,51 +123,53 @@ CURLcode easysrc_addf(struct slist_wc **plist, const char *fmt, ...)
   return ret;
 }
 
-#define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} while(0)
-
 CURLcode easysrc_init(void)
 {
-  CHKRET(easysrc_add(&easysrc_code,
-                     "hnd = curl_easy_init();"));
-  return CURLE_OK;
+  return easysrc_add(&easysrc_code, "hnd = curl_easy_init();");
 }
 
 CURLcode easysrc_perform(void)
 {
+  CURLcode ret = CURLE_OK;
   /* Note any setopt calls which we could not convert */
   if(easysrc_toohard) {
     int i;
     struct curl_slist *ptr;
-    const char *c;
-    CHKRET(easysrc_add(&easysrc_code, ""));
+    ret = easysrc_add(&easysrc_code, "");
     /* Preamble comment */
-    for(i = 0; ((c = srchard[i]) != NULL); i++)
-      CHKRET(easysrc_add(&easysrc_code, c));
+    for(i = 0; srchard[i] && !ret; i++)
+      ret = easysrc_add(&easysrc_code, srchard[i]);
     /* Each unconverted option */
-    if(easysrc_toohard) {
-      for(ptr = easysrc_toohard->first; ptr; ptr = ptr->next)
-        CHKRET(easysrc_add(&easysrc_code, ptr->data));
+    if(easysrc_toohard && !ret) {
+      for(ptr = easysrc_toohard->first; ptr && !ret; ptr = ptr->next)
+        ret = easysrc_add(&easysrc_code, ptr->data);
     }
-    CHKRET(easysrc_add(&easysrc_code, ""));
-    CHKRET(easysrc_add(&easysrc_code, "*/"));
+    if(!ret)
+      ret = easysrc_add(&easysrc_code, "");
+    if(!ret)
+      ret = easysrc_add(&easysrc_code, "*/");
 
     slist_wc_free_all(easysrc_toohard);
     easysrc_toohard = NULL;
   }
 
-  CHKRET(easysrc_add(&easysrc_code, ""));
-  CHKRET(easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);"));
-  CHKRET(easysrc_add(&easysrc_code, ""));
+  if(!ret)
+    ret = easysrc_add(&easysrc_code, "");
+  if(!ret)
+    ret = easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);");
+  if(!ret)
+    ret = easysrc_add(&easysrc_code, "");
 
-  return CURLE_OK;
+  return ret;
 }
 
 CURLcode easysrc_cleanup(void)
 {
-  CHKRET(easysrc_add(&easysrc_code, "curl_easy_cleanup(hnd);"));
-  CHKRET(easysrc_add(&easysrc_code, "hnd = NULL;"));
+  CURLcode ret = easysrc_add(&easysrc_code, "curl_easy_cleanup(hnd);");
+  if(!ret)
+    ret = easysrc_add(&easysrc_code, "hnd = NULL;");
 
-  return CURLE_OK;
+  return ret;
 }
 
 void dumpeasysrc(struct GlobalConfig *config)
index b2a479cc4e7109e5faede06c7ec19c7e0305d261..cd3aeabe00e17dbc66e7b97eec3b065d3df1b319 100644 (file)
@@ -168,47 +168,7 @@ static const struct NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
   NVEND
 };
 
-/* Format and add code; jump to nomem on malloc error */
-#define ADD(args) do { \
-  ret = easysrc_add args; \
-  if(ret) \
-    goto nomem; \
-} while(0)
-#define ADDF(args) do { \
-  ret = easysrc_addf args; \
-  if(ret) \
-    goto nomem; \
-} while(0)
-#define NULL_CHECK(p) do { \
-  if(!p) { \
-    ret = CURLE_OUT_OF_MEMORY; \
-    goto nomem; \
-  } \
-} while(0)
-
-/* #define DECL0(s) ADD((&easysrc_decl, s)) */
-#define DECL1(f,a) ADDF((&easysrc_decl, f,a))
-
-/* #define DATA0(s) ADD((&easysrc_data, s)) */
-#define DATA1(f,a) ADDF((&easysrc_data, f,a))
-/* #define DATA2(f,a,b) ADDF((&easysrc_data, f,a,b)) */
-#define DATA3(f,a,b,c) ADDF((&easysrc_data, f,a,b,c))
-
-#define CODE0(s) ADD((&easysrc_code, s))
-#define CODE1(f,a) ADDF((&easysrc_code, f,a))
-#define CODE2(f,a,b) ADDF((&easysrc_code, f,a,b))
-#define CODE3(f,a,b,c) ADDF((&easysrc_code, f,a,b,c))
-
-/* #define CLEAN0(s) ADD((&easysrc_clean, s)) */
-#define CLEAN1(f,a) ADDF((&easysrc_clean, f,a))
-
-/* #define REM0(s) ADD((&easysrc_toohard, s)) */
-/* #define REM1(f,a) ADDF((&easysrc_toohard, f,a)) */
-#define REM3(f,a,b,c) ADDF((&easysrc_toohard, f,a,b,c))
-
-/* Escape string to C string syntax. Return NULL if out of memory.
- * Is this correct for those wacky EBCDIC guys? */
-
+/* Escape string to C string syntax. Return NULL if out of memory. */
 #define MAX_STRING_LENGTH_OUTPUT 2000
 #define ZERO_TERMINATED -1
 
@@ -289,10 +249,12 @@ CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
       /* If no definition was found, output an explicit value.
        * This could happen if new values are defined and used
        * but the NameValue list is not updated. */
-      CODE2("curl_easy_setopt(hnd, %s, %ldL);", name, lval);
+      ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, %ldL);",
+                         name, lval);
     }
     else {
-      CODE2("curl_easy_setopt(hnd, %s, (long)%s);", name, nv->name);
+      ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, (long)%s);",
+                         name, nv->name);
     }
   }
 
@@ -300,7 +262,6 @@ CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config,
   if(ret)
     warnf(config, "option %s returned error (%d)", name, (int)ret);
 #endif
-nomem:
   return ret;
 }
 
@@ -332,11 +293,13 @@ CURLcode tool_setopt_SSLVERSION(CURL *curl, struct GlobalConfig *config,
       /* If no definition was found, output an explicit value.
        * This could happen if new values are defined and used
        * but the NameValue list is not updated. */
-      CODE2("curl_easy_setopt(hnd, %s, %ldL);", name, lval);
+      ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, %ldL);",
+                         name, lval);
     }
     else {
-      CODE3("curl_easy_setopt(hnd, %s, (long)(%s | %s));",
-            name, nv->name, nv2->name);
+      ret = easysrc_addf(&easysrc_code,
+                         "curl_easy_setopt(hnd, %s, (long)(%s | %s));",
+                         name, nv->name, nv2->name);
     }
   }
 
@@ -344,7 +307,6 @@ CURLcode tool_setopt_SSLVERSION(CURL *curl, struct GlobalConfig *config,
   if(ret)
     warnf(config, "option %s returned error (%d)", name, (int)ret);
 #endif
-nomem:
   return ret;
 }
 
@@ -354,10 +316,8 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
                              const struct NameValueUnsigned *nvlist,
                              long lval)
 {
-  CURLcode ret = CURLE_OK;
   bool skip = FALSE;
-
-  ret = curl_easy_setopt(curl, tag, lval);
+  CURLcode ret = curl_easy_setopt(curl, tag, lval);
   if(!lval)
     skip = TRUE;
 
@@ -372,9 +332,9 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
       if((nv->value & ~ rest) == 0) {
         /* all value flags contained in rest */
         rest &= ~ nv->value;    /* remove bits handled here */
-        CODE3("%s(long)%s%s",
-              preamble, nv->name, rest ? " |" : ");");
-        if(!rest)
+        ret = easysrc_addf(&easysrc_code, "%s(long)%s%s",
+                           preamble, nv->name, rest ? " |" : ");");
+        if(!rest || ret)
           break;                /* handled them all */
         /* replace with all spaces for continuation line */
         msnprintf(preamble, sizeof(preamble), "%*s", (int)strlen(preamble),
@@ -384,11 +344,10 @@ CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config,
     /* If any bits have no definition, output an explicit value.
      * This could happen if new bits are defined and used
      * but the NameValue list is not updated. */
-    if(rest)
-      CODE2("%s%luUL);", preamble, rest);
+    if(rest && !ret)
+      ret = easysrc_addf(&easysrc_code, "%s%luUL);", preamble, rest);
   }
 
-nomem:
   return ret;
 }
 
@@ -396,26 +355,30 @@ nomem:
 static CURLcode libcurl_generate_slist(struct curl_slist *slist, int *slistno)
 {
   CURLcode ret = CURLE_OK;
-  char *escaped = NULL;
 
   /* May need several slist variables, so invent name */
   *slistno = ++easysrc_slist_count;
 
-  DECL1("struct curl_slist *slist%d;", *slistno);
-  DATA1("slist%d = NULL;", *slistno);
-  CLEAN1("curl_slist_free_all(slist%d);", *slistno);
-  CLEAN1("slist%d = NULL;", *slistno);
-  for(; slist; slist = slist->next) {
-    free(escaped);
-    escaped = c_escape(slist->data, ZERO_TERMINATED);
+  ret = easysrc_addf(&easysrc_decl, "struct curl_slist *slist%d;", *slistno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_data, "slist%d = NULL;", *slistno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_clean, "curl_slist_free_all(slist%d);",
+                       *slistno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_clean, "slist%d = NULL;", *slistno);
+  if(ret)
+    return ret;
+  for(; slist && !ret; slist = slist->next) {
+    char *escaped = c_escape(slist->data, ZERO_TERMINATED);
     if(!escaped)
       return CURLE_OUT_OF_MEMORY;
-    DATA3("slist%d = curl_slist_append(slist%d, \"%s\");",
-                                       *slistno, *slistno, escaped);
+    ret = easysrc_addf(&easysrc_data,
+                       "slist%d = curl_slist_append(slist%d, \"%s\");",
+                       *slistno, *slistno, escaped);
+    free(escaped);
   }
 
-nomem:
-  curlx_safefree(escaped);
   return ret;
 }
 
@@ -432,49 +395,57 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
 {
   CURLcode ret = CURLE_OK;
   int submimeno = 0;
-  char *escaped = NULL;
   const char *data = NULL;
   const char *filename = part->filename;
 
   /* Parts are linked in reverse order. */
-  if(part->prev) {
+  if(part->prev)
     ret = libcurl_generate_mime_part(curl, config, part->prev, mimeno);
-    if(ret)
-      return ret;
-  }
 
   /* Create the part. */
-  CODE2("part%d = curl_mime_addpart(mime%d);", mimeno, mimeno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_code, "part%d = curl_mime_addpart(mime%d);",
+                       mimeno, mimeno);
+  if(ret)
+    return ret;
 
   switch(part->kind) {
   case TOOLMIME_PARTS:
     ret = libcurl_generate_mime(curl, config, part, &submimeno);
     if(!ret) {
-      CODE2("curl_mime_subparts(part%d, mime%d);", mimeno, submimeno);
-      CODE1("mime%d = NULL;", submimeno);   /* Avoid freeing in CLEAN. */
+      ret = easysrc_addf(&easysrc_code, "curl_mime_subparts(part%d, mime%d);",
+                         mimeno, submimeno);
+      if(!ret)
+        /* Avoid freeing in CLEAN. */
+        ret = easysrc_addf(&easysrc_code,
+                           "mime%d = NULL;", submimeno);
     }
     break;
 
   case TOOLMIME_DATA:
     data = part->data;
     if(!ret) {
+      char *escaped = c_escape(data, ZERO_TERMINATED);
+      ret =
+        easysrc_addf(&easysrc_code,
+                     "curl_mime_data(part%d, \"%s\", CURL_ZERO_TERMINATED);",
+                     mimeno, escaped);
       free(escaped);
-      escaped = c_escape(data, ZERO_TERMINATED);
-      NULL_CHECK(escaped);
-      CODE2("curl_mime_data(part%d, \"%s\", CURL_ZERO_TERMINATED);",
-                            mimeno, escaped);
     }
     break;
 
   case TOOLMIME_FILE:
-  case TOOLMIME_FILEDATA:
-    escaped = c_escape(part->data, ZERO_TERMINATED);
-    NULL_CHECK(escaped);
-    CODE2("curl_mime_filedata(part%d, \"%s\");", mimeno, escaped);
-    if(part->kind == TOOLMIME_FILEDATA && !filename) {
-      CODE1("curl_mime_filename(part%d, NULL);", mimeno);
+  case TOOLMIME_FILEDATA: {
+    char *escaped = c_escape(part->data, ZERO_TERMINATED);
+    ret = easysrc_addf(&easysrc_code,
+                       "curl_mime_filedata(part%d, \"%s\");", mimeno, escaped);
+    if(part->kind == TOOLMIME_FILEDATA && !filename && !ret) {
+      ret = easysrc_addf(&easysrc_code,
+                         "curl_mime_filename(part%d, NULL);", mimeno);
     }
+    free(escaped);
     break;
+  }
 
   case TOOLMIME_STDIN:
     if(!filename)
@@ -482,9 +453,11 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
     FALLTHROUGH();
   case TOOLMIME_STDINDATA:
     /* Can only be reading stdin in the current context. */
-    CODE1("curl_mime_data_cb(part%d, -1, (curl_read_callback) fread, \\",
-          mimeno);
-    CODE0("                  (curl_seek_callback) fseek, NULL, stdin);");
+    ret = easysrc_addf(&easysrc_code, "curl_mime_data_cb(part%d, -1, "
+                       "(curl_read_callback) fread, \\", mimeno);
+    if(!ret)
+      ret = easysrc_addf(&easysrc_code, "                  "
+                         "(curl_seek_callback) fseek, NULL, stdin);");
     break;
   default:
     /* Other cases not possible in this context. */
@@ -492,31 +465,31 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
   }
 
   if(!ret && part->encoder) {
+    char *escaped = c_escape(part->encoder, ZERO_TERMINATED);
+    ret = easysrc_addf(&easysrc_code, "curl_mime_encoder(part%d, \"%s\");",
+                       mimeno, escaped);
     free(escaped);
-    escaped = c_escape(part->encoder, ZERO_TERMINATED);
-    NULL_CHECK(escaped);
-    CODE2("curl_mime_encoder(part%d, \"%s\");", mimeno, escaped);
   }
 
   if(!ret && filename) {
+    char *escaped = c_escape(filename, ZERO_TERMINATED);
+    ret = easysrc_addf(&easysrc_code, "curl_mime_filename(part%d, \"%s\");",
+                       mimeno, escaped);
     free(escaped);
-    escaped = c_escape(filename, ZERO_TERMINATED);
-    NULL_CHECK(escaped);
-    CODE2("curl_mime_filename(part%d, \"%s\");", mimeno, escaped);
   }
 
   if(!ret && part->name) {
+    char *escaped = c_escape(part->name, ZERO_TERMINATED);
+    ret = easysrc_addf(&easysrc_code, "curl_mime_name(part%d, \"%s\");",
+                       mimeno, escaped);
     free(escaped);
-    escaped = c_escape(part->name, ZERO_TERMINATED);
-    NULL_CHECK(escaped);
-    CODE2("curl_mime_name(part%d, \"%s\");", mimeno, escaped);
   }
 
   if(!ret && part->type) {
+    char *escaped = c_escape(part->type, ZERO_TERMINATED);
+    ret = easysrc_addf(&easysrc_code, "curl_mime_type(part%d, \"%s\");",
+                       mimeno, escaped);
     free(escaped);
-    escaped = c_escape(part->type, ZERO_TERMINATED);
-    NULL_CHECK(escaped);
-    CODE2("curl_mime_type(part%d, \"%s\");", mimeno, escaped);
   }
 
   if(!ret && part->headers) {
@@ -524,13 +497,15 @@ static CURLcode libcurl_generate_mime_part(CURL *curl,
 
     ret = libcurl_generate_slist(part->headers, &slistno);
     if(!ret) {
-      CODE2("curl_mime_headers(part%d, slist%d, 1);", mimeno, slistno);
-      CODE1("slist%d = NULL;", slistno); /* Prevent CLEANing. */
+      ret = easysrc_addf(&easysrc_code,
+                         "curl_mime_headers(part%d, slist%d, 1);",
+                         mimeno, slistno);
+      if(!ret)
+        ret = easysrc_addf(&easysrc_code,
+                           "slist%d = NULL;", slistno); /* Prevent CLEANing. */
     }
   }
 
-nomem:
-  curlx_safefree(escaped);
   return ret;
 }
 
@@ -544,19 +519,24 @@ static CURLcode libcurl_generate_mime(CURL *curl,
 
   /* May need several mime variables, so invent name. */
   *mimeno = ++easysrc_mime_count;
-  DECL1("curl_mime *mime%d;", *mimeno);
-  DATA1("mime%d = NULL;", *mimeno);
-  CODE1("mime%d = curl_mime_init(hnd);", *mimeno);
-  CLEAN1("curl_mime_free(mime%d);", *mimeno);
-  CLEAN1("mime%d = NULL;", *mimeno);
-
-  if(toolmime->subparts) {
-    DECL1("curl_mimepart *part%d;", *mimeno);
-    ret = libcurl_generate_mime_part(curl, config,
-                                     toolmime->subparts, *mimeno);
+  ret = easysrc_addf(&easysrc_decl, "curl_mime *mime%d;", *mimeno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_data, "mime%d = NULL;", *mimeno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_code, "mime%d = curl_mime_init(hnd);",
+                       *mimeno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_clean, "curl_mime_free(mime%d);", *mimeno);
+  if(!ret)
+    ret = easysrc_addf(&easysrc_clean, "mime%d = NULL;", *mimeno);
+
+  if(toolmime->subparts && !ret) {
+    ret = easysrc_addf(&easysrc_decl, "curl_mimepart *part%d;", *mimeno);
+    if(!ret)
+      ret = libcurl_generate_mime_part(curl, config,
+                                       toolmime->subparts, *mimeno);
   }
 
-nomem:
   return ret;
 }
 
@@ -573,10 +553,10 @@ CURLcode tool_setopt_mimepost(CURL *curl, struct GlobalConfig *config,
                                 config->current->mimeroot, &mimeno);
 
     if(!ret)
-      CODE2("curl_easy_setopt(hnd, %s, mime%d);", name, mimeno);
+      ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, mime%d);",
+                         name, mimeno);
   }
 
-nomem:
   return ret;
 }
 
@@ -594,10 +574,10 @@ CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config,
 
     ret = libcurl_generate_slist(list, &i);
     if(!ret)
-      CODE2("curl_easy_setopt(hnd, %s, slist%d);", name, i);
+      ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, slist%d);",
+                         name, i);
   }
 
-nomem:
   return ret;
 }
 
@@ -621,9 +601,9 @@ CURLcode tool_setopt_long(CURL *curl, struct GlobalConfig *global,
   ret = curl_easy_setopt(curl, tag, lval);
   if((lval != defval) && global->libcurl && !ret) {
     /* we only use this for real if --libcurl was used */
-    CODE2("curl_easy_setopt(hnd, %s, %ldL);", name, lval);
+    ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, %ldL);",
+                       name, lval);
   }
-nomem:
   return ret;
 }
 
@@ -638,10 +618,10 @@ CURLcode tool_setopt_offt(CURL *curl, struct GlobalConfig *global,
   ret = curl_easy_setopt(curl, tag, lval);
   if(global->libcurl && !ret && lval) {
     /* we only use this for real if --libcurl was used */
-    CODE2("curl_easy_setopt(hnd, %s, (curl_off_t)%"
+    ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, (curl_off_t)%"
           CURL_FORMAT_CURL_OFF_T ");", name, lval);
   }
-nomem:
+
   return ret;
 }
 
@@ -676,8 +656,9 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *global,
       /* function pointers are never printable */
       const char *remark = (tag >= CURLOPTTYPE_FUNCTIONPOINT) ?
         "function" : "object";
-      REM3("%s was set to a%s %s pointer", name,
-           (*remark == 'o' ? "n" : ""), remark);
+      ret = easysrc_addf(&easysrc_toohard,
+                         "%s was set to a%s %s pointer", name,
+                         (*remark == 'o' ? "n" : ""), remark);
     }
     else {
       curl_off_t len = ZERO_TERMINATED;
@@ -686,13 +667,13 @@ CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *global,
         len = curlx_dyn_len(&config->postdata);
       escaped = c_escape(pval, len);
       if(escaped) {
-        CODE2("curl_easy_setopt(hnd, %s, \"%s\");", name, escaped);
+        ret = easysrc_addf(&easysrc_code, "curl_easy_setopt(hnd, %s, \"%s\");",
+                           name, escaped);
         free(escaped);
       }
     }
   }
 
-nomem:
   return ret;
 }