1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl 2*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 3*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 4*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 5*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 6*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 7*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 8*6236dae4SAndroid Build Coastguard Worker# 9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 10*6236dae4SAndroid Build Coastguard Worker# 11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 14*6236dae4SAndroid Build Coastguard Worker# 15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 18*6236dae4SAndroid Build Coastguard Worker# 19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 21*6236dae4SAndroid Build Coastguard Worker# 22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 23*6236dae4SAndroid Build Coastguard Worker# 24*6236dae4SAndroid Build Coastguard Worker########################################################################### 25*6236dae4SAndroid Build Coastguard Worker 26*6236dae4SAndroid Build Coastguard Worker=begin comment 27*6236dae4SAndroid Build Coastguard Worker 28*6236dae4SAndroid Build Coastguard WorkerThis script generates the manpage. 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard WorkerExample: managen <command> [files] > curl.1 31*6236dae4SAndroid Build Coastguard Worker 32*6236dae4SAndroid Build Coastguard WorkerDev notes: 33*6236dae4SAndroid Build Coastguard Worker 34*6236dae4SAndroid Build Coastguard WorkerWe open *input* files in :crlf translation (a no-op on many platforms) in 35*6236dae4SAndroid Build Coastguard Workercase we have CRLF line endings in Windows but a perl that defaults to LF. 36*6236dae4SAndroid Build Coastguard WorkerUnfortunately it seems some perls like msysgit cannot handle a global input-only 37*6236dae4SAndroid Build Coastguard Worker:crlf so it has to be specified on each file open for text input. 38*6236dae4SAndroid Build Coastguard Worker 39*6236dae4SAndroid Build Coastguard Worker=end comment 40*6236dae4SAndroid Build Coastguard Worker=cut 41*6236dae4SAndroid Build Coastguard Worker 42*6236dae4SAndroid Build Coastguard Workermy %optshort; 43*6236dae4SAndroid Build Coastguard Workermy %optlong; 44*6236dae4SAndroid Build Coastguard Workermy %helplong; 45*6236dae4SAndroid Build Coastguard Workermy %arglong; 46*6236dae4SAndroid Build Coastguard Workermy %redirlong; 47*6236dae4SAndroid Build Coastguard Workermy %protolong; 48*6236dae4SAndroid Build Coastguard Workermy %catlong; 49*6236dae4SAndroid Build Coastguard Worker 50*6236dae4SAndroid Build Coastguard Workeruse POSIX qw(strftime); 51*6236dae4SAndroid Build Coastguard Workermy @ts; 52*6236dae4SAndroid Build Coastguard Workerif (defined($ENV{SOURCE_DATE_EPOCH})) { 53*6236dae4SAndroid Build Coastguard Worker @ts = gmtime($ENV{SOURCE_DATE_EPOCH}); 54*6236dae4SAndroid Build Coastguard Worker} else { 55*6236dae4SAndroid Build Coastguard Worker @ts = localtime; 56*6236dae4SAndroid Build Coastguard Worker} 57*6236dae4SAndroid Build Coastguard Workermy $date = strftime "%Y-%m-%d", @ts; 58*6236dae4SAndroid Build Coastguard Workermy $year = strftime "%Y", @ts; 59*6236dae4SAndroid Build Coastguard Workermy $version = "unknown"; 60*6236dae4SAndroid Build Coastguard Workermy $globals; 61*6236dae4SAndroid Build Coastguard Workermy $error = 0; 62*6236dae4SAndroid Build Coastguard Workermy $indent = 4; 63*6236dae4SAndroid Build Coastguard Worker 64*6236dae4SAndroid Build Coastguard Worker# get the long name version, return the manpage string 65*6236dae4SAndroid Build Coastguard Workersub manpageify { 66*6236dae4SAndroid Build Coastguard Worker my ($k)=@_; 67*6236dae4SAndroid Build Coastguard Worker my $l; 68*6236dae4SAndroid Build Coastguard Worker my $trail; 69*6236dae4SAndroid Build Coastguard Worker # the matching pattern might include a trailing dot that cannot be part of 70*6236dae4SAndroid Build Coastguard Worker # the option name 71*6236dae4SAndroid Build Coastguard Worker if($k =~ s/\.$//) { 72*6236dae4SAndroid Build Coastguard Worker # cut off trailing dot 73*6236dae4SAndroid Build Coastguard Worker $trail = "."; 74*6236dae4SAndroid Build Coastguard Worker } 75*6236dae4SAndroid Build Coastguard Worker my $klong = $k; 76*6236dae4SAndroid Build Coastguard Worker # quote "bare" minuses in the long name 77*6236dae4SAndroid Build Coastguard Worker $klong =~ s/-/\\-/g; 78*6236dae4SAndroid Build Coastguard Worker if($optlong{$k}) { 79*6236dae4SAndroid Build Coastguard Worker # both short + long 80*6236dae4SAndroid Build Coastguard Worker $l = "\\fI-".$optlong{$k}.", \\-\\-$klong\\fP$trail"; 81*6236dae4SAndroid Build Coastguard Worker } 82*6236dae4SAndroid Build Coastguard Worker else { 83*6236dae4SAndroid Build Coastguard Worker # only long 84*6236dae4SAndroid Build Coastguard Worker $l = "\\fI\\-\\-$klong\\fP$trail"; 85*6236dae4SAndroid Build Coastguard Worker } 86*6236dae4SAndroid Build Coastguard Worker return $l; 87*6236dae4SAndroid Build Coastguard Worker} 88*6236dae4SAndroid Build Coastguard Worker 89*6236dae4SAndroid Build Coastguard Worker 90*6236dae4SAndroid Build Coastguard Workermy $colwidth=79; # max number of columns 91*6236dae4SAndroid Build Coastguard Worker 92*6236dae4SAndroid Build Coastguard Workersub prefixline { 93*6236dae4SAndroid Build Coastguard Worker my ($num) = @_; 94*6236dae4SAndroid Build Coastguard Worker print "\t" x ($num/8); 95*6236dae4SAndroid Build Coastguard Worker print ' ' x ($num%8); 96*6236dae4SAndroid Build Coastguard Worker} 97*6236dae4SAndroid Build Coastguard Worker 98*6236dae4SAndroid Build Coastguard Workersub justline { 99*6236dae4SAndroid Build Coastguard Worker my ($lvl, @line) = @_; 100*6236dae4SAndroid Build Coastguard Worker my $w = -1; 101*6236dae4SAndroid Build Coastguard Worker my $spaces = -1; 102*6236dae4SAndroid Build Coastguard Worker my $width = $colwidth - ($lvl * $indent); 103*6236dae4SAndroid Build Coastguard Worker for(@line) { 104*6236dae4SAndroid Build Coastguard Worker $w += length($_); 105*6236dae4SAndroid Build Coastguard Worker $w++; 106*6236dae4SAndroid Build Coastguard Worker $spaces++; 107*6236dae4SAndroid Build Coastguard Worker } 108*6236dae4SAndroid Build Coastguard Worker my $inject = $width - $w; 109*6236dae4SAndroid Build Coastguard Worker my $ratio = 0; # stay at zero if no spaces at all 110*6236dae4SAndroid Build Coastguard Worker if($spaces) { 111*6236dae4SAndroid Build Coastguard Worker $ratio = $inject / $spaces; 112*6236dae4SAndroid Build Coastguard Worker } 113*6236dae4SAndroid Build Coastguard Worker my $spare = 0; 114*6236dae4SAndroid Build Coastguard Worker prefixline($lvl * $indent); 115*6236dae4SAndroid Build Coastguard Worker my $prev; 116*6236dae4SAndroid Build Coastguard Worker for(@line) { 117*6236dae4SAndroid Build Coastguard Worker while($spare >= 0.90) { 118*6236dae4SAndroid Build Coastguard Worker print " "; 119*6236dae4SAndroid Build Coastguard Worker $spare--; 120*6236dae4SAndroid Build Coastguard Worker } 121*6236dae4SAndroid Build Coastguard Worker printf "%s%s", $prev?" ":"", $_; 122*6236dae4SAndroid Build Coastguard Worker $prev = 1; 123*6236dae4SAndroid Build Coastguard Worker $spare += $ratio; 124*6236dae4SAndroid Build Coastguard Worker } 125*6236dae4SAndroid Build Coastguard Worker print "\n"; 126*6236dae4SAndroid Build Coastguard Worker} 127*6236dae4SAndroid Build Coastguard Worker 128*6236dae4SAndroid Build Coastguard Workersub lastline { 129*6236dae4SAndroid Build Coastguard Worker my ($lvl, @line) = @_; 130*6236dae4SAndroid Build Coastguard Worker $line[0] =~ s/^( +)//; 131*6236dae4SAndroid Build Coastguard Worker prefixline($lvl * $indent + length($1)); 132*6236dae4SAndroid Build Coastguard Worker my $prev = 0; 133*6236dae4SAndroid Build Coastguard Worker for(@line) { 134*6236dae4SAndroid Build Coastguard Worker printf "%s%s", $prev?" ":"", $_; 135*6236dae4SAndroid Build Coastguard Worker $prev = 1; 136*6236dae4SAndroid Build Coastguard Worker } 137*6236dae4SAndroid Build Coastguard Worker print "\n"; 138*6236dae4SAndroid Build Coastguard Worker} 139*6236dae4SAndroid Build Coastguard Worker 140*6236dae4SAndroid Build Coastguard Workersub outputpara { 141*6236dae4SAndroid Build Coastguard Worker my ($lvl, $f) = @_; 142*6236dae4SAndroid Build Coastguard Worker $f =~ s/\n/ /g; 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard Worker my $w = 0; 145*6236dae4SAndroid Build Coastguard Worker my @words = split(/ */, $f); 146*6236dae4SAndroid Build Coastguard Worker my $width = $colwidth - ($lvl * $indent); 147*6236dae4SAndroid Build Coastguard Worker 148*6236dae4SAndroid Build Coastguard Worker my @line; 149*6236dae4SAndroid Build Coastguard Worker for my $e (@words) { 150*6236dae4SAndroid Build Coastguard Worker my $l = length($e); 151*6236dae4SAndroid Build Coastguard Worker my $spaces = scalar(@line); 152*6236dae4SAndroid Build Coastguard Worker if(($w + $l + $spaces) >= $width) { 153*6236dae4SAndroid Build Coastguard Worker justline($lvl, @line); 154*6236dae4SAndroid Build Coastguard Worker undef @line; 155*6236dae4SAndroid Build Coastguard Worker $w = 0; 156*6236dae4SAndroid Build Coastguard Worker } 157*6236dae4SAndroid Build Coastguard Worker 158*6236dae4SAndroid Build Coastguard Worker push @line, $e; 159*6236dae4SAndroid Build Coastguard Worker $w += $l; # new width 160*6236dae4SAndroid Build Coastguard Worker } 161*6236dae4SAndroid Build Coastguard Worker if($w) { 162*6236dae4SAndroid Build Coastguard Worker lastline($lvl, @line); 163*6236dae4SAndroid Build Coastguard Worker print "\n"; 164*6236dae4SAndroid Build Coastguard Worker } 165*6236dae4SAndroid Build Coastguard Worker} 166*6236dae4SAndroid Build Coastguard Worker 167*6236dae4SAndroid Build Coastguard Workersub printdesc { 168*6236dae4SAndroid Build Coastguard Worker my ($manpage, $baselvl, @desc) = @_; 169*6236dae4SAndroid Build Coastguard Worker 170*6236dae4SAndroid Build Coastguard Worker if($manpage) { 171*6236dae4SAndroid Build Coastguard Worker for my $d (@desc) { 172*6236dae4SAndroid Build Coastguard Worker print $d; 173*6236dae4SAndroid Build Coastguard Worker } 174*6236dae4SAndroid Build Coastguard Worker } 175*6236dae4SAndroid Build Coastguard Worker else { 176*6236dae4SAndroid Build Coastguard Worker my $p = -1; 177*6236dae4SAndroid Build Coastguard Worker my $para; 178*6236dae4SAndroid Build Coastguard Worker for my $l (@desc) { 179*6236dae4SAndroid Build Coastguard Worker my $lvl; 180*6236dae4SAndroid Build Coastguard Worker if($l !~ /^[\n\r]+/) { 181*6236dae4SAndroid Build Coastguard Worker # get the indent level off the string 182*6236dae4SAndroid Build Coastguard Worker $l =~ s/^\[([0-9q]*)\]//; 183*6236dae4SAndroid Build Coastguard Worker $lvl = $1; 184*6236dae4SAndroid Build Coastguard Worker } 185*6236dae4SAndroid Build Coastguard Worker if(($p =~ /q/) && ($lvl !~ /q/)) { 186*6236dae4SAndroid Build Coastguard Worker # the previous was quoted, this is not 187*6236dae4SAndroid Build Coastguard Worker print "\n"; 188*6236dae4SAndroid Build Coastguard Worker } 189*6236dae4SAndroid Build Coastguard Worker if($lvl != $p) { 190*6236dae4SAndroid Build Coastguard Worker outputpara($baselvl + $p, $para); 191*6236dae4SAndroid Build Coastguard Worker $para = ""; 192*6236dae4SAndroid Build Coastguard Worker } 193*6236dae4SAndroid Build Coastguard Worker if($lvl =~ /q/) { 194*6236dae4SAndroid Build Coastguard Worker # quoted, do not right-justify 195*6236dae4SAndroid Build Coastguard Worker chomp $l; 196*6236dae4SAndroid Build Coastguard Worker lastline($baselvl + $lvl + 1, $l); 197*6236dae4SAndroid Build Coastguard Worker my $w = ($baselvl + $lvl + 1) * $indent + length($l); 198*6236dae4SAndroid Build Coastguard Worker if ($w > $colwidth) { 199*6236dae4SAndroid Build Coastguard Worker print STDERR "ERROR: $w columns is too long\n"; 200*6236dae4SAndroid Build Coastguard Worker print STDERR "$l\n"; 201*6236dae4SAndroid Build Coastguard Worker $error++; 202*6236dae4SAndroid Build Coastguard Worker } 203*6236dae4SAndroid Build Coastguard Worker } 204*6236dae4SAndroid Build Coastguard Worker else { 205*6236dae4SAndroid Build Coastguard Worker $para .= $l; 206*6236dae4SAndroid Build Coastguard Worker } 207*6236dae4SAndroid Build Coastguard Worker 208*6236dae4SAndroid Build Coastguard Worker $p = $lvl; 209*6236dae4SAndroid Build Coastguard Worker } 210*6236dae4SAndroid Build Coastguard Worker outputpara($baselvl + $p, $para); 211*6236dae4SAndroid Build Coastguard Worker } 212*6236dae4SAndroid Build Coastguard Worker} 213*6236dae4SAndroid Build Coastguard Worker 214*6236dae4SAndroid Build Coastguard Workersub seealso { 215*6236dae4SAndroid Build Coastguard Worker my($standalone, $data)=@_; 216*6236dae4SAndroid Build Coastguard Worker if($standalone) { 217*6236dae4SAndroid Build Coastguard Worker return sprintf 218*6236dae4SAndroid Build Coastguard Worker ".SH \"SEE ALSO\"\n$data\n"; 219*6236dae4SAndroid Build Coastguard Worker } 220*6236dae4SAndroid Build Coastguard Worker else { 221*6236dae4SAndroid Build Coastguard Worker return "See also $data. "; 222*6236dae4SAndroid Build Coastguard Worker } 223*6236dae4SAndroid Build Coastguard Worker} 224*6236dae4SAndroid Build Coastguard Worker 225*6236dae4SAndroid Build Coastguard Workersub overrides { 226*6236dae4SAndroid Build Coastguard Worker my ($standalone, $data)=@_; 227*6236dae4SAndroid Build Coastguard Worker if($standalone) { 228*6236dae4SAndroid Build Coastguard Worker return ".SH \"OVERRIDES\"\n$data\n"; 229*6236dae4SAndroid Build Coastguard Worker } 230*6236dae4SAndroid Build Coastguard Worker else { 231*6236dae4SAndroid Build Coastguard Worker return $data; 232*6236dae4SAndroid Build Coastguard Worker } 233*6236dae4SAndroid Build Coastguard Worker} 234*6236dae4SAndroid Build Coastguard Worker 235*6236dae4SAndroid Build Coastguard Workersub protocols { 236*6236dae4SAndroid Build Coastguard Worker my ($manpage, $standalone, $data)=@_; 237*6236dae4SAndroid Build Coastguard Worker if($standalone) { 238*6236dae4SAndroid Build Coastguard Worker return ".SH \"PROTOCOLS\"\n$data\n"; 239*6236dae4SAndroid Build Coastguard Worker } 240*6236dae4SAndroid Build Coastguard Worker else { 241*6236dae4SAndroid Build Coastguard Worker return "($data) " if($manpage); 242*6236dae4SAndroid Build Coastguard Worker return "[1]($data) " if(!$manpage); 243*6236dae4SAndroid Build Coastguard Worker } 244*6236dae4SAndroid Build Coastguard Worker} 245*6236dae4SAndroid Build Coastguard Worker 246*6236dae4SAndroid Build Coastguard Workersub too_old { 247*6236dae4SAndroid Build Coastguard Worker my ($version)=@_; 248*6236dae4SAndroid Build Coastguard Worker my $a = 999999; 249*6236dae4SAndroid Build Coastguard Worker if($version =~ /^(\d+)\.(\d+)\.(\d+)/) { 250*6236dae4SAndroid Build Coastguard Worker $a = $1 * 1000 + $2 * 10 + $3; 251*6236dae4SAndroid Build Coastguard Worker } 252*6236dae4SAndroid Build Coastguard Worker elsif($version =~ /^(\d+)\.(\d+)/) { 253*6236dae4SAndroid Build Coastguard Worker $a = $1 * 1000 + $2 * 10; 254*6236dae4SAndroid Build Coastguard Worker } 255*6236dae4SAndroid Build Coastguard Worker if($a < 7600) { 256*6236dae4SAndroid Build Coastguard Worker # we consider everything before 7.60.0 to be too old to mention 257*6236dae4SAndroid Build Coastguard Worker # specific changes for 258*6236dae4SAndroid Build Coastguard Worker return 1; 259*6236dae4SAndroid Build Coastguard Worker } 260*6236dae4SAndroid Build Coastguard Worker return 0; 261*6236dae4SAndroid Build Coastguard Worker} 262*6236dae4SAndroid Build Coastguard Worker 263*6236dae4SAndroid Build Coastguard Workersub added { 264*6236dae4SAndroid Build Coastguard Worker my ($standalone, $data)=@_; 265*6236dae4SAndroid Build Coastguard Worker if(too_old($data)) { 266*6236dae4SAndroid Build Coastguard Worker # do not mention ancient additions 267*6236dae4SAndroid Build Coastguard Worker return ""; 268*6236dae4SAndroid Build Coastguard Worker } 269*6236dae4SAndroid Build Coastguard Worker if($standalone) { 270*6236dae4SAndroid Build Coastguard Worker return ".SH \"ADDED\"\nAdded in curl version $data\n"; 271*6236dae4SAndroid Build Coastguard Worker } 272*6236dae4SAndroid Build Coastguard Worker else { 273*6236dae4SAndroid Build Coastguard Worker return "Added in $data. "; 274*6236dae4SAndroid Build Coastguard Worker } 275*6236dae4SAndroid Build Coastguard Worker} 276*6236dae4SAndroid Build Coastguard Worker 277*6236dae4SAndroid Build Coastguard Workersub render { 278*6236dae4SAndroid Build Coastguard Worker my ($manpage, $fh, $f, $line) = @_; 279*6236dae4SAndroid Build Coastguard Worker my @desc; 280*6236dae4SAndroid Build Coastguard Worker my $tablemode = 0; 281*6236dae4SAndroid Build Coastguard Worker my $header = 0; 282*6236dae4SAndroid Build Coastguard Worker # if $top is TRUE, it means a top-level page and not a command line option 283*6236dae4SAndroid Build Coastguard Worker my $top = ($line == 1); 284*6236dae4SAndroid Build Coastguard Worker my $quote; 285*6236dae4SAndroid Build Coastguard Worker my $level; 286*6236dae4SAndroid Build Coastguard Worker my $finalblank; 287*6236dae4SAndroid Build Coastguard Worker $start = 0; 288*6236dae4SAndroid Build Coastguard Worker 289*6236dae4SAndroid Build Coastguard Worker while(<$fh>) { 290*6236dae4SAndroid Build Coastguard Worker my $d = $_; 291*6236dae4SAndroid Build Coastguard Worker $line++; 292*6236dae4SAndroid Build Coastguard Worker $finalblank = ($d eq "\n"); 293*6236dae4SAndroid Build Coastguard Worker if($d =~ /^\.(SH|BR|IP|B)/) { 294*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: nroff instruction in input: \".$1\"\n"; 295*6236dae4SAndroid Build Coastguard Worker return 4; 296*6236dae4SAndroid Build Coastguard Worker } 297*6236dae4SAndroid Build Coastguard Worker if(/^ *<!--/) { 298*6236dae4SAndroid Build Coastguard Worker # skip comments 299*6236dae4SAndroid Build Coastguard Worker next; 300*6236dae4SAndroid Build Coastguard Worker } 301*6236dae4SAndroid Build Coastguard Worker if((!$start) && ($_ =~ /^[\r\n]*\z/)) { 302*6236dae4SAndroid Build Coastguard Worker # skip leading blank lines 303*6236dae4SAndroid Build Coastguard Worker next; 304*6236dae4SAndroid Build Coastguard Worker } 305*6236dae4SAndroid Build Coastguard Worker $start = 1; 306*6236dae4SAndroid Build Coastguard Worker if(/^# (.*)/) { 307*6236dae4SAndroid Build Coastguard Worker $header = 1; 308*6236dae4SAndroid Build Coastguard Worker if($top != 1) { 309*6236dae4SAndroid Build Coastguard Worker # ignored for command line options 310*6236dae4SAndroid Build Coastguard Worker $blankline++; 311*6236dae4SAndroid Build Coastguard Worker next; 312*6236dae4SAndroid Build Coastguard Worker } 313*6236dae4SAndroid Build Coastguard Worker push @desc, ".SH $1\n" if($manpage); 314*6236dae4SAndroid Build Coastguard Worker push @desc, "[0]$1\n" if(!$manpage); 315*6236dae4SAndroid Build Coastguard Worker next; 316*6236dae4SAndroid Build Coastguard Worker } 317*6236dae4SAndroid Build Coastguard Worker elsif(/^###/) { 318*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: ### header is not supported\n"; 319*6236dae4SAndroid Build Coastguard Worker exit 3; 320*6236dae4SAndroid Build Coastguard Worker } 321*6236dae4SAndroid Build Coastguard Worker elsif(/^## (.*)/) { 322*6236dae4SAndroid Build Coastguard Worker my $word = $1; 323*6236dae4SAndroid Build Coastguard Worker # if there are enclosing quotes, remove them first 324*6236dae4SAndroid Build Coastguard Worker $word =~ s/[\"\'](.*)[\"\']\z/$1/; 325*6236dae4SAndroid Build Coastguard Worker 326*6236dae4SAndroid Build Coastguard Worker # remove backticks from headers 327*6236dae4SAndroid Build Coastguard Worker $word =~ s/\`//g; 328*6236dae4SAndroid Build Coastguard Worker 329*6236dae4SAndroid Build Coastguard Worker # if there is a space, it needs quotes for manpage 330*6236dae4SAndroid Build Coastguard Worker if(($word =~ / /) && $manpage) { 331*6236dae4SAndroid Build Coastguard Worker $word = "\"$word\""; 332*6236dae4SAndroid Build Coastguard Worker } 333*6236dae4SAndroid Build Coastguard Worker $level = 1; 334*6236dae4SAndroid Build Coastguard Worker if($top == 1) { 335*6236dae4SAndroid Build Coastguard Worker push @desc, ".IP $word\n" if($manpage); 336*6236dae4SAndroid Build Coastguard Worker push @desc, "\n" if(!$manpage); 337*6236dae4SAndroid Build Coastguard Worker push @desc, "[1]$word\n" if(!$manpage); 338*6236dae4SAndroid Build Coastguard Worker } 339*6236dae4SAndroid Build Coastguard Worker else { 340*6236dae4SAndroid Build Coastguard Worker if(!$tablemode) { 341*6236dae4SAndroid Build Coastguard Worker push @desc, ".RS\n" if($manpage); 342*6236dae4SAndroid Build Coastguard Worker $tablemode = 1; 343*6236dae4SAndroid Build Coastguard Worker } 344*6236dae4SAndroid Build Coastguard Worker push @desc, ".IP $word\n" if($manpage); 345*6236dae4SAndroid Build Coastguard Worker push @desc, "\n" if(!$manpage); 346*6236dae4SAndroid Build Coastguard Worker push @desc, "[1]$word\n" if(!$manpage); 347*6236dae4SAndroid Build Coastguard Worker } 348*6236dae4SAndroid Build Coastguard Worker $header = 1; 349*6236dae4SAndroid Build Coastguard Worker next; 350*6236dae4SAndroid Build Coastguard Worker } 351*6236dae4SAndroid Build Coastguard Worker elsif(/^##/) { 352*6236dae4SAndroid Build Coastguard Worker if($top == 1) { 353*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: ## empty header top-level mode\n"; 354*6236dae4SAndroid Build Coastguard Worker exit 3; 355*6236dae4SAndroid Build Coastguard Worker } 356*6236dae4SAndroid Build Coastguard Worker if($tablemode) { 357*6236dae4SAndroid Build Coastguard Worker # end of table 358*6236dae4SAndroid Build Coastguard Worker push @desc, ".RE\n.IP\n" if($manpage); 359*6236dae4SAndroid Build Coastguard Worker $tablemode = 0; 360*6236dae4SAndroid Build Coastguard Worker } 361*6236dae4SAndroid Build Coastguard Worker $header = 1; 362*6236dae4SAndroid Build Coastguard Worker next; 363*6236dae4SAndroid Build Coastguard Worker } 364*6236dae4SAndroid Build Coastguard Worker elsif(/^\.(IP|RS|RE)/) { 365*6236dae4SAndroid Build Coastguard Worker my ($cmd) = ($1); 366*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: $cmd detected, use ##-style\n"; 367*6236dae4SAndroid Build Coastguard Worker return 3; 368*6236dae4SAndroid Build Coastguard Worker } 369*6236dae4SAndroid Build Coastguard Worker elsif(/^[ \t]*\n/) { 370*6236dae4SAndroid Build Coastguard Worker # count and ignore blank lines 371*6236dae4SAndroid Build Coastguard Worker $blankline++; 372*6236dae4SAndroid Build Coastguard Worker next; 373*6236dae4SAndroid Build Coastguard Worker } 374*6236dae4SAndroid Build Coastguard Worker elsif($d =~ /^ (.*)/) { 375*6236dae4SAndroid Build Coastguard Worker my $word = $1; 376*6236dae4SAndroid Build Coastguard Worker if(!$quote && $manpage) { 377*6236dae4SAndroid Build Coastguard Worker push @desc, "\n" if($blankline); 378*6236dae4SAndroid Build Coastguard Worker push @desc, ".nf\n"; 379*6236dae4SAndroid Build Coastguard Worker $blankline = 0; 380*6236dae4SAndroid Build Coastguard Worker } 381*6236dae4SAndroid Build Coastguard Worker $quote = 1; 382*6236dae4SAndroid Build Coastguard Worker $d = "$word\n"; 383*6236dae4SAndroid Build Coastguard Worker } 384*6236dae4SAndroid Build Coastguard Worker elsif($quote && ($d !~ /^ (.*)/)) { 385*6236dae4SAndroid Build Coastguard Worker # end of quote 386*6236dae4SAndroid Build Coastguard Worker push @desc, ".fi\n" if($manpage); 387*6236dae4SAndroid Build Coastguard Worker $quote = 0; 388*6236dae4SAndroid Build Coastguard Worker } 389*6236dae4SAndroid Build Coastguard Worker 390*6236dae4SAndroid Build Coastguard Worker $d =~ s/`%DATE`/$date/g; 391*6236dae4SAndroid Build Coastguard Worker $d =~ s/`%VERSION`/$version/g; 392*6236dae4SAndroid Build Coastguard Worker $d =~ s/`%GLOBALS`/$globals/g; 393*6236dae4SAndroid Build Coastguard Worker 394*6236dae4SAndroid Build Coastguard Worker # convert backticks to double quotes 395*6236dae4SAndroid Build Coastguard Worker $d =~ s/\`/\"/g; 396*6236dae4SAndroid Build Coastguard Worker 397*6236dae4SAndroid Build Coastguard Worker if($d =~ /\(added in(.*)/i) { 398*6236dae4SAndroid Build Coastguard Worker if(length($1) < 2) { 399*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: broken up added-in line:\n"; 400*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: $d"; 401*6236dae4SAndroid Build Coastguard Worker return 3; 402*6236dae4SAndroid Build Coastguard Worker } 403*6236dae4SAndroid Build Coastguard Worker } 404*6236dae4SAndroid Build Coastguard Worker again: 405*6236dae4SAndroid Build Coastguard Worker if($d =~ /\(Added in ([0-9.]+)\)/i) { 406*6236dae4SAndroid Build Coastguard Worker my $ver = $1; 407*6236dae4SAndroid Build Coastguard Worker if(too_old($ver)) { 408*6236dae4SAndroid Build Coastguard Worker $d =~ s/ *\(Added in $ver\)//gi; 409*6236dae4SAndroid Build Coastguard Worker goto again; 410*6236dae4SAndroid Build Coastguard Worker } 411*6236dae4SAndroid Build Coastguard Worker } 412*6236dae4SAndroid Build Coastguard Worker 413*6236dae4SAndroid Build Coastguard Worker if(!$quote) { 414*6236dae4SAndroid Build Coastguard Worker if($d =~ /^(.*) /) { 415*6236dae4SAndroid Build Coastguard Worker printf STDERR "$f:$line:%d:ERROR: 2 spaces detected\n", 416*6236dae4SAndroid Build Coastguard Worker length($1); 417*6236dae4SAndroid Build Coastguard Worker return 3; 418*6236dae4SAndroid Build Coastguard Worker } 419*6236dae4SAndroid Build Coastguard Worker elsif($d =~ /[^\\][\<\>]/) { 420*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:WARN: un-escaped < or > used\n"; 421*6236dae4SAndroid Build Coastguard Worker return 3; 422*6236dae4SAndroid Build Coastguard Worker } 423*6236dae4SAndroid Build Coastguard Worker } 424*6236dae4SAndroid Build Coastguard Worker # convert backslash-'<' or '> to just the second character 425*6236dae4SAndroid Build Coastguard Worker $d =~ s/\\([><])/$1/g; 426*6236dae4SAndroid Build Coastguard Worker # convert single backslash to double-backslash 427*6236dae4SAndroid Build Coastguard Worker $d =~ s/\\/\\\\/g if($manpage); 428*6236dae4SAndroid Build Coastguard Worker 429*6236dae4SAndroid Build Coastguard Worker 430*6236dae4SAndroid Build Coastguard Worker if($manpage) { 431*6236dae4SAndroid Build Coastguard Worker if(!$quote && $d =~ /--/) { 432*6236dae4SAndroid Build Coastguard Worker $d =~ s/--([a-z0-9.-]+)/manpageify($1)/ge; 433*6236dae4SAndroid Build Coastguard Worker } 434*6236dae4SAndroid Build Coastguard Worker 435*6236dae4SAndroid Build Coastguard Worker # quote minuses in the output 436*6236dae4SAndroid Build Coastguard Worker $d =~ s/([^\\])-/$1\\-/g; 437*6236dae4SAndroid Build Coastguard Worker # replace single quotes 438*6236dae4SAndroid Build Coastguard Worker $d =~ s/\'/\\(aq/g; 439*6236dae4SAndroid Build Coastguard Worker # handle double quotes or periods first on the line 440*6236dae4SAndroid Build Coastguard Worker $d =~ s/^([\.\"])/\\&$1/; 441*6236dae4SAndroid Build Coastguard Worker # **bold** 442*6236dae4SAndroid Build Coastguard Worker $d =~ s/\*\*(\S.*?)\*\*/\\fB$1\\fP/g; 443*6236dae4SAndroid Build Coastguard Worker # *italics* 444*6236dae4SAndroid Build Coastguard Worker $d =~ s/\*(\S.*?)\*/\\fI$1\\fP/g; 445*6236dae4SAndroid Build Coastguard Worker } 446*6236dae4SAndroid Build Coastguard Worker else { 447*6236dae4SAndroid Build Coastguard Worker # **bold** 448*6236dae4SAndroid Build Coastguard Worker $d =~ s/\*\*(\S.*?)\*\*/$1/g; 449*6236dae4SAndroid Build Coastguard Worker # *italics* 450*6236dae4SAndroid Build Coastguard Worker $d =~ s/\*(\S.*?)\*/$1/g; 451*6236dae4SAndroid Build Coastguard Worker } 452*6236dae4SAndroid Build Coastguard Worker # trim trailing spaces 453*6236dae4SAndroid Build Coastguard Worker $d =~ s/[ \t]+\z//; 454*6236dae4SAndroid Build Coastguard Worker push @desc, "\n" if($blankline && !$header); 455*6236dae4SAndroid Build Coastguard Worker $blankline = 0; 456*6236dae4SAndroid Build Coastguard Worker push @desc, $d if($manpage); 457*6236dae4SAndroid Build Coastguard Worker my $qstr = $quote ? "q": ""; 458*6236dae4SAndroid Build Coastguard Worker push @desc, "[".(1 + $level)."$qstr]$d" if(!$manpage); 459*6236dae4SAndroid Build Coastguard Worker $header = 0; 460*6236dae4SAndroid Build Coastguard Worker 461*6236dae4SAndroid Build Coastguard Worker } 462*6236dae4SAndroid Build Coastguard Worker if($finalblank) { 463*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: trailing blank line\n"; 464*6236dae4SAndroid Build Coastguard Worker exit 3; 465*6236dae4SAndroid Build Coastguard Worker } 466*6236dae4SAndroid Build Coastguard Worker if($quote) { 467*6236dae4SAndroid Build Coastguard Worker # don't leave the quote "hanging" 468*6236dae4SAndroid Build Coastguard Worker push @desc, ".fi\n" if($manpage); 469*6236dae4SAndroid Build Coastguard Worker } 470*6236dae4SAndroid Build Coastguard Worker if($tablemode) { 471*6236dae4SAndroid Build Coastguard Worker # end of table 472*6236dae4SAndroid Build Coastguard Worker push @desc, ".RE\n.IP\n" if($manpage); 473*6236dae4SAndroid Build Coastguard Worker } 474*6236dae4SAndroid Build Coastguard Worker return @desc; 475*6236dae4SAndroid Build Coastguard Worker} 476*6236dae4SAndroid Build Coastguard Worker 477*6236dae4SAndroid Build Coastguard Workersub maybespace { 478*6236dae4SAndroid Build Coastguard Worker my ($string) = @_; 479*6236dae4SAndroid Build Coastguard Worker 480*6236dae4SAndroid Build Coastguard Worker if(($string =~ /(.* )(.*)/) && 481*6236dae4SAndroid Build Coastguard Worker (length($2) <= 20)) { 482*6236dae4SAndroid Build Coastguard Worker return $1; 483*6236dae4SAndroid Build Coastguard Worker } 484*6236dae4SAndroid Build Coastguard Worker if(($string =~ /(.*:)(.*)/) && 485*6236dae4SAndroid Build Coastguard Worker (length($2) <= 20)) { 486*6236dae4SAndroid Build Coastguard Worker return $1; 487*6236dae4SAndroid Build Coastguard Worker } 488*6236dae4SAndroid Build Coastguard Worker return $string; 489*6236dae4SAndroid Build Coastguard Worker} 490*6236dae4SAndroid Build Coastguard Worker 491*6236dae4SAndroid Build Coastguard Workersub single { 492*6236dae4SAndroid Build Coastguard Worker my ($dir, $manpage, $f, $standalone)=@_; 493*6236dae4SAndroid Build Coastguard Worker my $fh; 494*6236dae4SAndroid Build Coastguard Worker open($fh, "<:crlf", "$dir/$f") || 495*6236dae4SAndroid Build Coastguard Worker die "could not find $dir/$f"; 496*6236dae4SAndroid Build Coastguard Worker my $short; 497*6236dae4SAndroid Build Coastguard Worker my $long; 498*6236dae4SAndroid Build Coastguard Worker my $tags; 499*6236dae4SAndroid Build Coastguard Worker my $added; 500*6236dae4SAndroid Build Coastguard Worker my $protocols; 501*6236dae4SAndroid Build Coastguard Worker my $arg; 502*6236dae4SAndroid Build Coastguard Worker my $mutexed; 503*6236dae4SAndroid Build Coastguard Worker my $requires; 504*6236dae4SAndroid Build Coastguard Worker my $category; 505*6236dae4SAndroid Build Coastguard Worker my @seealso; 506*6236dae4SAndroid Build Coastguard Worker my $copyright; 507*6236dae4SAndroid Build Coastguard Worker my $spdx; 508*6236dae4SAndroid Build Coastguard Worker my @examples; # there can be more than one 509*6236dae4SAndroid Build Coastguard Worker my $magic; # cmdline special option 510*6236dae4SAndroid Build Coastguard Worker my $line; 511*6236dae4SAndroid Build Coastguard Worker my $dline; 512*6236dae4SAndroid Build Coastguard Worker my $multi; 513*6236dae4SAndroid Build Coastguard Worker my $scope; 514*6236dae4SAndroid Build Coastguard Worker my $experimental; 515*6236dae4SAndroid Build Coastguard Worker my $start; 516*6236dae4SAndroid Build Coastguard Worker my $list; # identifies the list, 1 example, 2 see-also 517*6236dae4SAndroid Build Coastguard Worker while(<$fh>) { 518*6236dae4SAndroid Build Coastguard Worker $line++; 519*6236dae4SAndroid Build Coastguard Worker if(/^ *<!--/) { 520*6236dae4SAndroid Build Coastguard Worker next; 521*6236dae4SAndroid Build Coastguard Worker } 522*6236dae4SAndroid Build Coastguard Worker if(!$start) { 523*6236dae4SAndroid Build Coastguard Worker if(/^---/) { 524*6236dae4SAndroid Build Coastguard Worker $start = 1; 525*6236dae4SAndroid Build Coastguard Worker } 526*6236dae4SAndroid Build Coastguard Worker next; 527*6236dae4SAndroid Build Coastguard Worker } 528*6236dae4SAndroid Build Coastguard Worker if(/^Short: *(.)/i) { 529*6236dae4SAndroid Build Coastguard Worker $short=$1; 530*6236dae4SAndroid Build Coastguard Worker } 531*6236dae4SAndroid Build Coastguard Worker elsif(/^Long: *(.*)/i) { 532*6236dae4SAndroid Build Coastguard Worker $long=$1; 533*6236dae4SAndroid Build Coastguard Worker } 534*6236dae4SAndroid Build Coastguard Worker elsif(/^Added: *(.*)/i) { 535*6236dae4SAndroid Build Coastguard Worker $added=$1; 536*6236dae4SAndroid Build Coastguard Worker } 537*6236dae4SAndroid Build Coastguard Worker elsif(/^Tags: *(.*)/i) { 538*6236dae4SAndroid Build Coastguard Worker $tags=$1; 539*6236dae4SAndroid Build Coastguard Worker } 540*6236dae4SAndroid Build Coastguard Worker elsif(/^Arg: *(.*)/i) { 541*6236dae4SAndroid Build Coastguard Worker $arg=$1; 542*6236dae4SAndroid Build Coastguard Worker } 543*6236dae4SAndroid Build Coastguard Worker elsif(/^Magic: *(.*)/i) { 544*6236dae4SAndroid Build Coastguard Worker $magic=$1; 545*6236dae4SAndroid Build Coastguard Worker } 546*6236dae4SAndroid Build Coastguard Worker elsif(/^Mutexed: *(.*)/i) { 547*6236dae4SAndroid Build Coastguard Worker $mutexed=$1; 548*6236dae4SAndroid Build Coastguard Worker } 549*6236dae4SAndroid Build Coastguard Worker elsif(/^Protocols: *(.*)/i) { 550*6236dae4SAndroid Build Coastguard Worker $protocols=$1; 551*6236dae4SAndroid Build Coastguard Worker } 552*6236dae4SAndroid Build Coastguard Worker elsif(/^See-also: +(.+)/i) { 553*6236dae4SAndroid Build Coastguard Worker if($seealso) { 554*6236dae4SAndroid Build Coastguard Worker print STDERR "ERROR: duplicated See-also in $f\n"; 555*6236dae4SAndroid Build Coastguard Worker return 1; 556*6236dae4SAndroid Build Coastguard Worker } 557*6236dae4SAndroid Build Coastguard Worker push @seealso, $1; 558*6236dae4SAndroid Build Coastguard Worker } 559*6236dae4SAndroid Build Coastguard Worker elsif(/^See-also:/i) { 560*6236dae4SAndroid Build Coastguard Worker $list=2; 561*6236dae4SAndroid Build Coastguard Worker } 562*6236dae4SAndroid Build Coastguard Worker elsif(/^ *- (.*)/i && ($list == 2)) { 563*6236dae4SAndroid Build Coastguard Worker push @seealso, $1; 564*6236dae4SAndroid Build Coastguard Worker } 565*6236dae4SAndroid Build Coastguard Worker elsif(/^Requires: *(.*)/i) { 566*6236dae4SAndroid Build Coastguard Worker $requires=$1; 567*6236dae4SAndroid Build Coastguard Worker } 568*6236dae4SAndroid Build Coastguard Worker elsif(/^Category: *(.*)/i) { 569*6236dae4SAndroid Build Coastguard Worker $category=$1; 570*6236dae4SAndroid Build Coastguard Worker } 571*6236dae4SAndroid Build Coastguard Worker elsif(/^Example: +(.+)/i) { 572*6236dae4SAndroid Build Coastguard Worker push @examples, $1; 573*6236dae4SAndroid Build Coastguard Worker } 574*6236dae4SAndroid Build Coastguard Worker elsif(/^Example:/i) { 575*6236dae4SAndroid Build Coastguard Worker # '1' is the example list 576*6236dae4SAndroid Build Coastguard Worker $list = 1; 577*6236dae4SAndroid Build Coastguard Worker } 578*6236dae4SAndroid Build Coastguard Worker elsif(/^ *- (.*)/i && ($list == 1)) { 579*6236dae4SAndroid Build Coastguard Worker push @examples, $1; 580*6236dae4SAndroid Build Coastguard Worker } 581*6236dae4SAndroid Build Coastguard Worker elsif(/^Multi: *(.*)/i) { 582*6236dae4SAndroid Build Coastguard Worker $multi=$1; 583*6236dae4SAndroid Build Coastguard Worker } 584*6236dae4SAndroid Build Coastguard Worker elsif(/^Scope: *(.*)/i) { 585*6236dae4SAndroid Build Coastguard Worker $scope=$1; 586*6236dae4SAndroid Build Coastguard Worker } 587*6236dae4SAndroid Build Coastguard Worker elsif(/^Experimental: yes/i) { 588*6236dae4SAndroid Build Coastguard Worker $experimental=1; 589*6236dae4SAndroid Build Coastguard Worker } 590*6236dae4SAndroid Build Coastguard Worker elsif(/^C: (.*)/i) { 591*6236dae4SAndroid Build Coastguard Worker $copyright=$1; 592*6236dae4SAndroid Build Coastguard Worker } 593*6236dae4SAndroid Build Coastguard Worker elsif(/^SPDX-License-Identifier: (.*)/i) { 594*6236dae4SAndroid Build Coastguard Worker $spdx=$1; 595*6236dae4SAndroid Build Coastguard Worker } 596*6236dae4SAndroid Build Coastguard Worker elsif(/^Help: *(.*)/i) { 597*6236dae4SAndroid Build Coastguard Worker ; 598*6236dae4SAndroid Build Coastguard Worker } 599*6236dae4SAndroid Build Coastguard Worker elsif(/^---/) { 600*6236dae4SAndroid Build Coastguard Worker $start++; 601*6236dae4SAndroid Build Coastguard Worker if(!$long) { 602*6236dae4SAndroid Build Coastguard Worker print STDERR "ERROR: no 'Long:' in $f\n"; 603*6236dae4SAndroid Build Coastguard Worker return 1; 604*6236dae4SAndroid Build Coastguard Worker } 605*6236dae4SAndroid Build Coastguard Worker if(!$category) { 606*6236dae4SAndroid Build Coastguard Worker print STDERR "ERROR: no 'Category:' in $f\n"; 607*6236dae4SAndroid Build Coastguard Worker return 2; 608*6236dae4SAndroid Build Coastguard Worker } 609*6236dae4SAndroid Build Coastguard Worker if(!$examples[0]) { 610*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'Example:' present\n"; 611*6236dae4SAndroid Build Coastguard Worker return 2; 612*6236dae4SAndroid Build Coastguard Worker } 613*6236dae4SAndroid Build Coastguard Worker if(!$added) { 614*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'Added:' version present\n"; 615*6236dae4SAndroid Build Coastguard Worker return 2; 616*6236dae4SAndroid Build Coastguard Worker } 617*6236dae4SAndroid Build Coastguard Worker if(!$seealso[0]) { 618*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'See-also:' field present\n"; 619*6236dae4SAndroid Build Coastguard Worker return 2; 620*6236dae4SAndroid Build Coastguard Worker } 621*6236dae4SAndroid Build Coastguard Worker if(!$copyright) { 622*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'C:' field present\n"; 623*6236dae4SAndroid Build Coastguard Worker return 2; 624*6236dae4SAndroid Build Coastguard Worker } 625*6236dae4SAndroid Build Coastguard Worker if(!$spdx) { 626*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: no 'SPDX-License-Identifier:' field present\n"; 627*6236dae4SAndroid Build Coastguard Worker return 2; 628*6236dae4SAndroid Build Coastguard Worker } 629*6236dae4SAndroid Build Coastguard Worker last; 630*6236dae4SAndroid Build Coastguard Worker } 631*6236dae4SAndroid Build Coastguard Worker else { 632*6236dae4SAndroid Build Coastguard Worker chomp; 633*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:WARN: unrecognized line in $f, ignoring:\n:'$_';" 634*6236dae4SAndroid Build Coastguard Worker } 635*6236dae4SAndroid Build Coastguard Worker } 636*6236dae4SAndroid Build Coastguard Worker 637*6236dae4SAndroid Build Coastguard Worker if($start < 2) { 638*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:1:1:ERROR: no proper meta-data header\n"; 639*6236dae4SAndroid Build Coastguard Worker return 2; 640*6236dae4SAndroid Build Coastguard Worker } 641*6236dae4SAndroid Build Coastguard Worker 642*6236dae4SAndroid Build Coastguard Worker my @desc = render($manpage, $fh, $f, $line); 643*6236dae4SAndroid Build Coastguard Worker close($fh); 644*6236dae4SAndroid Build Coastguard Worker if($tablemode) { 645*6236dae4SAndroid Build Coastguard Worker # end of table 646*6236dae4SAndroid Build Coastguard Worker push @desc, ".RE\n.IP\n"; 647*6236dae4SAndroid Build Coastguard Worker } 648*6236dae4SAndroid Build Coastguard Worker my $opt; 649*6236dae4SAndroid Build Coastguard Worker 650*6236dae4SAndroid Build Coastguard Worker if(defined($short) && $long) { 651*6236dae4SAndroid Build Coastguard Worker $opt = "-$short, --$long"; 652*6236dae4SAndroid Build Coastguard Worker } 653*6236dae4SAndroid Build Coastguard Worker elsif($short && !$long) { 654*6236dae4SAndroid Build Coastguard Worker $opt = "-$short"; 655*6236dae4SAndroid Build Coastguard Worker } 656*6236dae4SAndroid Build Coastguard Worker elsif($long && !$short) { 657*6236dae4SAndroid Build Coastguard Worker $opt = "--$long"; 658*6236dae4SAndroid Build Coastguard Worker } 659*6236dae4SAndroid Build Coastguard Worker 660*6236dae4SAndroid Build Coastguard Worker if($arg) { 661*6236dae4SAndroid Build Coastguard Worker $opt .= " $arg"; 662*6236dae4SAndroid Build Coastguard Worker } 663*6236dae4SAndroid Build Coastguard Worker 664*6236dae4SAndroid Build Coastguard Worker # quote "bare" minuses in opt 665*6236dae4SAndroid Build Coastguard Worker $opt =~ s/-/\\-/g if($manpage); 666*6236dae4SAndroid Build Coastguard Worker if($standalone) { 667*6236dae4SAndroid Build Coastguard Worker print ".TH curl 1 \"30 Nov 2016\" \"curl 7.52.0\" \"curl manual\"\n"; 668*6236dae4SAndroid Build Coastguard Worker print ".SH OPTION\n"; 669*6236dae4SAndroid Build Coastguard Worker print "curl $opt\n"; 670*6236dae4SAndroid Build Coastguard Worker } 671*6236dae4SAndroid Build Coastguard Worker elsif($manpage) { 672*6236dae4SAndroid Build Coastguard Worker print ".IP \"$opt\"\n"; 673*6236dae4SAndroid Build Coastguard Worker } 674*6236dae4SAndroid Build Coastguard Worker else { 675*6236dae4SAndroid Build Coastguard Worker lastline(1, $opt); 676*6236dae4SAndroid Build Coastguard Worker } 677*6236dae4SAndroid Build Coastguard Worker my @leading; 678*6236dae4SAndroid Build Coastguard Worker if($protocols) { 679*6236dae4SAndroid Build Coastguard Worker push @leading, protocols($manpage, $standalone, $protocols); 680*6236dae4SAndroid Build Coastguard Worker } 681*6236dae4SAndroid Build Coastguard Worker 682*6236dae4SAndroid Build Coastguard Worker if($standalone) { 683*6236dae4SAndroid Build Coastguard Worker print ".SH DESCRIPTION\n"; 684*6236dae4SAndroid Build Coastguard Worker } 685*6236dae4SAndroid Build Coastguard Worker 686*6236dae4SAndroid Build Coastguard Worker if($experimental) { 687*6236dae4SAndroid Build Coastguard Worker push @leading, "**WARNING**: this option is experimental. Do not use in production.\n\n"; 688*6236dae4SAndroid Build Coastguard Worker } 689*6236dae4SAndroid Build Coastguard Worker 690*6236dae4SAndroid Build Coastguard Worker my $pre = $manpage ? "\n": "[1]"; 691*6236dae4SAndroid Build Coastguard Worker 692*6236dae4SAndroid Build Coastguard Worker if($scope) { 693*6236dae4SAndroid Build Coastguard Worker if($category !~ /global/) { 694*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: global scope option does not have global category\n"; 695*6236dae4SAndroid Build Coastguard Worker return 2; 696*6236dae4SAndroid Build Coastguard Worker } 697*6236dae4SAndroid Build Coastguard Worker if($scope eq "global") { 698*6236dae4SAndroid Build Coastguard Worker push @desc, "\n" if(!$manpage); 699*6236dae4SAndroid Build Coastguard Worker push @desc, "${pre}This option is global and does not need to be specified for each use of --next.\n"; 700*6236dae4SAndroid Build Coastguard Worker } 701*6236dae4SAndroid Build Coastguard Worker else { 702*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: unrecognized scope: '$scope'\n"; 703*6236dae4SAndroid Build Coastguard Worker return 2; 704*6236dae4SAndroid Build Coastguard Worker } 705*6236dae4SAndroid Build Coastguard Worker } 706*6236dae4SAndroid Build Coastguard Worker 707*6236dae4SAndroid Build Coastguard Worker my @extra; 708*6236dae4SAndroid Build Coastguard Worker if($multi eq "single") { 709*6236dae4SAndroid Build Coastguard Worker push @extra, "${pre}If --$long is provided several times, the last set ". 710*6236dae4SAndroid Build Coastguard Worker "value is used.\n"; 711*6236dae4SAndroid Build Coastguard Worker } 712*6236dae4SAndroid Build Coastguard Worker elsif($multi eq "append") { 713*6236dae4SAndroid Build Coastguard Worker push @extra, "${pre}--$long can be used several times in a command line\n"; 714*6236dae4SAndroid Build Coastguard Worker } 715*6236dae4SAndroid Build Coastguard Worker elsif($multi eq "boolean") { 716*6236dae4SAndroid Build Coastguard Worker my $rev = "no-$long"; 717*6236dae4SAndroid Build Coastguard Worker # for options that start with "no-" the reverse is then without 718*6236dae4SAndroid Build Coastguard Worker # the no- prefix 719*6236dae4SAndroid Build Coastguard Worker if($long =~ /^no-/) { 720*6236dae4SAndroid Build Coastguard Worker $rev = $long; 721*6236dae4SAndroid Build Coastguard Worker $rev =~ s/^no-//; 722*6236dae4SAndroid Build Coastguard Worker } 723*6236dae4SAndroid Build Coastguard Worker my $dashes = $manpage ? "\\-\\-" : "--"; 724*6236dae4SAndroid Build Coastguard Worker push @extra, 725*6236dae4SAndroid Build Coastguard Worker "${pre}Providing --$long multiple times has no extra effect.\n". 726*6236dae4SAndroid Build Coastguard Worker "Disable it again with $dashes$rev.\n"; 727*6236dae4SAndroid Build Coastguard Worker } 728*6236dae4SAndroid Build Coastguard Worker elsif($multi eq "mutex") { 729*6236dae4SAndroid Build Coastguard Worker push @extra, 730*6236dae4SAndroid Build Coastguard Worker "${pre}Providing --$long multiple times has no extra effect.\n"; 731*6236dae4SAndroid Build Coastguard Worker } 732*6236dae4SAndroid Build Coastguard Worker elsif($multi eq "custom") { 733*6236dae4SAndroid Build Coastguard Worker ; # left for the text to describe 734*6236dae4SAndroid Build Coastguard Worker } 735*6236dae4SAndroid Build Coastguard Worker elsif($multi eq "per-URL") { 736*6236dae4SAndroid Build Coastguard Worker push @extra, 737*6236dae4SAndroid Build Coastguard Worker "${pre}--$long is associated with a single URL. Use it once per URL ". 738*6236dae4SAndroid Build Coastguard Worker "when you use several URLs in a command line.\n"; 739*6236dae4SAndroid Build Coastguard Worker } 740*6236dae4SAndroid Build Coastguard Worker else { 741*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:ERROR: unrecognized Multi: '$multi'\n"; 742*6236dae4SAndroid Build Coastguard Worker return 2; 743*6236dae4SAndroid Build Coastguard Worker } 744*6236dae4SAndroid Build Coastguard Worker 745*6236dae4SAndroid Build Coastguard Worker printdesc($manpage, 2, (@leading, @desc, @extra)); 746*6236dae4SAndroid Build Coastguard Worker undef @desc; 747*6236dae4SAndroid Build Coastguard Worker 748*6236dae4SAndroid Build Coastguard Worker my @foot; 749*6236dae4SAndroid Build Coastguard Worker 750*6236dae4SAndroid Build Coastguard Worker my $mstr; 751*6236dae4SAndroid Build Coastguard Worker my $and = 0; 752*6236dae4SAndroid Build Coastguard Worker my $num = scalar(@seealso); 753*6236dae4SAndroid Build Coastguard Worker if($num > 2) { 754*6236dae4SAndroid Build Coastguard Worker # use commas up to this point 755*6236dae4SAndroid Build Coastguard Worker $and = $num - 1; 756*6236dae4SAndroid Build Coastguard Worker } 757*6236dae4SAndroid Build Coastguard Worker my $i = 0; 758*6236dae4SAndroid Build Coastguard Worker for my $k (@seealso) { 759*6236dae4SAndroid Build Coastguard Worker if(!$helplong{$k}) { 760*6236dae4SAndroid Build Coastguard Worker print STDERR "$f:$line:1:WARN: see-also a non-existing option: $k\n"; 761*6236dae4SAndroid Build Coastguard Worker } 762*6236dae4SAndroid Build Coastguard Worker my $l = $manpage ? manpageify($k) : "--$k"; 763*6236dae4SAndroid Build Coastguard Worker my $sep = " and"; 764*6236dae4SAndroid Build Coastguard Worker if($and && ($i < $and)) { 765*6236dae4SAndroid Build Coastguard Worker $sep = ","; 766*6236dae4SAndroid Build Coastguard Worker } 767*6236dae4SAndroid Build Coastguard Worker $mstr .= sprintf "%s$l", $mstr?"$sep ":""; 768*6236dae4SAndroid Build Coastguard Worker $i++; 769*6236dae4SAndroid Build Coastguard Worker } 770*6236dae4SAndroid Build Coastguard Worker 771*6236dae4SAndroid Build Coastguard Worker if($requires) { 772*6236dae4SAndroid Build Coastguard Worker my $l = $manpage ? manpageify($long) : "--$long"; 773*6236dae4SAndroid Build Coastguard Worker push @foot, "$l requires that libcurl". 774*6236dae4SAndroid Build Coastguard Worker " is built to support $requires.\n"; 775*6236dae4SAndroid Build Coastguard Worker } 776*6236dae4SAndroid Build Coastguard Worker if($mutexed) { 777*6236dae4SAndroid Build Coastguard Worker my @m=split(/ /, $mutexed); 778*6236dae4SAndroid Build Coastguard Worker my $mstr; 779*6236dae4SAndroid Build Coastguard Worker my $num = scalar(@m); 780*6236dae4SAndroid Build Coastguard Worker my $count; 781*6236dae4SAndroid Build Coastguard Worker for my $k (@m) { 782*6236dae4SAndroid Build Coastguard Worker if(!$helplong{$k}) { 783*6236dae4SAndroid Build Coastguard Worker print STDERR "WARN: $f mutexes a non-existing option: $k\n"; 784*6236dae4SAndroid Build Coastguard Worker } 785*6236dae4SAndroid Build Coastguard Worker my $l = $manpage ? manpageify($k) : "--$k"; 786*6236dae4SAndroid Build Coastguard Worker my $sep = ", "; 787*6236dae4SAndroid Build Coastguard Worker if($count == ($num -1)) { 788*6236dae4SAndroid Build Coastguard Worker $sep = " and "; 789*6236dae4SAndroid Build Coastguard Worker } 790*6236dae4SAndroid Build Coastguard Worker $mstr .= sprintf "%s$l", $mstr?$sep:""; 791*6236dae4SAndroid Build Coastguard Worker $count++; 792*6236dae4SAndroid Build Coastguard Worker } 793*6236dae4SAndroid Build Coastguard Worker push @foot, overrides($standalone, 794*6236dae4SAndroid Build Coastguard Worker "This option is mutually exclusive with $mstr.\n"); 795*6236dae4SAndroid Build Coastguard Worker } 796*6236dae4SAndroid Build Coastguard Worker if($examples[0]) { 797*6236dae4SAndroid Build Coastguard Worker my $s =""; 798*6236dae4SAndroid Build Coastguard Worker $s="s" if($examples[1]); 799*6236dae4SAndroid Build Coastguard Worker if($manpage) { 800*6236dae4SAndroid Build Coastguard Worker print "\nExample$s:\n"; 801*6236dae4SAndroid Build Coastguard Worker print ".nf\n"; 802*6236dae4SAndroid Build Coastguard Worker foreach my $e (@examples) { 803*6236dae4SAndroid Build Coastguard Worker $e =~ s!\$URL!https://example.com!g; 804*6236dae4SAndroid Build Coastguard Worker # convert single backslahes to doubles 805*6236dae4SAndroid Build Coastguard Worker $e =~ s/\\/\\\\/g; 806*6236dae4SAndroid Build Coastguard Worker print "curl $e\n"; 807*6236dae4SAndroid Build Coastguard Worker } 808*6236dae4SAndroid Build Coastguard Worker print ".fi\n"; 809*6236dae4SAndroid Build Coastguard Worker } 810*6236dae4SAndroid Build Coastguard Worker else { 811*6236dae4SAndroid Build Coastguard Worker my @ex; 812*6236dae4SAndroid Build Coastguard Worker push @ex, "[0q]Example$s:\n"; 813*6236dae4SAndroid Build Coastguard Worker # 814*6236dae4SAndroid Build Coastguard Worker # long ASCII examples are wrapped. Preferably at the last space 815*6236dae4SAndroid Build Coastguard Worker # before the margin. Or at a colon. Otherwise it just cuts at the 816*6236dae4SAndroid Build Coastguard Worker # exact boundary. 817*6236dae4SAndroid Build Coastguard Worker # 818*6236dae4SAndroid Build Coastguard Worker foreach my $e (@examples) { 819*6236dae4SAndroid Build Coastguard Worker $e =~ s!\$URL!https://example.com!g; 820*6236dae4SAndroid Build Coastguard Worker my $maxwidth = 60; # plus the " curl " 18 col prefix 821*6236dae4SAndroid Build Coastguard Worker if(length($e) > $maxwidth) { 822*6236dae4SAndroid Build Coastguard Worker # a long example, shorten it 823*6236dae4SAndroid Build Coastguard Worker my $p = substr($e, 0, $maxwidth); 824*6236dae4SAndroid Build Coastguard Worker $p = maybespace($p); 825*6236dae4SAndroid Build Coastguard Worker push @ex, "[0q] curl ".$p."\\"; 826*6236dae4SAndroid Build Coastguard Worker $e = substr($e, length($p)); 827*6236dae4SAndroid Build Coastguard Worker do { 828*6236dae4SAndroid Build Coastguard Worker my $r = substr($e, 0, $maxwidth); 829*6236dae4SAndroid Build Coastguard Worker if(length($e) > $maxwidth) { 830*6236dae4SAndroid Build Coastguard Worker $r = maybespace($r); 831*6236dae4SAndroid Build Coastguard Worker } 832*6236dae4SAndroid Build Coastguard Worker my $slash =""; 833*6236dae4SAndroid Build Coastguard Worker $e = substr($e, length($r)); 834*6236dae4SAndroid Build Coastguard Worker if(length($e) > 0) { 835*6236dae4SAndroid Build Coastguard Worker $slash = "\\"; 836*6236dae4SAndroid Build Coastguard Worker } 837*6236dae4SAndroid Build Coastguard Worker 838*6236dae4SAndroid Build Coastguard Worker push @ex, "[0q] $r$slash" if($r); 839*6236dae4SAndroid Build Coastguard Worker } while(length($e)); 840*6236dae4SAndroid Build Coastguard Worker } 841*6236dae4SAndroid Build Coastguard Worker else { 842*6236dae4SAndroid Build Coastguard Worker push @ex, "[0q] curl $e\n"; 843*6236dae4SAndroid Build Coastguard Worker } 844*6236dae4SAndroid Build Coastguard Worker } 845*6236dae4SAndroid Build Coastguard Worker printdesc($manpage, 2, @ex); 846*6236dae4SAndroid Build Coastguard Worker } 847*6236dae4SAndroid Build Coastguard Worker } 848*6236dae4SAndroid Build Coastguard Worker if($added) { 849*6236dae4SAndroid Build Coastguard Worker push @foot, added($standalone, $added); 850*6236dae4SAndroid Build Coastguard Worker } 851*6236dae4SAndroid Build Coastguard Worker push @foot, seealso($standalone, $mstr); 852*6236dae4SAndroid Build Coastguard Worker 853*6236dae4SAndroid Build Coastguard Worker print "\n"; 854*6236dae4SAndroid Build Coastguard Worker my $f = join("", @foot); 855*6236dae4SAndroid Build Coastguard Worker if($manpage) { 856*6236dae4SAndroid Build Coastguard Worker $f =~ s/ +\z//; # remove trailing space 857*6236dae4SAndroid Build Coastguard Worker print "$f\n"; 858*6236dae4SAndroid Build Coastguard Worker } 859*6236dae4SAndroid Build Coastguard Worker else { 860*6236dae4SAndroid Build Coastguard Worker printdesc($manpage, 2, "[1]$f"); 861*6236dae4SAndroid Build Coastguard Worker } 862*6236dae4SAndroid Build Coastguard Worker return 0; 863*6236dae4SAndroid Build Coastguard Worker} 864*6236dae4SAndroid Build Coastguard Worker 865*6236dae4SAndroid Build Coastguard Workersub getshortlong { 866*6236dae4SAndroid Build Coastguard Worker my ($dir, $f)=@_; 867*6236dae4SAndroid Build Coastguard Worker $f =~ s/^.*\///; 868*6236dae4SAndroid Build Coastguard Worker open(F, "<:crlf", "$dir/$f") || 869*6236dae4SAndroid Build Coastguard Worker die "could not find $dir/$f"; 870*6236dae4SAndroid Build Coastguard Worker my $short; 871*6236dae4SAndroid Build Coastguard Worker my $long; 872*6236dae4SAndroid Build Coastguard Worker my $help; 873*6236dae4SAndroid Build Coastguard Worker my $arg; 874*6236dae4SAndroid Build Coastguard Worker my $protocols; 875*6236dae4SAndroid Build Coastguard Worker my $category; 876*6236dae4SAndroid Build Coastguard Worker my $start = 0; 877*6236dae4SAndroid Build Coastguard Worker my $line = 0; 878*6236dae4SAndroid Build Coastguard Worker while(<F>) { 879*6236dae4SAndroid Build Coastguard Worker $line++; 880*6236dae4SAndroid Build Coastguard Worker if(!$start) { 881*6236dae4SAndroid Build Coastguard Worker if(/^---/) { 882*6236dae4SAndroid Build Coastguard Worker $start = 1; 883*6236dae4SAndroid Build Coastguard Worker } 884*6236dae4SAndroid Build Coastguard Worker next; 885*6236dae4SAndroid Build Coastguard Worker } 886*6236dae4SAndroid Build Coastguard Worker if(/^Short: (.)/i) { 887*6236dae4SAndroid Build Coastguard Worker $short=$1; 888*6236dae4SAndroid Build Coastguard Worker } 889*6236dae4SAndroid Build Coastguard Worker elsif(/^Long: (.*)/i) { 890*6236dae4SAndroid Build Coastguard Worker $long=$1; 891*6236dae4SAndroid Build Coastguard Worker } 892*6236dae4SAndroid Build Coastguard Worker elsif(/^Help: (.*)/i) { 893*6236dae4SAndroid Build Coastguard Worker $help=$1; 894*6236dae4SAndroid Build Coastguard Worker my $len = length($help); 895*6236dae4SAndroid Build Coastguard Worker if($len >= 49) { 896*6236dae4SAndroid Build Coastguard Worker printf STDERR "$f:$line:1:WARN: oversized help text: %d characters\n", 897*6236dae4SAndroid Build Coastguard Worker $len; 898*6236dae4SAndroid Build Coastguard Worker } 899*6236dae4SAndroid Build Coastguard Worker } 900*6236dae4SAndroid Build Coastguard Worker elsif(/^Arg: (.*)/i) { 901*6236dae4SAndroid Build Coastguard Worker $arg=$1; 902*6236dae4SAndroid Build Coastguard Worker } 903*6236dae4SAndroid Build Coastguard Worker elsif(/^Protocols: (.*)/i) { 904*6236dae4SAndroid Build Coastguard Worker $protocols=$1; 905*6236dae4SAndroid Build Coastguard Worker } 906*6236dae4SAndroid Build Coastguard Worker elsif(/^Category: (.*)/i) { 907*6236dae4SAndroid Build Coastguard Worker $category=$1; 908*6236dae4SAndroid Build Coastguard Worker } 909*6236dae4SAndroid Build Coastguard Worker elsif(/^---/) { 910*6236dae4SAndroid Build Coastguard Worker last; 911*6236dae4SAndroid Build Coastguard Worker } 912*6236dae4SAndroid Build Coastguard Worker } 913*6236dae4SAndroid Build Coastguard Worker close(F); 914*6236dae4SAndroid Build Coastguard Worker if($short) { 915*6236dae4SAndroid Build Coastguard Worker $optshort{$short}=$long; 916*6236dae4SAndroid Build Coastguard Worker } 917*6236dae4SAndroid Build Coastguard Worker if($long) { 918*6236dae4SAndroid Build Coastguard Worker $optlong{$long}=$short; 919*6236dae4SAndroid Build Coastguard Worker $helplong{$long}=$help; 920*6236dae4SAndroid Build Coastguard Worker $arglong{$long}=$arg; 921*6236dae4SAndroid Build Coastguard Worker $protolong{$long}=$protocols; 922*6236dae4SAndroid Build Coastguard Worker $catlong{$long}=$category; 923*6236dae4SAndroid Build Coastguard Worker } 924*6236dae4SAndroid Build Coastguard Worker} 925*6236dae4SAndroid Build Coastguard Worker 926*6236dae4SAndroid Build Coastguard Workersub indexoptions { 927*6236dae4SAndroid Build Coastguard Worker my ($dir, @files) = @_; 928*6236dae4SAndroid Build Coastguard Worker foreach my $f (@files) { 929*6236dae4SAndroid Build Coastguard Worker getshortlong($dir, $f); 930*6236dae4SAndroid Build Coastguard Worker } 931*6236dae4SAndroid Build Coastguard Worker} 932*6236dae4SAndroid Build Coastguard Worker 933*6236dae4SAndroid Build Coastguard Workersub header { 934*6236dae4SAndroid Build Coastguard Worker my ($dir, $manpage, $f)=@_; 935*6236dae4SAndroid Build Coastguard Worker my $fh; 936*6236dae4SAndroid Build Coastguard Worker open($fh, "<:crlf", "$dir/$f") || 937*6236dae4SAndroid Build Coastguard Worker die "could not find $dir/$f"; 938*6236dae4SAndroid Build Coastguard Worker my @d = render($manpage, $fh, $f, 1); 939*6236dae4SAndroid Build Coastguard Worker close($fh); 940*6236dae4SAndroid Build Coastguard Worker printdesc($manpage, 0, @d); 941*6236dae4SAndroid Build Coastguard Worker} 942*6236dae4SAndroid Build Coastguard Worker 943*6236dae4SAndroid Build Coastguard Worker 944*6236dae4SAndroid Build Coastguard Workersub sourcecategories { 945*6236dae4SAndroid Build Coastguard Worker my ($dir) = @_; 946*6236dae4SAndroid Build Coastguard Worker my %cats; 947*6236dae4SAndroid Build Coastguard Worker open(H, "<$dir/../../src/tool_help.h") || 948*6236dae4SAndroid Build Coastguard Worker die "can't find the header file"; 949*6236dae4SAndroid Build Coastguard Worker while(<H>) { 950*6236dae4SAndroid Build Coastguard Worker if(/^\#define CURLHELP_([A-Z0-9]*)/) { 951*6236dae4SAndroid Build Coastguard Worker $cats{lc($1)}++; 952*6236dae4SAndroid Build Coastguard Worker } 953*6236dae4SAndroid Build Coastguard Worker } 954*6236dae4SAndroid Build Coastguard Worker close(H); 955*6236dae4SAndroid Build Coastguard Worker return %cats; 956*6236dae4SAndroid Build Coastguard Worker} 957*6236dae4SAndroid Build Coastguard Worker 958*6236dae4SAndroid Build Coastguard Workersub listhelp { 959*6236dae4SAndroid Build Coastguard Worker my ($dir) = @_; 960*6236dae4SAndroid Build Coastguard Worker my %cats = sourcecategories($dir); 961*6236dae4SAndroid Build Coastguard Worker 962*6236dae4SAndroid Build Coastguard Worker print <<HEAD 963*6236dae4SAndroid Build Coastguard Worker/*************************************************************************** 964*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 965*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \\| | 966*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 967*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 968*6236dae4SAndroid Build Coastguard Worker * \\___|\\___/|_| \\_\\_____| 969*6236dae4SAndroid Build Coastguard Worker * 970*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <daniel\@haxx.se>, et al. 971*6236dae4SAndroid Build Coastguard Worker * 972*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 973*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 974*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 975*6236dae4SAndroid Build Coastguard Worker * 976*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 977*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 978*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 979*6236dae4SAndroid Build Coastguard Worker * 980*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 981*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 982*6236dae4SAndroid Build Coastguard Worker * 983*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 984*6236dae4SAndroid Build Coastguard Worker * 985*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 986*6236dae4SAndroid Build Coastguard Worker#include "tool_setup.h" 987*6236dae4SAndroid Build Coastguard Worker#include "tool_help.h" 988*6236dae4SAndroid Build Coastguard Worker 989*6236dae4SAndroid Build Coastguard Worker/* 990*6236dae4SAndroid Build Coastguard Worker * DO NOT edit tool_listhelp.c manually. 991*6236dae4SAndroid Build Coastguard Worker * This source file is generated with the following command in an autotools 992*6236dae4SAndroid Build Coastguard Worker * build: 993*6236dae4SAndroid Build Coastguard Worker * 994*6236dae4SAndroid Build Coastguard Worker * "make listhelp" 995*6236dae4SAndroid Build Coastguard Worker */ 996*6236dae4SAndroid Build Coastguard Worker 997*6236dae4SAndroid Build Coastguard Workerconst struct helptxt helptext[] = { 998*6236dae4SAndroid Build Coastguard WorkerHEAD 999*6236dae4SAndroid Build Coastguard Worker ; 1000*6236dae4SAndroid Build Coastguard Worker foreach my $f (sort keys %helplong) { 1001*6236dae4SAndroid Build Coastguard Worker my $long = $f; 1002*6236dae4SAndroid Build Coastguard Worker my $short = $optlong{$long}; 1003*6236dae4SAndroid Build Coastguard Worker my @categories = split ' ', $catlong{$long}; 1004*6236dae4SAndroid Build Coastguard Worker my $bitmask = ' '; 1005*6236dae4SAndroid Build Coastguard Worker my $opt; 1006*6236dae4SAndroid Build Coastguard Worker 1007*6236dae4SAndroid Build Coastguard Worker if(defined($short) && $long) { 1008*6236dae4SAndroid Build Coastguard Worker $opt = "-$short, --$long"; 1009*6236dae4SAndroid Build Coastguard Worker } 1010*6236dae4SAndroid Build Coastguard Worker elsif($long && !$short) { 1011*6236dae4SAndroid Build Coastguard Worker $opt = " --$long"; 1012*6236dae4SAndroid Build Coastguard Worker } 1013*6236dae4SAndroid Build Coastguard Worker for my $i (0 .. $#categories) { 1014*6236dae4SAndroid Build Coastguard Worker if(!$cats{ $categories[$i] }) { 1015*6236dae4SAndroid Build Coastguard Worker printf STDERR "$f.md:ERROR: Unknown category '%s'\n", 1016*6236dae4SAndroid Build Coastguard Worker $categories[$i]; 1017*6236dae4SAndroid Build Coastguard Worker exit 3; 1018*6236dae4SAndroid Build Coastguard Worker } 1019*6236dae4SAndroid Build Coastguard Worker 1020*6236dae4SAndroid Build Coastguard Worker $bitmask .= 'CURLHELP_' . uc $categories[$i]; 1021*6236dae4SAndroid Build Coastguard Worker # If not last element, append | 1022*6236dae4SAndroid Build Coastguard Worker if($i < $#categories) { 1023*6236dae4SAndroid Build Coastguard Worker $bitmask .= ' | '; 1024*6236dae4SAndroid Build Coastguard Worker } 1025*6236dae4SAndroid Build Coastguard Worker } 1026*6236dae4SAndroid Build Coastguard Worker $bitmask =~ s/(?=.{76}).{1,76}\|/$&\n /g; 1027*6236dae4SAndroid Build Coastguard Worker my $arg = $arglong{$long}; 1028*6236dae4SAndroid Build Coastguard Worker if($arg) { 1029*6236dae4SAndroid Build Coastguard Worker $opt .= " $arg"; 1030*6236dae4SAndroid Build Coastguard Worker } 1031*6236dae4SAndroid Build Coastguard Worker my $desc = $helplong{$f}; 1032*6236dae4SAndroid Build Coastguard Worker $desc =~ s/\"/\\\"/g; # escape double quotes 1033*6236dae4SAndroid Build Coastguard Worker 1034*6236dae4SAndroid Build Coastguard Worker my $line = sprintf " {\"%s\",\n \"%s\",\n %s},\n", $opt, $desc, $bitmask; 1035*6236dae4SAndroid Build Coastguard Worker 1036*6236dae4SAndroid Build Coastguard Worker if(length($opt) > 78) { 1037*6236dae4SAndroid Build Coastguard Worker print STDERR "WARN: the --$long name is too long\n"; 1038*6236dae4SAndroid Build Coastguard Worker } 1039*6236dae4SAndroid Build Coastguard Worker elsif(length($desc) > 78) { 1040*6236dae4SAndroid Build Coastguard Worker print STDERR "WARN: the --$long description is too long\n"; 1041*6236dae4SAndroid Build Coastguard Worker } 1042*6236dae4SAndroid Build Coastguard Worker print $line; 1043*6236dae4SAndroid Build Coastguard Worker } 1044*6236dae4SAndroid Build Coastguard Worker print <<FOOT 1045*6236dae4SAndroid Build Coastguard Worker { NULL, NULL, 0 } 1046*6236dae4SAndroid Build Coastguard Worker}; 1047*6236dae4SAndroid Build Coastguard WorkerFOOT 1048*6236dae4SAndroid Build Coastguard Worker ; 1049*6236dae4SAndroid Build Coastguard Worker} 1050*6236dae4SAndroid Build Coastguard Worker 1051*6236dae4SAndroid Build Coastguard Workersub listcats { 1052*6236dae4SAndroid Build Coastguard Worker my %allcats; 1053*6236dae4SAndroid Build Coastguard Worker foreach my $f (sort keys %helplong) { 1054*6236dae4SAndroid Build Coastguard Worker my @categories = split ' ', $catlong{$f}; 1055*6236dae4SAndroid Build Coastguard Worker foreach (@categories) { 1056*6236dae4SAndroid Build Coastguard Worker $allcats{$_} = undef; 1057*6236dae4SAndroid Build Coastguard Worker } 1058*6236dae4SAndroid Build Coastguard Worker } 1059*6236dae4SAndroid Build Coastguard Worker my @categories; 1060*6236dae4SAndroid Build Coastguard Worker foreach my $key (keys %allcats) { 1061*6236dae4SAndroid Build Coastguard Worker push @categories, $key; 1062*6236dae4SAndroid Build Coastguard Worker } 1063*6236dae4SAndroid Build Coastguard Worker @categories = sort @categories; 1064*6236dae4SAndroid Build Coastguard Worker for my $i (0..$#categories) { 1065*6236dae4SAndroid Build Coastguard Worker printf("#define CURLHELP_%-10s (%s)\n", 1066*6236dae4SAndroid Build Coastguard Worker uc($categories[$i]), "1u << ${i}u"); 1067*6236dae4SAndroid Build Coastguard Worker } 1068*6236dae4SAndroid Build Coastguard Worker} 1069*6236dae4SAndroid Build Coastguard Worker 1070*6236dae4SAndroid Build Coastguard Workersub listglobals { 1071*6236dae4SAndroid Build Coastguard Worker my ($dir, @files) = @_; 1072*6236dae4SAndroid Build Coastguard Worker my @globalopts; 1073*6236dae4SAndroid Build Coastguard Worker 1074*6236dae4SAndroid Build Coastguard Worker # Find all global options and output them 1075*6236dae4SAndroid Build Coastguard Worker foreach my $f (sort @files) { 1076*6236dae4SAndroid Build Coastguard Worker open(F, "<:crlf", "$dir/$f") || 1077*6236dae4SAndroid Build Coastguard Worker die "could not read $dir/$f"; 1078*6236dae4SAndroid Build Coastguard Worker my $long; 1079*6236dae4SAndroid Build Coastguard Worker my $start = 0; 1080*6236dae4SAndroid Build Coastguard Worker while(<F>) { 1081*6236dae4SAndroid Build Coastguard Worker if(/^---/) { 1082*6236dae4SAndroid Build Coastguard Worker if(!$start) { 1083*6236dae4SAndroid Build Coastguard Worker $start = 1; 1084*6236dae4SAndroid Build Coastguard Worker next; 1085*6236dae4SAndroid Build Coastguard Worker } 1086*6236dae4SAndroid Build Coastguard Worker else { 1087*6236dae4SAndroid Build Coastguard Worker last; 1088*6236dae4SAndroid Build Coastguard Worker } 1089*6236dae4SAndroid Build Coastguard Worker } 1090*6236dae4SAndroid Build Coastguard Worker if(/^Long: *(.*)/i) { 1091*6236dae4SAndroid Build Coastguard Worker $long=$1; 1092*6236dae4SAndroid Build Coastguard Worker } 1093*6236dae4SAndroid Build Coastguard Worker elsif(/^Scope: global/i) { 1094*6236dae4SAndroid Build Coastguard Worker push @globalopts, $long; 1095*6236dae4SAndroid Build Coastguard Worker last; 1096*6236dae4SAndroid Build Coastguard Worker } 1097*6236dae4SAndroid Build Coastguard Worker } 1098*6236dae4SAndroid Build Coastguard Worker close(F); 1099*6236dae4SAndroid Build Coastguard Worker } 1100*6236dae4SAndroid Build Coastguard Worker return $ret if($ret); 1101*6236dae4SAndroid Build Coastguard Worker for my $e (0 .. $#globalopts) { 1102*6236dae4SAndroid Build Coastguard Worker $globals .= sprintf "%s--%s", $e?($globalopts[$e+1] ? ", " : " and "):"", 1103*6236dae4SAndroid Build Coastguard Worker $globalopts[$e],; 1104*6236dae4SAndroid Build Coastguard Worker } 1105*6236dae4SAndroid Build Coastguard Worker} 1106*6236dae4SAndroid Build Coastguard Worker 1107*6236dae4SAndroid Build Coastguard Workersub noext { 1108*6236dae4SAndroid Build Coastguard Worker my $in = $_[0]; 1109*6236dae4SAndroid Build Coastguard Worker $in =~ s/\.md//; 1110*6236dae4SAndroid Build Coastguard Worker return $in; 1111*6236dae4SAndroid Build Coastguard Worker} 1112*6236dae4SAndroid Build Coastguard Worker 1113*6236dae4SAndroid Build Coastguard Workersub sortnames { 1114*6236dae4SAndroid Build Coastguard Worker return noext($a) cmp noext($b); 1115*6236dae4SAndroid Build Coastguard Worker} 1116*6236dae4SAndroid Build Coastguard Worker 1117*6236dae4SAndroid Build Coastguard Workersub mainpage { 1118*6236dae4SAndroid Build Coastguard Worker my ($dir, $manpage, @files) = @_; 1119*6236dae4SAndroid Build Coastguard Worker # $manpage is 1 for nroff, 0 for ASCII 1120*6236dae4SAndroid Build Coastguard Worker my $ret; 1121*6236dae4SAndroid Build Coastguard Worker my $fh; 1122*6236dae4SAndroid Build Coastguard Worker open($fh, "<:crlf", "$dir/mainpage.idx") || 1123*6236dae4SAndroid Build Coastguard Worker die "no $dir/mainpage.idx file"; 1124*6236dae4SAndroid Build Coastguard Worker 1125*6236dae4SAndroid Build Coastguard Worker print <<HEADER 1126*6236dae4SAndroid Build Coastguard Worker.\\" ************************************************************************** 1127*6236dae4SAndroid Build Coastguard Worker.\\" * _ _ ____ _ 1128*6236dae4SAndroid Build Coastguard Worker.\\" * Project ___| | | | _ \\| | 1129*6236dae4SAndroid Build Coastguard Worker.\\" * / __| | | | |_) | | 1130*6236dae4SAndroid Build Coastguard Worker.\\" * | (__| |_| | _ <| |___ 1131*6236dae4SAndroid Build Coastguard Worker.\\" * \\___|\\___/|_| \\_\\_____| 1132*6236dae4SAndroid Build Coastguard Worker.\\" * 1133*6236dae4SAndroid Build Coastguard Worker.\\" * Copyright (C) Daniel Stenberg, <daniel\@haxx.se>, et al. 1134*6236dae4SAndroid Build Coastguard Worker.\\" * 1135*6236dae4SAndroid Build Coastguard Worker.\\" * This software is licensed as described in the file COPYING, which 1136*6236dae4SAndroid Build Coastguard Worker.\\" * you should have received as part of this distribution. The terms 1137*6236dae4SAndroid Build Coastguard Worker.\\" * are also available at https://curl.se/docs/copyright.html. 1138*6236dae4SAndroid Build Coastguard Worker.\\" * 1139*6236dae4SAndroid Build Coastguard Worker.\\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell 1140*6236dae4SAndroid Build Coastguard Worker.\\" * copies of the Software, and permit persons to whom the Software is 1141*6236dae4SAndroid Build Coastguard Worker.\\" * furnished to do so, under the terms of the COPYING file. 1142*6236dae4SAndroid Build Coastguard Worker.\\" * 1143*6236dae4SAndroid Build Coastguard Worker.\\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 1144*6236dae4SAndroid Build Coastguard Worker.\\" * KIND, either express or implied. 1145*6236dae4SAndroid Build Coastguard Worker.\\" * 1146*6236dae4SAndroid Build Coastguard Worker.\\" * SPDX-License-Identifier: curl 1147*6236dae4SAndroid Build Coastguard Worker.\\" * 1148*6236dae4SAndroid Build Coastguard Worker.\\" ************************************************************************** 1149*6236dae4SAndroid Build Coastguard Worker.\\" 1150*6236dae4SAndroid Build Coastguard Worker.\\" DO NOT EDIT. Generated by the curl project managen manpage generator. 1151*6236dae4SAndroid Build Coastguard Worker.\\" 1152*6236dae4SAndroid Build Coastguard Worker.TH curl 1 "$date" "curl $version" "curl Manual" 1153*6236dae4SAndroid Build Coastguard WorkerHEADER 1154*6236dae4SAndroid Build Coastguard Worker if ($manpage); 1155*6236dae4SAndroid Build Coastguard Worker 1156*6236dae4SAndroid Build Coastguard Worker while(<$fh>) { 1157*6236dae4SAndroid Build Coastguard Worker my $f = $_; 1158*6236dae4SAndroid Build Coastguard Worker chomp $f; 1159*6236dae4SAndroid Build Coastguard Worker if($f =~ /^#/) { 1160*6236dae4SAndroid Build Coastguard Worker # standard comment 1161*6236dae4SAndroid Build Coastguard Worker next; 1162*6236dae4SAndroid Build Coastguard Worker } 1163*6236dae4SAndroid Build Coastguard Worker if(/^%options/) { 1164*6236dae4SAndroid Build Coastguard Worker # output docs for all options 1165*6236dae4SAndroid Build Coastguard Worker foreach my $f (sort sortnames @files) { 1166*6236dae4SAndroid Build Coastguard Worker $ret += single($dir, $manpage, $f, 0); 1167*6236dae4SAndroid Build Coastguard Worker } 1168*6236dae4SAndroid Build Coastguard Worker } 1169*6236dae4SAndroid Build Coastguard Worker else { 1170*6236dae4SAndroid Build Coastguard Worker # render the file 1171*6236dae4SAndroid Build Coastguard Worker header($dir, $manpage, $f); 1172*6236dae4SAndroid Build Coastguard Worker } 1173*6236dae4SAndroid Build Coastguard Worker } 1174*6236dae4SAndroid Build Coastguard Worker close($fh); 1175*6236dae4SAndroid Build Coastguard Worker exit $ret if($ret); 1176*6236dae4SAndroid Build Coastguard Worker} 1177*6236dae4SAndroid Build Coastguard Worker 1178*6236dae4SAndroid Build Coastguard Workersub showonly { 1179*6236dae4SAndroid Build Coastguard Worker my ($f) = @_; 1180*6236dae4SAndroid Build Coastguard Worker if(single($f, 1)) { 1181*6236dae4SAndroid Build Coastguard Worker print STDERR "$f: failed\n"; 1182*6236dae4SAndroid Build Coastguard Worker } 1183*6236dae4SAndroid Build Coastguard Worker} 1184*6236dae4SAndroid Build Coastguard Worker 1185*6236dae4SAndroid Build Coastguard Workersub showprotocols { 1186*6236dae4SAndroid Build Coastguard Worker my %prots; 1187*6236dae4SAndroid Build Coastguard Worker foreach my $f (keys %optlong) { 1188*6236dae4SAndroid Build Coastguard Worker my @p = split(/ /, $protolong{$f}); 1189*6236dae4SAndroid Build Coastguard Worker for my $p (@p) { 1190*6236dae4SAndroid Build Coastguard Worker $prots{$p}++; 1191*6236dae4SAndroid Build Coastguard Worker } 1192*6236dae4SAndroid Build Coastguard Worker } 1193*6236dae4SAndroid Build Coastguard Worker for(sort keys %prots) { 1194*6236dae4SAndroid Build Coastguard Worker printf "$_ (%d options)\n", $prots{$_}; 1195*6236dae4SAndroid Build Coastguard Worker } 1196*6236dae4SAndroid Build Coastguard Worker} 1197*6236dae4SAndroid Build Coastguard Worker 1198*6236dae4SAndroid Build Coastguard Workersub getargs { 1199*6236dae4SAndroid Build Coastguard Worker my ($dir, $f, @s) = @_; 1200*6236dae4SAndroid Build Coastguard Worker if($f eq "mainpage") { 1201*6236dae4SAndroid Build Coastguard Worker listglobals($dir, @s); 1202*6236dae4SAndroid Build Coastguard Worker mainpage($dir, 1, @s); 1203*6236dae4SAndroid Build Coastguard Worker return; 1204*6236dae4SAndroid Build Coastguard Worker } 1205*6236dae4SAndroid Build Coastguard Worker elsif($f eq "ascii") { 1206*6236dae4SAndroid Build Coastguard Worker listglobals($dir, @s); 1207*6236dae4SAndroid Build Coastguard Worker mainpage($dir, 0, @s); 1208*6236dae4SAndroid Build Coastguard Worker return; 1209*6236dae4SAndroid Build Coastguard Worker } 1210*6236dae4SAndroid Build Coastguard Worker elsif($f eq "listhelp") { 1211*6236dae4SAndroid Build Coastguard Worker listhelp($dir); 1212*6236dae4SAndroid Build Coastguard Worker return; 1213*6236dae4SAndroid Build Coastguard Worker } 1214*6236dae4SAndroid Build Coastguard Worker elsif($f eq "single") { 1215*6236dae4SAndroid Build Coastguard Worker showonly($s[0]); 1216*6236dae4SAndroid Build Coastguard Worker return; 1217*6236dae4SAndroid Build Coastguard Worker } 1218*6236dae4SAndroid Build Coastguard Worker elsif($f eq "protos") { 1219*6236dae4SAndroid Build Coastguard Worker showprotocols(); 1220*6236dae4SAndroid Build Coastguard Worker return; 1221*6236dae4SAndroid Build Coastguard Worker } 1222*6236dae4SAndroid Build Coastguard Worker elsif($f eq "listcats") { 1223*6236dae4SAndroid Build Coastguard Worker listcats(); 1224*6236dae4SAndroid Build Coastguard Worker return; 1225*6236dae4SAndroid Build Coastguard Worker } 1226*6236dae4SAndroid Build Coastguard Worker 1227*6236dae4SAndroid Build Coastguard Worker print "Usage: managen ". 1228*6236dae4SAndroid Build Coastguard Worker "[-d dir] <mainpage/ascii/listhelp/single FILE/protos/listcats> [files]\n"; 1229*6236dae4SAndroid Build Coastguard Worker} 1230*6236dae4SAndroid Build Coastguard Worker 1231*6236dae4SAndroid Build Coastguard Worker#------------------------------------------------------------------------ 1232*6236dae4SAndroid Build Coastguard Worker 1233*6236dae4SAndroid Build Coastguard Workermy $dir = "."; 1234*6236dae4SAndroid Build Coastguard Workermy $include = "../../include"; 1235*6236dae4SAndroid Build Coastguard Workermy $cmd = shift @ARGV; 1236*6236dae4SAndroid Build Coastguard Worker 1237*6236dae4SAndroid Build Coastguard Worker check: 1238*6236dae4SAndroid Build Coastguard Workerif($cmd eq "-d") { 1239*6236dae4SAndroid Build Coastguard Worker # specifies source directory 1240*6236dae4SAndroid Build Coastguard Worker $dir = shift @ARGV; 1241*6236dae4SAndroid Build Coastguard Worker $cmd = shift @ARGV; 1242*6236dae4SAndroid Build Coastguard Worker goto check; 1243*6236dae4SAndroid Build Coastguard Worker} 1244*6236dae4SAndroid Build Coastguard Workerelsif($cmd eq "-I") { 1245*6236dae4SAndroid Build Coastguard Worker # include path root 1246*6236dae4SAndroid Build Coastguard Worker $include = shift @ARGV; 1247*6236dae4SAndroid Build Coastguard Worker $cmd = shift @ARGV; 1248*6236dae4SAndroid Build Coastguard Worker goto check; 1249*6236dae4SAndroid Build Coastguard Worker} 1250*6236dae4SAndroid Build Coastguard Workerelsif($cmd eq "-c") { 1251*6236dae4SAndroid Build Coastguard Worker # Column width 1252*6236dae4SAndroid Build Coastguard Worker $colwidth = 0 + shift @ARGV; 1253*6236dae4SAndroid Build Coastguard Worker $cmd = shift @ARGV; 1254*6236dae4SAndroid Build Coastguard Worker goto check; 1255*6236dae4SAndroid Build Coastguard Worker} 1256*6236dae4SAndroid Build Coastguard Worker 1257*6236dae4SAndroid Build Coastguard Workermy @files = @ARGV; # the rest are the files 1258*6236dae4SAndroid Build Coastguard Worker 1259*6236dae4SAndroid Build Coastguard Worker# can be overridden for releases 1260*6236dae4SAndroid Build Coastguard Workerif($ENV{'CURL_MAKETGZ_VERSION'}) { 1261*6236dae4SAndroid Build Coastguard Worker $version = $ENV{'CURL_MAKETGZ_VERSION'}; 1262*6236dae4SAndroid Build Coastguard Worker} 1263*6236dae4SAndroid Build Coastguard Workerelse { 1264*6236dae4SAndroid Build Coastguard Worker open(INC, "<$include/curl/curlver.h"); 1265*6236dae4SAndroid Build Coastguard Worker while(<INC>) { 1266*6236dae4SAndroid Build Coastguard Worker if($_ =~ /^#define LIBCURL_VERSION \"([0-9.]*)/) { 1267*6236dae4SAndroid Build Coastguard Worker $version = $1; 1268*6236dae4SAndroid Build Coastguard Worker last; 1269*6236dae4SAndroid Build Coastguard Worker } 1270*6236dae4SAndroid Build Coastguard Worker } 1271*6236dae4SAndroid Build Coastguard Worker close(INC); 1272*6236dae4SAndroid Build Coastguard Worker} 1273*6236dae4SAndroid Build Coastguard Worker 1274*6236dae4SAndroid Build Coastguard Worker# learn all existing options 1275*6236dae4SAndroid Build Coastguard Workerindexoptions($dir, @files); 1276*6236dae4SAndroid Build Coastguard Worker 1277*6236dae4SAndroid Build Coastguard Workergetargs($dir, $cmd, @files); 1278*6236dae4SAndroid Build Coastguard Worker 1279*6236dae4SAndroid Build Coastguard Workerexit $error; 1280