function append(line) { if (doc) { doc = doc "\n" } doc = doc line } function output(name) { print name print doc exit } function reset() { doc = "" } BEGIN { RE_ANY = "(.*)" RE_CONST = "([_A-Z][_0-9A-Z]*)" RE_SET = "=.*" RE_SPACE = "[[:space:]]" RE_SPACES = RE_SPACE "*" RE_VAR = "([_a-z][_0-9a-z]*)" RE_BEGIN = "^" RE_END = RE_SPACES "$" RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{" RE_ALIAS = RE_BEGIN "#\\(" RE_SPACES RE_VAR RE_END RE_CONSTANT = RE_BEGIN RE_CONST RE_SET RE_END RE_DOC = RE_BEGIN "#" RE_SPACE RE_ANY RE_END RE_FUNCTION = RE_BEGIN RE_VAR RE_FUNC RE_END RE_MODULE = RE_BEGIN "#." RE_SPACES RE_ANY RE_END RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END RE_VARIABLE = RE_BEGIN RE_VAR RE_SET RE_END alias = 0 reset() module = 0 } { # doc if (match($0, RE_SHEBANG, m)) { append("shebang: " m[1]) } else if (match($0, RE_DOC, m)) { append(m[1]) } else if (match($0, RE_ALIAS, m)) { append("alias: " m[1]) if (m[1] == target) { alias = 1 } # set } else if (match($0, RE_CONSTANT, m)) { if (m[1] == target) { printf "constant: " output(m[1]) } else { reset() } } else if (match($0, RE_VARIABLE, m)) { if (m[1] == target) { printf "variable: " output(m[1]) } else { reset() } # others } else if (match($0, RE_MODULE, m)) { reset() if (m[1] == target) { module = 1 } } else if (match($0, RE_FUNCTION, m)) { if (alias) { print "alias: " target printf "function: " output(m[1]) } else if (m[1] == target) { printf "function: " output(target) } else { reset() } } else { if (module) { printf "module: " output(target) } else { reset() } } }