diff options
author | Glenn Randers-Pehrson <glennrp at users.sourceforge.net> | 2013-02-22 14:55:27 -0600 |
---|---|---|
committer | Glenn Randers-Pehrson <glennrp at users.sourceforge.net> | 2013-05-12 12:12:08 -0500 |
commit | ae8174d9a35605148e9b5ddcc02e4608d8739a65 (patch) | |
tree | 2d0a8aa3f9d0b3e627bc797f71d1f3d74f8fd849 /scripts/dfn.awk | |
parent | a3bece6bb79b34c0b70a963fc7543dbdd5d11bb5 (diff) | |
download | libpng-ae8174d9a35605148e9b5ddcc02e4608d8739a65.tar.gz |
[libpng15] Imported from libpng-1.5.15beta06.tar
Diffstat (limited to 'scripts/dfn.awk')
-rw-r--r-- | scripts/dfn.awk | 192 |
1 files changed, 62 insertions, 130 deletions
diff --git a/scripts/dfn.awk b/scripts/dfn.awk index 89b92d5d9..8a5dab6f9 100644 --- a/scripts/dfn.awk +++ b/scripts/dfn.awk @@ -31,11 +31,11 @@ NR==1 && out == "/dev/null" { # Output can be sorted; two lines are recognized $1 == "PNG_DFN_START_SORT"{ - sort=0+$2 + sort=$2 next } -$1 ~ /^PNG_DFN_END_SORT/{ +$1 == "PNG_DFN_END_SORT"{ # Do a very simple, slow, sort; notice that blank lines won't be # output by this for (entry in array) { @@ -61,143 +61,75 @@ $1 ~ /^PNG_DFN_END_SORT/{ } /^[^"]*PNG_DFN *".*"[^"]*$/{ - # A definition line, apparently correctly formated, extract the - # definition then replace any doubled "" that remain with a single - # double quote. Notice that the original doubled double quotes - # may have been split by tokenization - # - # Sometimes GCC splits the PNG_DFN lines, we know this has happened - # if the quotes aren't closed and must read another line. In this - # case it is essential to reject lines that start '#' because those - # are introduced #line directives. - orig=$0 - line=$0 - lineno=FNR - if (lineno == "") lineno=NR - - if (sub(/^[^"]*PNG_DFN *"/,"",line) != 1) { - print "line", lineno ": processing failed:" + # A definition line, apparently correctly formated, extract the + # definition then replace any doubled "" that remain with a single + # double quote. Notice that the original doubled double quotes + # may have been split by tokenization + orig=$0 + + if (gsub(/^[^"]*PNG_DFN *"/,"") != 1 || gsub(/"[^"]*$/, "") != 1) { + print "line", NR, "processing failed:" print orig + print $0 err=1 - next - } else { + } else { ++out_count - } - - # Now examine quotes within the value: - # - # @" - delete this and any following spaces - # "@ - delete this and any preceding spaces - # @' - replace this by a double quote - # - # This allows macro substitution by the C compiler thus: - # - # #define first_name John - # #define last_name Smith - # - # PNG_DFN"#define name @'@" first_name "@ @" last_name "@@'" - # - # Might get C preprocessed to: - # - # PNG_DFN "#define foo @'@" John "@ @" Smith "@@'" - # - # Which this script reduces to: - # - # #define name "John Smith" - # - while (1) { - # While there is an @" remove it and the next "@ - if (line ~ /@"/) { - if (line ~ /@".*"@/) { - # Do this special case first to avoid swallowing extra spaces - # before or after the @ stuff: - if (!sub(/@" *"@/, "", line)) { - # Ok, do it in pieces - there has to be a non-space between the - # two. NOTE: really weird things happen if a leading @" is - # lost - the code will error out below (I believe). - if (!sub(/@" */, "", line) || !sub(/ *"@/, "", line)) { - print "line", lineno, ": internal error:", orig - exit 1 - } - } - } - - # There is no matching "@. Assume a split line - else while (1) { - if (getline nextline) { - # If the line starts with '#' it is a preprocesor line directive - # from cc -E, skip it: - if (nextline !~ /^#/) { - line = line " " nextline - break - } - } else { - # This is end-of-input - probably a missig "@ on the first line: - print "line", lineno ": unbalanced @\" ... \"@ pair" - err=1 - next - } - } - - # Keep going until all the @" have gone - continue - } - - # Attempt to remove a trailing " (not preceded by '@') - if this can - # be done stop now, if not assume a split line again - if (sub(/"[^"]*$/, "", line)) - break - - # Read another line - while (1) { - if (getline nextline) { - if (nextline !~ /^#/) { - line = line " " nextline - # Go back to stripping @" "@ pairs - break - } - } else { - print "line", lineno ": unterminated PNG_DFN string" - err=1 - next - } - } - } - - # Put any needed double quotes in (at the end, because these would otherwise - # interfere with the processing above.) - gsub(/@'/,"\"", line) - - # Remove any trailing spaces (not really required, but for - # editorial consistency - sub(/ *$/, "", line) - - # Remove trailing CR - sub(/
$/, "", line) - - if (sort) { - if (split(line, parts) < sort) { - print "line", lineno ": missing sort field:", line - err=1 - } else - array[parts[sort]] = line - } - - else - print line >out - next + } + + # Now examine quotes within the value: + # + # @" - delete this and any following spaces + # "@ - delete this and any original spaces + # @' - replace this by a double quote + # + # This allows macro substitution by the C compiler thus: + # + # #define first_name John + # #define last_name Smith + # + # PNG_DFN"#define name @'@" first_name "@ @" last_name "@@'" + # + # Might get C preprocessed to: + # + # PNG_DFN "#define foo @'@" John "@ @" Smith "@@'" + # + # Which this script reduces to: + # + # #define name "John Smith" + # + while (sub(/@" */, "")) { + if (!sub(/ *"@/, "")) { + print "unbalanced @\" ... \"@ pair" + err=1 + break + } + } + + # Put any needed double quotes in + gsub(/@'/,"\"") + + # Remove any trailing spaces (not really required, but for + # editorial consistency + sub(/ *$/, "") + + if (sort) + array[$(sort)] = $0 + + else + print $0 >out + next } /PNG_DFN/{ - print "line", NR, "incorrectly formated PNG_DFN line:" - print $0 - err = 1 + print "line", NR, "incorrectly formated PNG_DFN line:" + print $0 + err = 1 } END{ - if (out_count > 0 || err > 0) + if (out_count > 0 || err > 0) exit err - print "no definition lines found" - exit 1 + print "no definition lines found" + exit 1 } |