#!/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
#
#
###########################################################################
#
# Check the OS/400 translating wrapper properly handles all translatable
# string options.

use strict;
use warnings;

my $root=$ARGV[0] || ".";
my $incdir = "$root/include/curl";
my $os400dir = "$root/packages/OS400";
my $errcount = 0;

# Scan header file for string option definitions.
sub scan_header {
    my ($f)=@_;
    my $line = "";
    my $incomment = 0;
    my @stringopts;

    open(my $h, "<", "$f");
    while(<$h>) {
      s/^\s*(.*?)\s*$/$1/;      # Trim.
      # Remove multi-line comment trail.
      if($incomment) {
        if($_ !~ /.*?\*\/\s*(.*)$/) {
          next;
        }
        $_ = $1;
        $incomment = 0;
      }
      if($line ne "") {
        # Unfold line.
        $_ = "$line $1";
        $line = "";
      }
      if($_ =~ /^(.*)\\$/) {
        $line = "$1 ";
        next;
      }
      # Remove comments.
      while($_ =~ /^(.*?)\/\*.*?\*\/(.*)$/) {
        $_ = "$1 $2";
      }
      if($_ =~ /^(.*)\/\*/) {
        $_ = "$1 ";
        $incomment = 1;
      }
      s/^\s*(.*?)\s*$/$1/;      # Trim again.
      # Ignore preprocessor directives and blank lines.
      if($_ =~ /^(?:#|$)/) {
        next;
      }
      # Handle lines that may be continued as if they were folded.
      if($_ !~ /[;,{}]$/ || $_ =~ /[^)],$/) {
        # Folded line.
        $line = $_;
        next;
      }
      # Keep string options only.
      if($_ =~ /CURLOPT(?:DEPRECATED)?\s*\(\s*([^, \t]+)\s*,\s*CURLOPTTYPE_STRINGPOINT/) {
        push(@stringopts, $1);
      }
    }
    close $h;
    return @stringopts;
}

# Scan packages/OS400/ccsidcurl.c for translatable string option cases.
sub scan_wrapper_for_strings {
    my ($f)=@_;
    my $inarmor = 0;
    my @stringopts;

    open(my $h, "<", "$f");
    while(<$h>) {
      if($_ =~ /(BEGIN|END) TRANSLATABLE STRING OPTIONS/) {
        $inarmor = $1 eq "BEGIN";
      }
      elsif($inarmor && $_ =~ /case\s+([^:]+):/) {
        push(@stringopts, $1);
      }
    }
    close $h;
    return @stringopts;
}

# Get translatable string options from header file.
my @stringdefs = scan_header("$incdir/curl.h");

# Get translated string options.
my @stringrefs = scan_wrapper_for_strings("$os400dir/ccsidcurl.c");

# Lists should be equal: check differences.
my %diff;
@diff{@stringdefs} = 0..$#stringdefs;
delete @diff{@stringrefs};

foreach(keys %diff) {
  print "$_ is not translated\n";
  delete $diff{$_};
  $errcount++;
}

@diff{@stringrefs} = 0..$#stringrefs;
delete @diff{@stringdefs};

foreach(keys %diff) {
  print "translated option $_ does not exist\n";
  $errcount++;
}

# Check translated string option cases are sorted alphanumerically.
foreach(my $i = 1; $i < $#stringrefs; $i++) {
  if($stringrefs[$i] lt $stringrefs[$i - 1]) {
    print("Translated string options are not sorted (" . $stringrefs[$i - 1] .
          "/" . $stringrefs[$i] . ")\n");
    $errcount++;
    last;
  }
}

exit !!$errcount;
