2025-07-06 03:16:41 +02:00
|
|
|
function append(line) {
|
|
|
|
if (doc) {
|
|
|
|
doc = doc "\n"
|
|
|
|
}
|
|
|
|
doc = doc line
|
|
|
|
}
|
|
|
|
|
2025-07-08 20:37:33 +02:00
|
|
|
function eval(alias, target) {
|
2025-07-08 20:43:24 +02:00
|
|
|
print alias "() { " target " \"${@}\"; }"
|
2025-07-08 20:37:33 +02:00
|
|
|
}
|
|
|
|
|
2025-07-06 09:42:23 +02:00
|
|
|
function output(name, type) {
|
2025-07-06 09:49:00 +02:00
|
|
|
print "↙ " type
|
|
|
|
print name
|
2025-07-06 03:16:41 +02:00
|
|
|
print doc
|
|
|
|
exit
|
|
|
|
}
|
|
|
|
|
|
|
|
function reset() {
|
2025-07-06 10:15:43 +02:00
|
|
|
if (f == "") {
|
|
|
|
doc = ""
|
|
|
|
}
|
2025-07-06 03:16:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
BEGIN {
|
|
|
|
RE_ANY = "(.*)"
|
2025-07-08 17:01:10 +02:00
|
|
|
RE_BEGIN = "^"
|
2025-07-06 05:31:51 +02:00
|
|
|
RE_CONST = "([_A-Z][_0-9A-Z]*)"
|
|
|
|
RE_SET = "=.*"
|
2025-07-06 03:16:41 +02:00
|
|
|
RE_SPACE = "[[:space:]]"
|
2025-07-06 05:31:51 +02:00
|
|
|
RE_VAR = "([_a-z][_0-9a-z]*)"
|
2025-07-06 03:16:41 +02:00
|
|
|
|
2025-07-08 17:01:10 +02:00
|
|
|
RE_SPACES = RE_SPACE "*"
|
|
|
|
|
2025-07-06 03:16:41 +02:00
|
|
|
RE_END = RE_SPACES "$"
|
|
|
|
RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{"
|
|
|
|
|
2025-07-06 06:59:32 +02:00
|
|
|
RE_ALIAS = RE_BEGIN "#=" RE_SPACES RE_VAR RE_END
|
2025-07-08 15:17:05 +02:00
|
|
|
RE_BINARY = RE_BEGIN "#\\|" RE_SPACES RE_VAR RE_END
|
2025-07-06 09:32:52 +02:00
|
|
|
RE_CLOSE = RE_BEGIN "}" RE_SPACES RE_END
|
2025-07-08 00:05:07 +02:00
|
|
|
RE_COMMAND = RE_BEGIN "#/" RE_SPACES RE_VAR RE_END
|
2025-07-06 05:31:51 +02:00
|
|
|
RE_CONSTANT = RE_BEGIN RE_CONST RE_SET RE_END
|
2025-07-06 10:18:18 +02:00
|
|
|
RE_DOC = RE_BEGIN RE_SPACES "#" RE_SPACE RE_ANY RE_END
|
2025-07-06 05:31:51 +02:00
|
|
|
RE_FUNCTION = RE_BEGIN RE_VAR RE_FUNC RE_END
|
|
|
|
RE_MODULE = RE_BEGIN "#." RE_SPACES RE_ANY RE_END
|
2025-07-06 03:16:41 +02:00
|
|
|
RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END
|
2025-07-06 05:31:51 +02:00
|
|
|
RE_VARIABLE = RE_BEGIN RE_VAR RE_SET RE_END
|
2025-07-06 03:16:41 +02:00
|
|
|
|
2025-07-06 10:15:43 +02:00
|
|
|
f = ""
|
2025-07-08 21:23:49 +02:00
|
|
|
match_alias = 0
|
|
|
|
match_command = 0
|
2025-07-08 21:25:44 +02:00
|
|
|
match_module = 0
|
2025-07-06 03:16:41 +02:00
|
|
|
reset()
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2025-07-07 02:10:05 +02:00
|
|
|
if (action == "aliases") {
|
|
|
|
if (match($0, RE_ALIAS, m)) {
|
|
|
|
print m[1]
|
|
|
|
}
|
2025-07-08 15:17:05 +02:00
|
|
|
} else if (action == "binaries") {
|
|
|
|
if (match($0, RE_BINARY, m)) {
|
2025-07-08 15:26:34 +02:00
|
|
|
binaries[m[1]] = ""
|
2025-07-08 15:17:05 +02:00
|
|
|
}
|
2025-07-08 00:05:07 +02:00
|
|
|
} else if (action == "commands") {
|
|
|
|
if (match($0, RE_COMMAND, m)) {
|
|
|
|
print m[1]
|
|
|
|
}
|
2025-07-07 02:27:41 +02:00
|
|
|
} else if (action == "constants") {
|
|
|
|
if (match($0, RE_CONSTANT, m)) {
|
|
|
|
print m[1]
|
|
|
|
}
|
2025-07-07 02:20:25 +02:00
|
|
|
} else if (action == "functions") {
|
|
|
|
if (match($0, RE_FUNCTION, m)) {
|
|
|
|
print m[1]
|
|
|
|
}
|
2025-07-07 02:31:01 +02:00
|
|
|
} else if (action == "variables") {
|
2025-07-07 03:09:02 +02:00
|
|
|
if (match($0, RE_VARIABLE, m)) {
|
2025-07-07 02:31:01 +02:00
|
|
|
print m[1]
|
|
|
|
}
|
2025-07-07 02:10:05 +02:00
|
|
|
} else if (action == "aliases functions") {
|
2025-07-06 06:41:44 +02:00
|
|
|
if (match($0, RE_ALIAS, m)) {
|
|
|
|
append(m[1])
|
|
|
|
} else if (match($0, RE_FUNCTION, m)) {
|
2025-07-08 16:06:51 +02:00
|
|
|
split(doc, array, "\n")
|
|
|
|
for (item in array) {
|
2025-07-08 20:37:33 +02:00
|
|
|
eval(array[item], m[1])
|
2025-07-08 15:48:13 +02:00
|
|
|
}
|
|
|
|
reset()
|
|
|
|
} else {
|
|
|
|
reset()
|
|
|
|
}
|
|
|
|
} else if (action == "commands functions") {
|
|
|
|
if (match($0, RE_COMMAND, m)) {
|
|
|
|
append(m[1])
|
|
|
|
} else if (match($0, RE_FUNCTION, m)) {
|
2025-07-08 16:06:51 +02:00
|
|
|
split(doc, array, "\n")
|
|
|
|
for (item in array) {
|
2025-07-08 20:57:42 +02:00
|
|
|
eval(array[item], m[1])
|
2025-07-06 06:41:44 +02:00
|
|
|
}
|
2025-07-06 05:31:51 +02:00
|
|
|
reset()
|
2025-07-06 03:16:41 +02:00
|
|
|
} else {
|
|
|
|
reset()
|
|
|
|
}
|
2025-07-08 21:18:50 +02:00
|
|
|
} 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 (item == target) {
|
|
|
|
print m[1]
|
|
|
|
exit
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reset()
|
|
|
|
} else {
|
|
|
|
reset()
|
|
|
|
}
|
2025-07-06 06:41:44 +02:00
|
|
|
} else if (action == "doc") {
|
|
|
|
# doc
|
|
|
|
if (match($0, RE_SHEBANG, m)) {
|
2025-07-06 09:36:06 +02:00
|
|
|
append("! " m[1])
|
2025-07-06 06:41:44 +02:00
|
|
|
} else if (match($0, RE_DOC, m)) {
|
2025-07-06 10:20:52 +02:00
|
|
|
if (f) {
|
|
|
|
append($0)
|
|
|
|
} else {
|
|
|
|
append(m[1])
|
|
|
|
}
|
2025-07-06 06:41:44 +02:00
|
|
|
} else if (match($0, RE_ALIAS, m)) {
|
2025-07-06 09:36:06 +02:00
|
|
|
append("= " m[1])
|
2025-07-06 06:41:44 +02:00
|
|
|
if (m[1] == target) {
|
2025-07-08 21:21:49 +02:00
|
|
|
match_alias = 1
|
2025-07-06 06:41:44 +02:00
|
|
|
}
|
2025-07-08 00:05:07 +02:00
|
|
|
} else if (match($0, RE_COMMAND, m)) {
|
|
|
|
append("/ " m[1])
|
|
|
|
if (m[1] == target) {
|
2025-07-08 21:23:49 +02:00
|
|
|
match_command = 1
|
2025-07-08 00:05:07 +02:00
|
|
|
}
|
2025-07-06 06:41:44 +02:00
|
|
|
# set
|
|
|
|
} else if (match($0, RE_CONSTANT, m)) {
|
|
|
|
if (m[1] == target) {
|
2025-07-06 09:42:23 +02:00
|
|
|
output(m[1], "constant")
|
2025-07-06 06:41:44 +02:00
|
|
|
} else {
|
|
|
|
reset()
|
|
|
|
}
|
|
|
|
} else if (match($0, RE_VARIABLE, m)) {
|
|
|
|
if (m[1] == target) {
|
2025-07-06 09:42:23 +02:00
|
|
|
output(m[1], "variable")
|
2025-07-06 06:41:44 +02:00
|
|
|
} else {
|
|
|
|
reset()
|
|
|
|
}
|
|
|
|
# others
|
|
|
|
} else if (match($0, RE_MODULE, m)) {
|
2025-07-06 03:16:41 +02:00
|
|
|
reset()
|
2025-07-06 06:41:44 +02:00
|
|
|
if (m[1] == target) {
|
2025-07-08 21:25:44 +02:00
|
|
|
match_module = 1
|
2025-07-06 06:41:44 +02:00
|
|
|
}
|
|
|
|
} else if (match($0, RE_FUNCTION, m)) {
|
2025-07-06 10:15:43 +02:00
|
|
|
f = m[1]
|
|
|
|
} else if (match($0, RE_CLOSE, m)) {
|
2025-07-08 21:21:49 +02:00
|
|
|
if (match_alias) {
|
2025-07-06 09:36:06 +02:00
|
|
|
print "= " target
|
2025-07-06 10:15:43 +02:00
|
|
|
output(f, "function")
|
2025-07-08 21:23:49 +02:00
|
|
|
} else if (match_command) {
|
2025-07-08 01:43:30 +02:00
|
|
|
print "/ " target
|
|
|
|
output(f, "function")
|
2025-07-06 10:15:43 +02:00
|
|
|
} else if (f == target) {
|
|
|
|
output(f, "function")
|
2025-07-06 06:41:44 +02:00
|
|
|
} else {
|
2025-07-06 10:15:43 +02:00
|
|
|
f = ""
|
2025-07-06 06:41:44 +02:00
|
|
|
reset()
|
|
|
|
}
|
2025-07-06 03:24:23 +02:00
|
|
|
} else {
|
2025-07-08 21:25:44 +02:00
|
|
|
if (match_module) {
|
2025-07-06 09:42:23 +02:00
|
|
|
output(target, "module")
|
2025-07-06 06:41:44 +02:00
|
|
|
} else {
|
|
|
|
reset()
|
|
|
|
}
|
2025-07-06 03:24:23 +02:00
|
|
|
}
|
2025-07-06 03:16:41 +02:00
|
|
|
}
|
|
|
|
}
|
2025-07-08 15:26:34 +02:00
|
|
|
|
|
|
|
END {
|
|
|
|
if (action == "binaries") {
|
|
|
|
for (binary in binaries) {
|
|
|
|
print binary
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|