You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
2.9 KiB
130 lines
2.9 KiB
#! /bin/sh |
|
# igawk --- like gawk but do @include processing |
|
# |
|
# Arnold Robbins, arnold@gnu.org, Public Domain |
|
# July 1993 |
|
|
|
if [ "$1" = debug ] |
|
then |
|
set -x |
|
shift |
|
else |
|
# cleanup on exit, hangup, interrupt, quit, termination |
|
trap 'rm -f /tmp/ig.[se].$$' 0 1 2 3 15 |
|
fi |
|
|
|
while [ $# -ne 0 ] # loop over arguments |
|
do |
|
case $1 in |
|
--) shift; break;; |
|
|
|
-W) shift |
|
set -- -W"$@" |
|
continue;; |
|
|
|
-[vF]) opts="$opts $1 '$2'" |
|
shift;; |
|
|
|
-[vF]*) opts="$opts '$1'" ;; |
|
|
|
-f) echo @include "$2" >> /tmp/ig.s.$$ |
|
shift;; |
|
|
|
-f*) f=`echo "$1" | sed 's/-f//'` |
|
echo @include "$f" >> /tmp/ig.s.$$ ;; |
|
|
|
-?file=*) # -Wfile or --file |
|
f=`echo "$1" | sed 's/-.file=//'` |
|
echo @include "$f" >> /tmp/ig.s.$$ ;; |
|
|
|
-?file) # get arg, $2 |
|
echo @include "$2" >> /tmp/ig.s.$$ |
|
shift;; |
|
|
|
-?source=*) # -Wsource or --source |
|
t=`echo "$1" | sed 's/-.source=//'` |
|
echo "$t" >> /tmp/ig.s.$$ ;; |
|
|
|
-?source) # get arg, $2 |
|
echo "$2" >> /tmp/ig.s.$$ |
|
shift;; |
|
|
|
-?version) |
|
echo igawk: version 1.0 1>&2 |
|
gawk --version |
|
exit 0 ;; |
|
|
|
-[W-]*) opts="$opts '$1'" ;; |
|
|
|
*) break;; |
|
esac |
|
shift |
|
done |
|
|
|
if [ ! -s /tmp/ig.s.$$ ] |
|
then |
|
if [ -z "$1" ] |
|
then |
|
echo igawk: no program! 1>&2 |
|
exit 1 |
|
else |
|
echo "$1" > /tmp/ig.s.$$ |
|
shift |
|
fi |
|
fi |
|
|
|
# at this point, /tmp/ig.s.$$ has the program |
|
gawk -- ' |
|
# process @include directives |
|
|
|
function pathto(file, i, t, junk) |
|
{ |
|
if (index(file, "/") != 0) |
|
return file |
|
|
|
for (i = 1; i <= ndirs; i++) { |
|
t = (pathlist[i] "/" file) |
|
if ((getline junk < t) > 0) { |
|
# found it |
|
close(t) |
|
return t |
|
} |
|
} |
|
return "" |
|
} |
|
BEGIN { |
|
path = ENVIRON["AWKPATH"] |
|
ndirs = split(path, pathlist, ":") |
|
for (i = 1; i <= ndirs; i++) { |
|
if (pathlist[i] == "") |
|
pathlist[i] = "." |
|
} |
|
stackptr = 0 |
|
input[stackptr] = ARGV[1] # ARGV[1] is first file |
|
|
|
for (; stackptr >= 0; stackptr--) { |
|
while ((getline < input[stackptr]) > 0) { |
|
if (tolower($1) != "@include") { |
|
print |
|
continue |
|
} |
|
fpath = pathto($2) |
|
if (fpath == "") { |
|
printf("igawk:%s:%d: cannot find %s\n", |
|
input[stackptr], FNR, $2) > "/dev/stderr" |
|
continue |
|
} |
|
if (! (fpath in processed)) { |
|
processed[fpath] = input[stackptr] |
|
input[++stackptr] = fpath # push onto stack |
|
} else |
|
print $2, "included in", input[stackptr], |
|
"already included in", |
|
processed[fpath] > "/dev/stderr" |
|
} |
|
close(input[stackptr]) |
|
} |
|
}' /tmp/ig.s.$$ > /tmp/ig.e.$$ |
|
eval gawk -f /tmp/ig.e.$$ $opts -- "$@" |
|
|
|
exit $?
|
|
|