Annotation of embedaddon/curl/src/tool_easysrc.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
                      9:  *
                     10:  * This software is licensed as described in the file COPYING, which
                     11:  * you should have received as part of this distribution. The terms
                     12:  * are also available at https://curl.haxx.se/docs/copyright.html.
                     13:  *
                     14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     15:  * copies of the Software, and permit persons to whom the Software is
                     16:  * furnished to do so, under the terms of the COPYING file.
                     17:  *
                     18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     19:  * KIND, either express or implied.
                     20:  *
                     21:  ***************************************************************************/
                     22: #include "tool_setup.h"
                     23: 
                     24: #include "slist_wc.h"
                     25: 
                     26: #ifndef CURL_DISABLE_LIBCURL_OPTION
                     27: 
                     28: #define ENABLE_CURLX_PRINTF
                     29: /* use our own printf() functions */
                     30: #include "curlx.h"
                     31: 
                     32: #include "tool_cfgable.h"
                     33: #include "tool_easysrc.h"
                     34: #include "tool_msgs.h"
                     35: 
                     36: #include "memdebug.h" /* keep this as LAST include */
                     37: 
                     38: /* global variable definitions, for easy-interface source code generation */
                     39: 
                     40: struct slist_wc *easysrc_decl = NULL; /* Variable declarations */
                     41: struct slist_wc *easysrc_data = NULL; /* Build slists, forms etc. */
                     42: struct slist_wc *easysrc_code = NULL; /* Setopt calls */
                     43: struct slist_wc *easysrc_toohard = NULL; /* Unconvertible setopt */
                     44: struct slist_wc *easysrc_clean = NULL;  /* Clean up allocated data */
                     45: int easysrc_mime_count = 0;
                     46: int easysrc_slist_count = 0;
                     47: 
                     48: static const char *const srchead[]={
                     49:   "/********* Sample code generated by the curl command line tool **********",
                     50:   " * All curl_easy_setopt() options are documented at:",
                     51:   " * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html",
                     52:   " ************************************************************************/",
                     53:   "#include <curl/curl.h>",
                     54:   "",
                     55:   "int main(int argc, char *argv[])",
                     56:   "{",
                     57:   "  CURLcode ret;",
                     58:   "  CURL *hnd;",
                     59:   NULL
                     60: };
                     61: /* easysrc_decl declarations come here */
                     62: /* easysrc_data initialisations come here */
                     63: /* easysrc_code statements come here */
                     64: static const char *const srchard[]={
                     65:   "/* Here is a list of options the curl code used that cannot get generated",
                     66:   "   as source easily. You may select to either not use them or implement",
                     67:   "   them yourself.",
                     68:   "",
                     69:   NULL
                     70: };
                     71: static const char *const srcend[]={
                     72:   "",
                     73:   "  return (int)ret;",
                     74:   "}",
                     75:   "/**** End of sample code ****/",
                     76:   NULL
                     77: };
                     78: 
                     79: /* Clean up all source code if we run out of memory */
                     80: static void easysrc_free(void)
                     81: {
                     82:   slist_wc_free_all(easysrc_decl);
                     83:   easysrc_decl = NULL;
                     84:   slist_wc_free_all(easysrc_data);
                     85:   easysrc_data = NULL;
                     86:   slist_wc_free_all(easysrc_code);
                     87:   easysrc_code = NULL;
                     88:   slist_wc_free_all(easysrc_toohard);
                     89:   easysrc_toohard = NULL;
                     90:   slist_wc_free_all(easysrc_clean);
                     91:   easysrc_clean = NULL;
                     92: }
                     93: 
                     94: /* Add a source line to the main code or remarks */
                     95: CURLcode easysrc_add(struct slist_wc **plist, const char *line)
                     96: {
                     97:   CURLcode ret = CURLE_OK;
                     98:   struct slist_wc *list = slist_wc_append(*plist, line);
                     99:   if(!list) {
                    100:     easysrc_free();
                    101:     ret = CURLE_OUT_OF_MEMORY;
                    102:   }
                    103:   else
                    104:     *plist = list;
                    105:   return ret;
                    106: }
                    107: 
                    108: CURLcode easysrc_addf(struct slist_wc **plist, const char *fmt, ...)
                    109: {
                    110:   CURLcode ret;
                    111:   char *bufp;
                    112:   va_list ap;
                    113:   va_start(ap, fmt);
                    114:   bufp = curlx_mvaprintf(fmt, ap);
                    115:   va_end(ap);
                    116:   if(! bufp) {
                    117:     ret = CURLE_OUT_OF_MEMORY;
                    118:   }
                    119:   else {
                    120:     ret = easysrc_add(plist, bufp);
                    121:     curl_free(bufp);
                    122:   }
                    123:   return ret;
                    124: }
                    125: 
                    126: #define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} while(0)
                    127: 
                    128: CURLcode easysrc_init(void)
                    129: {
                    130:   CHKRET(easysrc_add(&easysrc_code,
                    131:                      "hnd = curl_easy_init();"));
                    132:   return CURLE_OK;
                    133: }
                    134: 
                    135: CURLcode easysrc_perform(void)
                    136: {
                    137:   /* Note any setopt calls which we could not convert */
                    138:   if(easysrc_toohard) {
                    139:     int i;
                    140:     struct curl_slist *ptr;
                    141:     const char *c;
                    142:     CHKRET(easysrc_add(&easysrc_code, ""));
                    143:     /* Preamble comment */
                    144:     for(i = 0; ((c = srchard[i]) != NULL); i++)
                    145:       CHKRET(easysrc_add(&easysrc_code, c));
                    146:     /* Each unconverted option */
                    147:     if(easysrc_toohard) {
                    148:       for(ptr = easysrc_toohard->first; ptr; ptr = ptr->next)
                    149:         CHKRET(easysrc_add(&easysrc_code, ptr->data));
                    150:     }
                    151:     CHKRET(easysrc_add(&easysrc_code, ""));
                    152:     CHKRET(easysrc_add(&easysrc_code, "*/"));
                    153: 
                    154:     slist_wc_free_all(easysrc_toohard);
                    155:     easysrc_toohard = NULL;
                    156:   }
                    157: 
                    158:   CHKRET(easysrc_add(&easysrc_code, ""));
                    159:   CHKRET(easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);"));
                    160:   CHKRET(easysrc_add(&easysrc_code, ""));
                    161: 
                    162:   return CURLE_OK;
                    163: }
                    164: 
                    165: CURLcode easysrc_cleanup(void)
                    166: {
                    167:   CHKRET(easysrc_add(&easysrc_code, "curl_easy_cleanup(hnd);"));
                    168:   CHKRET(easysrc_add(&easysrc_code, "hnd = NULL;"));
                    169: 
                    170:   return CURLE_OK;
                    171: }
                    172: 
                    173: void dumpeasysrc(struct GlobalConfig *config)
                    174: {
                    175:   struct curl_slist *ptr;
                    176:   char *o = config->libcurl;
                    177: 
                    178:   FILE *out;
                    179:   bool fopened = FALSE;
                    180:   if(strcmp(o, "-")) {
                    181:     out = fopen(o, FOPEN_WRITETEXT);
                    182:     fopened = TRUE;
                    183:   }
                    184:   else
                    185:     out = stdout;
                    186:   if(!out)
                    187:     warnf(config, "Failed to open %s to write libcurl code!\n", o);
                    188:   else {
                    189:     int i;
                    190:     const char *c;
                    191: 
                    192:     for(i = 0; ((c = srchead[i]) != NULL); i++)
                    193:       fprintf(out, "%s\n", c);
                    194: 
                    195:     /* Declare variables used for complex setopt values */
                    196:     if(easysrc_decl) {
                    197:       for(ptr = easysrc_decl->first; ptr; ptr = ptr->next)
                    198:         fprintf(out, "  %s\n", ptr->data);
                    199:     }
                    200: 
                    201:     /* Set up complex values for setopt calls */
                    202:     if(easysrc_data) {
                    203:       fprintf(out, "\n");
                    204: 
                    205:       for(ptr = easysrc_data->first; ptr; ptr = ptr->next)
                    206:         fprintf(out, "  %s\n", ptr->data);
                    207:     }
                    208: 
                    209:     fprintf(out, "\n");
                    210:     if(easysrc_code) {
                    211:       for(ptr = easysrc_code->first; ptr; ptr = ptr->next) {
                    212:         if(ptr->data[0]) {
                    213:           fprintf(out, "  %s\n", ptr->data);
                    214:         }
                    215:         else {
                    216:           fprintf(out, "\n");
                    217:         }
                    218:       }
                    219:     }
                    220: 
                    221:     if(easysrc_clean) {
                    222:       for(ptr = easysrc_clean->first; ptr; ptr = ptr->next)
                    223:         fprintf(out, "  %s\n", ptr->data);
                    224:     }
                    225: 
                    226:     for(i = 0; ((c = srcend[i]) != NULL); i++)
                    227:       fprintf(out, "%s\n", c);
                    228: 
                    229:     if(fopened)
                    230:       fclose(out);
                    231:   }
                    232: 
                    233:   easysrc_free();
                    234: }
                    235: 
                    236: #endif /* CURL_DISABLE_LIBCURL_OPTION */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>