#!/usr/bin/env perl #------------------------------------------------------------------------------- # Copyright 2021, Thomas E. Dickey # # All Rights Reserved # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name(s) of the above copyright # holders shall not be used in advertising or otherwise to promote the # sale, use or other dealings in this Software without prior written # authorization. #------------------------------------------------------------------------------- # Ensure that the function-prototypes listed in Xcursor.man have ".so" files, # and that those are listed in the makefile. use strict; use warnings; our $opt_v; our %man_links; sub read_file($) { my $file = shift; my @data; if ( open my $fh, $file ) { @data = <$fh>; close $fh; chomp @data; } return @data; } sub make_man_link($) { my $name = shift; my $link = ".so man__libmansuffix__/Xcursor.__libmansuffix__"; my $file = $name . ".man"; if ( -f $file ) { my @data = &read_file($file); if ( $#data != 0 or $data[0] ne $link ) { printf "?? wrong: $file\n"; } } else { printf "...create: $file\n"; open my $fh, ">$file" or die "cannot create $file"; printf $fh "%s\n", $link; close $fh; system("git add $file"); } $man_links{$name} = $file; } sub scan_man($) { my $file = shift; printf "** scan $file\n"; my @data = &read_file($file); my $last = ""; for my $n ( 0 .. $#data ) { if ( $last =~ /^\.NS\b/ ) { my $name = $data[$n]; $name =~ s/^(const)?\s*\w+\s*[*]*\s*(\w+)\b.*/$2/; printf STDERR "MAP '%s' -> '%s'\n", $data[$n], $name if ( $opt_v ); &make_man_link($name); } $last = $data[$n]; } } sub scan_make($) { my $find = shift; my $file = shift; printf "** find $find in $file\n"; my @data = &read_file($file); my %data; my $state = 0; for my $n ( 0 .. $#data ) { if ( $data[$n] =~ /^\s*$find\s*=/ ) { $state = 1; } elsif ( $state == 1 ) { if ( $data[$n] =~ /\\$/ ) { } else { $state = 2; } my $name = $data[$n]; $name =~ s/^\s*(\w+)\s*[\\]?$/$1/; $data{$name} = 1; } elsif ( $state == 2 ) { last; } } for my $key ( sort keys %data ) { printf "manpage needs $key\n", unless ( defined $man_links{$key} ); } for my $key ( sort keys %man_links ) { printf "$file needs $key\n", unless ( defined $data{$key} ); } } &scan_man("Xcursor.man"); &scan_make( "Xcursor_shadows", "Makefile.am" ); 1;