226 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			226 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env perl
 | 
						|
#***************************************************************************
 | 
						|
#                                  _   _ ____  _
 | 
						|
#  Project                     ___| | | |  _ \| |
 | 
						|
#                             / __| | | | |_) | |
 | 
						|
#                            | (__| |_| |  _ <| |___
 | 
						|
#                             \___|\___/|_| \_\_____|
 | 
						|
#
 | 
						|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
 | 
						|
#
 | 
						|
# This software is licensed as described in the file COPYING, which
 | 
						|
# you should have received as part of this distribution. The terms
 | 
						|
# are also available at https://curl.se/docs/copyright.html.
 | 
						|
#
 | 
						|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
 | 
						|
# copies of the Software, and permit persons to whom the Software is
 | 
						|
# furnished to do so, under the terms of the COPYING file.
 | 
						|
#
 | 
						|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 | 
						|
# KIND, either express or implied.
 | 
						|
#
 | 
						|
# SPDX-License-Identifier: curl
 | 
						|
#
 | 
						|
###########################################################################
 | 
						|
 | 
						|
=begin comment
 | 
						|
 | 
						|
This script updates a curldown file to current/better curldown.
 | 
						|
 | 
						|
Example: cd2cd [--in-place] <file.md> > <file.md>
 | 
						|
 | 
						|
--in-place: if used, it replaces the original file with the cleaned up
 | 
						|
            version. When this is used, cd2cd accepts multiple files to work
 | 
						|
            on and it ignores errors on single files.
 | 
						|
 | 
						|
=end comment
 | 
						|
=cut
 | 
						|
 | 
						|
my $cd2cd = "0.1"; # to keep check
 | 
						|
my $dir;
 | 
						|
my $extension;
 | 
						|
my $inplace = 0;
 | 
						|
 | 
						|
