Annotation of embedaddon/curl/tests/libtest/mk-lib1521.pl, revision 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>