| 1 |
#! /bin/sh |
| 2 |
# igawk --- like gawk but do @include processing |
| 3 |
# |
| 4 |
# Arnold Robbins, arnold@skeeve.com, Public Domain |
| 5 |
# July 1993 |
| 6 |
|
| 7 |
if [ "$1" = debug ] |
| 8 |
then |
| 9 |
set -x |
| 10 |
shift |
| 11 |
fi |
| 12 |
|
| 13 |
# A literal newline, so that program text is formatted correctly |
| 14 |
n=' |
| 15 |
' |
| 16 |
|
| 17 |
# Initialize variables to empty |
| 18 |
program= |
| 19 |
opts= |
| 20 |
|
| 21 |
while [ $# -ne 0 ] # loop over arguments |
| 22 |
do |
| 23 |
case $1 in |
| 24 |
--) shift; break;; |
| 25 |
|
| 26 |
-W) shift |
| 27 |
# The ${x?'message here'} construct prints a |
| 28 |
# diagnostic if $x is the null string |
| 29 |
set -- -W"${@?'missing operand'}" |
| 30 |
continue;; |
| 31 |
|
| 32 |
-[vF]) opts="$opts $1 '${2?'missing operand'}'" |
| 33 |
shift;; |
| 34 |
|
| 35 |
-[vF]*) opts="$opts '$1'" ;; |
| 36 |
|
| 37 |
-f) program="$program$n@include ${2?'missing operand'}" |
| 38 |
shift;; |
| 39 |
|
| 40 |
-f*) f=`expr "$1" : '-f\(.*\)'` |
| 41 |
program="$program$n@include $f";; |
| 42 |
|
| 43 |
-[W-]file=*) |
| 44 |
f=`expr "$1" : '-.file=\(.*\)'` |
| 45 |
program="$program$n@include $f";; |
| 46 |
|
| 47 |
-[W-]file) |
| 48 |
program="$program$n@include ${2?'missing operand'}" |
| 49 |
shift;; |
| 50 |
|
| 51 |
-[W-]source=*) |
| 52 |
t=`expr "$1" : '-.source=\(.*\)'` |
| 53 |
program="$program$n$t";; |
| 54 |
|
| 55 |
-[W-]source) |
| 56 |
program="$program$n${2?'missing operand'}" |
| 57 |
shift;; |
| 58 |
|
| 59 |
-[W-]version) |
| 60 |
echo igawk: version 2.0 1>&2 |
| 61 |
gawk --version |
| 62 |
exit 0 ;; |
| 63 |
|
| 64 |
-[W-]*) opts="$opts '$1'" ;; |
| 65 |
|
| 66 |
*) break;; |
| 67 |
esac |
| 68 |
shift |
| 69 |
done |
| 70 |
|
| 71 |
if [ -z "$program" ] |
| 72 |
then |
| 73 |
program=${1?'missing program'} |
| 74 |
shift |
| 75 |
fi |
| 76 |
|
| 77 |
# At this point, `program' has the program. |
| 78 |
expand_prog=' |
| 79 |
|
| 80 |
function pathto(file, i, t, junk) |
| 81 |
{ |
| 82 |
if (index(file, "/") != 0) |
| 83 |
return file |
| 84 |
|
| 85 |
for (i = 1; i <= ndirs; i++) { |
| 86 |
t = (pathlist[i] "/" file) |
| 87 |
if ((getline junk < t) > 0) { |
| 88 |
# found it |
| 89 |
close(t) |
| 90 |
return t |
| 91 |
} |
| 92 |
} |
| 93 |
return "" |
| 94 |
} |
| 95 |
BEGIN { |
| 96 |
path = ENVIRON["AWKPATH"] |
| 97 |
ndirs = split(path, pathlist, ":") |
| 98 |
for (i = 1; i <= ndirs; i++) { |
| 99 |
if (pathlist[i] == "") |
| 100 |
pathlist[i] = "." |
| 101 |
} |
| 102 |
stackptr = 0 |
| 103 |
input[stackptr] = ARGV[1] # ARGV[1] is first file |
| 104 |
|
| 105 |
for (; stackptr >= 0; stackptr--) { |
| 106 |
while ((getline < input[stackptr]) > 0) { |
| 107 |
if (tolower($1) != "@include") { |
| 108 |
print |
| 109 |
continue |
| 110 |
} |
| 111 |
fpath = pathto($2) |
| 112 |
if (fpath == "") { |
| 113 |
printf("igawk:%s:%d: cannot find %s\n", |
| 114 |
input[stackptr], FNR, $2) > "/dev/stderr" |
| 115 |
continue |
| 116 |
} |
| 117 |
if (! (fpath in processed)) { |
| 118 |
processed[fpath] = input[stackptr] |
| 119 |
input[++stackptr] = fpath # push onto stack |
| 120 |
} else |
| 121 |
print $2, "included in", input[stackptr], |
| 122 |
"already included in", |
| 123 |
processed[fpath] > "/dev/stderr" |
| 124 |
} |
| 125 |
close(input[stackptr]) |
| 126 |
} |
| 127 |
}' # close quote ends `expand_prog' variable |
| 128 |
|
| 129 |
processed_program=`gawk -- "$expand_prog" /dev/stdin <<EOF |
| 130 |
$program |
| 131 |
EOF |
| 132 |
` |
| 133 |
eval gawk $opts -- '"$processed_program"' '"$@"' |