From: Daniel Stenberg Date: Thu, 13 Mar 2025 14:23:17 +0000 (+0100) Subject: tool_setopt: reduce use of "code hiding" macros X-Git-Tag: curl-8_13_0~144 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=acdb48272a53fe97f63e5437fce27c7036a9c43e;p=thirdparty%2Fcurl.git tool_setopt: reduce use of "code hiding" macros CODEx, DATAx, CLEANx, DECLx, REM3, CHKRET are all removed now. Closes #16709 --- diff --git a/src/tool_easysrc.c b/src/tool_easysrc.c index a623f19613..ea09fd7849 100644 --- a/src/tool_easysrc.c +++ b/src/tool_easysrc.c @@ -37,13 +37,13 @@ /* 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) diff --git a/src/tool_setopt.c b/src/tool_setopt.c index b2a479cc4e..cd3aeabe00 100644 --- a/src/tool_setopt.c +++ b/src/tool_setopt.c @@ -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; }