#!/usr/bin/env perl # $Id: txivarcheck 5320 2013-08-16 13:50:01Z karl $ # Copyright 2012, 2013 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, # or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Original author: Karl Berry. # # Kludge of a script to check customization variables in refman vs. tp # for consistency. Although this has nothing to do with the reference # card, since it's similar to the txicmdcheck script, keep them # together. And maybe we'll add the cust.vars to the refcard. exit (&main ()); sub main { my $no_common = $ARGV[0] eq "--no-common"; my @man_vars = &read_refman ("../texinfo.texi"); my @tp_vars = &read_tp ("../../util/txicustomvars"); my (%man_vars, %tp_vars); # list to hash @man_vars{@man_vars} = (); @tp_vars{@tp_vars} = (); my @found = (); for my $name (@tp_vars) { if (exists $man_vars{$name}) { push (@found, $name); delete $man_vars{$name}; delete $tp_vars{$name}; } } printf ("common %3d: @{[sort @found]}\n", @found + 0) unless $no_common; # we can't reasonly reduce the list of variable names only in the # manual to null, since the manual necessarily includes many non-variables. # my @man_only = keys %man_vars; printf "man only %2s: @{[sort @man_only]}\n", @man_only + 0; my @tp_only = keys %tp_vars; printf "tp only %2s: @{[sort @tp_only]}\n", @tp_only + 0; return @tp_only; } # Return customization variable names from the section in the reference # manual. We assume their names are all uppercase, to avoid returning # numerous non-variables. # sub read_refman { my ($fname) = @_; my @ret = (); local *FILE; $FILE = $fname; open (FILE) || die "open($FILE) failed: $!"; # since we have to look at generic commands like @item, at least # ignore until right section to reduce chance of false matches. while () { last if /^\@section Customization Variables$/; } while () { if (/^\@node Customization Variables for \@\@/) { # in this node we have a bare of bare @-commands which have cust.vars. while () { last if /^\@smallexample/; } my $atcmds = ""; while () { last if /^\@end smallexample/; s/\@\@//g; # the variable names don't start with @ $atcmds .= $_; } # done with special node. my @atcmds = split (" ", $atcmds); push (@ret, @atcmds); next; } # Stop looking for cust.var names after those nodes are done. last if /^\@node Internationalization of Document Strings/; # Otherwise, we're looking at a line in one of the cust.var # documentation nodes. next unless s/^\@(itemx?|vindex) *//; # look for item[x]s and vindex next unless /^[A-Z0-9_]+$/; # uppercase only chomp; push (@ret, $_); } close (FILE) || warn "close($FILE) failed: $!"; return @ret; } # Return customization variable names implemented in the general parser. # The argument is the command to run which returns the list. # sub read_tp { my ($prog) = @_; my @ret = (); local *FILE; $FILE = "$prog |"; open (FILE) || die "open($FILE) failed: $!"; while () { chomp; my ($var,$where) = split (/\t/); next if ($where eq 'variable_other_settables' || $where eq 'parser_options'); next if $var eq "OUTPUT_PERL_ENCODING"; # not for users # these are documented, but their lowercase names don't match # everything #next if $var =~ /^(even|every|odd)(heading|footing)$/; push (@ret, $var); } close (FILE) || warn "close($FILE) failed: $!"; return @ret; }