#! /usr/bin/env perl
# Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the OpenSSL license (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

# Generate progs.h file by looking for command mains in list of C files
# passed on the command line.

use strict;
use warnings;
use lib '.';
use configdata qw/@disablables %unified_info/;

my %commands     = ();
my $cmdre        = qr/^\s*int\s+([a-z_][a-z0-9_]*)_main\(\s*int\s+argc\s*,/;
my $apps_openssl = shift @ARGV;

# because the program apps/openssl has object files as sources, and
# they then have the corresponding C files as source, we need to chain
# the lookups in %unified_info
my @openssl_source =
    map { @{$unified_info{sources}->{$_}} }
        @{$unified_info{sources}->{$apps_openssl}};

foreach my $filename (@openssl_source) {
    open F, $filename or die "Coudn't open $_: $!\n";
    foreach ( grep /$cmdre/, <F> ) {
        my @foo = /$cmdre/;
        $commands{$1} = 1;
    }
    close F;
}

@ARGV = sort keys %commands;

print <<'EOF';
/*
 * WARNING: do not edit!
 * Generated by apps/progs.pl
 *
 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

typedef enum FUNC_TYPE {
    FT_none, FT_general, FT_md, FT_cipher, FT_pkey,
    FT_md_alg, FT_cipher_alg
} FUNC_TYPE;

typedef struct function_st {
    FUNC_TYPE type;
    const char *name;
    int (*func)(int argc, char *argv[]);
    const OPTIONS *help;
} FUNCTION;

DEFINE_LHASH_OF(FUNCTION);

EOF

foreach (@ARGV) {
    printf "extern int %s_main(int argc, char *argv[]);\n", $_;
}
print "\n";

foreach (@ARGV) {
    printf "extern const OPTIONS %s_options[];\n", $_;
}
print "\n";

my %cmd_disabler = (
    ciphers  => "sock",
    genrsa   => "rsa",
    rsautl   => "rsa",
    gendsa   => "dsa",
    dsaparam => "dsa",
    gendh    => "dh",
    dhparam  => "dh",
    ecparam  => "ec",
    pkcs12   => "des",
);

print "#ifdef INCLUDE_FUNCTION_TABLE\n";
print "static FUNCTION functions[] = {\n";
foreach my $cmd ( @ARGV ) {
    my $str = "    {FT_general, \"$cmd\", ${cmd}_main, ${cmd}_options},\n";
    if ($cmd =~ /^s_/) {
        print "#ifndef OPENSSL_NO_SOCK\n${str}#endif\n";
    } elsif (grep { $cmd eq $_ } @disablables) {
        print "#ifndef OPENSSL_NO_" . uc($cmd) . "\n${str}#endif\n";
    } elsif (my $disabler = $cmd_disabler{$cmd}) {
        print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n";
    } else {
        print $str;
    }
}

my %md_disabler = (
    blake2b512 => "blake2",
    blake2s256 => "blake2",
);
foreach my $cmd (
	"md2", "md4", "md5",
	"gost",
	"sha1", "sha224", "sha256", "sha384", "sha512",
	"mdc2", "rmd160", "blake2b512", "blake2s256"
) {
    my $str = "    {FT_md, \"$cmd\", dgst_main},\n";
    if (grep { $cmd eq $_ } @disablables) {
        print "#ifndef OPENSSL_NO_" . uc($cmd) . "\n${str}#endif\n";
    } elsif (my $disabler = $md_disabler{$cmd}) {
        print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n";
    } else {
        print $str;
    }
}

my %cipher_disabler = (
    des3  => "des",
    desx  => "des",
    cast5 => "cast",
);
foreach my $cmd (
    "aes-128-cbc", "aes-128-ecb",
    "aes-192-cbc", "aes-192-ecb",
    "aes-256-cbc", "aes-256-ecb",
    "aria-128-cbc", "aria-128-cfb",
    "aria-128-ctr", "aria-128-ecb", "aria-128-ofb",
    "aria-128-cfb1", "aria-128-cfb8",
    "aria-192-cbc", "aria-192-cfb",
    "aria-192-ctr", "aria-192-ecb", "aria-192-ofb",
    "aria-192-cfb1", "aria-192-cfb8",
    "aria-256-cbc", "aria-256-cfb",
    "aria-256-ctr", "aria-256-ecb", "aria-256-ofb",
    "aria-256-cfb1", "aria-256-cfb8",
    "camellia-128-cbc", "camellia-128-ecb",
    "camellia-192-cbc", "camellia-192-ecb",
    "camellia-256-cbc", "camellia-256-ecb",
    "base64", "zlib",
    "des", "des3", "desx", "idea", "seed", "rc4", "rc4-40",
    "rc2", "bf", "cast", "rc5",
    "des-ecb", "des-ede", "des-ede3",
    "des-cbc", "des-ede-cbc","des-ede3-cbc",
    "des-cfb", "des-ede-cfb","des-ede3-cfb",
    "des-ofb", "des-ede-ofb","des-ede3-ofb",
    "idea-cbc","idea-ecb", "idea-cfb", "idea-ofb",
    "seed-cbc","seed-ecb", "seed-cfb", "seed-ofb",
    "rc2-cbc", "rc2-ecb", "rc2-cfb","rc2-ofb", "rc2-64-cbc", "rc2-40-cbc",
    "bf-cbc", "bf-ecb", "bf-cfb", "bf-ofb",
    "cast5-cbc","cast5-ecb", "cast5-cfb","cast5-ofb",
    "cast-cbc", "rc5-cbc", "rc5-ecb", "rc5-cfb", "rc5-ofb"
) {
    my $str = "    {FT_cipher, \"$cmd\", enc_main, enc_options},\n";
    (my $algo = $cmd) =~ s/-.*//g;
    if ($cmd eq "zlib") {
        print "#ifdef ZLIB\n${str}#endif\n";
    } elsif (grep { $algo eq $_ } @disablables) {
        print "#ifndef OPENSSL_NO_" . uc($algo) . "\n${str}#endif\n";
    } elsif (my $disabler = $cipher_disabler{$algo}) {
        print "#ifndef OPENSSL_NO_" . uc($disabler) . "\n${str}#endif\n";
    } else {
        print $str;
    }
}

print "    {0, NULL, NULL}\n};\n";
print "#endif\n";
