X-Git-Url: http://git.draconx.ca/gitweb/dxcommon.git/blobdiff_plain/62bc7469bf3ef88c4f81ddf615aa7dabe9ddbf74..075a8578cc9467d07ccff7688bfd0f4855712e1c:/scripts/gen-options.awk diff --git a/scripts/gen-options.awk b/scripts/gen-options.awk index 679dc99..80adcb4 100755 --- a/scripts/gen-options.awk +++ b/scripts/gen-options.awk @@ -82,7 +82,9 @@ # # * the object-like macro LOPT_PACK_BITS expands to an integer constant # expression, suitable for use in #if directives, that specifies the -# minimum number of bits required by the encoding. +# minimum number of bits required by the encoding. LOPT_PACK_BITS2 +# is the same, but rounded up to the next power of two greater than +# or equal to 8. # # * the object-like macro LOPTS_PACKED_INITIALIZER expands to a # comma-separated sequence of integer constant expressions, suitable @@ -152,7 +154,7 @@ $0 ~ /^-/ { } # Extract argument name - if (work ~ /^\[=[^\] \t]+\]/) { + if (work ~ /^\[=[^ \t]+\]/ && sub(/\]/, "&", work) == 1) { if (n = index(work, "]")) { arg = substr(work, 3, n-3) work = substr(work, n+1) @@ -213,7 +215,9 @@ lopt { sub(/^[ \t]*/, "") if (!$0) { next } - optionhelp[lopt] = (lopt in optionhelp ? optionhelp[lopt] "\n" : "") $0 + if (lopt in optionhelp) + $0 = "\n" $0; + optionhelp[lopt] = optionhelp[lopt] $0; } # Exit immediately on error @@ -356,17 +360,18 @@ END { # Currently, this only works if none of the options use action specifications # (as these would require encoding user-specified pointer expressions and # arbitrary int values). -function output_packed_macros(i, tmp, accum, max) +function output_packed_macros(i, tmp, accum, max, totalbits) { - print "\n#define LOPT_PACK_BITS (LOPT_SC_BITS + LOPT_HA_BITS + LOPT_LS_BITS)"; + print ""; # determine number of bits to encode offsets in SOPT_STRING max = length(sopt_string); - accum = 0; + totalbits = accum = 0; for (i = 1; i <= max; i *= 2) { accum++; } print "#define LOPT_SC_BITS " accum; + totalbits += accum; # determine number of bits to encode has_arg values max = 0; @@ -375,7 +380,9 @@ function output_packed_macros(i, tmp, accum, max) if (tmp > max) max = tmp; } - print "#define LOPT_HA_BITS " (max > 1 ? 2 : max > 0 ? 1 : 0); + accum = (max > 1 ? 2 : max > 0 ? 1 : 0); + print "#define LOPT_HA_BITS " accum; + totalbits += accum; # determine number of bits to encode offsets in lopt_strings max = 0; @@ -389,6 +396,12 @@ function output_packed_macros(i, tmp, accum, max) accum++; } print "#define LOPT_LS_BITS " accum; + totalbits += accum; + + print "#define LOPT_PACK_BITS " totalbits; + for (i = 8; i < totalbits; i *= 2) + ; + print "#define LOPT_PACK_BITS2 " i; # Now emit the packed initializer macro print "\n#define LOPTS_PACKED_INITIALIZER \\";