mirror of
https://github.com/moparisthebest/curl
synced 2024-11-07 10:05:06 -05:00
9954242980
This patch improves the output of curl's --libcurl option by generating code which builds curl_httppost and curl_slist lists, and uses symbolic names for enum and flag values. Variants of the my_setopt macro in tool_setopt.h are added in order to pass extra type information to the code-generation step in tool_setopt.c. If curl is configured with --disable-libcurl-option then the macros call curl_easy_setopt directly.
230 lines
6.2 KiB
C
230 lines
6.2 KiB
C
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
|
*
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
* copies of the Software, and permit persons to whom the Software is
|
|
* furnished to do so, under the terms of the COPYING file.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
***************************************************************************/
|
|
#include "setup.h"
|
|
|
|
#include <curl/curl.h>
|
|
|
|
#ifndef CURL_DISABLE_LIBCURL_OPTION
|
|
|
|
#define ENABLE_CURLX_PRINTF
|
|
/* use our own printf() functions */
|
|
#include "curlx.h"
|
|
|
|
#include "tool_cfgable.h"
|
|
#include "tool_easysrc.h"
|
|
#include "tool_msgs.h"
|
|
|
|
#include "memdebug.h" /* keep this as LAST include */
|
|
|
|
/* global variable definitions, for easy-interface source code generation */
|
|
|
|
struct curl_slist *easysrc_decl = NULL; /* Variable declarations */
|
|
struct curl_slist *easysrc_data = NULL; /* Build slists, forms etc. */
|
|
struct curl_slist *easysrc_code = NULL; /* Setopt calls */
|
|
struct curl_slist *easysrc_toohard = NULL; /* Unconvertible setopt */
|
|
struct curl_slist *easysrc_clean = NULL; /* Clean up allocated data */
|
|
int easysrc_form_count = 0;
|
|
int easysrc_slist_count = 0;
|
|
|
|
static const char *const srchead[]={
|
|
"/********* Sample code generated by the curl command line tool **********",
|
|
" * All curl_easy_setopt() options are documented at:",
|
|
" * http://curl.haxx.se/libcurl/c/curl_easy_setopt.html",
|
|
" ************************************************************************/",
|
|
"#include <curl/curl.h>",
|
|
"",
|
|
"int main(int argc, char *argv[])",
|
|
"{",
|
|
" CURLcode ret;",
|
|
" CURL *hnd;",
|
|
NULL
|
|
};
|
|
/* easysrc_decl declarations come here */
|
|
/* easysrc_data initialisations come here */
|
|
/* easysrc_code statements come here */
|
|
static const char *const srchard[]={
|
|
"/* Here is a list of options the curl code used that cannot get generated",
|
|
" as source easily. You may select to either not use them or implement",
|
|
" them yourself.",
|
|
"",
|
|
NULL
|
|
};
|
|
static const char *const srcend[]={
|
|
"",
|
|
" return (int)ret;",
|
|
"}",
|
|
"/**** End of sample code ****/",
|
|
NULL
|
|
};
|
|
|
|
/* Clean up all source code if we run out of memory */
|
|
static void easysrc_free(void)
|
|
{
|
|
curl_slist_free_all(easysrc_decl);
|
|
easysrc_decl = NULL;
|
|
curl_slist_free_all(easysrc_data);
|
|
easysrc_data = NULL;
|
|
curl_slist_free_all(easysrc_code);
|
|
easysrc_code = NULL;
|
|
curl_slist_free_all(easysrc_toohard);
|
|
easysrc_toohard = NULL;
|
|
curl_slist_free_all(easysrc_clean);
|
|
easysrc_clean = NULL;
|
|
}
|
|
|
|
/* Add a source line to the main code or remarks */
|
|
CURLcode easysrc_add(struct curl_slist **plist, const char *line)
|
|
{
|
|
CURLcode ret = CURLE_OK;
|
|
struct curl_slist *list =
|
|
curl_slist_append(*plist, line);
|
|
if(!list) {
|
|
easysrc_free();
|
|
ret = CURLE_OUT_OF_MEMORY;
|
|
}
|
|
else
|
|
*plist = list;
|
|
return ret;
|
|
}
|
|
|
|
CURLcode easysrc_addf(struct curl_slist **plist, const char *fmt, ...)
|
|
{
|
|
CURLcode ret;
|
|
char *bufp;
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
bufp = curlx_mvaprintf(fmt, ap);
|
|
va_end(ap);
|
|
if(! bufp) {
|
|
ret = CURLE_OUT_OF_MEMORY;
|
|
}
|
|
else {
|
|
ret = easysrc_add(plist, bufp);
|
|
curl_free(bufp);
|
|
}
|
|
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;
|
|
}
|
|
|
|
CURLcode easysrc_perform(void)
|
|
{
|
|
/* 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, ""));
|
|
/* Preamble comment */
|
|
for(i=0; ((c = srchard[i]) != '\0'); i++)
|
|
CHKRET(easysrc_add(&easysrc_code, c));
|
|
/* Each unconverted option */
|
|
for(ptr=easysrc_toohard; ptr; ptr = ptr->next)
|
|
CHKRET(easysrc_add(&easysrc_code, ptr->data));
|
|
CHKRET(easysrc_add(&easysrc_code, ""));
|
|
CHKRET(easysrc_add(&easysrc_code, "*/"));
|
|
|
|
curl_slist_free_all(easysrc_toohard);
|
|
easysrc_toohard = NULL;
|
|
}
|
|
|
|
CHKRET(easysrc_add(&easysrc_code, ""));
|
|
CHKRET(easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);"));
|
|
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;
|
|
}
|
|
|
|
void dumpeasysrc(struct Configurable *config)
|
|
{
|
|
struct curl_slist *ptr;
|
|
char *o = config->libcurl;
|
|
|
|
if(o) {
|
|
FILE *out;
|
|
bool fopened = FALSE;
|
|
if(strcmp(o, "-")) {
|
|
out = fopen(o, "wt");
|
|
fopened = TRUE;
|
|
}
|
|
else
|
|
out = stdout;
|
|
if(!out)
|
|
warnf(config, "Failed to open %s to write libcurl code!\n", o);
|
|
else {
|
|
int i;
|
|
const char *c;
|
|
|
|
for(i=0; ((c = srchead[i]) != '\0'); i++)
|
|
fprintf(out, "%s\n", c);
|
|
|
|
/* Declare variables used for complex setopt values */
|
|
for(ptr=easysrc_decl; ptr; ptr = ptr->next)
|
|
fprintf(out, " %s\n", ptr->data);
|
|
|
|
/* Set up complex values for setopt calls */
|
|
if(easysrc_data) {
|
|
fprintf(out, "\n");
|
|
|
|
for(ptr=easysrc_data; ptr; ptr = ptr->next)
|
|
fprintf(out, " %s\n", ptr->data);
|
|
}
|
|
|
|
fprintf(out, "\n");
|
|
for(ptr=easysrc_code; ptr; ptr = ptr->next) {
|
|
if(ptr->data[0]) {
|
|
fprintf(out, " %s\n", ptr->data);
|
|
}
|
|
else {
|
|
fprintf(out, "\n");
|
|
}
|
|
}
|
|
|
|
for(ptr=easysrc_clean; ptr; ptr = ptr->next)
|
|
fprintf(out, " %s\n", ptr->data);
|
|
|
|
for(i=0; ((c = srcend[i]) != '\0'); i++)
|
|
fprintf(out, "%s\n", c);
|
|
|
|
if(fopened)
|
|
fclose(out);
|
|
}
|
|
}
|
|
|
|
easysrc_free();
|
|
}
|
|
|
|
#endif /* CURL_DISABLE_LIBCURL_OPTION */
|