xref: /netbsd-src/external/gpl3/binutils.old/dist/libiberty/gather-docs (revision e992f068c547fd6e84b3f104dc2340adcc955732)
116dce513Schristos#!/usr/bin/perl
216dce513Schristos# -*- perl -*-
316dce513Schristos
4*e992f068Schristos#   Copyright (C) 2001-2022 Free Software Foundation, Inc.
516dce513Schristos#
616dce513Schristos# This file is part of the libiberty library.
716dce513Schristos# Libiberty is free software; you can redistribute it and/or
816dce513Schristos# modify it under the terms of the GNU Library General Public
916dce513Schristos# License as published by the Free Software Foundation; either
1016dce513Schristos# version 2 of the License, or (at your option) any later version.
1116dce513Schristos#
1216dce513Schristos# Libiberty is distributed in the hope that it will be useful,
1316dce513Schristos# but WITHOUT ANY WARRANTY; without even the implied warranty of
1416dce513Schristos# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1516dce513Schristos# Library General Public License for more details.
1616dce513Schristos#
1716dce513Schristos# You should have received a copy of the GNU Library General Public
1816dce513Schristos# License along with libiberty; see the file COPYING.LIB.  If not,
1916dce513Schristos# write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
2016dce513Schristos# Boston, MA 02110-1301, USA.
2116dce513Schristos#
2216dce513Schristos# Originally written by DJ Delorie <dj@redhat.com>
2316dce513Schristos
2416dce513Schristos
2516dce513Schristos
2616dce513Schristos# This program looks for texinfo snippets in source files and other
2716dce513Schristos# files, and builds per-category files with entries sorted in
2816dce513Schristos# alphabetical order.
2916dce513Schristos
3016dce513Schristos# The syntax it looks for is lines starting with '@def' in *.c and
3116dce513Schristos# other files (see TEXIFILES in Makefile.in).  Entries are terminated
3216dce513Schristos# at the next @def* (which begins a new entry) or, for C files, a line
3316dce513Schristos# that begins with '*/' without leading spaces (this assumes that the
3416dce513Schristos# texinfo snippet is within a C-style /* */ comment).
3516dce513Schristos
3616dce513Schristos#
3716dce513Schristos
3816dce513Schristos
3916dce513Schristos
4016dce513Schristosif ($ARGV[0] eq "-v") {
4116dce513Schristos    $verbose = 1;
4216dce513Schristos    shift;
4316dce513Schristos}
4416dce513Schristos
4516dce513Schristos$srcdir = shift;
4616dce513Schristos$outfile = shift;
4716dce513Schristos
4816dce513Schristosif ($outfile !~ /\S/ || ! -f "$srcdir/Makefile.in" ) {
4916dce513Schristos    print STDERR "Usage: gather-docs [-v] srcdir outfile.txi [files with snippets in them ...]\n";
5016dce513Schristos    exit 1;
5116dce513Schristos}
5216dce513Schristos
5316dce513Schristos$errors = 0;
5416dce513Schristos
5516dce513Schristosfor $in (@ARGV) {
5616dce513Schristos
5716dce513Schristos    if (!open(IN, "$srcdir/$in")) {
5816dce513Schristos	print STDERR "Cannot open $srcdir/$in for reading: $!\n";
5916dce513Schristos	$errors ++;
6016dce513Schristos
6116dce513Schristos    } else {
6216dce513Schristos	$first = 1;
6316dce513Schristos	$pertinent = 0;
6416dce513Schristos	$man_mode = 0;
6516dce513Schristos	$line = 0;
6616dce513Schristos
6716dce513Schristos	while (<IN>) {
6816dce513Schristos	    $line ++;
6916dce513Schristos	    $pertinent = 1 if /^\@def[a-z]*[a-wyz] /;
7016dce513Schristos	    $pertinent = 0 if /^\*\//;
7116dce513Schristos	    next unless $pertinent;
7216dce513Schristos
7316dce513Schristos	    if (/^\@def[a-z]*[a-wyz] /) {
7416dce513Schristos
7516dce513Schristos		($name) = m/[^\(]* ([^\( \t\r\n\@]+) *(\(|\@?$)/;
7616dce513Schristos		$name =~ s/[	 ]*\@?$//;
7716dce513Schristos		$key = $name;
7816dce513Schristos		$key =~ tr/A-Z/a-z/;
7916dce513Schristos		$key =~ s/[^a-z0-9]+/ /g;
8016dce513Schristos		$name{$key} = $node;
8116dce513Schristos		$lines{$key} = '';
8216dce513Schristos		$src_file{$key} = $in;
8316dce513Schristos		$src_line{$key} = $line;
8416dce513Schristos		print "\nReading $in :" if $verbose && $first;
8516dce513Schristos		$first = 0;
8616dce513Schristos		print " $name" if $verbose;
8716dce513Schristos		$node_lines{$key} .= $_;
8816dce513Schristos
8916dce513Schristos	    } else {
9016dce513Schristos		$node_lines{$key} .= $_;
9116dce513Schristos	    }
9216dce513Schristos
9316dce513Schristos	    $pertinent = 0 if /^\@end def/;
9416dce513Schristos	}
9516dce513Schristos	close (IN);
9616dce513Schristos    }
9716dce513Schristos}
9816dce513Schristos
9916dce513Schristosprint "\n" if $verbose;
10016dce513Schristosexit $errors if $errors;
10116dce513Schristos
10216dce513Schristosif (!open (OUT, "> $outfile")) {
10316dce513Schristos    print STDERR "Cannot open $outfile for writing: $!\n";
10416dce513Schristos    $errors ++;
10516dce513Schristos    next;
10616dce513Schristos}
10716dce513Schristosprint "Writing $outfile\n" if $verbose;
10816dce513Schristos
10916dce513Schristosprint OUT "\@c Automatically generated from *.c and others (the comments before\n";
11016dce513Schristosprint OUT "\@c each entry tell you which file and where in that file).  DO NOT EDIT!\n";
11116dce513Schristosprint OUT "\@c Edit the *.c files, configure with --enable-maintainer-mode,\n";
11216dce513Schristosprint OUT "\@c run 'make stamp-functions' and gather-docs will build a new copy.\n\n";
11316dce513Schristos
11416dce513Schristosfor $key (sort keys %name) {
11516dce513Schristos    print OUT "\@c $src_file{$key}:$src_line{$key}\n";
11616dce513Schristos    print OUT $node_lines{$key};
11716dce513Schristos    print OUT "\n";
11816dce513Schristos}
11916dce513Schristos
12016dce513Schristosif (! print OUT "\n") {
12116dce513Schristos    print STDERR "Disk full writing $srcdir/$cat.texi\n";
12216dce513Schristos    $errors ++;
12316dce513Schristos}
12416dce513Schristos
12516dce513Schristosclose (OUT);
12616dce513Schristos
12716dce513Schristosexit $errors;
128