summaryrefslogtreecommitdiff
path: root/builtins/mkbuiltins.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtins/mkbuiltins.c')
-rw-r--r--builtins/mkbuiltins.c91
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");
}