]> git.draconx.ca Git - dxcommon.git/blobdiff - scripts/gen-options.awk
Add a script to embed config.h into installed headers.
[dxcommon.git] / scripts / gen-options.awk
index 679dc9904c4770fbcbec5f6d32dc991a42237ef4..80adcb44177a3fb91f79b0868e4e2b07dd4ca812 100755 (executable)
@@ -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 \\";