1169695Skan#!/usr/bin/perl 2169695Skan# -*- perl -*- 3169695Skan 4169695Skan# Copyright (C) 2001 5169695Skan# Free Software Foundation 6169695Skan# 7169695Skan# This file is part of the libiberty library. 8169695Skan# Libiberty is free software; you can redistribute it and/or 9169695Skan# modify it under the terms of the GNU Library General Public 10169695Skan# License as published by the Free Software Foundation; either 11169695Skan# version 2 of the License, or (at your option) any later version. 12169695Skan# 13169695Skan# Libiberty is distributed in the hope that it will be useful, 14169695Skan# but WITHOUT ANY WARRANTY; without even the implied warranty of 15169695Skan# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16169695Skan# Library General Public License for more details. 17169695Skan# 18169695Skan# You should have received a copy of the GNU Library General Public 19169695Skan# License along with libiberty; see the file COPYING.LIB. If not, 20169695Skan# write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, 21169695Skan# Boston, MA 02110-1301, USA. 22169695Skan# 23169695Skan# Originally written by DJ Delorie <dj@redhat.com> 24169695Skan 25169695Skan 26169695Skan 27169695Skan# This program looks for texinfo snippets in source files and other 28169695Skan# files, and builds per-category files with entries sorted in 29169695Skan# alphabetical order. 30169695Skan 31169695Skan# The syntax it looks for is lines starting with '@def' in *.c and 32169695Skan# other files (see TEXIFILES in Makefile.in). Entries are terminated 33169695Skan# at the next @def* (which begins a new entry) or, for C files, a line 34169695Skan# that begins with '*/' without leading spaces (this assumes that the 35169695Skan# texinfo snippet is within a C-style /* */ comment). 36169695Skan 37169695Skan# 38169695Skan 39169695Skan 40169695Skan 41169695Skanif ($ARGV[0] eq "-v") { 42169695Skan $verbose = 1; 43169695Skan shift; 44169695Skan} 45169695Skan 46169695Skan$srcdir = shift; 47169695Skan$outfile = shift; 48169695Skan 49169695Skanif ($outfile !~ /\S/ || ! -f "$srcdir/Makefile.in" ) { 50169695Skan print STDERR "Usage: gather-docs [-v] srcdir outfile.txi [files with snippets in them ...]\n"; 51169695Skan exit 1; 52169695Skan} 53169695Skan 54169695Skan$errors = 0; 55169695Skan 56169695Skanfor $in (@ARGV) { 57169695Skan 58169695Skan if (!open(IN, "$srcdir/$in")) { 59169695Skan print STDERR "Cannot open $srcdir/$in for reading: $!\n"; 60169695Skan $errors ++; 61169695Skan 62169695Skan } else { 63169695Skan $first = 1; 64169695Skan $pertinent = 0; 65169695Skan $man_mode = 0; 66169695Skan $line = 0; 67169695Skan 68169695Skan while (<IN>) { 69169695Skan $line ++; 70169695Skan $pertinent = 1 if /^\@def[a-z]*[a-wyz] /; 71169695Skan $pertinent = 0 if /^\*\//; 72169695Skan next unless $pertinent; 73169695Skan 74169695Skan if (/^\@def[a-z]*[a-wyz] /) { 75169695Skan 76169695Skan ($name) = m/[^\(]* ([^\( \t\r\n]+) *\(/; 77169695Skan $name =~ s/[ ]*$//; 78169695Skan $key = $name; 79169695Skan $key =~ tr/A-Z/a-z/; 80169695Skan $key =~ s/[^a-z0-9]+/ /g; 81169695Skan $name{$key} = $node; 82169695Skan $lines{$key} = ''; 83169695Skan $src_file{$key} = $in; 84169695Skan $src_line{$key} = $line; 85169695Skan print "\nReading $in :" if $verbose && $first; 86169695Skan $first = 0; 87169695Skan print " $name" if $verbose; 88169695Skan $node_lines{$key} .= $_; 89169695Skan 90169695Skan } else { 91169695Skan $node_lines{$key} .= $_; 92169695Skan } 93169695Skan 94169695Skan $pertinent = 0 if /^\@end def/; 95169695Skan } 96169695Skan close (IN); 97169695Skan } 98169695Skan} 99169695Skan 100169695Skanprint "\n" if $verbose; 101169695Skanexit $errors if $errors; 102169695Skan 103169695Skanif (!open (OUT, "> $outfile")) { 104169695Skan print STDERR "Cannot open $outfile for writing: $!\n"; 105169695Skan $errors ++; 106169695Skan next; 107169695Skan} 108169695Skanprint "Writing $outfile\n" if $verbose; 109169695Skan 110169695Skanprint OUT "\@c Automatically generated from *.c and others (the comments before\n"; 111169695Skanprint OUT "\@c each entry tell you which file and where in that file). DO NOT EDIT!\n"; 112169695Skanprint OUT "\@c Edit the *.c files, configure with --enable-maintainer-mode,\n"; 113169695Skanprint OUT "\@c and let gather-docs build you a new copy.\n\n"; 114169695Skan 115169695Skanfor $key (sort keys %name) { 116169695Skan print OUT "\@c $src_file{$key}:$src_line{$key}\n"; 117169695Skan print OUT $node_lines{$key}; 118169695Skan print OUT "\n"; 119169695Skan} 120169695Skan 121169695Skanif (! print OUT "\n") { 122169695Skan print STDERR "Disk full writing $srcdir/$cat.texi\n"; 123169695Skan $errors ++; 124169695Skan} 125169695Skan 126169695Skanclose (OUT); 127169695Skan 128169695Skanexit $errors; 129