#!/usr/bin/perl
# SPDX-License-Identifier: GPL-2.0

use strict;
use Pod::Usage;
use Getopt::Long;
use File::Find;
use Fcntl ':mode';
use Cwd 'abs_path';

my $help;
my $man;
my $debug;
my $arch;
my $feat;
my $enable_fname;

my $basename = abs_path($0);
$basename =~ s,/[^/]+$,/,;

my $prefix=$basename . "../Documentation/features";

# Used only at for full features output. The script will auto-adjust
# such values for the minimal possible values
my $status_size = 1;
my $description_size = 1;

GetOptions(
	"debug|d+" => \$debug,
	"dir=s" => \$prefix,
	'help|?' => \$help,
	'arch=s' => \$arch,
	'feat=s' => \$feat,
	'feature=s' => \$feat,
	"enable-fname" => \$enable_fname,
	man => \$man
) or pod2usage(2);

pod2usage(1) if $help;
pod2usage(-exitstatus => 0, -verbose => 2) if $man;

pod2usage(1) if (scalar @ARGV < 1 || @ARGV > 2);

my ($cmd, $arg) = @ARGV;

pod2usage(2) if ($cmd ne "current" && $cmd ne "rest" && $cmd ne "validate"
		&& $cmd ne "ls" && $cmd ne "list");

require Data::Dumper if ($debug);

my %data;
my %archs;

#
# Displays an error message, printing file name and line
#
sub parse_error($$$$) {
	my ($file, $ln, $msg, $data) = @_;

	$data =~ s/\s+$/\n/;

	print STDERR "Warning: file $file#$ln:\n\t$msg";

	if ($data ne "") {
		print STDERR ". Line\n\t\t$data";
	} else {
	    print STDERR "\n";
	}
}

#
# Parse a features file, storing its contents at %data
#

my $h_name = "Feature";
my $h_kconfig = "Kconfig";
my $h_description = "Description";
my $h_subsys = "Subsystem";
my $h_status = "Status";
my $h_arch = "Architecture";

my $max_size_name = length($h_name);
my $max_size_kconfig = length($h_kconfig);
my $max_size_description = length($h_description);
my $max_size_subsys = length($h_subsys);
my $max_size_status = length($h_status);

my $max_size_arch = 0;
my $max_size_arch_with_header;
my $max_description_word = 0;

sub parse_feat {
	my $file = $File::Find::name;

	my $mode = (stat($file))[2];
	return if ($mode & S_IFDIR);
	return if ($file =~ m,($prefix)/arch-support.txt,);
	return if (!($file =~ m,arch-support.txt$,));

	if ($enable_fname) {
		printf ".. FILE %s\n", abs_path($file);
	}

	my $subsys = "";
	$subsys = $2 if ( m,.*($prefix)/([^/]+).*,);

	if (length($subsys) > $max_size_subsys) {
		$max_size_subsys = length($subsys);
	}

	my $name;
	my $kconfig;
	my $description;
	my $comments = "";
	my $last_status;
	my $ln;
	my %arch_table;

	print STDERR "Opening $file\n" if ($debug > 1);
	open IN, $file;

	while(<IN>) {
		$ln++;

		if (m/^\#\s+Feature\s+name:\s*(.*\S)/) {
			$name = $1;
			if (length($name) > $max_size_name) {
				$max_size_name = length($name);
			}
			next;
		}
		if (m/^\#\s+Kconfig:\s*(.*\S)/) {
			$kconfig = $1;
			if (length($kconfig) > $max_size_kconfig) {
				$max_size_kconfig = length($kconfig);
			}
			next;
		}
		if (m/^\#\s+description:\s*(.*\S)/) {
			$description = $1;
			if (length($description) > $max_size_description) {
				$max_size_description = length($description);
			}

			foreach my $word (split /\s+/, $description) {
				if (length($word) > $max_description_word) {
					$max_description_word = length($word);
				}
			}

			next;
		}
		next if (m/^\\s*$/);
		next if (m/^\s*\-+\s*$/);
		next if (m/^\s*\|\s*arch\s*\|\s*status\s*\|\s*$/);

		if (m/^\#\s*(.*)/) {
			$comments .= "$1\n";
			next;
		}
		if (m/^\s*\|\s*(\S+):\s*\|\s*(\S+)\s*\|\s*$/) {
			my $a = $1;
			my $status = $2;

			if (length($status) > $max_size_status) {
				$max_size_status = length($status);
			}
			if (length($a) > $max_size_arch) {
				$max_size_arch = length($a);
			}

			$status = "---" if ($status =~ m/^\.\.$/);

			$archs{$a} = 1;
			$arch_table{$a} = $status;
			next;
		}

		#Everything else is an error
		parse_error($file, $ln, "line is invalid", $_);
	}
	close IN;

	if (!$name) {
		parse_error($file, $ln, "Feature name not found", "");
		return;
	}

	parse_error($file, $ln, "Subsystem not found", "") if (!$subsys);
	parse_error($file, $ln, "Kconfig not found", "") if (!$kconfig);
	parse_error($file, $ln, "Description not found", "") if (!$description);

	if (!%arch_table) {
		parse_error($file, $ln, "Architecture table not found", "");
		return;
	}

	$data{$name}->{where} = $file;
	$data{$name}->{subsys} = $subsys;
	$data{$name}->{kconfig} = $kconfig;
	$data{$name}->{description} = $description;
	$data{$name}->{comments} = $comments;
	$data{$name}->{table} = \%arch_table;

	$max_size_arch_with_header = $max_size_arch + length($h_arch);
}

