#!/usr/bin/env perl # Simple script for substitute placeholders in Texinfo files with # docstring values found in source code. # Copyright (C) 2020-2024 Sergey Matveev (stargrave@stargrave.org) # # If you C source code contains: # # // TEXINFO: SomeKey # // ... # // last line of docstring # some C code # # Then under "SomeKey" you will have the whole docstring (starting from # the line after "TEXINFO", till "last line"). You can include its # contents (excluding comment characters) in your .texi files placing # # @DOCSTRING SomeKey@ use strict; use warnings; my $verbose = 0; if ($ARGV[0] eq "-v") { $verbose = 1; shift @ARGV; } 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; foreach my $srcDir (@srcDirs) { print "src: $srcDir\n" if $verbose; opendir(my $dir, $srcDir) or die "can not open $srcDir"; foreach my $fn (readdir $dir) { next unless grep { $fn =~ /\.$_$/ } @exts; open(my $src, "<:encoding(UTF-8)", "$srcDir/$fn") or die "can not open $srcDir/$fn"; my $curEntry; 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; } close $src; } 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; }