summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
70c8454)
Defining objects in the generated header can make some usage more
difficult. Add an option which defines a macro instead, allowing
the user to control definitions.
# @nozero
# All strings will have a non-zero offset in the strtab.
#
# @nozero
# All strings will have a non-zero offset in the strtab.
#
+# @macro
+# Instead of a variable declaration, the generated header will define an
+# object-like macro that can be used as the initializer for a char array.
+#
# A string is defined by beginning a line with one or two & characters, which
# must be immediately followed by a C identifier. Two & characters indicates
# a string that should not be translated, as described below. A nonempty
# A string is defined by beginning a line with one or two & characters, which
# must be immediately followed by a C identifier. Two & characters indicates
# a string that should not be translated, as described below. A nonempty
# - All other backslashes are deleted. This can be used to prevent special
# handling of whitespace, # or & characters at the beginning of a line.
#
# - All other backslashes are deleted. This can be used to prevent special
# handling of whitespace, # or & characters at the beginning of a line.
#
-# The output defines a variable, strtab, which contains all of the strings,
-# and each identifier in the input is declared as an emumeration constant
-# whose value is the offset of the associated string within strtab.
+# Unless the @macro option is specified, the output defines a variable,
+# strtab, which contains all of the strings, and each identifier in the input
+# is declared as an emumeration constant whose value is the offset of the
+# associated string within strtab. Otherwise, if the @macro option is
+# specified, no variables are defined and STRTAB_INITIALIZER object-like macro
+# may be used to initialize a char array with static storage duration.
#
# Normally, the generated source code wraps strings using the identity macro
# N_(x), which has no effect on the resulting data structures but enables tools
#
# Normally, the generated source code wraps strings using the identity macro
# N_(x), which has no effect on the resulting data structures but enables tools
collected = ident = ""
startline = endline = 0
num_vars = 0
collected = ident = ""
startline = endline = 0
num_vars = 0
strtab_len = 0
count = bucketsort(sorted_strings, strings)
max = 0
strtab_len = 0
count = bucketsort(sorted_strings, strings)
max = 0
print "#ifndef N_"
print "# define N_(x) x"
print "#endif"
print "#ifndef N_"
print "# define N_(x) x"
print "#endif"
- print "\nstatic const char strtab[] ="
+ if (opts["macro"]) {
+ cont = " \\";
+ print "\n#define STRTAB_INITIALIZER" cont;
+ } else {
+ print "\nstatic const char strtab[] =";
+ }
for (i = 0; i < count; i++) {
s = sorted_strings[i]
for (i = 0; i < count; i++) {
s = sorted_strings[i]
if ((n = index(strtab "\1", s "\1")) > 0) {
offsets[sorted_strings[i]] = real_length(substr(strtab, 1, n-1));
if (!(sorted_strings[i] in nol10n))
if ((n = index(strtab "\1", s "\1")) > 0) {
offsets[sorted_strings[i]] = real_length(substr(strtab, 1, n-1));
if (!(sorted_strings[i] in nol10n))
- print "\tSTR_L10N_(N_(\"" sorted_strings[i] "\"))";
+ print "\tSTR_L10N_(N_(\"" sorted_strings[i] "\"))" cont;
} else if (strtab) {
strtab = strtab "\1" s
offsets[sorted_strings[i]] = strtab_len + 1
} else if (strtab) {
strtab = strtab "\1" s
offsets[sorted_strings[i]] = strtab_len + 1
printf("\t%4s ", i > !!opts["zero"] ? "\"\\0\"" : "");
if (split_strtab[i] in nol10n) {
printf("\t%4s ", i > !!opts["zero"] ? "\"\\0\"" : "");
if (split_strtab[i] in nol10n) {
- print "\"" split_strtab[i] "\"";
+ print "\"" split_strtab[i] "\"" cont;
- print "N_(\"" split_strtab[i] "\")";
+ print "N_(\"" split_strtab[i] "\")" cont;
+ print "\t\"\"" substr(";", 1, !opts["macro"]);
print "enum {"
for (i = 0; i < num_vars; i++) {
print "enum {"
for (i = 0; i < num_vars; i++) {
+AT_SETUP([gen-strtab.awk @macro option])
+AT_KEYWORDS([gen-strtab awk script scripts])
+
+AT_DATA([test0.def],
+[[@macro
+&foo foobar
+&bar bar
+&baz baz
+]])
+AT_CHECK([$AWK -f "$builddir/scripts/gen-strtab.awk" <test0.def >test0.h])
+
+AT_DATA([test0.c],
+[[#include <stdio.h>
+extern const char strtab[];
+#include "test0.h"
+
+int main(void)
+{
+ static const char mystrtab[] = STRTAB_INITIALIZER;
+ printf("%s\n%s\n%s\n", mystrtab+foo, mystrtab+bar, mystrtab+baz);
+ return 0;
+}
+]])
+AT_CHECK([$CC -o test0$EXEEXT test0.c && ./test0$EXEEXT], [0],
+[[foobar
+bar
+baz
+]])
+
+AT_CLEANUP
+
AT_SETUP([gen-strtab.awk l10n options])
AT_KEYWORDS([gen-strtab awk script scripts])
AT_SETUP([gen-strtab.awk l10n options])
AT_KEYWORDS([gen-strtab awk script scripts])