#
# Output feature(s) for a given architecture
#
sub output_arch_table {
	my $title = "Feature status on $arch architecture";

	print "=" x length($title) . "\n";
	print "$title\n";
	print "=" x length($title) . "\n\n";

	print "=" x $max_size_subsys;
	print "  ";
	print "=" x $max_size_name;
	print "  ";
	print "=" x $max_size_kconfig;
	print "  ";
	print "=" x $max_size_status;
	print "  ";
	print "=" x $max_size_description;
	print "\n";
	printf "%-${max_size_subsys}s  ", $h_subsys;
	printf "%-${max_size_name}s  ", $h_name;
	printf "%-${max_size_kconfig}s  ", $h_kconfig;
	printf "%-${max_size_status}s  ", $h_status;
	printf "%-${max_size_description}s\n", $h_description;
	print "=" x $max_size_subsys;
	print "  ";
	print "=" x $max_size_name;
	print "  ";
	print "=" x $max_size_kconfig;
	print "  ";
	print "=" x $max_size_status;
	print "  ";
	print "=" x $max_size_description;
	print "\n";

	foreach my $name (sort {
				($data{$a}->{subsys} cmp $data{$b}->{subsys}) ||
				("\L$a" cmp "\L$b")
			       } keys %data) {
		next if ($feat && $name ne $feat);

		my %arch_table = %{$data{$name}->{table}};
		printf "%-${max_size_subsys}s  ", $data{$name}->{subsys};
		printf "%-${max_size_name}s  ", $name;
		printf "%-${max_size_kconfig}s  ", $data{$name}->{kconfig};
		printf "%-${max_size_status}s  ", $arch_table{$arch};
		printf "%-s\n", $data{$name}->{description};
	}

	print "=" x $max_size_subsys;
	print "  ";
	print "=" x $max_size_name;
	print "  ";
	print "=" x $max_size_kconfig;
	print "  ";
	print "=" x $max_size_status;
	print "  ";
	print "=" x $max_size_description;
	print "\n";
}

#
# list feature(s) for a given architecture
#
sub list_arch_features {
	print "#\n# Kernel feature support matrix of the '$arch' architecture:\n#\n";

	foreach my $name (sort {
				($data{$a}->{subsys} cmp $data{$b}->{subsys}) ||
				("\L$a" cmp "\L$b")
			       } keys %data) {
		next if ($feat && $name ne $feat);

		my %arch_table = %{$data{$name}->{table}};

		my $status = $arch_table{$arch};
		$status = " " x ((4 - length($status)) / 2) . $status;

		printf " %${max_size_subsys}s/ ", $data{$name}->{subsys};
		printf "%-${max_size_name}s: ", $name;
		printf "%-5s|   ", $status;
		printf "%${max_size_kconfig}s # ", $data{$name}->{kconfig};
		printf " %s\n", $data{$name}->{description};
	}
}

