]> git.draconx.ca Git - dxcommon.git/blobdiff - scripts/gen-strtab.awk
Import getline helper from cdecl99.
[dxcommon.git] / scripts / gen-strtab.awk
index 6ec06be8b526c469c2f094babf6fb0bee2867b3c..2a56fd65a52e7324a6c56928cc9d64578457cb9f 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/awk -f
 #
-# Copyright © 2021, 2023 Nick Bowler
+# Copyright © 2021, 2023-2024 Nick Bowler
 #
 # Generate a C string table based on an input string specification file.
 #
@@ -111,32 +111,29 @@ sub(/^@/, "", $0) {
 }
 
 sub(/^[&]/, "") {
-  if (ident) {
-    finish_string_input(strings, ident, collected)
-    vars[num_vars++] = ident
+  if (ident != "") {
+    finish_string_input(strings, ident, collected);
+    vars[num_vars++] = ident;
   }
 
-  current_l10n = !sub(/^[&]/, "", $1);
-  startline = NR
-  ident = $1
+  current_l10n = !sub(/^[&]/, "");
+  startline = NR;
+  ident = $1;
 
-  $1 = ""
-  collected = ""
+  collected = "";
+  sub(/^[^ \t]*/, "");
 }
 
-ident {
-  sub(/^[ \t]*/, "")
-  if (collected) {
-    collected = collected "\n" $0
-  } else {
-    collected = $0
-  }
+ident != "" {
+  sub(/^[ \t]*/, "");
 
-  endline = NR
+  sep = collected != "" ? "\n" : "";
+  collected = collected sep $0;
+  endline = NR;
 }
 
 END {
-  if (ident) {
+  if (ident != "") {
     finish_string_input(strings, ident, collected)
     vars[num_vars++] = ident
   }
@@ -210,25 +207,25 @@ END {
 # strings[ident] = val.
 function finish_string_input(strings, ident, val, n, tmpval)
 {
-  gsub(/\\\\/, "\1", val);
+  gsub(/\\\\/, "\2", val);
   if (endline > startline)
     val = val "\n";
   gsub(/\\\n/, "", val);
 
   tmpval = ""
   while ((n = match(val, /\\[^abtnvfr]/)) > 0) {
-    tmpval = tmpval substr(val, 1, n-1)
-    val = substr(val, n+1)
+    tmpval = tmpval substr(val, 1, n-1);
+    val = substr(val, n+1);
   }
-  tmpval = tmpval val
+  tmpval = tmpval val;
 
   # Escape special characters
-  gsub(/"/,  bs"\"", tmpval)
-  gsub(/\t/, bs"t", tmpval)
-  gsub(/\n/, bs"n", tmpval)
-  gsub("\1", bs bs, tmpval)
+  gsub(/"/,  bs"\"", tmpval);
+  gsub(/\t/, bs"t", tmpval);
+  gsub(/\n/, bs"n", tmpval);
+  gsub("\2", bs bs, tmpval);
 
-  strings[ident] = tmpval
+  strings[ident] = tmpval;
   if (!current_l10n) {
     nol10n[tmpval] = 1;
   }