while(1) {
 | 
						|
    if($ARGV[0] eq "--in-place") {
 | 
						|
        shift @ARGV;
 | 
						|
        $inplace = 1;
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        last;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
use POSIX qw(strftime);
 | 
						|
my @ts;
 | 
						|
if (defined($ENV{SOURCE_DATE_EPOCH})) {
 | 
						|
    @ts = localtime($ENV{SOURCE_DATE_EPOCH});
 | 
						|
} else {
 | 
						|
    @ts = localtime;
 | 
						|
}
 | 
						|
my $date = strftime "%B %d %Y", @ts;
 | 
						|
 | 
						|
sub outseealso {
 | 
						|
    my (@sa) = @_;
 | 
						|
    my $comma = 0;
 | 
						|
    my @o;
 | 
						|
    push @o, ".SH SEE ALSO\n";
 | 
						|
    for my $s (sort @sa) {
 | 
						|
        push @o, sprintf "%s.BR $s", $comma ? ",\n": "";
 | 
						|
        $comma = 1;
 | 
						|
    }
 | 
						|
    push @o, "\n";
 | 
						|
    return @o;
 | 
						|
}
 | 
						|
 | 
						|
sub single {
 | 
						|
    my @head;
 | 
						|
    my @seealso;
 | 
						|
    my ($f)=@_;
 | 
						|
    my $title;
 | 
						|
    my $section;
 | 
						|
    my $source;
 | 
						|
    my $start = 0;
 | 
						|
    my $d;
 | 
						|
    my $line = 0;
 | 
						|
    open(F, "<:crlf", "$f") ||
 | 
						|
        return 1;
 | 
						|
    while(<F>) {
 | 
						|
        $line++;
 | 
						|
        $d = $_;
 | 
						|
        if(!$start) {
 | 
						|
            if(/^---/) {
 | 
						|
                # header starts here
 | 
						|
                $start = 1;
 | 
						|
                push @head, $d;
 | 
						|
            }
 | 
						|
            next;
 | 
						|
        }
 | 
						|
        if(/^Title: *(.*)/i) {
 | 
						|
            $title=$1;
 | 
						|
        }
 | 
						|
        elsif(/^Section: *(.*)/i) {
 | 
						|
            $section=$1;
 | 
						|
        }
 | 
						|
        elsif(/^Source: *(.*)/i) {
 | 
						|
            $source=$1;
 | 
						|
        }
 | 
						|
        elsif(/^See-also: +(.*)/i) {
 | 
						|
            $salist = 0;
 | 
						|
            push @seealso, $1;
 | 
						|
        }
 | 
						|
        elsif(/^See-also: */i) {
 | 
						|
            if($seealso[0]) {
 | 
						|
                print STDERR "$f:$line:1:ERROR: bad See-Also, needs list\n";
 | 
						|
                return 2;
 | 
						|
            }
 | 
						|
            $salist = 1;
 | 
						|
        }
 | 
						|
        elsif(/^ +- (.*)/i) {
 | 
						|
            # the only list we support is the see-also
 | 
						|
            if($salist) {
 | 
						|
                push @seealso, $1;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        # REUSE-IgnoreStart
 | 
						|
        elsif(/^C: (.*)/i) {
 | 
						|
            $copyright=$1;
 | 
						|
        }
 | 
						|
        elsif(/^SPDX-License-Identifier: (.*)/i) {
 | 
						|
            $spdx=$1;
 | 
						|
        }
 | 
						|
        # REUSE-IgnoreEnd
 | 
						|
        elsif(/^---/) {
 | 
						|
            # end of the header section
 | 
						|
            if(!$title) {
 | 
						|
                print STDERR "ERROR: no 'Title:' in $f\n";
 | 
						|
                return 1;
 | 
						|
            }
 | 
						|
            if(!$section) {
 | 
						|
                print STDERR "ERROR: no 'Section:' in $f\n";
 | 
						|
                return 2;
 | 
						|
            }
 | 
						|
            if(!$seealso[0]) {
 | 
						|
                print STDERR "$f:$line:1:ERROR: no 'See-also:' present\n";
 | 
						|
                return 2;
 | 
						|
            }
 | 
						|
            if(!$copyright) {
 | 
						|
                print STDERR "$f:$line:1:ERROR: no 'C:' field present\n";
 | 
						|
                return 2;
 | 
						|
            }
 | 
						|
            if(!$spdx) {
 | 
						|
                print STDERR "$f:$line:1:ERROR: no 'SPDX-License-Identifier:' field present\n";
 | 
						|
                return 2;
 | 
						|
            }
 | 
						|
            last;
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            chomp;
 | 
						|
            print STDERR "WARN: unrecognized line in $f, ignoring:\n:'$_';"
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if(!$start) {
 | 
						|
        print STDERR "$f:$line:1:ERROR: no header present\n";
 | 
						|
        return 2;
 | 
						|
    }
 | 
						|
 | 
						|
    my @desc;
 | 
						|
 | 
						|
    push @desc, sprintf <<HEAD
 | 
						|
---
 | 
						|
c: Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
 | 
						|
SPDX-License-Identifier: curl
 | 
						|
Title: $title
 | 
						|
Section: $section
 | 
						|
Source: $source
 | 
						|
HEAD
 | 
						|
        ;
 | 
						|
    push @desc, "See-also:\n";
 | 
						|
    for my $s (sort @seealso) {
 | 
						|
        push @desc, "  - $s\n" if($s);
 | 
						|
    }
 | 
						|
    push @desc, "---\n";
 | 
						|
 | 
						|
    my $blankline = 0;
 | 
						|
    while(<F>) {
 | 
						|
        $d = $_;
 | 
						|
        $line++;
 | 
						|
        if($d =~ /^[ \t]*\n/) {
 | 
						|
            $blankline++;
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            $blankline = 0;
 | 
						|
        }
 | 
						|
        # *italics* for curl symbol links get the asterisks removed
 | 
						|
        $d =~ s/\*((lib|)curl[^ ]*\(3\))\*/$1/gi;
 | 
						|
 | 
						|
        if(length($d) > 90) {
 | 
						|
            print STDERR "$f:$line:1:WARN: excessive line length\n";
 | 
						|
        }
 | 
						|
 | 
						|
        push @desc, $d if($blankline < 2);
 | 
						|
    }
 | 
						|
    close(F);
 | 
						|
 | 
						|
    if($inplace) {
 | 
						|
        open(O, ">$f") || return 1;
 | 
						|
        print O @desc;
 | 
						|
        close(O);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        print @desc;
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
if($inplace) {
 | 
						|
    for my $a (@ARGV) {
 | 
						|
        # this ignores errors
 | 
						|
        single($a);
 | 
						|
    }
 | 
						|
}
 | 
						|
else {
 | 
						|
    exit single($ARGV[0]);
 | 
						|
}
 |