#
# Output a feature on all architectures
#
sub output_feature {
	my $title = "Feature $feat";

	print "=" x length($title) . "\n";
	print "$title\n";
	print "=" x length($title) . "\n\n";

	print ":Subsystem: $data{$feat}->{subsys} \n" if ($data{$feat}->{subsys});
	print ":Kconfig: $data{$feat}->{kconfig} \n" if ($data{$feat}->{kconfig});

	my $desc = $data{$feat}->{description};
	$desc =~ s/^([a-z])/\U$1/;
	$desc =~ s/\.?\s*//;
	print "\n$desc.\n\n";

	my $com = $data{$feat}->{comments};
	$com =~ s/^\s+//;
	$com =~ s/\s+$//;
	if ($com) {
		print "Comments\n";
		print "--------\n\n";
		print "$com\n\n";
	}

	print "=" x $max_size_arch_with_header;
	print "  ";
	print "=" x $max_size_status;
	print "\n";

	printf "%-${max_size_arch}s  ", $h_arch;
	printf "%-${max_size_status}s", $h_status . "\n";

	print "=" x $max_size_arch_with_header;
	print "  ";
	print "=" x $max_size_status;
	print "\n";

	my %arch_table = %{$data{$feat}->{table}};
	foreach my $arch (sort keys %arch_table) {
		printf "%-${max_size_arch}s  ", $arch;
		printf "%-${max_size_status}s\n", $arch_table{$arch};
	}

	print "=" x $max_size_arch_with_header;
	print "  ";
	print "=" x $max_size_status;
	print "\n";
}

#
# Output all features for all architectures
#

sub matrix_lines($$$) {
	my $desc_size = shift;
	my $status_size = shift;
	my $header = shift;
	my $fill;
	my $ln_marker;

	if ($header) {
		$ln_marker = "=";
	} else {
		$ln_marker = "-";
	}

	$fill = $ln_marker;

	print "+";
	print $fill x $max_size_name;
	print "+";
	print $fill x $desc_size;
	print "+";
	print $ln_marker x $status_size;
	print "+\n";
}

sub output_matrix {
	my $title = "Feature status on all architectures";
	my $notcompat = "Not compatible";

	print "=" x length($title) . "\n";
	print "$title\n";
	print "=" x length($title) . "\n\n";

	my $desc_title = "$h_kconfig / $h_description";

	my $desc_size = $max_size_kconfig + 4;
	if (!$description_size) {
		$desc_size = $max_size_description if ($max_size_description > $desc_size);
	} else {
		$desc_size = $description_size if ($description_size > $desc_size);
	}
	$desc_size = $max_description_word if ($max_description_word > $desc_size);

	$desc_size = length($desc_title) if (length($desc_title) > $desc_size);

	$max_size_status = length($notcompat) if (length($notcompat) > $max_size_status);

	# Ensure that the status will fit
	my $min_status_size = $max_size_status + $max_size_arch + 6;
	$status_size = $min_status_size if ($status_size < $min_status_size);


	my $cur_subsys = "";
	foreach my $name (sort {
				($data{$a}->{subsys} cmp $data{$b}->{subsys}) or
				("\L$a" cmp "\L$b")
			       } keys %data) {

		if ($cur_subsys ne $data{$name}->{subsys}) {
			if ($cur_subsys ne "") {
				printf "\n";
			}

			$cur_subsys = $data{$name}->{subsys};

			my $title = "Subsystem: $cur_subsys";
			print "$title\n";
			print "=" x length($title) . "\n\n";


			matrix_lines($desc_size, $status_size, 0);

			printf "|%-${max_size_name}s", $h_name;
			printf "|%-${desc_size}s", $desc_title;

			printf "|%-${status_size}s|\n", "Status per architecture";
			matrix_lines($desc_size, $status_size, 1);
		}

		my %arch_table = %{$data{$name}->{table}};
		my $cur_status = "";

		my (@lines, @descs);
		my $line = "";
		foreach my $arch (sort {
					($arch_table{$b} cmp $arch_table{$a}) or
					("\L$a" cmp "\L$b")
				       } keys %arch_table) {

			my $status = $arch_table{$arch};

			if ($status eq "---") {
				$status = $notcompat;
			}

			if ($status ne $cur_status) {
				if ($line ne "") {
					push @lines, $line;
					$line = "";
				}
				$line = "- **" . $status . "**: " . $arch;
			} elsif (length($line) + length ($arch) + 2 < $status_size) {
				$line .= ", " . $arch;
			} else {
				push @lines, $line;
				$line = "  " . $arch;
			}
			$cur_status = $status;
		}
		push @lines, $line if ($line ne "");

		my $description = $data{$name}->{description};
		while (length($description) > $desc_size) {
			my $d = substr $description, 0, $desc_size;

			# Ensure that it will end on a space
			# if it can't, it means that the size is too small
			# Instead of aborting it, let's print what we have
			if (!($d =~ s/^(.*)\s+.*/$1/)) {
				$d = substr $d, 0, -1;
				push @descs, "$d\\";
				$description =~ s/^\Q$d\E//;
			} else {
				push @descs, $d;
				$description =~ s/^\Q$d\E\s+//;
			}
		}
		push @descs, $description;

		# Ensure that the full description will be printed
		push @lines, "" while (scalar(@lines) < 2 + scalar(@descs));

		my $ln = 0;
		for my $line(@lines) {
			if (!$ln) {
				printf "|%-${max_size_name}s", $name;
				printf "|%-${desc_size}s", "``" . $data{$name}->{kconfig} . "``";
			} elsif ($ln >= 2 && scalar(@descs)) {
				printf "|%-${max_size_name}s", "";
				printf "|%-${desc_size}s", shift @descs;
			} else {
				printf "|%-${max_size_name}s", "";
				printf "|%-${desc_size}s", "";
			}

			printf "|%-${status_size}s|\n", $line;

			$ln++;
		}
		matrix_lines($desc_size, $status_size, 0);
	}
}


