#!/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
#
###########################################################################
#
# This script grew out of help from Przemyslaw Iskra and Balint Szilakszi
# a late evening in the #curl IRC channel.
#

use strict;
use warnings;

my $curl = shift @ARGV;
my $opt = shift @ARGV;
my $txt = shift @ARGV;

my $longopt;
my $shortopt;
if($opt =~ /^--/) {
    $longopt = $opt;
}
else {
    $shortopt = $opt;
}

# first run the help command
my @curlout; open(O, '-|', $curl, '-h', $opt) or die; push @curlout, <O>; close(O);

# figure out the short+long option combo using -h all*/
open(C, '-|', $curl, '-h', 'all');
if($shortopt) {
    while(<C>) {
        if(/^ +$opt, ([^ ]*)/) {
            $longopt = $1;
            last;
        }
    }
}
else {
    while(<C>) {
        my $f  = $_;
        if(/ $opt /) {
            if($f =~ /^ *(-(.)), $longopt/) {
                $shortopt = $1;
            }
            last;
        }
    }
}
close(C);

my $fullopt;
if($shortopt) {
    $fullopt = "$shortopt, $longopt";
}
else {
    $fullopt = $longopt;
}

open(R, "<", $txt);
my $show = 0;
my @txtout;
while(<R>) {
    if(/^    $fullopt/) {
        $show = 1;
    }
    elsif(/^    -/ && $show) {
        last;
    }
    if($show) {
        push @txtout, $_;
    }
}
close(R);

my $error = 0;
if(scalar(@curlout) != scalar(@txtout)) {
    printf "curl -h $opt is %d lines, $txt says %d lines\n",
        scalar(@curlout), scalar(@txtout);
    $error++;
}
else {
    # same size, compare line by line
    for my $i (0 .. $#curlout) {
        # trim CRLF from the data
        $curlout[$i] =~ s/[\r\n]//g;
        $txtout[$i] =~ s/[\r\n]//g;
        if($curlout[$i] ne $txtout[$i]) {
            printf "Line %d\n", $i;
            printf "-h   : %s (%d bytes)\n", $curlout[$i],
                length($curlout[$i]);
            printf "file : %s (%d bytes)\n", $txtout[$i],
                length($txtout[$i]);

            if(length($curlout[$i]) == length($txtout[$i])) {
                my $l = length($curlout[$i]);
                for my $c (0 .. $l) {
                    my $o = substr($curlout[$i], $c, 1);
                    my $t = substr($txtout[$i], $c, 1);
                    if($o ne $t) {
                        print "-h   col %d: %02x\n", $c, ord($o);
                        print "file col %d: %02x\n", $c, ord($t);
                    }
                }
            }
            $error++;
        }
    }
}
exit $error;
