Annotation of embedaddon/curl/tests/libtest/mk-lib1521.pl, revision 1.1.1.1

1.1       misho       1: #!/usr/bin/env perl
                      2: #***************************************************************************
                      3: #                                  _   _ ____  _
                      4: #  Project                     ___| | | |  _ \| |
                      5: #                             / __| | | | |_) | |
                      6: #                            | (__| |_| |  _ <| |___
                      7: #                             \___|\___/|_| \_\_____|
                      8: #
                      9: # Copyright (C) 2017 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
                     10: #
                     11: # This software is licensed as described in the file COPYING, which
                     12: # you should have received as part of this distribution. The terms
                     13: # are also available at https://curl.haxx.se/docs/copyright.html.
                     14: #
                     15: # You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     16: # copies of the Software, and permit persons to whom the Software is
                     17: # furnished to do so, under the terms of the COPYING file.
                     18: #
                     19: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     20: # KIND, either express or implied.
                     21: #
                     22: ###########################################################################
                     23: 
                     24: # Usage:
                     25: #   perl mk-lib1521.pl < ../../include/curl/curl.h > lib1521.c
                     26: 
                     27: # minimum and maximum long signed values
                     28: my $minlong = "LONG_MIN";
                     29: my $maxlong = "LONG_MAX";
                     30: # maximum long unsigned value
                     31: my $maxulong = "ULONG_MAX";
                     32: 
                     33: print <<HEADER
                     34: /***************************************************************************
                     35:  *                                  _   _ ____  _
                     36:  *  Project                     ___| | | |  _ \\| |
                     37:  *                             / __| | | | |_) | |
                     38:  *                            | (__| |_| |  _ <| |___
                     39:  *                             \\___|\\___/|_| \\_\\_____|
                     40:  *
                     41:  * Copyright (C) 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
                     42:  *
                     43:  * This software is licensed as described in the file COPYING, which
                     44:  * you should have received as part of this distribution. The terms
                     45:  * are also available at https://curl.haxx.se/docs/copyright.html.
                     46:  *
                     47:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     48:  * copies of the Software, and permit persons to whom the Software is
                     49:  * furnished to do so, under the terms of the COPYING file.
                     50:  *
                     51:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     52:  * KIND, either express or implied.
                     53:  *
                     54:  ***************************************************************************/
                     55: #include "test.h"
                     56: #include "memdebug.h"
                     57: #include <limits.h>
                     58: 
                     59: /* This source code is generated by mk-lib1521.pl ! */
                     60: 
                     61: struct data {
                     62:     char *blaha;
                     63: };
                     64: 
                     65: #define LO $minlong
                     66: #define HI $maxlong
                     67: #define OFF_LO (curl_off_t) LO
                     68: #define OFF_HI (curl_off_t) $maxulong
                     69: #define OFF_NO (curl_off_t) 0
                     70: 
                     71: /* Unexpected error.
                     72:     CURLE_NOT_BUILT_IN   - means disabled at build
                     73:     CURLE_UNKNOWN_OPTION - means no such option (anymore?)
                     74:     CURLE_SSL_ENGINE_NOTFOUND - set unknown ssl engine
                     75:     CURLE_UNSUPPORTED_PROTOCOL - set bad HTTP version
                     76:     CURLE_BAD_FUNCTION_ARGUMENT - unsupported value
                     77:    */
                     78: #define UNEX(x) ((x) && \\
                     79:                  ((x) != CURLE_NOT_BUILT_IN) && \\
                     80:                  ((x) != CURLE_UNKNOWN_OPTION) && \\
                     81:                  ((x) != CURLE_SSL_ENGINE_NOTFOUND) && \\
                     82:                  ((x) != CURLE_UNSUPPORTED_PROTOCOL) && \\
                     83:                  ((x) != CURLE_BAD_FUNCTION_ARGUMENT) )
                     84: 
                     85: static size_t writecb(char *buffer, size_t size, size_t nitems,
                     86:                       void *outstream)
                     87: {
                     88:   (void)buffer;
                     89:   (void)size;
                     90:   (void)nitems;
                     91:   (void)outstream;
                     92:   return 0;
                     93: }
                     94: 
                     95: static size_t readcb(char *buffer,
                     96:               size_t size,
                     97:               size_t nitems,
                     98:               void *instream)
                     99: {
                    100:   (void)buffer;
                    101:   (void)size;
                    102:   (void)nitems;
                    103:   (void)instream;
                    104:   return 0;
                    105: }
                    106: 
                    107: static int err(const char *name, CURLcode val, int lineno)
                    108: {
                    109:   printf("CURLOPT_%s returned %d, \\"%s\\" on line %d\\n",
                    110:          name, val, curl_easy_strerror(val), lineno);
                    111:   return (int)val;
                    112: }
                    113: 
                    114: static int geterr(const char *name, CURLcode val, int lineno)
                    115: {
                    116:   printf("CURLINFO_%s returned %d, \\"%s\\" on line %d\\n",
                    117:          name, val, curl_easy_strerror(val), lineno);
                    118:   return (int)val;
                    119: }
                    120: 
                    121: static curl_progress_callback progresscb;
                    122: static curl_write_callback headercb;
                    123: static curl_debug_callback debugcb;
                    124: static curl_trailer_callback trailercb;
                    125: static curl_ssl_ctx_callback ssl_ctx_cb;
                    126: static curl_ioctl_callback ioctlcb;
                    127: static curl_sockopt_callback sockoptcb;
                    128: static curl_opensocket_callback opensocketcb;
                    129: static curl_seek_callback seekcb;
                    130: static curl_sshkeycallback ssh_keycb;
                    131: static curl_chunk_bgn_callback chunk_bgn_cb;
                    132: static curl_chunk_end_callback chunk_end_cb;
                    133: static curl_fnmatch_callback fnmatch_cb;
                    134: static curl_closesocket_callback closesocketcb;
                    135: static curl_xferinfo_callback xferinfocb;
                    136: static curl_resolver_start_callback resolver_start_cb;
                    137: 
                    138: int test(char *URL)
                    139: {
                    140:   CURL *curl = NULL;
                    141:   CURL *dep = NULL;
                    142:   CURLSH *share = NULL;
                    143:   char errorbuffer[CURL_ERROR_SIZE];
                    144:   void *conv_from_network_cb = NULL;
                    145:   void *conv_to_network_cb = NULL;
                    146:   void *conv_from_utf8_cb = NULL;
                    147:   void *interleavecb = NULL;
                    148:   char *stringpointerextra = (char *)"moooo";
                    149:   struct curl_slist *slist = NULL;
                    150:   struct curl_httppost *httppost = NULL;
                    151:   curl_mime *mimepost = NULL;
                    152:   FILE *stream = stderr;
                    153:   struct data object;
                    154:   char *charp;
                    155:   long val;
                    156:   curl_off_t oval;
                    157:   double dval;
                    158:   curl_socket_t sockfd;
                    159:   struct curl_certinfo *certinfo;
                    160:   struct curl_tlssessioninfo *tlssession;
                    161:   CURLcode res = CURLE_OK;
                    162:   (void)URL; /* not used */
                    163:   global_init(CURL_GLOBAL_ALL);
                    164:   easy_init(dep);
                    165:   easy_init(curl);
                    166:   share = curl_share_init();
                    167:   if(!share) {
                    168:     res = CURLE_OUT_OF_MEMORY;
                    169:     goto test_cleanup;
                    170:   }
                    171: 
                    172: HEADER
                    173:     ;
                    174: 
                    175: while(<STDIN>) {
                    176:     if($_ =~ /^  CURLOPT\(([^ ]*), ([^ ]*), (\d*)\)/) {
                    177:         my ($name, $type, $val)=($1, $2, $3);
                    178:         my $w="  ";
                    179:         my $pref = "${w}res = curl_easy_setopt(curl, $name,";
                    180:         my $i = ' ' x (length($w) + 23);
                    181:         my $check = "  if(UNEX(res)) {\n    err(\"$name\", res, __LINE__);\n    goto test_cleanup;\n  }\n";
                    182:         if($type eq "CURLOPTTYPE_STRINGPOINT") {
                    183:             print "${pref} \"string\");\n$check";
                    184:             print "${pref} NULL);\n$check";
                    185:         }
                    186:         elsif($type eq "CURLOPTTYPE_LONG") {
                    187:             print "${pref} 0L);\n$check";
                    188:             print "${pref} 22L);\n$check";
                    189:             print "${pref} LO);\n$check";
                    190:             print "${pref} HI);\n$check";
                    191:         }
                    192:         elsif($type eq "CURLOPTTYPE_OBJECTPOINT") {
                    193:             if($name =~ /DEPENDS/) {
                    194:               print "${pref} dep);\n$check";
                    195:             }
                    196:             elsif($name =~ "SHARE") {
                    197:               print "${pref} share);\n$check";
                    198:             }
                    199:             elsif($name eq "CURLOPT_ERRORBUFFER") {
                    200:               print "${pref} errorbuffer);\n$check";
                    201:             }
                    202:             elsif(($name eq "CURLOPT_POSTFIELDS") ||
                    203:                   ($name eq "CURLOPT_COPYPOSTFIELDS")) {
                    204:                 # set size to zero to avoid it being "illegal"
                    205:                 print "  (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);\n";
                    206:                 print "${pref} stringpointerextra);\n$check";
                    207:             }
                    208:             elsif($name eq "CURLOPT_HTTPPOST") {
                    209:               print "${pref} httppost);\n$check";
                    210:             }
                    211:             elsif($name eq "CURLOPT_MIMEPOST") {
                    212:               print "${pref} mimepost);\n$check";
                    213:             }
                    214:             elsif($name eq "CURLOPT_STDERR") {
                    215:               print "${pref} stream);\n$check";
                    216:             }
                    217:             else {
                    218:               print "${pref} &object);\n$check";
                    219:             }
                    220:             print "${pref} NULL);\n$check";
                    221:         }
                    222:         elsif($type eq "CURLOPTTYPE_SLISTPOINT") {
                    223:             print "${pref} slist);\n$check";
                    224:         }
                    225:         elsif($type eq "CURLOPTTYPE_FUNCTIONPOINT") {
                    226:             if($name =~ /([^ ]*)FUNCTION/) {
                    227:                 my $l=lc($1);
                    228:                 $l =~ s/^curlopt_//;
                    229:                 print "${pref}\n$i${l}cb);\n$check";
                    230:             }
                    231:             else {
                    232:                 print "${pref} &func);\n$check";
                    233:             }
                    234:             print "${pref} NULL);\n$check";
                    235:         }
                    236:         elsif($type eq "CURLOPTTYPE_OFF_T") {
                    237:             # play conservative to work with 32bit curl_off_t
                    238:             print "${pref} OFF_NO);\n$check";
                    239:             print "${pref} OFF_HI);\n$check";
                    240:             print "${pref} OFF_LO);\n$check";
                    241:         }
                    242:         else {
                    243:             print STDERR "\n---- $type\n";
                    244:         }
                    245:     }
                    246:     elsif($_ =~ /^  CURLINFO_NONE/) {
                    247:        $infomode = 1;
                    248:     }
                    249:     elsif($infomode &&
                    250:           ($_ =~ /^  CURLINFO_([^ ]*) *= *CURLINFO_([^ ]*)/)) {
                    251:        my ($info, $type)=($1, $2);
                    252:        my $c = "  res = curl_easy_getinfo(curl, CURLINFO_$info,";
                    253:        my $check = "  if(UNEX(res)) {\n    geterr(\"$info\", res, __LINE__);\n    goto test_cleanup;\n  }\n";
                    254:        if($type eq "STRING") {
                    255:          print "$c &charp);\n$check";
                    256:        }
                    257:        elsif($type eq "LONG") {
                    258:          print "$c &val);\n$check";
                    259:        }
                    260:        elsif($type eq "OFF_T") {
                    261:          print "$c &oval);\n$check";
                    262:        }
                    263:        elsif($type eq "DOUBLE") {
                    264:          print "$c &dval);\n$check";
                    265:        }
                    266:        elsif($type eq "SLIST") {
                    267:          print "$c &slist);\n$check";
                    268:          print "  if(slist)\n    curl_slist_free_all(slist);\n";
                    269:        }
                    270:        elsif($type eq "SOCKET") {
                    271:          print "$c &sockfd);\n$check";
                    272:        }
                    273:        elsif($type eq "PTR") {
                    274:          if($info eq "CERTINFO") {
                    275:             print "$c &certinfo);\n$check";
                    276:          }
                    277:          elsif(($info eq "TLS_SESSION") ||
                    278:                ($info eq "TLS_SSL_PTR")) {
                    279:             print "$c &tlssession);\n$check";
                    280:          }
                    281:          else {
                    282:             print STDERR "$info/$type is unsupported\n";
                    283:          }
                    284:        }
                    285:        else {
                    286:          print STDERR "$type is unsupported\n";
                    287:        }
                    288:     }
                    289: }
                    290: 
                    291: 
                    292: print <<FOOTER
                    293:   curl_easy_setopt(curl, 1, 0);
                    294:   res = CURLE_OK;
                    295: test_cleanup:
                    296:   curl_easy_cleanup(curl);
                    297:   curl_easy_cleanup(dep);
                    298:   curl_share_cleanup(share);
                    299:   curl_global_cleanup();
                    300: 
                    301:   return (int)res;
                    302: }
                    303: FOOTER
                    304:     ;

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