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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# pbjparse.awk
##
# Parse a PBJ data file and print a PBDATA datafile to STDOUT.
# Justin Davis <jrcd83@gmail.com>
BEGIN {
templcount = 0 # number of templates that will be in the templates array
PROG = "pbjparse"
}
{ parsepbj() }
END {
tcmd = ""
if (templcount > 0) {
tcmd = templates[1]
for (i=2; i<=templcount; i++) tcmd = tcmd "|" templates[i]
}
else tcmd = "cat"
for (key in pbvars) {
split(key, keys, SUBSEP)
if (keys[2] != "len") continue
name = keys[1]
len = pbvars[key]
print name | tcmd
for (i=1; i<=len; i++) print pbvars[name,i] | tcmd
print "" | tcmd
}
if (optdepcount > 0) {
print "optdepends" | tcmd
for (name in optdeps) print optdeps[name] | tcmd
print "" | tcmd
}
if (!seenpkgr) print "packager\n" packager "\n\n" | tcmd
}
function parsepbj ( cmd)
{
# Ignore comments.
sub(/#.*/, "")
# Optdeps are special. In an annoying way.
if ($1 == "+") {
if ($2 == "optdepends") {
msg = $3
for (i=4; i<=NF; i++) msg = msg " " $i
++optdepcount
name = optdepname($3)
optdeps[name] = msg
remdep("depends", name)
remdep("makedeps", name)
}
else {
# We print the default packager if none was seen.
if ($2 == "packager") seenpkgr = 1
val = $3
for (i=4; i<=NF; i++) val = val " " $i
pbvars[$2, ++pbvars[$2,"len"]] = val
}
}
else if ($1 == "-") {
if ($2 == "optdepends")
die("cannot delete an optdep once it is created.")
remdep($2, $3)
}
else if ($1 == "!") {
cmd = $2
for (i=3; i<=NF; i++) cmd = cmd " " $i
while ((ret = cmd | getline) > 0) parsepbj()
if (ret == -1) die("failed to run $cmd")
close(cmd)
}
else if ($1 == "|") {
tcmd = $2
for (i=3; i<=NF; i++) tcmd = tcmd " " $i
templates[++templcount] = tcmd
}
else if ($1 == "") ; # ignore blank lines
else {
print "ignoring line " FNR ": " $0 | "cat 1>&2"
}
}
function die (msg)
{
printf "%s:%s.%d:%s\n", PROG, FILENAME, FNR, msg | "cat 1>&2"
exit 1
}
function remdep (name, prefix)
{
len = pbvars[name, "len"]
if (len == 0) return
for (i=1; i<=len; i++)
if (pbvars[name, i] ~ "^" prefix) break
if (i > len) die("could not find " prefix " in " name)
while (i < len) { pbvars[name, i] = pbvars[name, i+1]; i++ }
delete pbvars[name, i]
pbvars[name, "len"]--
}
function optdepname (msgbeg)
{
if (! match(msgbeg, "^[a-z_-]+:"))
die("failed to extract name from optdept")
return substr(msgbeg, 1, RLENGTH-1)
}
|