123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #! /bin/sh
- # igawk --- like gawk but do @include processing
- #
- # Arnold Robbins, arnold@skeeve.com, Public Domain
- # July 1993
- # December 2010, minor edits
- if [ "$1" = debug ]
- then
- set -x
- shift
- fi
- # A literal newline, so that program text is formatted correctly
- n='
- '
- # Initialize variables to empty
- program=
- opts=
- while [ $# -ne 0 ] # loop over arguments
- do
- case $1 in
- --) shift
- break ;;
- -W) shift
- # The ${x?'message here'} construct prints a
- # diagnostic if $x is the null string
- set -- -W"${@?'missing operand'}"
- continue ;;
- -[vF]) opts="$opts $1 '${2?'missing operand'}'"
- shift ;;
- -[vF]*) opts="$opts '$1'" ;;
- -f) program="$program$n@include ${2?'missing operand'}"
- shift ;;
- -f*) f=$(expr "$1" : '-f\(.*\)')
- program="$program$n@include $f" ;;
- -[W-]file=*)
- f=$(expr "$1" : '-.file=\(.*\)')
- program="$program$n@include $f" ;;
- -[W-]file)
- program="$program$n@include ${2?'missing operand'}"
- shift ;;
- -[W-]source=*)
- t=$(expr "$1" : '-.source=\(.*\)')
- program="$program$n$t" ;;
- -[W-]source)
- program="$program$n${2?'missing operand'}"
- shift ;;
- -[W-]version)
- echo igawk: version 3.0 1>&2
- gawk --version
- exit 0 ;;
- -[W-]*) opts="$opts '$1'" ;;
- *) break ;;
- esac
- shift
- done
- if [ -z "$program" ]
- then
- program=${1?'missing program'}
- shift
- fi
- # At this point, `program' has the program.
- expand_prog='
- function pathto(file, i, t, junk)
- {
- if (index(file, "/") != 0)
- return file
- if (file == "-")
- 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])
- }
- }' # close quote ends `expand_prog' variable
- processed_program=$(gawk -- "$expand_prog" /dev/stdin << EOF
- $program
- EOF
- )
- eval gawk $opts -- '"$processed_program"' '"$@"'
|