#!/bin/awk -f
NR == 1 {
	size = $2
	printf "/"
	Fmt["CHAR"] = "b"
	Sizeof["CHAR"] = 1
	Fmt["UCHAR"] = "b"
	Sizeof["UCHAR"] = 1
	Fmt["SHORT"] = "d"
	Sizeof["SHORT"] = 2
	Fmt["USHORT"] = "u"
	Sizeof["USHORT"] = 2
	Fmt["LONG"] = "D"
	Sizeof["LONG"] = 4
	Fmt["ULONG"] = "U"
	Sizeof["ULONG"] = 4
	Fmt["VLONG"] = "XX"
	Sizeof["VLONG"] = 8
	Fmt["FLOAT"] = "f"
	Sizeof["FLOAT"] = 4
	Fmt["DOUBLE"] = "F"
	Sizeof["DOUBLE"] = 8
	Fmt["IND"] = "X"
	Sizeof["IND"] = 4
	Fmt["FUNC"] = "X"
	Sizeof["FUNC"] = 4
	Fmt["ARRAY"] = "a"
	Sizeof["ARRAY"] = 0
	Fmt["STRUCT"] = "a"
	Sizeof["STRUCT"] = 0
	Fmt["UNION"] = "a"
	Sizeof["UNION"] = 0
	offset = 0
}
NR > 1 {
	ty = $3
	sub(/[^A-Z].*$/, "", ty)
	f = Fmt[ty]
	s = Sizeof[ty]
	if (f == "") {
		f = "a"
		s = 0
	}
	if ($4 ~ /^[0-9]+:[0-9]+$/) {
		f = bitfieldf($4)
		s = 4
	}
	d = $2 - offset
	if (d > 0)
		printf "%d+", d
	else if (d < 0)
		printf "%d-", -d
	printf "\"%s \"%sn", $1, f
	offset = $2 + s
}
END {
	if (size != offset)
		printf "%d+", size - offset
	printf "\n"
}
func bitfieldf(bf,	sh, n, div, mask)
{
	split(bf, A, ":")
	sh = A[1]
	n = A[2]
	if (sh >= 31)
		return "X\"%#80000000\""
	div = 2^sh
	if (sh + n >= 32)
		return sprintf("X\"%#%x\"", div)
	mask = (2^n - 1) * div
	return sprintf("X\"&#%x%%#%x\"", mask, div)
}
