function append(line) { if (doc) { doc = doc "\n" } doc = doc line } function alias_function(alias, target) { print alias "() { " target " \"${@}\"; }" } function alias_variable(alias, target) { print alias "() { echo \"${" target "}\"; }" } function output(name, type) { print "↙ " type print name print doc exit } function reset() { if (f == "") { doc = "" } } BEGIN { RE_ANY = "(.*)" RE_BEGIN = "^" RE_CONST = "([_A-Z][_0-9A-Z]*)" RE_SET = "=.*" RE_SPACE = "[[:space:]]" RE_TSK = "(FIXME|TODO)" RE_VAR = "([_a-z][_0-9a-z]*)" RE_SPACES = RE_SPACE "*" RE_END = RE_SPACES "$" RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{" re["alias"] = RE_BEGIN "#=" RE_SPACES RE_VAR RE_END RE_BINARY = RE_BEGIN "#\\|" RE_SPACES RE_VAR RE_END RE_CLOSE = RE_BEGIN "}" RE_SPACES RE_END RE_COMMAND = RE_BEGIN "#/" RE_SPACES RE_VAR RE_END RE_COMMENT = RE_BEGIN "#" RE_ANY RE_END re["constant"] = RE_BEGIN RE_CONST RE_SET RE_END RE_DOC = RE_BEGIN RE_SPACES "#" 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_TASK = RE_BEGIN RE_SPACES "#" RE_SPACES RE_TSK RE_ANY RE_END re["variable"] = RE_BEGIN RE_VAR RE_SET RE_END f = "" match_alias = 0 match_command = 0 match_module = 0 match_task = 0 reset() } { if (action == "filter") { if (match($0, re[target], m)) { print m[1] } } else if (action == "binaries") { if (match($0, RE_BINARY, m)) { binaries[m[1]] = "" } } else if (action == "commands") { if (match($0, RE_COMMAND, m)) { print m[1] } } else if (action == "tasks") { if (match($0, RE_MODULE, m)) { if (output_tasks) { print "" print output_module print output_tasks output_tasks = "" } doc = "" match_task = 0 output_module = ". " m[1] } else if (match($0, RE_TASK, m)) { if (target) { if (target == m[1]) { match_task = 1 } } else { match_task = 1 } append($0) } else if (match($0, RE_COMMENT, m)) { append($0) } else { if (match_task) { output_tasks = output_tasks "\n" doc } doc = "" match_task = 0 } } else if (action == "variables") { if (match($0, re["variable"], m)) { print m[1] } } else if (action == "aliases functions") { if (match($0, re["alias"], m)) { append(m[1]) } else if (match($0, re["function"], m)) { split(doc, array, "\n") for (item in array) { alias_function(array[item], m[1]) } reset() } else { reset() } } else if (action == "commands functions") { if (match($0, RE_COMMAND, m)) { append(m[1]) } else if (match($0, re["function"], m)) { split(doc, array, "\n") for (item in array) { alias_function(array[item], m[1]) } reset() } else { reset() } } else if (action == "command function") { if (match($0, RE_COMMAND, m)) { append(m[1]) } else if (match($0, re["function"], m)) { split(doc, array, "\n") for (item in array) { if (array[item] == target) { print m[1] exit } } reset() } else { reset() } } else if (action == "doc") { # doc if (match($0, RE_SHEBANG, m)) { append("! " m[1]) } else if (match($0, RE_DOC, m)) { if (f) { append($0) } else { append(m[1]) } } else if (match($0, re["alias"], m)) { append("= " m[1]) if (m[1] == target) { match_alias = 1 } } else if (match($0, RE_COMMAND, m)) { append("/ " m[1]) if (m[1] == target) { match_command = 1 } # set } else if (match($0, re["constant"], m)) { if (m[1] == target) { output(m[1], "constant") } else { reset() } } else if (match($0, re["variable"], m)) { if (m[1] == target) { output(m[1], "variable") } else { reset() } # others } else if (match($0, RE_MODULE, m)) { reset() if (m[1] == target) { match_module = 1 } } else if (match($0, re["function"], m)) { f = m[1] } else if (match($0, RE_CLOSE, m)) { if (match_alias) { print "= " target output(f, "function") } else if (match_command) { print "/ " target output(f, "function") } else if (f == target) { output(f, "function") } else { f = "" reset() } } else { if (match_module) { output(target, "module") } else { reset() } } } } END { if (action == "binaries") { for (binary in binaries) { print binary } } # FIXME tasks last module end }