Based on Dan Fandrich's patch and gzip unpack function, we now compress
authorDaniel Stenberg <daniel@haxx.se>
Thu, 12 Jun 2003 12:54:34 +0000 (12:54 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 12 Jun 2003 12:54:34 +0000 (12:54 +0000)
the 'hugehelp' text if libz and gzip are available at build time.

src/Makefile.am
src/mkhelp.pl

index 00c51af..1699c96 100644 (file)
@@ -11,6 +11,14 @@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/src -I$(top_srcdir)/src
 
 bin_PROGRAMS = curl #memtest
 
+if HAVE_LIBZ
+# libz available, attempt to compress the help data
+MKHELPOPT=-c
+else
+# no libz, don't try to compress
+MKHELPOPT=
+endif
+
 #memtest_SOURCES = memtest.c
 #memtest_LDADD = $(top_srcdir)/lib/libcurl.la
 
@@ -38,4 +46,4 @@ MKHELP=$(top_srcdir)/src/mkhelp.pl
 # This generates the hugehelp.c file
 hugehelp.c: $(README) $(MANPAGE)  mkhelp.pl
        rm -f hugehelp.c
-       $(NROFF) -man $(MANPAGE) | $(PERL) $(MKHELP)  $(README) > hugehelp.c
+       $(NROFF) -man $(MANPAGE) | $(PERL) -s $(MKHELP) $(MKHELPOPT) $(README) > hugehelp.c
index d58ccf9..8487b87 100644 (file)
@@ -6,10 +6,10 @@
 # THEY DON'T FIT ME :-)
 
 # Get readme file as parameter:
-$README = $ARGV[0];
+my $README = $ARGV[0];
 
 if($README eq "") {
-    print "usage: mkreadme.pl <README>\n";
+    print "usage: mkreadme.pl [-c] <README> < manpage\n";
     exit;
 }
 
@@ -20,8 +20,8 @@ push @out, "                             / __| | | | |_) | |    \n";
 push @out, "                            | (__| |_| |  _ <| |___ \n";
 push @out, "                             \\___|\\___/|_| \\_\\_____|\n";
 
-$head=0;
-loop:
+my $head=0;
+
 while (<STDIN>) {
     $line = $_;
 
@@ -34,13 +34,13 @@ while (<STDIN>) {
     if($line =~ /^curl/i) {
        # cut off the page headers
         $head=1;
-       next loop;
+       next;
     } 
 
     if($line =~ /^[ \t]*\n/) {
        $wline++;
        # we only make one empty line max
-       next loop;
+       next;
     }
     if($wline) {
        $wline = 0;
@@ -54,20 +54,113 @@ while (<STDIN>) {
 push @out, "\n"; # just an extra newline
 
 open(READ, "<$README") ||
-    die "couldn't read the README infile";
+    die "couldn't read the README infile $README";
 
 while(<READ>) {
     push @out, $_;
 }
 close(READ);
 
+# 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";
+    }
+}
 
-print "/* NEVER EVER edit this manually, fix the mkhelp script instead! */\n"
-;
-print "#include <stdio.h>\n";
-print "void hugehelp(void)\n";
-print "{\n";
-print " fputs (\n";
+$now = localtime;
+print <<HEAD
+/*
+ * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
+ * Generation time: $now
+ */
+#include <stdio.h>
+HEAD
+    ;
+if($c) {
+    print "/* gzip shrunk this data from $gzip to $gzipped bytes */\n",
+    "#include <zlib.h>\nstatic const unsigned char hugehelpgz[] = {\n  ";
+    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 "\n};\n";
+
+    print <<EOF
+/* Decompress and send to stdout a gzip-compressed buffer */
+void hugehelp(void)
+{
+  unsigned char buf[0x10000];
+  int status,headerlen;
+  z_stream z;
+
+  /* Make sure no gzip options are set */
+  if (hugehelpgz[3] & 0xfe)
+    return;
+
+  headerlen = 10;
+  z.avail_in = 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 */
+  }
+  inflateEnd(&z);
+}
+EOF
+    ;
+exit;
+}
+else {
+    print <<HEAD
+void hugehelp(void)
+{
+   fputs(
+HEAD
+         ;
+}
 
 $outsize=0;
 for(@out) {