Generate TIFF structs/enums from a text file
This is to make the tables much easier to maintain.
This commit is contained in:
94
tiff-tables.awk
Executable file
94
tiff-tables.awk
Executable file
@@ -0,0 +1,94 @@
|
||||
#!/usr/bin/awk -f
|
||||
BEGIN {
|
||||
FS = ", *"
|
||||
print "// Generated by tiff-tables.awk. DO NOT MODIFY."
|
||||
}
|
||||
|
||||
{
|
||||
# Remember and strip consecutive comments.
|
||||
if (match($0, /#/))
|
||||
comment[++comments] = substr($0, RSTART + 1)
|
||||
else if (!/[[:space:]]/)
|
||||
comments = 0
|
||||
|
||||
sub(/#.*$/, "")
|
||||
sub(/[[:space:]]*$/, "")
|
||||
}
|
||||
|
||||
# Converts arbitrary strings to C identifiers (when running in the C locale).
|
||||
function identifize(s) {
|
||||
# Regard parenthesised text as comments.
|
||||
while (match(s, /[[:space:]]\([^)]+\)/)) {
|
||||
comment[++comments] = substr(s, RSTART, RLENGTH)
|
||||
s = substr(s, 1, RSTART - 1) substr(s, RSTART + RLENGTH)
|
||||
}
|
||||
|
||||
# Capitalize words (toupper is POSIX), removing spaces and dashes between.
|
||||
while (match(s, /[-[:space:]]./)) {
|
||||
s = substr(s, 1, RSTART - 1) \
|
||||
toupper(substr(s, RSTART + 1, 1)) \
|
||||
substr(s, RSTART + RLENGTH)
|
||||
}
|
||||
|
||||
# Replace any remaining non-identifier characters with underscores.
|
||||
gsub(/[^[:alnum:]]/, "_", s)
|
||||
return s
|
||||
}
|
||||
|
||||
function flushcomments(prefix, i, acc) {
|
||||
for (i = 1; i <= comments; i++)
|
||||
acc = acc prefix comment[i] "\n"
|
||||
comments = 0
|
||||
return acc
|
||||
}
|
||||
|
||||
function flushvalues() {
|
||||
if (values) {
|
||||
allvalues = allvalues "enum " fieldname " {\n" values "};\n\n"
|
||||
values = ""
|
||||
fields = fields "\n\t\t{}\n\t}},"
|
||||
} else if (fields) {
|
||||
fields = fields " NULL},"
|
||||
}
|
||||
}
|
||||
|
||||
function flushsection() {
|
||||
if (section) {
|
||||
flushvalues()
|
||||
print "};\n\n" allvalues "static struct tiff_entry " \
|
||||
sectionsnakecase "_entries[] = {" fields "\n\t{}\n};"
|
||||
}
|
||||
}
|
||||
|
||||
# Section marker
|
||||
/^= / {
|
||||
flushsection()
|
||||
section = identifize(substr($0, 3))
|
||||
sectionsnakecase = tolower(substr($0, 3))
|
||||
gsub(/[^[:alnum:]]/, "_", sectionsnakecase)
|
||||
fields = ""
|
||||
allvalues = ""
|
||||
print "\n" flushcomments("//") "enum {"
|
||||
}
|
||||
|
||||
# Field
|
||||
section && /^[^\t=]/ {
|
||||
flushvalues()
|
||||
fieldname = section "_" identifize($2)
|
||||
fields = fields "\n\t{\"" $2 "\", " fieldname ","
|
||||
print flushcomments("\t//") "\t" fieldname " = " $1 ","
|
||||
}
|
||||
|
||||
# Value
|
||||
section && /^\t/ {
|
||||
sub(/^\t*/, "")
|
||||
valuename = fieldname "_" identifize($2)
|
||||
if (!values)
|
||||
fields = fields " (struct tiff_value[]) {"
|
||||
values = values flushcomments("\t//") "\t" valuename " = " $1 ",\n"
|
||||
fields = fields "\n\t\t{\"" $2 "\", " valuename "},"
|
||||
}
|
||||
|
||||
END {
|
||||
flushsection()
|
||||
}
|
||||
Reference in New Issue
Block a user