| Line | |
|---|
| 1 | # igawk.awk
|
|---|
| 2 | # process @include directives
|
|---|
| 3 |
|
|---|
| 4 | function pathto(file, i, t, junk)
|
|---|
| 5 | {
|
|---|
| 6 | if (index(file, "/") != 0)
|
|---|
| 7 | return file
|
|---|
| 8 |
|
|---|
| 9 | for (i = 1; i <= ndirs; i++) {
|
|---|
| 10 | t = (pathlist[i] "/" file)
|
|---|
| 11 | if ((getline junk < t) > 0) {
|
|---|
| 12 | # found it
|
|---|
| 13 | close(t)
|
|---|
| 14 | return t
|
|---|
| 15 | }
|
|---|
| 16 | }
|
|---|
| 17 | return ""
|
|---|
| 18 | }
|
|---|
| 19 | BEGIN {
|
|---|
| 20 | path = ENVIRON["AWKPATH"]
|
|---|
| 21 | ndirs = split(path, pathlist, ";")
|
|---|
| 22 | for (i = 1; i <= ndirs; i++) {
|
|---|
| 23 | if (pathlist[i] == "")
|
|---|
| 24 | pathlist[i] = "."
|
|---|
| 25 | }
|
|---|
| 26 | stackptr = 0
|
|---|
| 27 | input[stackptr] = ARGV[1] # ARGV[1] is first file
|
|---|
| 28 |
|
|---|
| 29 | for (; stackptr >= 0; stackptr--) {
|
|---|
| 30 | while ((getline < input[stackptr]) > 0) {
|
|---|
| 31 | if (tolower($1) != "@include") {
|
|---|
| 32 | print
|
|---|
| 33 | continue
|
|---|
| 34 | }
|
|---|
| 35 | fpath = pathto($2)
|
|---|
| 36 | if (fpath == "") {
|
|---|
| 37 | printf("igawk:%s:%d: cannot find %s\n",
|
|---|
| 38 | input[stackptr], FNR, $2) > "/dev/stderr"
|
|---|
| 39 | continue
|
|---|
| 40 | }
|
|---|
| 41 | if (! (fpath in processed)) {
|
|---|
| 42 | processed[fpath] = input[stackptr]
|
|---|
| 43 | input[++stackptr] = fpath # push onto stack
|
|---|
| 44 | } else
|
|---|
| 45 | print $2, "included in", input[stackptr],
|
|---|
| 46 | "already included in",
|
|---|
| 47 | processed[fpath] > "/dev/stderr"
|
|---|
| 48 | }
|
|---|
| 49 | close(input[stackptr])
|
|---|
| 50 | }
|
|---|
| 51 | }
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.