smtp: use the upload buffer size for scratch buffer malloc
[platform/upstream/curl.git] / src / mkhelp.pl
old mode 100644 (file)
new mode 100755 (executable)
index 8487b87..757f024
@@ -1,4 +1,25 @@
-#!/usr/local/bin/perl
+#!/usr/bin/env perl
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2014, 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 https://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.
+#
+###########################################################################
 
 # Yeah, I know, probably 1000 other persons already wrote a script like
 # this, but I'll tell ya:
 # THEY DON'T FIT ME :-)
 
 # Get readme file as parameter:
+
+if($ARGV[0] eq "-c") {
+    $c=1;
+    shift @ARGV;
+}
+
 my $README = $ARGV[0];
 
 if($README eq "") {
-    print "usage: mkreadme.pl [-c] <README> < manpage\n";
+    print "usage: mkhelp.pl [-c] <README> < manpage\n";
     exit;
 }
 
 
-push @out, "                                  _   _ ____  _     \n";
-push @out, "  Project                     ___| | | |  _ \\| |    \n";
-push @out, "                             / __| | | | |_) | |    \n";
-push @out, "                            | (__| |_| |  _ <| |___ \n";
+push @out, "                                  _   _ ____  _\n";
+push @out, "  Project                     ___| | | |  _ \\| |\n";
+push @out, "                             / __| | | | |_) | |\n";
+push @out, "                            | (__| |_| |  _ <| |___\n";
 push @out, "                             \\___|\\___/|_| \\_\\_____|\n";
 
