52 lines
1.3 KiB
Awk
52 lines
1.3 KiB
Awk
# igawk.awk
|
|
# 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])
|
|
}
|
|
}
|