#
# Parses all feature files located at $prefix dir
#
find({wanted =>\&parse_feat, no_chdir => 1}, $prefix);

print STDERR Data::Dumper->Dump([\%data], [qw(*data)]) if ($debug);

#
# Handles the command
#
if ($cmd eq "current") {
	$arch = qx(uname -m | sed 's/x86_64/x86/' | sed 's/i386/x86/');
	$arch =~s/\s+$//;
}

if ($cmd eq "ls" or $cmd eq "list") {
	if (!$arch) {
		$arch = qx(uname -m | sed 's/x86_64/x86/' | sed 's/i386/x86/');
		$arch =~s/\s+$//;
	}

	list_arch_features;

	exit;
}

if ($cmd ne "validate") {
	if ($arch) {
		output_arch_table;
	} elsif ($feat) {
		output_feature;
	} else {
		output_matrix;
	}
}

__END__

=head1 NAME

get_feat.pl - parse the Linux Feature files and produce a ReST book.

=head1 SYNOPSIS

B<get_feat.pl> [--debug] [--man] [--help] [--dir=<dir>] [--arch=<arch>]
	       [--feature=<feature>|--feat=<feature>] <COMAND> [<ARGUMENT>]

Where <COMMAND> can be:

=over 8

B<current>               - output table in ReST compatible ASCII format
			   with features for this machine's architecture

B<rest>                  - output table(s)  in ReST compatible ASCII format
			   with features in ReST markup language. The output
			   is affected by --arch or --feat/--feature flags.

B<validate>              - validate the contents of the files under
			   Documentation/features.

B<ls> or B<list>         - list features for this machine's architecture,
			   using an easier to parse format.
			   The output is affected by --arch flag.

=back

=head1 OPTIONS

=over 8

=item B<--arch>

Output features for an specific architecture, optionally filtering for
a single specific feature.

=item B<--feat> or B<--feature>

Output features for a single specific feature.

=item B<--dir>

Changes the location of the Feature files. By default, it uses
the Documentation/features directory.

=item B<--enable-fname>

Prints the file name of the feature files. This can be used in order to
track dependencies during documentation build.

=item B<--debug>

Put the script in verbose mode, useful for debugging. Can be called multiple
times, to increase verbosity.

=item B<--help>

Prints a brief help message and exits.

=item B<--man>

Prints the manual page and exits.

=back

=head1 DESCRIPTION

Parse the Linux feature files from Documentation/features (by default),
optionally producing results at ReST format.

It supports output data per architecture, per feature or a
feature x arch matrix.

When used with B<rest> command, it will use either one of the tree formats:

If neither B<--arch> or B<--feature> arguments are used, it will output a
matrix with features per architecture.

If B<--arch> argument is used, it will output the features availability for
a given architecture.

If B<--feat> argument is used, it will output the content of the feature
file using ReStructured Text markup.

=head1 BUGS

Report bugs to Mauro Carvalho Chehab <mchehab+samsung@kernel.org>

=head1 COPYRIGHT

Copyright (c) 2019 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>.

License GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>.

This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

=cut
