function append(line) { if (doc) { doc = doc "\n" } doc = doc line } function output(name) { print name print "↓" print doc exit } function reset() { doc = "" } BEGIN { RE_ANY = "(.*)" RE_NAME = "([_A-Za-z][_0-9A-Za-z]*)" RE_SPACE = "[[:space:]]" RE_SPACES = RE_SPACE "*" RE_BEGIN = "^" RE_END = RE_SPACES "$" RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{" RE_ALIAS = RE_BEGIN "#\\(" RE_SPACES RE_NAME RE_END RE_DOC = RE_BEGIN "#" RE_SPACE RE_ANY RE_END RE_FUNCTION = RE_BEGIN RE_NAME RE_FUNC RE_END RE_MODULE = RE_BEGIN "#." RE_SPACES RE_NAME RE_END RE_SET = RE_BEGIN RE_NAME "=.*" RE_END RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END alias = 0 reset() module = 0 } { # doc if (match($0, RE_SHEBANG, m)) { append(m[1]) } else if (match($0, RE_DOC, m)) { append(m[1]) } else if (match($0, RE_ALIAS, m)) { append(m[1]) if (m[1] == target) { alias = 1 } # not doc } else if (match($0, RE_MODULE, m)) { reset() if (m[1] == target) { module = 1 } } else if (match($0, RE_SET, m)) { if (m[1] == target) { output(m[1]) } else { reset() } } else if (match($0, RE_FUNCTION, m)) { if (alias) { output(target) } else if (m[1] == target) { output(target) } else { reset() } } else { if (module) { output(target) } else { reset() } } }