summaryrefslogtreecommitdiff
path: root/awklib/eg/prog/extract.awk
diff options
context:
space:
mode:
Diffstat (limited to 'awklib/eg/prog/extract.awk')
-rw-r--r--awklib/eg/prog/extract.awk72
1 files changed, 72 insertions, 0 deletions
diff --git a/awklib/eg/prog/extract.awk b/awklib/eg/prog/extract.awk
new file mode 100644
index 00000000..a9f5b80f
--- /dev/null
+++ b/awklib/eg/prog/extract.awk
@@ -0,0 +1,72 @@
+# extract.awk --- extract files and run programs
+# from texinfo files
+# Arnold Robbins, arnold@gnu.ai.mit.edu, Public Domain
+# May 1993
+
+BEGIN { IGNORECASE = 1 }
+
+/^@c(omment)?[ \t]+system/ \
+{
+ if (NF < 3) {
+ e = (FILENAME ":" FNR)
+ e = (e ": badly formed `system' line")
+ print e > "/dev/stderr"
+ next
+ }
+ $1 = ""
+ $2 = ""
+ stat = system($0)
+ if (stat != 0) {
+ e = (FILENAME ":" FNR)
+ e = (e ": warning: system returned " stat)
+ print e > "/dev/stderr"
+ }
+}
+/^@c(omment)?[ \t]+file/ \
+{
+ if (NF != 3) {
+ e = (FILENAME ":" FNR ": badly formed `file' line")
+ print e > "/dev/stderr"
+ next
+ }
+ if ($3 != curfile) {
+ if (curfile != "")
+ close(curfile)
+ curfile = $3
+ }
+
+ for (;;) {
+ if ((getline line) <= 0)
+ unexpected_eof()
+ if (line ~ /^@c(omment)?[ \t]+endfile/)
+ break
+ else if (line ~ /^@(end[ \t]+)?group/)
+ continue
+ if (index(line, "@") == 0) {
+ print line > curfile
+ continue
+ }
+ n = split(line, a, "@")
+ # if a[1] == "", means leading @,
+ # don't add one back in.
+ for (i = 2; i <= n; i++) {
+ if (a[i] == "") { # was an @@
+ a[i] = "@"
+ if (a[i+1] == "")
+ i++
+ }
+ }
+ print join(a, 1, n, SUBSEP) > curfile
+ }
+}
+function unexpected_eof()
+{
+ printf("%s:%d: unexpected EOF or error\n", \
+ FILENAME, FNR) > "/dev/stderr"
+ exit 1
+}
+
+END {
+ if (curfile)
+ close(curfile)
+}