-my $head=0;
-
+my $olen=0;
 while (<STDIN>) {
-    $line = $_;
+    my $line = $_;
 
-    # this kind should be removed first:
-    $line =~ s/_\b//g;
+    # this should be removed:
+    $line =~ s/(\b.|_\b)//g;
 
-    # then this:
-    $line =~ s/\b.//g;
+    # remove trailing CR from line. msysgit checks out files as line+CRLF
+    $line =~ s/\r$//;
 
-    if($line =~ /^curl/i) {
-       # cut off the page headers
-        $head=1;
-       next;
-    } 
+    if($line =~ /^([ \t]*\n|curl)/i) {
+        # cut off headers and empty lines
+        $wline++; # count number of cut off lines
+        next;
+    }
 
-    if($line =~ /^[ \t]*\n/) {
-       $wline++;
-       # we only make one empty line max
-       next;
+    my $text = $line;
+    $text =~ s/^\s+//g; # cut off preceding...
+    $text =~ s/\s+$//g; # and trailing whitespaces
+
+    $tlen = length($text);
+
+    if($wline && ($olen == $tlen)) {
+        # if the previous line with contents was exactly as long as
+        # this line, then we ignore the newlines!
+
+        # We do this magic because a header may abort a paragraph at
+        # any line, but we don't want that to be noticed in the output
+        # here
+        $wline=0;
     }
+    $olen = $tlen;
+
     if($wline) {
-       $wline = 0;
-        if(!$head) {
-            push @out, "\n";
-        }
-        $head =0;
+        # we only make one empty line max
+        $wline = 0;
+        push @out, "\n";
     }
     push @out, $line;
 }
@@ -57,68 +93,83 @@ open(READ, "<$README") ||
     die "couldn't read the README infile $README";
 
 while(<READ>) {
-    push @out, $_;
-}
-close(READ);
+    my $line = $_;
 
-# if compressed
-if($c) {
-    my @test = `gzip --version 2>&1`;
-    if($test[0] =~ /gzip/) {
-        open(GZIP, "|gzip -9 >dumpit.gz");
-        binmode GZIP;
-        for(@out) {
-            print GZIP $_;
-            $gzip += length($_);
-        }
-        close(GZIP);
-        
-        open(GZIP, "<dumpit.gz");
-        binmode GZIP;
-        while(<GZIP>) {
-            push @gzip, $_;
-            $gzipped += length($_);
-        }
-        close(GZIP);
-    }
-    else {
-        # no gzip, no compression!
-        undef $c;
-        print STDERR "MEEEP: Couldn't find gzip, disable compression\n";
-    }
+    # remove trailing CR from line. msysgit checks out files as line+CRLF
+    $line =~ s/\r$//;
+
+    push @out, $line;
 }
+close(READ);
 
-$now = localtime;
 print <<HEAD
 /*
  * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
- * Generation time: $now
  */
-#include <stdio.h>
+#ifdef USE_MANUAL
+#include "tool_hugehelp.h"
 HEAD
     ;
 if($c) {
-    print "/* gzip shrunk this data from $gzip to $gzipped bytes */\n",
-    "#include <zlib.h>\nstatic const unsigned char hugehelpgz[] = {\n  ";
+    # If compression requested, check that the Gzip module is available
+    # or else disable compression
+    $c = eval
+    {
+      require IO::Compress::Gzip;
+      IO::Compress::Gzip->import();
+      1;
+    };
+    print STDERR "Warning: compression requested but Gzip is not available\n" if (!$c)
+}
+
+if($c)
+{
+    my $content = join("", @out);
+    my $gzippedContent;
+    IO::Compress::Gzip::gzip(
+        \$content, \$gzippedContent, Level => 9, TextFlag => 1, Time=>0) or die "gzip failed:";
+    $gzip = length($content);
+    $gzipped = length($gzippedContent);
+
+    print <<HEAD
+#include <zlib.h>
+#include "memdebug.h" /* keep this as LAST include */
+static const unsigned char hugehelpgz[] = {
+  /* This mumbo-jumbo is the huge help text compressed with gzip.
+     Thanks to this operation, the size of this data shrank from $gzip
+     to $gzipped bytes. You can disable the use of compressed help
+     texts by NOT passing -c to the mkhelp.pl tool. */
+HEAD
+;
+
     my $c=0;
-    for(@gzip) {
-        my @all=split(//, $_);
-        for(@all) {
-            my $num=ord($_);
-            printf("0x%02x, ", 0+$num);
-            if(++$c>11) {
-                print "\n  ";
-                $c=0;
-            }
+    print " ";
+    for(split(//, $gzippedContent)) {
+        my $num=ord($_);
+        printf(" 0x%02x,", 0+$num);
+        if(!(++$c % 12)) {
+            print "\n ";
         }
     }
     print "\n};\n";
 
     print <<EOF
+#define BUF_SIZE 0x10000
+static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
+{
+  (void) opaque;
+  /* not a typo, keep it calloc() */
+  return (voidpf) calloc(items, size);
+}
+static void zfree_func(voidpf opaque, voidpf ptr)
+{
+  (void) opaque;
+  free(ptr);
+}
 /* Decompress and send to stdout a gzip-compressed buffer */
 void hugehelp(void)
 {
-  unsigned char buf[0x10000];
+  unsigned char* buf;
   int status,headerlen;
   z_stream z;
 
@@ -127,30 +178,36 @@ void hugehelp(void)
     return;
 
   headerlen = 10;
-  z.avail_in = sizeof(hugehelpgz) - headerlen;
+  memset(&z, 0, sizeof(z_stream));
+  z.zalloc = (alloc_func)zalloc_func;
+  z.zfree = (free_func)zfree_func;
+  z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen);
   z.next_in = (unsigned char *)hugehelpgz + headerlen;
-  z.zalloc = (alloc_func)Z_NULL;
-  z.zfree = (free_func)Z_NULL;
-  z.opaque = 0;
 
   if (inflateInit2(&z, -MAX_WBITS) != Z_OK)
     return;
 
-  for (;;) {
-    z.avail_out = (int)sizeof(buf);
-    z.next_out = buf;
-    status = inflate(&z, Z_SYNC_FLUSH);
-    if (status == Z_OK || status == Z_STREAM_END) {
-      fwrite(buf, sizeof(buf) - z.avail_out, 1, stdout);
-      if (status == Z_STREAM_END)
-         break;
-    } else
-      break;    /* Error */
+  buf = malloc(BUF_SIZE);
+  if (buf) {
+    while(1) {
+      z.avail_out = BUF_SIZE;
+      z.next_out = buf;
+      status = inflate(&z, Z_SYNC_FLUSH);
+      if (status == Z_OK || status == Z_STREAM_END) {
+        fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout);
+        if (status == Z_STREAM_END)
+          break;
+      }
+      else
+        break;    /* Error */
+    }
+    free(buf);
   }
   inflateEnd(&z);
 }
 EOF
     ;
+foot();
 exit;
 }
 else {
@@ -183,5 +240,17 @@ for(@out) {
 
 }
 
-print ", stdout) ;\n}\n"
-    
+print ", stdout) ;\n}\n";
+
+foot();
+
+sub foot {
+  print <<FOOT
+#else /* !USE_MANUAL */
+/* built-in manual is disabled, blank function */
+#include "tool_hugehelp.h"
+void hugehelp(void) {}
+#endif /* USE_MANUAL */
+FOOT
+  ;
+}