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