1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
function get_name(node, ty, level)
{
if (node "/name" in DATA)
nm = DATA[node "/name"]
else
nm = qstrip(NAME[node])
if (ty != "")
nm = ty ":" nm
while(level > 0) {
nm = " " nm
level--
}
return nm
}
function dup_begin(DUPSAV)
{
DUPSAV[1] = dupd_prefix
if (DUPSAV[1] == "")
dupd_prefix = "dup" ++uniq_node_name "_"
}
function dup_end(DUPSAV)
{
dupd_prefix = DUPSAV[1]
}
function gen_sub(root, level, parent, v, n, N, node, dst_children, DUPSAV)
{
if (!(root in NAME)) {
print "Error: path not found: " root > "/dev/stderr"
return
}
if (parent == "")
parent = root
v = children(N, root "/children")
for(n = 1; n <= v; n++) {
node = N[n]
if (TYPE[node] == "symlink") {
# normal node symlink: generate a link
# print "SY:" node " " DATA[node] "^^^" sy_is_recursive(node) > "/dev/stderr"
dup_begin(DUPSAV)
if (NAME[node] ~ "@dup") {
tbl_entry(DATA[node], level, parent)
gen_sub(DATA[node], level+1)
}
else
tbl_entry_link(node, DATA[node], level, parent)
dup_end(DUPSAV)
}
else if ((node "/children") in NAME) {
tbl_entry(node, level, parent)
if (TYPE[node "/children"] == "symlink") {
dup_begin(DUPSAV)
dst_children = DATA[node "/children"]
sub("/children$", "", dst_children)
gen_sub(dst_children, level+1, node)
dup_end(DUPSAV)
}
else {
gen_sub(node, level+1)
}
}
else if (TYPE[node] == "hash")
tbl_entry(node, level, parent)
else
print "Unhandled child (unknown type): " node > "/dev/stderr"
}
}
|