Git init
[external/curl.git] / src / mkhelp.pl
1 #!/usr/local/bin/perl
2
3 # Yeah, I know, probably 1000 other persons already wrote a script like
4 # this, but I'll tell ya:
5
6 # THEY DON'T FIT ME :-)
7
8 # Get readme file as parameter:
9
10 if($ARGV[0] eq "-c") {
11     $c=1;
12     shift @ARGV;
13 }
14
15 my $README = $ARGV[0];
16
17 if($README eq "") {
18     print "usage: mkreadme.pl [-c] <README> < manpage\n";
19     exit;
20 }
21
22
23 push @out, "                                  _   _ ____  _\n";
24 push @out, "  Project                     ___| | | |  _ \\| |\n";
25 push @out, "                             / __| | | | |_) | |\n";
26 push @out, "                            | (__| |_| |  _ <| |___\n";
27 push @out, "                             \\___|\\___/|_| \\_\\_____|\n";
28
29 my $olen=0;
30 while (<STDIN>) {
31     my $line = $_;
32
33     # this should be removed:
34     $line =~ s/(\b.|_\b)//g;
35
36     if($line =~ /^([ \t]*\n|curl)/i) {
37         # cut off headers and empty lines
38         $wline++; # count number of cut off lines
39         next;
40     }
41
42     my $text = $line;
43     $text =~ s/^\s+//g; # cut off preceeding...
44     $text =~ s/\s+$//g; # and trailing whitespaces
45
46     $tlen = length($text);
47
48     if($wline && ($olen == $tlen)) {
49         # if the previous line with contents was exactly as long as
50         # this line, then we ignore the newlines!
51
52         # We do this magic because a header may abort a paragraph at
53         # any line, but we don't want that to be noticed in the output
54         # here
55         $wline=0;
56     }
57     $olen = $tlen;
58
59     if($wline) {
60         # we only make one empty line max
61         $wline = 0;
62         push @out, "\n";
63     }
64     push @out, $line;
65 }
66 push @out, "\n"; # just an extra newline
67
68 open(READ, "<$README") ||
69     die "couldn't read the README infile $README";
70
71 while(<READ>) {
72     push @out, $_;
73 }
74 close(READ);
75
76 # if compressed
77 if($c) {
78     my @test = `gzip --version 2>&1`;
79     if($test[0] =~ /gzip/) {
80         open(GZIP, ">dumpit") ||
81             die "can't create the dumpit file, try without -c";
82         binmode GZIP;
83         for(@out) {
84             print GZIP $_;
85             $gzip += length($_);
86         }
87         close(GZIP);
88
89         system("gzip --best --no-name dumpit");
90
91         open(GZIP, "<dumpit.gz") ||
92              die "can't read the dumpit.gz file, try without -c";
93         binmode GZIP;
94         while(<GZIP>) {
95             push @gzip, $_;
96             $gzipped += length($_);
97         }
98         close(GZIP);
99
100         unlink("dumpit.gz");
101     }
102     else {
103         # no gzip, no compression!
104         undef $c;
105         print STDERR "MEEEP: Couldn't find gzip, disable compression\n";
106     }
107 }
108
109 $now = localtime;
110 print <<HEAD
111 /*
112  * NEVER EVER edit this manually, fix the mkhelp.pl script instead!
113  * Generation time: $now
114  */
115 #include "setup.h"
116 #ifdef USE_MANUAL
117 #include "hugehelp.h"
118 #include <stdio.h>
119 HEAD
120     ;
121 if($c) {
122     print <<HEAD
123 #include <stdlib.h>
124 #include <zlib.h>
125 static const unsigned char hugehelpgz[] = {
126   /* This mumbo-jumbo is the huge help text compressed with gzip.
127      Thanks to this operation, the size of this data shrunk from $gzip
128      to $gzipped bytes. You can disable the use of compressed help
129      texts by NOT passing -c to the mkhelp.pl tool. */
130 HEAD
131 ;
132     my $c=0;
133     print " ";
134     for(@gzip) {
135         my @all=split(//, $_);
136         for(@all) {
137             my $num=ord($_);
138             printf(" 0x%02x,", 0+$num);
139             if(++$c>11) {
140                 print "\n ";
141                 $c=0;
142             }
143         }
144     }
145     print "\n};\n";
146
147     print <<EOF
148 #define BUF_SIZE 0x10000
149 /* Decompress and send to stdout a gzip-compressed buffer */
150 void hugehelp(void)
151 {
152   unsigned char* buf;
153   int status,headerlen;
154   z_stream z;
155
156   /* Make sure no gzip options are set */
157   if (hugehelpgz[3] & 0xfe)
158     return;
159
160   headerlen = 10;
161   z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen);
162   z.next_in = (unsigned char *)hugehelpgz + headerlen;
163   z.zalloc = (alloc_func)Z_NULL;
164   z.zfree = (free_func)Z_NULL;
165   z.opaque = 0;
166
167   if (inflateInit2(&z, -MAX_WBITS) != Z_OK)
168     return;
169
170   buf = malloc(BUF_SIZE);
171   if (buf) {
172     while(1) {
173       z.avail_out = BUF_SIZE;
174       z.next_out = buf;
175       status = inflate(&z, Z_SYNC_FLUSH);
176       if (status == Z_OK || status == Z_STREAM_END) {
177         fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout);
178         if (status == Z_STREAM_END)
179           break;
180       }
181       else
182         break;    /* Error */
183     }
184     free(buf);
185   }
186   inflateEnd(&z);
187 }
188 EOF
189     ;
190 foot();
191 exit;
192 }
193 else {
194     print <<HEAD
195 void hugehelp(void)
196 {
197    fputs(
198 HEAD
199          ;
200 }
201
202 $outsize=0;
203 for(@out) {
204     chop;
205
206     $new = $_;
207
208     $outsize += length($new)+1; # one for the newline
209
210     $new =~ s/\\/\\\\/g;
211     $new =~ s/\"/\\\"/g;
212
213     # gcc 2.96 claims ISO C89 only is required to support 509 letter strings
214     if($outsize > 500) {
215         # terminate and make another fputs() call here
216         print ", stdout);\n fputs(\n";
217         $outsize=length($new)+1;
218     }
219     printf("\"%s\\n\"\n", $new);
220
221 }
222
223 print ", stdout) ;\n}\n";
224
225 foot();
226
227 sub foot {
228   print <<FOOT
229 #endif /* USE_MANUAL */
230 FOOT
231   ;
232 }