rwx/sh/main.awk

105 lines
2.5 KiB
Awk
Raw Normal View History

2025-07-06 03:16:41 +02:00
function append(line) {
if (doc) {
doc = doc "\n"
}
doc = doc line
}
2025-07-06 09:42:23 +02:00
function output(name, type) {
print name " ← " type
2025-07-06 03:16:41 +02:00
print doc
exit
}
function reset() {
doc = ""
}
BEGIN {
RE_ANY = "(.*)"
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:]]"
RE_SPACES = RE_SPACE "*"
2025-07-06 05:31:51 +02:00
RE_VAR = "([_a-z][_0-9a-z]*)"
2025-07-06 03:16:41 +02:00
RE_BEGIN = "^"
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-06 09:32:52 +02:00
RE_CLOSE = RE_BEGIN "}" RE_SPACES RE_END
2025-07-06 05:31:51 +02:00
RE_CONSTANT = RE_BEGIN RE_CONST RE_SET RE_END
2025-07-06 03:16:41 +02:00
RE_DOC = RE_BEGIN "#" 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
alias = 0
reset()
module = 0
}
{
2025-07-06 06:41:44 +02:00
if (action == "alias") {
if (match($0, RE_ALIAS, m)) {
append(m[1])
} else if (match($0, RE_FUNCTION, m)) {
n = split(doc, array, "\n")
for (i = 1; i<= n; i++) {
2025-07-06 07:53:27 +02:00
print array[i] " = " 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-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)) {
append(m[1])
} 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) {
alias = 1
}
# 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) {
module = 1
}
} else if (match($0, RE_FUNCTION, m)) {
if (alias) {
2025-07-06 09:36:06 +02:00
print "= " target
2025-07-06 09:42:23 +02:00
output(m[1], "function")
2025-07-06 06:41:44 +02:00
} else if (m[1] == target) {
2025-07-06 09:42:23 +02:00
output(target, "function")
2025-07-06 06:41:44 +02:00
} else {
reset()
}
2025-07-06 03:24:23 +02:00
} else {
2025-07-06 06:41:44 +02:00
if (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
}
}