Přemysl Eric Janouch
bb4b895cb5
Not all image/x-nikon-nef will work like this, so don't claim their MIME type.
113 lines
2.6 KiB
Awk
Executable File
113 lines
2.6 KiB
Awk
Executable File
#!/usr/bin/awk -f
|
|
BEGIN {
|
|
FS = ", *"
|
|
print "// Generated by tiff-tables.awk. DO NOT MODIFY."
|
|
print ""
|
|
print "#ifndef TIFF_TABLES_CONSTANTS_ONLY"
|
|
print "#include <stddef.h>"
|
|
print "#include <stdint.h>"
|
|
print ""
|
|
print "struct tiff_value {"
|
|
print "\tconst char *name;"
|
|
print "\tuint16_t value;"
|
|
print "};"
|
|
print ""
|
|
print "struct tiff_entry {"
|
|
print "\tconst char *name;"
|
|
print "\tuint16_t tag;"
|
|
print "\tstruct tiff_value *values;"
|
|
print "};"
|
|
print "#endif"
|
|
}
|
|
|
|
{
|
|
# 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 "#ifndef TIFF_TABLES_CONSTANTS_ONLY"
|
|
print "static struct tiff_entry " \
|
|
sectionsnakecase "_entries[] = {" fields "\n\t{}\n};"
|
|
print "#endif"
|
|
}
|
|
}
|
|
|
|
# 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()
|
|
}
|