# xref.awk - cross reference an awk program
BEGIN {
# create array of keywords to be ignored by lexer
asplit( "BEGIN:END:atan2:break:close:continue:cos:delete:" \
"do:else:exit:exp:for:getline:gsub:if:in:index:int:" \
"length:log:match:next:print:printf:rand:return:sin:" \
"split:sprintf:sqrt:srand:sub:substr:system:while" ,
keywords, ":" )
# build the symbol-state table
split( "00:00:00:00:00:00:00:00:00:00:" \
"20:10:10:12:12:11:07:00:00:00:" \
"08:08:08:08:08:33:08:00:00:00:" \
"08:44:08:36:08:08:08:00:00:00:" \
"08:44:45:42:42:41:08" , machine, ":" )
# parse the input and store an intermediate representation
# of the cross-reference information
# set up the machine
state = 1
# run the machine
for ( ;; ) {
# get next symbol
symb = lex( )
nextstate = substr( machine[ state symb] , 1 , 1 )
act = substr( machine[ state symb] , 2 , 1 )
# perform required action
if ( act == "0" )
; # do nothing
else if ( act == "1" ) {
if ( ! inarray( tok, names) )
names[ ++ nnames] = tok
lines[ tok,++ xnames[ tok] ] = NR }
else if ( act == "2" ) {
if ( tok in local ) {
tok = tok "(" funcname ")"
if ( ! inarray( tok, names) )
names[ ++ nnames] = tok
lines[ tok,++ xnames[ tok] ] = NR }
else {
tok = tok "()"
if ( ! inarray( tok, names) )
names[ ++ nnames] = tok
lines[ tok,++ xnames[ tok] ] = NR } }
else if ( act == "3" ) {
funcname = tok
flines[ tok] = NR }
else if ( act == "4" )
braces++
else if ( act == "5" ) {
braces--
if ( braces == 0 ) {
for ( temp in local )
delete local[ temp]
funcname = ""
nextstate = 1 } }
else if ( act == "6" ) {
local[ tok] = 1 }
else if ( act == "7" )
break
else if ( act == "8" ) {
print "error: xref.awk: line " NR ": aborting" \
> "/dev/con"
# finished with current token
state = nextstate }
# finished parsing, now ready to print output
for ( i = 1 ; i <= nnames; i++ ) {
printf "%d " , xnames
[ names
[ i
] ] | "sort +1" if ( index( names[ i] , "(" ) == 0 )
printf "%s(%d)" , names
[ i
] , flines
[ names
[ i
] ] | "sort +1" else
printf "%s" , names
[ i
] | "sort +1" for ( j = 1 ; j <= xnames[ names[ i] ] ; j++ )
if ( lines[ names[ i] , j] != lines[ names[ i] , j- 1 ] )
printf " %d" , lines
[ names
[ i
] , j
] | "sort +1"
} # END OF PROGRAM
function asplit( str, arr, fs, n) { n = split( str, temp_asplit, fs)
for ( i = 1 ; i <= n; i++ ) arr[ temp_asplit[ i] ] ++ }
function inarray( val, arr, j) {
for ( j in arr )
if ( arr[ j] == val ) return j
return "" }
function lex( ) {
for ( ;; ) {
if ( tok == "(eof)" ) return 7
while ( length( line) == 0 )
if ( getline line == 0 ) {
tok = "(eof)" ; return 7 }
sub( /^ [ \t] +/, "" , line) # remove white space,
sub( /^ "([^" ] | \\")*" /, "" , line) # quoted strings,
sub( /^ \/ ( [ ^ \/ ] | \\\/ ) + \//,"",line) # regular expressions,
sub( /^ #.*/,"",line) # and comments
if ( line ~ /^ function/ ) {
tok = "function" ; line = substr( line, 9 ) ; return 1 }
else if ( line ~ /^ { / ) {
tok = "{" ; line = substr( line, 2 ) ; return 2 }
else if ( line ~ /^ } / ) {
tok = "}" ; line = substr( line, 2 ) ; return 3 }
else if ( match( line,/^ [ A- Za- z_] [ A- Za- z_0- 9 ] * \[ / ) ) {
tok = substr( line, 1 , RLENGTH- 1 )
line = substr( line, RLENGTH+ 1 )
return 5 }
else if ( match( line,/^ [ A- Za- z_] [ A- Za- z_0- 9 ] * \( / ) ) {
tok = substr( line, 1 , RLENGTH- 1 )
line = substr( line, RLENGTH+ 1 )
if ( ! ( tok in keywords ) ) return 6 }
else if ( match( line,/^ [ A- Za- z_] [ A- Za- z_0- 9 ] */ ) ) {
tok = substr( line, 1 , RLENGTH)
line = substr( line, RLENGTH+ 1 )
if ( ! ( tok in keywords ) ) return 4 }
else {
match( line,/^ [ ^ A- Za- z_{ } ] / )
tok = substr( line, 1 , RLENGTH)
line = substr( line, RLENGTH+ 1 ) } } }
ICAgICAgICAjIHhyZWYuYXdrIC0gY3Jvc3MgcmVmZXJlbmNlIGFuIGF3ayBwcm9ncmFtCgogICAgICAgIEJFR0lOIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhcnJheSBvZiBrZXl3b3JkcyB0byBiZSBpZ25vcmVkIGJ5IGxleGVyCiAgICAgICAgICAgICAgICBhc3BsaXQoIkJFR0lOOkVORDphdGFuMjpicmVhazpjbG9zZTpjb250aW51ZTpjb3M6ZGVsZXRlOiIgXAogICAgICAgICAgICAgICAgICAgICAgICAiZG86ZWxzZTpleGl0OmV4cDpmb3I6Z2V0bGluZTpnc3ViOmlmOmluOmluZGV4OmludDoiICBcCiAgICAgICAgICAgICAgICAgICAgICAgICJsZW5ndGg6bG9nOm1hdGNoOm5leHQ6cHJpbnQ6cHJpbnRmOnJhbmQ6cmV0dXJuOnNpbjoiIFwKICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0OnNwcmludGY6c3FydDpzcmFuZDpzdWI6c3Vic3RyOnN5c3RlbTp3aGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLCI6IikKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIHRoZSBzeW1ib2wtc3RhdGUgdGFibGUKICAgICAgICAgICAgICAgIHNwbGl0KCIwMDowMDowMDowMDowMDowMDowMDowMDowMDowMDoiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAiMjA6MTA6MTA6MTI6MTI6MTE6MDc6MDA6MDA6MDA6IiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIjA4OjA4OjA4OjA4OjA4OjMzOjA4OjAwOjAwOjAwOiIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICIwODo0NDowODozNjowODowODowODowMDowMDowMDoiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAiMDg6NDQ6NDU6NDI6NDI6NDE6MDgiLG1hY2hpbmUsIjoiKQoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGlucHV0IGFuZCBzdG9yZSBhbiBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24KICAgICAgICAgICAgICAgICMgb2YgdGhlIGNyb3NzLXJlZmVyZW5jZSBpbmZvcm1hdGlvbgoKICAgICAgICAgICAgICAgICMgc2V0IHVwIHRoZSBtYWNoaW5lCiAgICAgICAgICAgICAgICBzdGF0ZSA9IDEKCiAgICAgICAgICAgICAgICAjIHJ1biB0aGUgbWFjaGluZQogICAgICAgICAgICAgICAgZm9yICg7OykgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgbmV4dCBzeW1ib2wKICAgICAgICAgICAgICAgICAgICAgICAgc3ltYiA9IGxleCgpCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRzdGF0ZSA9IHN1YnN0cihtYWNoaW5lW3N0YXRlIHN5bWJdLDEsMSkKICAgICAgICAgICAgICAgICAgICAgICAgYWN0ID0gc3Vic3RyKG1hY2hpbmVbc3RhdGUgc3ltYl0sMiwxKQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBwZXJmb3JtIHJlcXVpcmVkIGFjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGFjdCA9PSAiMCIgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIyBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhY3QgPT0gIjEiICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBpbmFycmF5KHRvayxuYW1lcykgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNbKytubmFtZXNdID0gdG9rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbdG9rLCsreG5hbWVzW3Rva11dID0gTlIgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYWN0ID09ICIyIiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRvayBpbiBsb2NhbCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvayAiKCIgZnVuY25hbWUgIikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5hcnJheSh0b2ssbmFtZXMpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNbKytubmFtZXNdID0gdG9rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1t0b2ssKyt4bmFtZXNbdG9rXV0gPSBOUiB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2sgIigpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGluYXJyYXkodG9rLG5hbWVzKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzWysrbm5hbWVzXSA9IHRvawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbdG9rLCsreG5hbWVzW3Rva11dID0gTlIgfSB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhY3QgPT0gIjMiICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lID0gdG9rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpbmVzW3Rva10gPSBOUiB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhY3QgPT0gIjQiICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFjZXMrKwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYWN0ID09ICI1IiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFjZXMtLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYnJhY2VzID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCB0ZW1wIGluIGxvY2FsICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvY2FsW3RlbXBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jbmFtZSA9ICIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0c3RhdGUgPSAxIH0gfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYWN0ID09ICI2IiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFt0b2tdID0gMSB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhY3QgPT0gIjciICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYWN0ID09ICI4IiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiZXJyb3I6IHhyZWYuYXdrOiBsaW5lICIgTlIgIjogYWJvcnRpbmciIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gIi9kZXYvY29uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMSB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGZpbmlzaGVkIHdpdGggY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG5leHRzdGF0ZSB9CgogICAgICAgICAgICAgICAgIyBmaW5pc2hlZCBwYXJzaW5nLCBub3cgcmVhZHkgdG8gcHJpbnQgb3V0cHV0CiAgICAgICAgICAgICAgICBmb3IgKCBpID0gMTsgaSA8PSBubmFtZXM7IGkrKyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICIlZCAiLCB4bmFtZXNbbmFtZXNbaV1dIHwic29ydCArMSIKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRleChuYW1lc1tpXSwiKCIpID09IDAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAiJXMoJWQpIiwgbmFtZXNbaV0sIGZsaW5lc1tuYW1lc1tpXV0gfCJzb3J0ICsxIgogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICIlcyIsIG5hbWVzW2ldIHwic29ydCArMSIKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDE7IGogPD0geG5hbWVzW25hbWVzW2ldXTsgaisrICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxpbmVzW25hbWVzW2ldLGpdICE9IGxpbmVzW25hbWVzW2ldLGotMV0gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICIgJWQiLCBsaW5lc1tuYW1lc1tpXSxqXSB8InNvcnQgKzEiCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAiXG4iIHwic29ydCArMSIgfQoKICAgICAgICAgICAgICAgIH0gIyBFTkQgT0YgUFJPR1JBTQoKICAgICAgICBmdW5jdGlvbiBhc3BsaXQoc3RyLGFycixmcywgIG4pIHsgbiA9IHNwbGl0KHN0cix0ZW1wX2FzcGxpdCxmcykKICAgICAgICAgICAgICAgIGZvciAoIGkgPSAxOyBpIDw9IG47IGkrKyApIGFyclt0ZW1wX2FzcGxpdFtpXV0rKyB9CgogICAgICAgIGZ1bmN0aW9uIGluYXJyYXkodmFsLGFyciwgIGopIHsKICAgICAgICAgICAgZm9yICggaiBpbiBhcnIgKQogICAgICAgICAgICAgICAgaWYgKCBhcnJbal0gPT0gdmFsICkgcmV0dXJuIGoKICAgICAgICAgICAgcmV0dXJuICIiIH0KCiAgICAgICAgZnVuY3Rpb24gbGV4KCkgewoKICAgICAgICAgICAgICAgIGZvciAoOzspIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG9rID09ICIoZW9mKSIgKSByZXR1cm4gNwoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBsZW5ndGgobGluZSkgPT0gMCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBnZXRsaW5lIGxpbmUgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9ICIoZW9mKSI7IHJldHVybiA3IH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YigvXlsgXHRdKy8sIiIsbGluZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBzdWIoL14iKFteIl18XFwiKSoiLywiIixsaW5lKSAgICAgICAgICAgICAgICAjIHF1b3RlZCBzdHJpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICBzdWIoL15cLyhbXlwvXXxcXFwvKStcLy8sIiIsbGluZSkgICAgICAgICMgcmVndWxhciBleHByZXNzaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgc3ViKC9eIy4qLywiIixsaW5lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBjb21tZW50cwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsaW5lIH4gL15mdW5jdGlvbi8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gImZ1bmN0aW9uIjsgbGluZSA9IHN1YnN0cihsaW5lLDkpOyByZXR1cm4gMSB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBsaW5lIH4gL157LyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSAieyI7IGxpbmUgPSBzdWJzdHIobGluZSwyKTsgcmV0dXJuIDIgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggbGluZSB+IC9efS8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gIn0iOyBsaW5lID0gc3Vic3RyKGxpbmUsMik7IHJldHVybiAzIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIG1hdGNoKGxpbmUsL15bQS1aYS16X11bQS1aYS16XzAtOV0qXFsvKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBzdWJzdHIobGluZSwxLFJMRU5HVEgtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsUkxFTkdUSCsxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1IH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIG1hdGNoKGxpbmUsL15bQS1aYS16X11bQS1aYS16XzAtOV0qXCgvKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBzdWJzdHIobGluZSwxLFJMRU5HVEgtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsUkxFTkdUSCsxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISAoIHRvayBpbiBrZXl3b3JkcyApICkgcmV0dXJuIDYgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggbWF0Y2gobGluZSwvXltBLVphLXpfXVtBLVphLXpfMC05XSovKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBzdWJzdHIobGluZSwxLFJMRU5HVEgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHN1YnN0cihsaW5lLFJMRU5HVEgrMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKCB0b2sgaW4ga2V5d29yZHMgKSApIHJldHVybiA0IH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2gobGluZSwvXlteQS1aYS16X3t9XS8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gc3Vic3RyKGxpbmUsMSxSTEVOR1RIKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzdWJzdHIobGluZSxSTEVOR1RIKzEpIH0gfSB9Cg==
stdin
ICAgICAgICAjIHhyZWYuYXdrIC0gY3Jvc3MgcmVmZXJlbmNlIGFuIGF3ayBwcm9ncmFtCgogICAgICAgIEJFR0lOIHsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhcnJheSBvZiBrZXl3b3JkcyB0byBiZSBpZ25vcmVkIGJ5IGxleGVyCiAgICAgICAgICAgICAgICBhc3BsaXQoJnF1b3Q7QkVHSU46RU5EOmF0YW4yOmJyZWFrOmNsb3NlOmNvbnRpbnVlOmNvczpkZWxldGU6JnF1b3Q7IFwKICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7ZG86ZWxzZTpleGl0OmV4cDpmb3I6Z2V0bGluZTpnc3ViOmlmOmluOmluZGV4OmludDomcXVvdDsgIFwKICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7bGVuZ3RoOmxvZzptYXRjaDpuZXh0OnByaW50OnByaW50ZjpyYW5kOnJldHVybjpzaW46JnF1b3Q7IFwKICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7c3BsaXQ6c3ByaW50ZjpzcXJ0OnNyYW5kOnN1YjpzdWJzdHI6c3lzdGVtOndoaWxlJnF1b3Q7LAogICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcywmcXVvdDs6JnF1b3Q7KQoKICAgICAgICAgICAgICAgICMgYnVpbGQgdGhlIHN5bWJvbC1zdGF0ZSB0YWJsZQogICAgICAgICAgICAgICAgc3BsaXQoJnF1b3Q7MDA6MDA6MDA6MDA6MDA6MDA6MDA6MDA6MDA6MDA6JnF1b3Q7IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdDsyMDoxMDoxMDoxMjoxMjoxMTowNzowMDowMDowMDomcXVvdDsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90OzA4OjA4OjA4OjA4OjA4OjMzOjA4OjAwOjAwOjAwOiZxdW90OyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7MDg6NDQ6MDg6MzY6MDg6MDg6MDg6MDA6MDA6MDA6JnF1b3Q7IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdDswODo0NDo0NTo0Mjo0Mjo0MTowOCZxdW90OyxtYWNoaW5lLCZxdW90OzomcXVvdDspCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgaW5wdXQgYW5kIHN0b3JlIGFuIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbgogICAgICAgICAgICAgICAgIyBvZiB0aGUgY3Jvc3MtcmVmZXJlbmNlIGluZm9ybWF0aW9uCgogICAgICAgICAgICAgICAgIyBzZXQgdXAgdGhlIG1hY2hpbmUKICAgICAgICAgICAgICAgIHN0YXRlID0gMQoKICAgICAgICAgICAgICAgICMgcnVuIHRoZSBtYWNoaW5lCiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBuZXh0IHN5bWJvbAogICAgICAgICAgICAgICAgICAgICAgICBzeW1iID0gbGV4KCkKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHN0YXRlID0gc3Vic3RyKG1hY2hpbmVbc3RhdGUgc3ltYl0sMSwxKQogICAgICAgICAgICAgICAgICAgICAgICBhY3QgPSBzdWJzdHIobWFjaGluZVtzdGF0ZSBzeW1iXSwyLDEpCgogICAgICAgICAgICAgICAgICAgICAgICAjIHBlcmZvcm0gcmVxdWlyZWQgYWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYWN0ID09ICZxdW90OzAmcXVvdDsgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIyBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhY3QgPT0gJnF1b3Q7MSZxdW90OyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5hcnJheSh0b2ssbmFtZXMpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzWysrbm5hbWVzXSA9IHRvawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW3RvaywrK3huYW1lc1t0b2tdXSA9IE5SIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGFjdCA9PSAmcXVvdDsyJnF1b3Q7ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG9rIGluIGxvY2FsICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rICZxdW90OygmcXVvdDsgZnVuY25hbWUgJnF1b3Q7KSZxdW90OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGluYXJyYXkodG9rLG5hbWVzKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzWysrbm5hbWVzXSA9IHRvawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbdG9rLCsreG5hbWVzW3Rva11dID0gTlIgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rICZxdW90OygpJnF1b3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgaW5hcnJheSh0b2ssbmFtZXMpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNbKytubmFtZXNdID0gdG9rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1t0b2ssKyt4bmFtZXNbdG9rXV0gPSBOUiB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGFjdCA9PSAmcXVvdDszJnF1b3Q7ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lID0gdG9rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpbmVzW3Rva10gPSBOUiB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhY3QgPT0gJnF1b3Q7NCZxdW90OyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2VzKysKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGFjdCA9PSAmcXVvdDs1JnF1b3Q7ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNlcy0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBicmFjZXMgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHRlbXAgaW4gbG9jYWwgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxbdGVtcF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lID0gJnF1b3Q7JnF1b3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0c3RhdGUgPSAxIH0gfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYWN0ID09ICZxdW90OzYmcXVvdDsgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxbdG9rXSA9IDEgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYWN0ID09ICZxdW90OzcmcXVvdDsgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhY3QgPT0gJnF1b3Q7OCZxdW90OyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAmcXVvdDtlcnJvcjogeHJlZi5hd2s6IGxpbmUgJnF1b3Q7IE5SICZxdW90OzogYWJvcnRpbmcmcXVvdDsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmd0OyAmcXVvdDsvZGV2L2NvbiZxdW90OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMSB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGZpbmlzaGVkIHdpdGggY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG5leHRzdGF0ZSB9CgogICAgICAgICAgICAgICAgIyBmaW5pc2hlZCBwYXJzaW5nLCBub3cgcmVhZHkgdG8gcHJpbnQgb3V0cHV0CiAgICAgICAgICAgICAgICBmb3IgKCBpID0gMTsgaSAmbHQ7PSBubmFtZXM7IGkrKyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICZxdW90OyVkICZxdW90OywgeG5hbWVzW25hbWVzW2ldXSB8JnF1b3Q7c29ydCArMSZxdW90OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluZGV4KG5hbWVzW2ldLCZxdW90OygmcXVvdDspID09IDAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAmcXVvdDslcyglZCkmcXVvdDssIG5hbWVzW2ldLCBmbGluZXNbbmFtZXNbaV1dIHwmcXVvdDtzb3J0ICsxJnF1b3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYgJnF1b3Q7JXMmcXVvdDssIG5hbWVzW2ldIHwmcXVvdDtzb3J0ICsxJnF1b3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSAxOyBqICZsdDs9IHhuYW1lc1tuYW1lc1tpXV07IGorKyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsaW5lc1tuYW1lc1tpXSxqXSAhPSBsaW5lc1tuYW1lc1tpXSxqLTFdICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAmcXVvdDsgJWQmcXVvdDssIGxpbmVzW25hbWVzW2ldLGpdIHwmcXVvdDtzb3J0ICsxJnF1b3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAmcXVvdDtcbiZxdW90OyB8JnF1b3Q7c29ydCArMSZxdW90OyB9CgogICAgICAgICAgICAgICAgfSAjIEVORCBPRiBQUk9HUkFNCgogICAgICAgIGZ1bmN0aW9uIGFzcGxpdChzdHIsYXJyLGZzLCAgbikgeyBuID0gc3BsaXQoc3RyLHRlbXBfYXNwbGl0LGZzKQogICAgICAgICAgICAgICAgZm9yICggaSA9IDE7IGkgJmx0Oz0gbjsgaSsrICkgYXJyW3RlbXBfYXNwbGl0W2ldXSsrIH0KCiAgICAgICAgZnVuY3Rpb24gaW5hcnJheSh2YWwsYXJyLCAgaikgewogICAgICAgICAgICBmb3IgKCBqIGluIGFyciApCiAgICAgICAgICAgICAgICBpZiAoIGFycltqXSA9PSB2YWwgKSByZXR1cm4gagogICAgICAgICAgICByZXR1cm4gJnF1b3Q7JnF1b3Q7IH0KCiAgICAgICAgZnVuY3Rpb24gbGV4KCkgewoKICAgICAgICAgICAgICAgIGZvciAoOzspIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdG9rID09ICZxdW90Oyhlb2YpJnF1b3Q7ICkgcmV0dXJuIDcKCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbGVuZ3RoKGxpbmUpID09IDAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZ2V0bGluZSBsaW5lID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSAmcXVvdDsoZW9mKSZxdW90OzsgcmV0dXJuIDcgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc3ViKC9eWyBcdF0rLywmcXVvdDsmcXVvdDssbGluZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHdoaXRlIHNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBzdWIoL14mcXVvdDsoW14mcXVvdDtdfFxcJnF1b3Q7KSomcXVvdDsvLCZxdW90OyZxdW90OyxsaW5lKSAgICAgICAgICAgICAgICAjIHF1b3RlZCBzdHJpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICBzdWIoL15cLyhbXlwvXXxcXFwvKStcLy8sJnF1b3Q7JnF1b3Q7LGxpbmUpICAgICAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YigvXiMuKi8sJnF1b3Q7JnF1b3Q7LGxpbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW5kIGNvbW1lbnRzCgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxpbmUgfiAvXmZ1bmN0aW9uLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSAmcXVvdDtmdW5jdGlvbiZxdW90OzsgbGluZSA9IHN1YnN0cihsaW5lLDkpOyByZXR1cm4gMSB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBsaW5lIH4gL157LyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSAmcXVvdDt7JnF1b3Q7OyBsaW5lID0gc3Vic3RyKGxpbmUsMik7IHJldHVybiAyIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGxpbmUgfiAvXn0vICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9ICZxdW90O30mcXVvdDs7IGxpbmUgPSBzdWJzdHIobGluZSwyKTsgcmV0dXJuIDMgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggbWF0Y2gobGluZSwvXltBLVphLXpfXVtBLVphLXpfMC05XSpcWy8pICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHN1YnN0cihsaW5lLDEsUkxFTkdUSC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzdWJzdHIobGluZSxSTEVOR1RIKzEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggbWF0Y2gobGluZSwvXltBLVphLXpfXVtBLVphLXpfMC05XSpcKC8pICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHN1YnN0cihsaW5lLDEsUkxFTkdUSC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzdWJzdHIobGluZSxSTEVOR1RIKzEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhICggdG9rIGluIGtleXdvcmRzICkgKSByZXR1cm4gNiB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBtYXRjaChsaW5lLC9eW0EtWmEtel9dW0EtWmEtel8wLTldKi8pICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHN1YnN0cihsaW5lLDEsUkxFTkdUSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsUkxFTkdUSCsxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISAoIHRvayBpbiBrZXl3b3JkcyApICkgcmV0dXJuIDQgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaChsaW5lLC9eW15BLVphLXpfe31dLykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBzdWJzdHIobGluZSwxLFJMRU5HVEgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHN1YnN0cihsaW5lLFJMRU5HVEgrMSkgfSB9IH0K
# xref.awk - cross reference an awk program
BEGIN {
# create array of keywords to be ignored by lexer
asplit("BEGIN:END:atan2:break:close:continue:cos:delete:" \
"do:else:exit:exp:for:getline:gsub:if:in:index:int:" \
"length:log:match:next:print:printf:rand:return:sin:" \
"split:sprintf:sqrt:srand:sub:substr:system:while",
keywords,":")
# build the symbol-state table
split("00:00:00:00:00:00:00:00:00:00:" \
"20:10:10:12:12:11:07:00:00:00:" \
"08:08:08:08:08:33:08:00:00:00:" \
"08:44:08:36:08:08:08:00:00:00:" \
"08:44:45:42:42:41:08",machine,":")
# parse the input and store an intermediate representation
# of the cross-reference information
# set up the machine
state = 1
# run the machine
for (;;) {
# get next symbol
symb = lex()
nextstate = substr(machine[state symb],1,1)
act = substr(machine[state symb],2,1)
# perform required action
if ( act == "0" )
; # do nothing
else if ( act == "1" ) {
if ( ! inarray(tok,names) )
names[++nnames] = tok
lines[tok,++xnames[tok]] = NR }
else if ( act == "2" ) {
if ( tok in local ) {
tok = tok "(" funcname ")"
if ( ! inarray(tok,names) )
names[++nnames] = tok
lines[tok,++xnames[tok]] = NR }
else {
tok = tok "()"
if ( ! inarray(tok,names) )
names[++nnames] = tok
lines[tok,++xnames[tok]] = NR } }
else if ( act == "3" ) {
funcname = tok
flines[tok] = NR }
else if ( act == "4" )
braces++
else if ( act == "5" ) {
braces--
if ( braces == 0 ) {
for ( temp in local )
delete local[temp]
funcname = ""
nextstate = 1 } }
else if ( act == "6" ) {
local[tok] = 1 }
else if ( act == "7" )
break
else if ( act == "8" ) {
print "error: xref.awk: line " NR ": aborting" \
> "/dev/con"
exit 1 }
# finished with current token
state = nextstate }
# finished parsing, now ready to print output
for ( i = 1; i <= nnames; i++ ) {
printf "%d ", xnames[names[i]] |"sort +1"
if ( index(names[i],"(") == 0 )
printf "%s(%d)", names[i], flines[names[i]] |"sort +1"
else
printf "%s", names[i] |"sort +1"
for ( j = 1; j <= xnames[names[i]]; j++ )
if ( lines[names[i],j] != lines[names[i],j-1] )
printf " %d", lines[names[i],j] |"sort +1"
printf "\n" |"sort +1" }
} # END OF PROGRAM
function asplit(str,arr,fs, n) { n = split(str,temp_asplit,fs)
for ( i = 1; i <= n; i++ ) arr[temp_asplit[i]]++ }
function inarray(val,arr, j) {
for ( j in arr )
if ( arr[j] == val ) return j
return "" }
function lex() {
for (;;) {
if ( tok == "(eof)" ) return 7
while ( length(line) == 0 )
if ( getline line == 0 ) {
tok = "(eof)"; return 7 }
sub(/^[ \t]+/,"",line) # remove white space,
sub(/^"([^"]|\\")*"/,"",line) # quoted strings,
sub(/^\/([^\/]|\\\/)+\//,"",line) # regular expressions,
sub(/^#.*/,"",line) # and comments
if ( line ~ /^function/ ) {
tok = "function"; line = substr(line,9); return 1 }
else if ( line ~ /^{/ ) {
tok = "{"; line = substr(line,2); return 2 }
else if ( line ~ /^}/ ) {
tok = "}"; line = substr(line,2); return 3 }
else if ( match(line,/^[A-Za-z_][A-Za-z_0-9]*\[/) ) {
tok = substr(line,1,RLENGTH-1)
line = substr(line,RLENGTH+1)
return 5 }
else if ( match(line,/^[A-Za-z_][A-Za-z_0-9]*\(/) ) {
tok = substr(line,1,RLENGTH-1)
line = substr(line,RLENGTH+1)
if ( ! ( tok in keywords ) ) return 6 }
else if ( match(line,/^[A-Za-z_][A-Za-z_0-9]*/) ) {
tok = substr(line,1,RLENGTH)
line = substr(line,RLENGTH+1)
if ( ! ( tok in keywords ) ) return 4 }
else {
match(line,/^[^A-Za-z_{}]/)
tok = substr(line,1,RLENGTH)
line = substr(line,RLENGTH+1) } } }