diff options
Diffstat (limited to 'builtins/mkbuiltins.c')
-rw-r--r-- | builtins/mkbuiltins.c | 91 |
1 files changed, 70 insertions, 21 deletions
diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c index 278755b4..94953e6c 100644 --- a/builtins/mkbuiltins.c +++ b/builtins/mkbuiltins.c @@ -63,6 +63,8 @@ extern char *strcpy (); #define BUILTIN_FLAG_SPECIAL 0x01 #define BUILTIN_FLAG_ASSIGNMENT 0x02 +#define BASE_INDENT 4 + /* If this stream descriptor is non-zero, then write texinfo documentation to it. */ FILE *documentation_file = (FILE *)NULL; @@ -77,6 +79,10 @@ int inhibit_production = 0; the builtin name, in `./helpfiles'. */ int separate_helpfiles = 0; +/* Non-zero means to create single C strings for each `longdoc', with + embedded newlines, for ease of translation. */ +int single_longdoc_strings = 1; + /* The name of a directory into which the separate external help files will eventually be installed. */ char *helpfile_directory; @@ -128,7 +134,7 @@ ARRAY *saved_builtins = (ARRAY *)NULL; char *special_builtins[] = { ":", ".", "source", "break", "continue", "eval", "exec", "exit", - "export", "readonly", "return", "set", "shift", "trap", "unset", + "export", "readonly", "return", "set", "shift", "times", "trap", "unset", (char *)NULL }; @@ -225,6 +231,8 @@ main (argc, argv) separate_helpfiles = 1; helpfile_directory = argv[arg_index++]; } + else if (strcmp (arg, "-S") == 0) + single_longdoc_strings = 0; else { fprintf (stderr, "%s: Unknown flag %s.\n", argv[0], arg); @@ -373,14 +381,8 @@ array_add (element, array) array->array = (char **)xrealloc (array->array, (array->size += array->growth_rate) * array->width); -#if defined (HAVE_BCOPY) - bcopy (&element, (char *) &(array->array[array->sindex]), array->width); - array->sindex++; - bzero ((char *) &(array->array[array->sindex]), array->width); -#else array->array[array->sindex++] = element; array->array[array->sindex] = (char *)NULL; -#endif /* !HAVE_BCOPY */ } /* Free an allocated array and data pointer. */ @@ -1058,9 +1060,10 @@ save_builtin (builtin) } /* Flags that mean something to write_documentation (). */ -#define STRING_ARRAY 1 -#define TEXINFO 2 -#define PLAINTEXT 4 +#define STRING_ARRAY 0x01 +#define TEXINFO 0x02 +#define PLAINTEXT 0x04 +#define HELPFILE 0x08 char *structfile_header[] = { "/* builtins.c -- the built in shell commands. */", @@ -1271,7 +1274,7 @@ write_longdocs (stream, builtins) sarray[0] = (char *)xmalloc (l + 1); sprintf (sarray[0], "%s/%s", helpfile_directory, dname); sarray[1] = (char *)NULL; - write_documentation (stream, sarray, 0, STRING_ARRAY); + write_documentation (stream, sarray, 0, STRING_ARRAY|HELPFILE); free (sarray[0]); } else @@ -1343,8 +1346,10 @@ write_endifs (stream, defines) fprintf (stream, " */\n"); } -/* Write DOCUMENTAION to STREAM, perhaps surrounding it with double-quotes - and quoting special characters in the string. */ +/* Write DOCUMENTATION to STREAM, perhaps surrounding it with double-quotes + and quoting special characters in the string. Handle special things for + internationalization (gettext) and the single-string vs. multiple-strings + issues. */ void write_documentation (stream, documentation, indentation, flags) FILE *stream; @@ -1353,33 +1358,59 @@ write_documentation (stream, documentation, indentation, flags) { register int i, j; register char *line; - int string_array, texinfo; + int string_array, texinfo, base_indent, last_cpp, filename_p; if (!stream) return; string_array = flags & STRING_ARRAY; + filename_p = flags & HELPFILE; + if (string_array) - fprintf (stream, " {\n#if defined (HELP_BUILTIN)\n"); + { + fprintf (stream, " {\n#if defined (HELP_BUILTIN)\n"); /* } */ + if (single_longdoc_strings) + { + if (filename_p == 0) + fprintf (stream, "N_(\" "); /* the empty string translates specially. */ + else + fprintf (stream, "\""); + } + } + + base_indent = (string_array && single_longdoc_strings && filename_p == 0) ? BASE_INDENT : 0; - for (i = 0, texinfo = (flags & TEXINFO); line = documentation[i]; i++) + for (i = last_cpp = 0, texinfo = (flags & TEXINFO); line = documentation[i]; i++) { - /* Allow #ifdef's to be written out verbatim. */ + /* Allow #ifdef's to be written out verbatim, but don't put them into + separate help files. */ if (*line == '#') { - if (string_array) + if (string_array && filename_p == 0 && single_longdoc_strings == 0) fprintf (stream, "%s\n", line); + last_cpp = 1; continue; } + else + last_cpp = 0; /* prefix with N_( for gettext */ - if (string_array) - fprintf (stream, " N_(\""); + if (string_array && single_longdoc_strings == 0) + { + if (filename_p == 0) + fprintf (stream, " N_(\" "); /* the empty string translates specially. */ + else + fprintf (stream, " \""); + } if (indentation) for (j = 0; j < indentation; j++) fprintf (stream, " "); + /* Don't indent the first line, because of how the help builtin works. */ + if (i == 0) + indentation += base_indent; + if (string_array) { for (j = 0; line[j]; j++) @@ -1397,7 +1428,16 @@ write_documentation (stream, documentation, indentation, flags) } /* closing right paren for gettext */ - fprintf (stream, "\"),\n"); + if (single_longdoc_strings == 0) + { + if (filename_p == 0) + fprintf (stream, "\"),\n"); + else + fprintf (stream, "\",\n"); + } + else if (documentation[i+1]) + /* don't add extra newline after last line */ + fprintf (stream, "\\n\\\n"); } else if (texinfo) { @@ -1421,6 +1461,15 @@ write_documentation (stream, documentation, indentation, flags) fprintf (stream, "%s\n", line); } + /* closing right paren for gettext */ + if (string_array && single_longdoc_strings) + { + if (filename_p == 0) + fprintf (stream, "\"),\n"); + else + fprintf (stream, "\",\n"); + } + if (string_array) fprintf (stream, "#endif /* HELP_BUILTIN */\n (char *)NULL\n};\n"); } |