#!/usr/bin/env perl
# Simple script for substitute placeholders in Texinfo files with
# docstring values found in source code.
-# Copyright (C) 2020 Sergey Matveev (stargrave@stargrave.org)
+# Copyright (C) 2020-2022 Sergey Matveev (stargrave@stargrave.org)
#
# If you C source code contains:
#
if ($ARGV[0] eq "-v") {
$verbose = 1;
shift @ARGV;
-};
-my @srcDirs = split / /, $ARGV[0];
-my $docDir = $ARGV[1];
-my $docBuildDir = $ARGV[2];
-my @exts = split / /, defined $ENV{EXTS} ? $ENV{EXTS} : "c h h.in";
+}
+my $outDir = $ARGV[0];
+my @srcDirs = split /:/, $ARGV[1];
+my @docDirs = split /:/, $ARGV[2];
+my @exts = split / /, (defined $ENV{EXTS}) ? $ENV{EXTS} : "c h h.in";
my %docstrings;
open(my $src, "<:encoding(UTF-8)", "$srcDir/$fn") or
die "can not open $srcDir/$fn";
my $curEntry;
- while(<$src>) {
+ while (<$src>) {
chomp;
if (not /^\/\//) {
if (defined $curEntry) {
undef $curEntry;
- };
+ }
next;
- };
+ }
s/^\/\/ ?//;
if (/^TEXINFO: (.*)$/) {
$curEntry = $1;
$docstrings{$curEntry} = "";
print "\t$fn: $curEntry\n" if $verbose;
next;
- };
- ( $docstrings{$curEntry} .= "$_\n" ) if defined $curEntry;
- };
+ }
+ ($docstrings{$curEntry} .= "$_\n") if defined $curEntry;
+ }
close $src;
- };
+ }
closedir $dir;
-};
+}
-print "doc: $docDir\n" if $verbose;
-opendir(my $dir, $docDir) or die "can not open $docDir";
-foreach my $fn (readdir $dir) {
- next unless $fn =~ /\.texi$/;
- open(my $src, "<:encoding(UTF-8)", "$docDir/$fn") or
- die "can not open $docDir/$fn";
- open(my $dst, ">:encoding(UTF-8)", "$docBuildDir/$fn") or
- die "can not open $docBuildDir/$fn";
- while(<$src>) {
- ( print($dst $_) and next ) unless /^\s*\@DOCSTRING (.*)\@$/;
- print "\t$fn: $1\n" if $verbose;
- die "unable to find docstring: $1" unless defined $docstrings{$1};
- print $dst $docstrings{$1};
- };
- close $src;
- close $dst;
-};
-closedir $dir;
+foreach my $docDir (@docDirs) {
+ print "doc: $docDir\n" if $verbose;
+ opendir(my $dir, $docDir) or die "can not open $docDir";
+ ($docDir .= "/") unless $docDir =~ /\/$/;
+ ($docDir = "") if $docDir eq "./";
+ foreach my $fn (readdir $dir) {
+ next unless $fn =~ /\.texi$/;
+ $fn = $docDir . $fn;
+ open(my $src, "<:encoding(UTF-8)", $fn) or die "can not open $fn";
+ mkdir "$outDir/$docDir";
+ open(my $dst, ">:encoding(UTF-8)", "$outDir/$fn") or
+ die "can not open $outDir/$fn";
+ while (<$src>) {
+ (print($dst $_) and next) unless /^\s*\@DOCSTRING (.*)\@$/;
+ print "\t$fn: $1\n" if $verbose;
+ die "unable to find docstring: $1" unless defined $docstrings{$1};
+ print $dst $docstrings{$1};
+ }
+ close $src;
+ close $dst;
+ }
+ closedir $dir;
+}