summaryrefslogtreecommitdiff
path: root/src/nativeresources/rctocpp.awk
diff options
context:
space:
mode:
Diffstat (limited to 'src/nativeresources/rctocpp.awk')
-rw-r--r--src/nativeresources/rctocpp.awk84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/nativeresources/rctocpp.awk b/src/nativeresources/rctocpp.awk
new file mode 100644
index 0000000000..e631021b35
--- /dev/null
+++ b/src/nativeresources/rctocpp.awk
@@ -0,0 +1,84 @@
+# Convert string resources from Windows native resource file to a C++
+# source file with an array of structs representing the resources.
+
+BEGIN {
+ numEntries = 0;
+}
+
+# Takes a number and returns a string corresponding to its hex
+# representation. A string representation that has fewer than 8
+# characters (not including the '0x' prefix) is padded with 0's
+# to make it 8 characters.
+# Example: an input of 49 yields "0x00000031".
+function numberToHexString(number)
+{
+ quotient = number;
+
+ hexString = "";
+ for (digitCount = 0; digitCount < 8; digitCount++)
+ {
+ remainder = quotient % 16;
+ quotient = int(quotient / 16);
+ hexString = sprintf("%x"hexString, remainder);
+ }
+
+ hexString = "0x" hexString;
+ return hexString;
+}
+
+# Add each entry that is in our associative array of entries to the
+# C++ array we are building. The C++ array will be ordered by the
+# resourceId (lowest to highest) to facilitate quick lookups.
+function writesortedentries()
+{
+ for (entry in resourceArray)
+ {
+ # Write the entries to the C++ array ordered by the ID.
+ printf " {%s,%s},\n", entry, resourceArray[entry] | "sort";
+ }
+
+ # Close the pipe to ensure that the data is written now.
+ close("sort");
+}
+
+# Write entry for a string resource
+# This is called for each entry. Because we want to write them in
+# sorted order once all the entries have come in, for now we just
+# store each entry in an associative array.
+function writestringentry(id, str)
+{
+ numEntries++;
+
+ # Use the string representation of the ID as the array index
+ # because the precision of numeric indices can be lost during
+ # the number -> string -> number conversions that would occur
+ # if numeric indices are used.
+ resourceArray[numberToHexString(id)] = str;
+}
+
+# Write file header and begin the array we will populate with the resources.
+function writeheader(arrayName, tableName)
+{
+ print "// This code was generated by rctocpp.awk and is not meant to be modified manually."
+ print "#include <resourcestring.h>";
+ print "";
+ print "extern const NativeStringResourceTable " tableName ";";
+ print "const NativeStringResource " arrayName "[] = {";
+}
+
+# Write file footer
+# This function is called after all of the entries have been given to
+# writestringentry. Because we know there are no more entries, we can
+# now write all the entries we received so far when this is called.
+# After we have written all the entries, we close the array and add a
+# constant for the size of the array for convenience.
+function writefooter(arrayName, tableName)
+{
+ writesortedentries();
+ print "};";
+ print "";
+
+ print "const NativeStringResourceTable " tableName " = {";
+ print numEntries ",";
+ print arrayName "};";
+}