summaryrefslogtreecommitdiff
path: root/util/fixref.gawk
diff options
context:
space:
mode:
Diffstat (limited to 'util/fixref.gawk')
-rw-r--r--util/fixref.gawk143
1 files changed, 143 insertions, 0 deletions
diff --git a/util/fixref.gawk b/util/fixref.gawk
new file mode 100644
index 0000000..4a692f7
--- /dev/null
+++ b/util/fixref.gawk
@@ -0,0 +1,143 @@
+#! /usr/local/bin/gawk -f
+
+# fixref.awk --- fix xrefs in texinfo documents
+# Copyright 1991, 1998 Arnold David Robbins
+
+# FIXREF is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# FIXREF is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Updated: Jul 21 1992 --- change unknown
+# Updated: Jul 18 1997 --- bug fix
+
+# usage: gawk -f fixref.awk input-file > output-file
+# or if you have #!: fixref.awk input-file > output-file
+
+# Limitations:
+# 1. no more than one cross reference on a line
+# 2. cross references may not cross a newline
+
+BEGIN \
+{
+ # we make two passes over the file. To do that we artificially
+ # tweak the argument vector to do a variable assignment
+
+ if (ARGC != 2) {
+ printf("usage: %s texinfo-file\n", ARGV[0]) > "/dev/stderr"
+ exit 1
+ }
+ ARGV[2] = "pass=2"
+ ARGV[3] = ARGV[1]
+ ARGC = 4
+
+ # examine paragraphs
+ RS = ""
+
+ heading = "@(chapter|appendix|unnumbered|(appendix(sec|subsec|subsubsec))|section|subsection|subsubsection|unnumberedsec|heading|top)"
+
+ pass = 1
+
+ # put space between paragraphs on output
+ ORS = "\n\n"
+}
+
+pass == 1 && NF == 0 { next }
+
+# pass == 1 && /@node/ \
+# bug fix 7/18/96
+pass == 1 && /^@node/ \
+{
+ lname = name = ""
+ n = split($0, lines, "\n")
+ for (i = 1; i <= n; i++) {
+ if (lines[i] ~ ("^" heading)) {
+ sub(heading, "", lines[i])
+ sub(/^[ \t]*/, "", lines[i])
+ lname = lines[i]
+# printf "long name is '%s'\n", lines[i]
+ } else if (lines[i] ~ /@node/) {
+ sub(/@node[ \t]*/, "", lines[i])
+ sub(/[ \t]*,.*$/, "", lines[i])
+ name = lines[i]
+# printf "node name is '%s'\n", lines[i]
+ }
+ }
+ if (name && lname)
+ names[name] = lname
+ else if (lname)
+ printf("node name for %s missing!\n", lname) > "/dev/stderr"
+ else
+ printf("long name for %s missing!\n", name) > "/dev/stderr"
+
+ if (name ~ /:/)
+ printf("node `%s' contains a `:'\n", name) > "/dev/stderr"
+
+ if (lname) {
+ if (lname ~ /:/)
+ printf("name `%s' contains a `:'\n", lname) > "/dev/stderr"
+ else if (lname ~ /,/) {
+ printf("name `%s' contains a `,'\n", lname) > "/dev/stderr"
+ gsub(/,/, " ", lname)
+ names[name] = lname # added 7/18/97
+ }
+ }
+}
+
+pass == 2 && /@(x|px)?ref{/ \
+{
+ # split the paragraph into lines
+ # write them out one by one after fixing them
+ n = split($0, lines, "\n")
+ for (i = 1; i <= n; i++)
+ if (lines[i] ~ /@(x|px)?ref{/) {
+ res = updateref(lines[i])
+ printf "%s\n", res
+ } else
+ printf "%s\n", lines[i]
+
+ printf "\n" # avoid ORS
+ next
+}
+
+function updateref(orig, refkind, line)
+{
+ line = orig # work on a copy
+
+ # find the beginning of the reference
+ match(line, "@(x|px)?ref{")
+ refkind = substr(line, RSTART, RLENGTH)
+
+ # pull out just the node name
+ sub(/.*ref{/, "", line)
+ sub(/}.*$/, "", line)
+ sub(/,.*/, "", line)
+
+# debugging
+# printf("found ref to node '%s'\n", line) > "/dev/stderr"
+
+ # If the node name and the section name are the same
+ # we don't want to bother doing this.
+
+ if (! (line in names)) # sanity checking
+ printf("no long name for %s\n", line) > "/dev/stderr"
+ else if (names[line] != line && names[line] !~ /[:,]/) {
+ # build up new ref
+ newref = refkind line ", ," names[line] "}"
+ pat = refkind line "[^}]*}"
+
+ sub(pat, newref, orig)
+ }
+
+ return orig
+}
+
+pass == 2 { print }