Packages

Erlang libvirt remote protocol

Current section

Files

Jump to
verx bin mk_libvirt_constants
Raw

bin/mk_libvirt_constants

#!/usr/bin/awk -f
# Usage: bin/mk_libvirt_constants /path/to/libvirt/include/libvirt/*.h | \
# sort | uniq > include/libvirt_constants.hrl
BEGIN { inenum = 0 }
# https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html
function join(array, start, end, sep, result, i) {
if (sep == "")
sep = " "
else if (sep == SUBSEP) # magic value
sep = ""
result = array[start]
for (i = start + 1; i <= end; i++)
result = result sep array[i]
return result
}
function err(msg) {
print msg > "/dev/stderr"
exit 1
}
function ensure_comma(str) {
if (str !~ /,/ && str ~ /\/\*/) {
sub("\\/\\*", ", \\/\\*", str)
}
else if (str !~ /,/) {
sub("$", ",", str)
}
return str
}
function strip(str) {
sub("^\\s*", "", str)
sub("\\s*$", "", str)
return str
}
function token(t) {
# #define ABC 1234
if (t ~ /^[0-9\-]+$/) {
return t
}
# #define ABC (1U << 31)
else if (t ~ /^\(*[-1-9]+U$/) {
sub("U", "", t)
return t
}
# #define ABC XYZ
else if (t ~ /^[A-Z0-9_]+$/) {
return "?" t
}
# #define ABC (1 << 31)
else if (t ~ /<</) {
return "bsl"
}
# #define ABC (1234)
else if (t ~ /^[0-9+\(\)]+$/) {
return t
}
err("UNMATCHED TERM:|" t "|")
}
function term(str) {
n = split(strip(str), tok)
for (t in tok) {
tok[t] = token(tok[t])
}
return join(tok, 1, n)
}
function define(name, val, comment) {
return "-define(" strip(name) "," term(val) ")."
}
{
if (/^typedef enum/) inenum = 1
if (/^}/) inenum = 0
sub(/^#\s+define/, "#define")
if (inenum && $1 ~ /^VIR_/) {
split(ensure_comma($0), a, "=")
split(a[2], b, ",")
if (!length(b[1])) next
print define(a[1], b[1], b[2])
}
else if (/^#define/ && $2 ~ /^VIR_/ && $3 ~ /^[0-9+\(\)]+$/) {
name = $2
$1 = ""
$2 = ""
print define(name, $0, "")
}
}