-
Notifications
You must be signed in to change notification settings - Fork 1
/
generate.awk
executable file
·123 lines (105 loc) · 2.14 KB
/
generate.awk
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
120
121
122
123
#!/bin/awk -f
# ./generate.awk github.com/rpm-software-management/rpm/{lib/rpm{tag,ds,files}.h,rpmio/rpmpgp.h} > types.gen.go
# lib/rpmtag.h
/^typedef.*rpmTag_e/ { t = "tag" }
/^typedef.*rpmSigTag_e/ { t = "sigtag" }
/^typedef.*rpmTagType_e/ { t = "tagtype" }
# lib/rpmds.h
/^enum.*rpmsenseFlags_e/ { t = "sense" }
# lib/rpmfiles.h
/^enum.*rpmfileAttrs_e/ { t = "fileattr" }
/^enum.*rpmVerifyAttrs_e/ { t = "verifyattr" }
# rpmio/rpmpgp.h
/^typedef.*pgpHashAlgo_e/ { t = "hashalgo" }
/^}.*;$/ { t = "" }
/^#define[[:space:]]HEADER_.*/ && t == "" {
hdr[$2]=$3
}
$1 ~ "^RPM.*_" || $1 ~ "^PGPHASHALGO_" || $1 == "#define" {
if (!t)
next
if ($1 ~ "RETURN_TYPE$")
next
if ($1 == "#define") {
k = $2
v = $3
} else {
match($0, ".*=")
if (RLENGTH == -1)
next
k = $1
v = substr($0, RLENGTH+1)
}
sub(/=/, "", k)
sub(/[,\t].*$/, "", v)
if (k == "RPMTAG_NOT_FOUND")
next
switch (t) {
case "tag":
tag[v]=k
break
case "sigtag":
sigtag[v]=k
break
case "tagtype":
tagtype[v]=k
break
case "sense":
sense[v]=k
break
case "fileattr":
fileattr[v]=k
break
case "verifyattr":
verifyattr[v]=k
break
case "hashalgo":
hashalgo[v]=k
break
}
}
function gen(data) {
print "const("
n = asorti(data, sorted)
for (i = 1; i <= n; i++) {
k = sorted[i]
print "\t", data[k], "=", k
}
print ")"
}
function gentype(name, type, data) {
print "type", name, type
print "const("
n = asorti(data, sorted)
for (i = 1; i <= n; i++) {
k = sorted[i]
print "\t", data[k], name, "=", k
}
print ")"
}
function genmap(data, type, name) {
printf "var %s = map[%s]string{\n", name, type
n = asorti(data, sorted)
for (i = 1; i <= n; i++) {
k = sorted[i]
print "\t", data[k], ":", "\""data[k]"\","
}
print "}"
}
END {
print "// Code generated by generate.awk. DO NOT EDIT.\n"
print "package rpm"
print "const ("
for (h in hdr)
print h, "=", hdr[h]
print ")"
print "//go:generate stringer -output types_string.gen.go -type=TagType"
gentype("TagType", "uint32", tag)
gentype("SigTagType", "= TagType", sigtag)
genmap(sigtag, "TagType", "sigTagString")
gen(tagtype)
gen(sense)
gen(fileattr)
gen(verifyattr)
gen(hashalgo)
}