* job.c: fix make action continuation lines.

* vmsjobs.c: fix writing DCL command files when trimming (white
  spaces and $ signs) especially after a split (command continuation).
This commit is contained in:
Hartmut Becker 2014-09-18 23:49:49 +02:00 committed by Paul Smith
parent bd716a1ec1
commit b11bef0bea
2 changed files with 53 additions and 45 deletions

2
job.c
View file

@ -1233,6 +1233,8 @@ start_job_command (struct child *child)
{
if (*s == '"')
instring = !instring;
else if (*s == '\\' && !instring && *(s+1) != 0)
s++;
else if (*s == '\n' && !instring)
{
end = s;

View file

@ -714,31 +714,45 @@ child_execute_job (char *argv, struct child *child)
}
#endif
fprintf (outfile, "$ %.*s_ = f$verify(%.*s_1)\n", tmpstrlen, tmpstr, tmpstrlen, tmpstr);
/* TODO: give 78 a name! Whether 78 is a good number is another question.
Trim, split and write the command lines.
Splitting of a command is done after 78 output characters at an
appropriate place (after strings, after comma or space and
before slash): appending a hyphen indicates that the DCL command
is being continued.
Trimming is to skip any whitespace around - including - a
leading $ from the command to ensure writing exactly one "$ "
at the beginning of the line of the output file. Trimming is
done when a new command is seen, indicated by a '\n' (outside
of a string).
The buffer so far is written and reset, when a new command is
seen, when a split was done and at the end of the command.
Only for ONESHELL there will be several commands separated by
'\n'. But there can always be multiple continuation lines. */
p = sep = q = cmd;
for (c = '\n'; c; c = *q++)
{
switch (c)
{
case '\n':
/* At a newline, skip any whitespace around a leading $
from the command and issue exactly one $ into the DCL. */
while (isspace ((unsigned char)*p))
if (q > p)
{
fwrite(p, 1, q - p, outfile);
p = q;
}
fputc('$', outfile);
fputc(' ', outfile);
while (isspace((unsigned char) *p))
p++;
if (*p == '$')
p++;
while (isspace ((unsigned char)*p))
while (isspace((unsigned char) *p))
p++;
fwrite (p, 1, q - p, outfile);
fputc ('$', outfile);
fputc (' ', outfile);
/* Reset variables. */
p = sep = q;
q = sep = p;
break;
/* Nice places for line breaks are after strings, after
comma or space and before slash. */
case '"':
q = vms_handle_apos (q);
q = vms_handle_apos(q);
sep = q;
break;
case ',':
@ -755,27 +769,19 @@ child_execute_job (char *argv, struct child *child)
if (sep - p > 78)
{
/* Enough stuff for a line. */
fwrite (p, 1, sep - p, outfile);
fwrite(p, 1, sep - p, outfile);
p = sep;
if (*sep)
{
/* The command continues. */
fputc ('-', outfile);
fputc('-', outfile);
}
fputc ('\n', outfile);
fputc('\n', outfile);
}
}
if (*p)
{
/* At the end of the line, skip any whitespace around a leading $
from the command because one $ was already written into the DCL. */
while (isspace((unsigned char) *p))
p++;
if (*p == '$')
p++;
while (isspace((unsigned char) *p))
p++;
fwrite(p, 1, --q - p, outfile);
fputc('\n', outfile);
}