/* --------------- Moved here from job.c ---------------
   This file must be #included in job.c, as it accesses static functions.

Copyright (C) 1996-2016 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3 of the License, or (at your option) any later
version.

GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <string.h>
#include <descrip.h>
#include <clidef.h>

/* TODO - VMS specific header file conditionally included in makeint.h */

#include <stsdef.h>
#include <ssdef.h>
void
decc$exit (int status);

/* Lowest legal non-success VMS exit code is 8 */
/* GNU make only defines codes 0, 1, 2 */
/* So assume any exit code > 8 is a VMS exit code */

#ifndef MAX_EXPECTED_EXIT_CODE
# define MAX_EXPECTED_EXIT_CODE 7
#endif


#if __CRTL_VER >= 70302000 && !defined(__VAX)
# define MAX_DCL_LINE_LENGTH 4095
# define MAX_DCL_CMD_LINE_LENGTH 8192
#else
# define MAX_DCL_LINE_LENGTH 255
# define MAX_DCL_CMD_LINE_LENGTH 1024
#endif
#define MAX_DCL_TOKEN_LENGTH 255
#define MAX_DCL_TOKENS 127

enum auto_pipe { nopipe, add_pipe, dcl_pipe };

char *vmsify (char *name, int type);

static int vms_jobsefnmask = 0;

/* returns whether path is assumed to be a unix like shell. */
int
_is_unixy_shell (const char *path)
{
  return vms_gnv_shell;
}

#define VMS_GETMSG_MAX 256
static char vms_strsignal_text[VMS_GETMSG_MAX + 2];

char *
vms_strsignal (int status)
{
  if (status <= MAX_EXPECTED_EXIT_CODE)
    sprintf (vms_strsignal_text, "lib$spawn returned %x", status);
  else
    {
      int vms_status;
      unsigned short * msg_len;
      unsigned char out[4];
      vms_status = SYS$GETMSG (status, &msg_len,
                               vms_strsignal_text, 7, *out);
    }

  return vms_strsignal_text;
}


/* Wait for nchildren children to terminate */
static void
vmsWaitForChildren (int *status)
{
  while (1)
    {
      if (!vms_jobsefnmask)
        {
          *status = 0;
          return;
        }

      *status = sys$wflor (32, vms_jobsefnmask);
    }
  return;
}

static int ctrlYPressed= 0;
/* This is called at main or AST level. It is at AST level for DONTWAITFORCHILD
   and at main level otherwise. In any case it is called when a child process
   terminated. At AST level it won't get interrupted by anything except a
   inner mode level AST.
*/
static int
vmsHandleChildTerm (struct child *child)
{
  int exit_code;
  register struct child *lastc, *c;
  int child_failed;

  /* The child efn is 0 when a built-in or null command is executed
     successfully with out actually creating a child.
  */
  if (child->efn > 0)
  {
    vms_jobsefnmask &= ~(1 << (child->efn - 32));

    lib$free_ef (&child->efn);
  }
  if (child->comname)
    {
      if (!ISDB (DB_JOBS) && !ctrlYPressed)
        unlink (child->comname);
      free (child->comname);
    }

  (void) sigblock (fatal_signal_mask);

  /* First check to see if this is a POSIX exit status and handle */
  if ((child->cstatus & VMS_POSIX_EXIT_MASK) == VMS_POSIX_EXIT_MASK)
    {
      exit_code = (child->cstatus >> 3) & 255;
      if (exit_code != MAKE_SUCCESS)
        child_failed = 1;
    }
  else
    {
      child_failed = !$VMS_STATUS_SUCCESS (child->cstatus);
      if (child_failed)
        exit_code = child->cstatus;
    }

  /* Search for a child matching the deceased one.  */
  lastc = 0;
#if defined(RECURSIVEJOBS)
  /* I've had problems with recursive stuff and process handling */
  for (c = children; c != 0 && c != child; lastc = c, c = c->next)
    ;
#else
  c = child;
#endif

  if ($VMS_STATUS_SUCCESS (child->vms_launch_status))
    {
      /* Convert VMS success status to 0 for UNIX code to be happy */
      child->vms_launch_status = 0;
    }

  /* Set the state flag to say the commands have finished.  */
  c->file->command_state = cs_finished;
  notice_finished_file (c->file);

  (void) sigsetmask (sigblock (0) & ~(fatal_signal_mask));

  return 1;
}

/* VMS:
   Spawn a process executing the command in ARGV and return its pid. */

/* local helpers to make ctrl+c and ctrl+y working, see below */
#include <iodef.h>
#include <libclidef.h>
#include <ssdef.h>

static int ctrlMask= LIB$M_CLI_CTRLY;
static int oldCtrlMask;
static int setupYAstTried= 0;
static unsigned short int chan= 0;

static void
reEnableAst(void)
{
  lib$enable_ctrl (&oldCtrlMask,0);
}

static int
astYHandler (void)
{
  struct child *c;
  for (c = children; c != 0; c = c->next)
    sys$delprc (&c->pid, 0, 0);
  ctrlYPressed= 1;
  kill (getpid(),SIGQUIT);
  return SS$_NORMAL;
}

static void
tryToSetupYAst(void)
{
  $DESCRIPTOR(inputDsc,"SYS$COMMAND");
  int     status;
  struct {
    short int       status, count;
    int     dvi;
  } iosb;
  unsigned short int loc_chan;

  setupYAstTried++;

  if (chan)
    loc_chan= chan;
  else
    {
      status= sys$assign(&inputDsc,&loc_chan,0,0);
      if (!(status&SS$_NORMAL))
        {
          lib$signal(status);
          return;
        }
    }
  status= sys$qiow (0, loc_chan, IO$_SETMODE|IO$M_CTRLYAST,&iosb,0,0,
                    astYHandler,0,0,0,0,0);
  if (status==SS$_NORMAL)
    status= iosb.status;
  if (status!=SS$_NORMAL)
    {
      if (!chan)
        sys$dassgn(loc_chan);
      if (status!=SS$_ILLIOFUNC && status!=SS$_NOPRIV)
        lib$signal(status);
      return;
    }

  /* called from AST handler ? */
  if (setupYAstTried>1)
    return;
  if (atexit(reEnableAst))
    fprintf (stderr,
             _("-warning, you may have to re-enable CTRL-Y handling from DCL.\n"));
  status= lib$disable_ctrl (&ctrlMask, &oldCtrlMask);
  if (!(status&SS$_NORMAL))
    {
      lib$signal(status);
      return;
    }
  if (!chan)
    chan = loc_chan;
}

/* Check if a token is too long */
#define INC_TOKEN_LEN_OR_RETURN(x) {token->length++; \
  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
    { token->cmd_errno = ERANGE; return x; }}

#define INC_TOKEN_LEN_OR_BREAK {token->length++; \
  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
    { token->cmd_errno = ERANGE; break; }}

#define ADD_TOKEN_LEN_OR_RETURN(add_len, x) {token->length += add_len; \
  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
    { token->cmd_errno = ERANGE; return x; }}

/* Check if we are out of space for more tokens */
#define V_NEXT_TOKEN { if (cmd_tkn_index < MAX_DCL_TOKENS) \
  cmd_tokens[++cmd_tkn_index] = NULL; \
  else { token.cmd_errno = E2BIG; break; } \
  token.length = 0;}


#define UPDATE_TOKEN {cmd_tokens[cmd_tkn_index] = strdup(token.text); \
  V_NEXT_TOKEN;}

#define EOS_ERROR(x) { if (*x == 0) { token->cmd_errno = ERANGE; break; }}

struct token_info
  {
    char *text;       /* Parsed text */
    int length;       /* Length of parsed text */
    char *src;        /* Pointer to source text */
    int cmd_errno;    /* Error status of parse */
    int use_cmd_file; /* Force use of a command file */
  };


/* Extract a Posix single quoted string from input line */
static char *
posix_parse_sq (struct token_info *token)
{
  /* A Posix quoted string with no expansion unless in a string
     Unix simulation means no lexical functions present.
  */
  char * q;
  char * p;
  q = token->text;
  p = token->src;

  *q++ = '"';
  p++;
  INC_TOKEN_LEN_OR_RETURN (p);

  while (*p != '\'' && (token->length < MAX_DCL_TOKEN_LENGTH))
    {
      EOS_ERROR (p);
      if (*p == '"')
        {
          /* Embedded double quotes need to be doubled */
          *q++ = '"';
          INC_TOKEN_LEN_OR_BREAK;
          *q = '"';
        }
      else
        *q = *p;

      q++;
      p++;
      INC_TOKEN_LEN_OR_BREAK;
    }
  *q++ = '"';
  p++;
  INC_TOKEN_LEN_OR_RETURN (p);
  *q = 0;
  return p;
}

/* Extract a Posix double quoted string from input line */
static char *
posix_parse_dq (struct token_info *token)
{
  /* Unix mode:  Any imbedded \" becomes doubled.
                 \t is tab, \\, \$ leading character stripped.
                 $ character replaced with \' unless escaped.
  */
  char * q;
  char * p;
  q = token->text;
  p = token->src;
  *q++ = *p++;
  INC_TOKEN_LEN_OR_RETURN (p);
  while (*p != 0)
    {
      if (*p == '\\')
        {
          switch(p[1])
            {
            case 't':     /* Convert tabs */
              *q = '\t';
              p++;
              break;
            case '\\':     /* Just remove leading backslash */
            case '$':
              p++;
              *q = *p;
              break;
            case '"':
              p++;
              *q = *p;
              *q++ = '"';
              INC_TOKEN_LEN_OR_BREAK;
            default:      /* Pass through unchanged */
              *q++ = *p++;
              INC_TOKEN_LEN_OR_BREAK;
            }
          INC_TOKEN_LEN_OR_BREAK;
        }
      else if (*p == '$' && isalpha (p[1]))
        {
          /* A symbol we should be able to substitute */
          *q++ = '\'';
          INC_TOKEN_LEN_OR_BREAK;
          *q = '\'';
          INC_TOKEN_LEN_OR_BREAK;
          token->use_cmd_file = 1;
        }
      else
        {
          *q = *p;
          INC_TOKEN_LEN_OR_BREAK;
          if (*p == '"')
            {
              p++;
              q++;
              break;
            }
        }
      p++;
      q++;
    }
  *q = 0;
  return p;
}

/* Extract a VMS quoted string or substitution string from input line */
static char *
vms_parse_quotes (struct token_info *token)
{
  /* VMS mode, the \' means that a symbol substitution is starting
     so while you might think you can just copy until the next
     \'.  Unfortunately the substitution can be a lexical function
     which can contain embedded strings and lexical functions.
     Messy, so both types need to be handled together.
  */
  char * q;
  char * p;
  q = token->text;
  p = token->src;
  int parse_level[MAX_DCL_TOKENS + 1];
  int nest = 0;

  parse_level[0] = *p;
  if (parse_level[0] == '\'')
    token->use_cmd_file = 1;

  *q++ = *p++;
  INC_TOKEN_LEN_OR_RETURN (p);


  /* Copy everything until after the next single quote at nest == 0 */
  while (token->length < MAX_DCL_TOKEN_LENGTH)
    {
      EOS_ERROR (p);
      *q = *p;
      INC_TOKEN_LEN_OR_BREAK;
      if ((*p == parse_level[nest]) && (p[1] != '"'))
        {
          if (nest == 0)
            {
              *q++ = *p++;
              break;
            }
          nest--;
        }
      else
        {
          switch(*p)
            {
            case '\\':
              /* Handle continuation on to next line */
              if (p[1] != '\n')
                break;
              p++;
              p++;
              *q = *p;
              break;
            case '(':
              /* Parenthesis only in single quote level */
              if (parse_level[nest] == '\'')
                {
                  nest++;
                  parse_level[nest] == ')';
                }
              break;
            case '"':
              /* Double quotes only in parenthesis */
              if (parse_level[nest] == ')')
                {
                  nest++;
                  parse_level[nest] == '"';
                }
              break;
            case '\'':
              /* Symbol substitution ony in double quotes */
              if ((p[1] == '\'') && (parse_level[nest] == '"'))
                {
                  nest++;
                  parse_level[nest] == '\'';
                  *p++ = *q++;
                  token->use_cmd_file = 1;
                  INC_TOKEN_LEN_OR_BREAK;
                  break;
                }
              *q = *p;
            }
        }
      p++;
      q++;
      /* Pass through doubled double quotes */
      if ((*p == '"') && (p[1] == '"') && (parse_level[nest] == '"'))
      {
        *p++ = *q++;
        INC_TOKEN_LEN_OR_BREAK;
        *p++ = *q++;
        INC_TOKEN_LEN_OR_BREAK;
      }
    }
  *q = 0;
  return p;
}

/* Extract a $ string from the input line */
static char *
posix_parse_dollar (struct token_info *token)
{
  /* $foo becomes 'foo' */
  char * q;
  char * p;
  q = token->text;
  p = token->src;
  token->use_cmd_file = 1;

  p++;
  *q++ = '\'';
  INC_TOKEN_LEN_OR_RETURN (p);

  while ((isalnum (*p)) || (*p == '_'))
    {
      *q++ = *p++;
      INC_TOKEN_LEN_OR_BREAK;
    }
  *q++ = '\'';
  while (1)
    {
      INC_TOKEN_LEN_OR_BREAK;
      break;
    }
  *q = 0;
  return p;
}

const char *vms_filechars = "0123456789abcdefghijklmnopqrstuvwxyz" \
   "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]<>:/_-.$";

/* Simple text copy */
static char *
parse_text (struct token_info *token, int assignment_hack)
{
  char * q;
  char * p;
  int str_len;
  q = token->text;
  p = token->src;

  /* If assignment hack, then this text needs to be double quoted. */
  if (vms_unix_simulation && (assignment_hack == 2))
    {
      *q++ = '"';
      INC_TOKEN_LEN_OR_RETURN (p);
    }

  *q++ = *p++;
  INC_TOKEN_LEN_OR_RETURN (p);

  while (*p != 0)
    {
      str_len = strspn (p, vms_filechars);
      if (str_len == 0)
        {
          /* Pass through backslash escapes in Unix simulation
             probably will not work anyway.
             All any character after a ^ otherwise to support EFS.
          */
          if (vms_unix_simulation && (p[0] == '\\') && (p[1] != 0))
            str_len = 2;
          else if ((p[0] == '^') && (p[1] != 0))
            str_len = 2;
          else if (!vms_unix_simulation && (p[0] == ';'))
            str_len = 1;

          if (str_len == 0)
            {
              /* If assignment hack, then this needs to be double quoted. */
              if (vms_unix_simulation && (assignment_hack == 2))
              {
                *q++ = '"';
                INC_TOKEN_LEN_OR_RETURN (p);
              }
              *q = 0;
              return p;
            }
        }
      if (str_len > 0)
        {
          ADD_TOKEN_LEN_OR_RETURN (str_len, p);
          strncpy (q, p, str_len);
          p += str_len;
          q += str_len;
          *q = 0;
        }
    }
  /* If assignment hack, then this text needs to be double quoted. */
  if (vms_unix_simulation && (assignment_hack == 2))
    {
      *q++ = '"';
      INC_TOKEN_LEN_OR_RETURN (p);
    }
  return p;
}

/* single character copy */
static char *
parse_char (struct token_info *token, int count)
{
  char * q;
  char * p;
  q = token->text;
  p = token->src;

  while (count > 0)
    {
      *q++ = *p++;
      INC_TOKEN_LEN_OR_RETURN (p);
      count--;
    }
  *q = 0;
  return p;
}

/* Build a command string from the collected tokens
   and process built-ins now
*/
static struct dsc$descriptor_s *
build_vms_cmd (char **cmd_tokens,
               enum auto_pipe use_pipe_cmd,
               int append_token)
{
  struct dsc$descriptor_s *cmd_dsc;
  int cmd_tkn_index;
  char * cmd;
  int cmd_len;
  int semicolon_seen;

  cmd_tkn_index = 0;
  cmd_dsc = xmalloc (sizeof (struct dsc$descriptor_s));

  /* Empty command? */
  if (cmd_tokens[0] == NULL)
    {
      cmd_dsc->dsc$a_pointer = NULL;
      cmd_dsc->dsc$w_length = 0;
      return cmd_dsc;
    }

  /* Max DCL command + 1 extra token and trailing space */
  cmd = xmalloc (MAX_DCL_CMD_LINE_LENGTH + 256);

  cmd[0] = '$';
  cmd[1] = 0;
  cmd_len = 1;

  /* Handle real or auto-pipe */
  if (use_pipe_cmd == add_pipe)
    {
      /* We need to auto convert to a pipe command */
      strcat (cmd, "pipe ");
      cmd_len += 5;
    }

  semicolon_seen = 0;
  while (cmd_tokens[cmd_tkn_index] != NULL)
    {

      /* Check for buffer overflow */
      if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
        {
          errno = E2BIG;
          break;
        }

      /* Eliminate double ';' */
      if (semicolon_seen && (cmd_tokens[cmd_tkn_index][0] == ';'))
        {
          semicolon_seen = 0;
          free (cmd_tokens[cmd_tkn_index++]);
          if (cmd_tokens[cmd_tkn_index] == NULL)
            break;
        }

      /* Special handling for CD built-in */
      if (strncmp (cmd_tokens[cmd_tkn_index], "builtin_cd", 11) == 0)
        {
          int result;
          semicolon_seen = 0;
          free (cmd_tokens[cmd_tkn_index]);
          cmd_tkn_index++;
          if (cmd_tokens[cmd_tkn_index] == NULL)
            break;
          DB(DB_JOBS, (_("BUILTIN CD %s\n"), cmd_tokens[cmd_tkn_index]));

          /* TODO: chdir fails with some valid syntaxes */
          result = chdir (cmd_tokens[cmd_tkn_index]);
          if (result != 0)
            {
              /* TODO: Handle failure better */
              free (cmd);
              while (cmd_tokens[cmd_tkn_index] == NULL)
                free (cmd_tokens[cmd_tkn_index++]);
              cmd_dsc->dsc$w_length = -1;
              cmd_dsc->dsc$a_pointer = NULL;
              return cmd_dsc;
            }
        }
      else if (strncmp (cmd_tokens[cmd_tkn_index], "exit", 5) == 0)
        {
          /* Copy the exit command */
          semicolon_seen = 0;
          strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
          cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
          free (cmd_tokens[cmd_tkn_index++]);
          if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
            {
              errno = E2BIG;
              break;
            }

          /* Optional whitespace */
          if (isspace (cmd_tokens[cmd_tkn_index][0]))
            {
              strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
              cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
              free (cmd_tokens[cmd_tkn_index++]);
              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
              {
                errno = E2BIG;
                break;
              }
            }

          /* There should be a status, but it is optional */
          if (cmd_tokens[cmd_tkn_index][0] == ';')
            continue;

          /* If Unix simulation, add '((' */
          if (vms_unix_simulation)
            {
              strcpy (&cmd[cmd_len], "((");
              cmd_len += 2;
              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
                {
                  errno = E2BIG;
                  break;
                }
            }

          /* Add the parameter */
          strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
          cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
          free (cmd_tokens[cmd_tkn_index++]);
          if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
            {
              errno = E2BIG;
              break;
            }

          /* Add " * 8) .and. %x7f8) .or. %x1035a002" */
          if (vms_unix_simulation)
            {
              const char *end_str = " * 8) .and. %x7f8) .or. %x1035a002";
              strcpy (&cmd[cmd_len], end_str);
              cmd_len += strlen (end_str);
              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
                {
                  errno = E2BIG;
                  break;
                }
            }
          continue;
        }

      /* auto pipe needs spaces before semicolon */
      if (use_pipe_cmd == add_pipe)
        if (cmd_tokens[cmd_tkn_index][0] == ';')
          {
            cmd[cmd_len++] = ' ';
            semicolon_seen = 1;
            if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
              {
                errno = E2BIG;
                break;
              }
          }
        else
          {
            char ch;
            ch = cmd_tokens[cmd_tkn_index][0];
            if (!(ch == ' ' || ch == '\t'))
              semicolon_seen = 0;
          }

      strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
      cmd_len += strlen (cmd_tokens[cmd_tkn_index]);

      free (cmd_tokens[cmd_tkn_index++]);

      /* Skip the append tokens if they exist */
      if (cmd_tkn_index == append_token)
        {
          free (cmd_tokens[cmd_tkn_index++]);
          if (isspace (cmd_tokens[cmd_tkn_index][0]))
            free (cmd_tokens[cmd_tkn_index++]);
          free (cmd_tokens[cmd_tkn_index++]);
        }
    }

  cmd[cmd_len] = 0;
  cmd_dsc->dsc$w_length = cmd_len;
  cmd_dsc->dsc$a_pointer = cmd;
  cmd_dsc->dsc$b_dtype = DSC$K_DTYPE_T;
  cmd_dsc->dsc$b_class = DSC$K_CLASS_S;

  return cmd_dsc;
}

int
child_execute_job (struct child *child, char *argv)
{
  int i;

  static struct dsc$descriptor_s *cmd_dsc;
  static struct dsc$descriptor_s pnamedsc;
  int spflags = CLI$M_NOWAIT;
  int status;
  int comnamelen;
  char procname[100];

  char *p;
  char *cmd_tokens[(MAX_DCL_TOKENS * 2) + 1]; /* whitespace does not count */
  char token_str[MAX_DCL_TOKEN_LENGTH + 1];
  struct token_info token;
  int cmd_tkn_index;
  int paren_level = 0;
  enum auto_pipe use_pipe_cmd = nopipe;
  int append_token = -1;
  char *append_file = NULL;
  int unix_echo_cmd = 0;  /* Special handle Unix echo command */
  int assignment_hack = 0; /* Handle x=y command as piped command */

  /* Parse IO redirection.  */

  child->comname = NULL;

  DB (DB_JOBS, ("child_execute_job (%s)\n", argv));

  while (isspace ((unsigned char)*argv))
    argv++;

  if (*argv == 0)
    {
      /* Only a built-in or a null command - Still need to run term AST */
      child->cstatus = VMS_POSIX_EXIT_MASK;
      child->vms_launch_status = SS$_NORMAL;
      /* TODO what is this "magic number" */
      child->pid = 270163; /* Special built-in */
      child->efn = 0;
      vmsHandleChildTerm (child);
      return 1;
    }

  sprintf (procname, "GMAKE_%05x", getpid () & 0xfffff);
  pnamedsc.dsc$w_length = strlen (procname);
  pnamedsc.dsc$a_pointer = procname;
  pnamedsc.dsc$b_dtype = DSC$K_DTYPE_T;
  pnamedsc.dsc$b_class = DSC$K_CLASS_S;

  /* Old */
  /* Handle comments and redirection.
     For ONESHELL, the redirection must be on the first line. Any other
     redirection token is handled by DCL, that is, the pipe command with
     redirection can be used, but it should not be used on the first line
     for ONESHELL. */

  /* VMS parser notes:
     1. A token is any of DCL verbs, qualifiers, parameters, or punctuation.
     2. Only MAX_DCL_TOKENS per line in both one line or command file mode.
     3. Each token limited to MAC_DCL_TOKEN_LENGTH
     4. If the line to DCL is greater than MAX_DCL_LINE_LENGTH then a
        command file must be used.
     5. Currently a command file must be used symbol substitution is to
        be performed.
     6. Currently limiting command files to 2 * MAX_DCL_TOKENS.

     Build both a command file token list and command line token list
     until it is determined that the command line limits are exceeded.
  */

  cmd_tkn_index = 0;
  cmd_tokens[cmd_tkn_index] = NULL;
  p = argv;

  token.text = token_str;
  token.length = 0;
  token.cmd_errno = 0;
  token.use_cmd_file = 0;

  while (*p != 0)
    {
      /* We can not build this command so give up */
      if (token.cmd_errno != 0)
        break;

      token.src = p;

      switch (*p)
        {
        case '\'':
          if (vms_unix_simulation || unix_echo_cmd)
            {
              p = posix_parse_sq (&token);
              UPDATE_TOKEN;
              break;
            }

          /* VMS mode, the \' means that a symbol substitution is starting
             so while you might think you can just copy until the next
             \'.  Unfortunately the substitution can be a lexical function
             which can contain embedded strings and lexical functions.
             Messy.
          */
          p = vms_parse_quotes (&token);
          UPDATE_TOKEN;
          break;
        case '"':
          if (vms_unix_simulation)
            {
              p = posix_parse_dq (&token);
              UPDATE_TOKEN;
              break;
            }

          /* VMS quoted string, can contain lexical functions with
             quoted strings and nested lexical functions.
          */
          p = vms_parse_quotes (&token);
          UPDATE_TOKEN;
          break;

        case '$':
          if (vms_unix_simulation)
            {
              p = posix_parse_dollar (&token);
              UPDATE_TOKEN;
              break;
            }

          /* Otherwise nothing special */
          p = parse_text (&token, 0);
          UPDATE_TOKEN;
          break;
        case '\\':
          if (p[1] == '\n')
            {
              /* Line continuation, remove it */
              p += 2;
              break;
            }

          /* Ordinary character otherwise */
          if (assignment_hack != 0)
            assignment_hack++;
          if (assignment_hack > 2)
            {
              assignment_hack = 0;          /* Reset */
              if (use_pipe_cmd == nopipe)   /* force pipe use */
                use_pipe_cmd = add_pipe;
              token_str[0] = ';';              /* add ; token */
              token_str[1] = 0;
              UPDATE_TOKEN;
            }
          p = parse_text (&token, assignment_hack);
          UPDATE_TOKEN;
          break;
        case '!':
        case '#':
          /* Unix '#' is VMS '!' which comments out the rest of the line.
             Historically the rest of the line has been skipped.
             Not quite the right thing to do, as the f$verify lexical
             function works in comments.  But this helps keep the line
             lengths short.
          */
          unix_echo_cmd = 0;
          while (*p != '\n' && *p != 0)
            p++;
          break;
        case '(':
          /* Subshell, equation, or lexical function argument start */
          p = parse_char (&token, 1);
          UPDATE_TOKEN;
          paren_level++;
          break;
        case ')':
          /* Close out a paren level */
          p = parse_char (&token, 1);
          UPDATE_TOKEN;
          paren_level--;
          /* TODO: Should we diagnose if paren_level goes negative? */
          break;
        case '&':
          if (isalpha (p[1]) && !vms_unix_simulation)
            {
              /* VMS symbol substitution */
              p = parse_text (&token, 0);
              token.use_cmd_file = 1;
              UPDATE_TOKEN;
              break;
            }
          if (use_pipe_cmd == nopipe)
            use_pipe_cmd = add_pipe;
          if (p[1] != '&')
            p = parse_char (&token, 1);
          else
            p = parse_char (&token, 2);
          UPDATE_TOKEN;
          break;
        case '|':
          if (use_pipe_cmd == nopipe)
            use_pipe_cmd = add_pipe;
          if (p[1] != '|')
            p = parse_char (&token, 1);
          else
            p = parse_char (&token, 2);
          UPDATE_TOKEN;
          break;
        case ';':
          /* Separator - convert to a pipe command. */
          unix_echo_cmd = 0;
        case '<':
          if (use_pipe_cmd == nopipe)
            use_pipe_cmd = add_pipe;
          p = parse_char (&token, 1);
          UPDATE_TOKEN;
          break;
        case '>':
          if (use_pipe_cmd == nopipe)
            use_pipe_cmd = add_pipe;
          if (p[1] == '>')
            {
              /* Parsing would have been simple until support for the >>
                 append redirect was added.
                 Implementation needs:
                 * if not exist output file create empty
                 * open/append gnv$make_temp??? output_file
                 * define/user sys$output gnv$make_temp???
                 ** And all this done before the command previously tokenized.
                 * command previously tokenized
                 * close gnv$make_temp???
              */
              p = parse_char (&token, 2);
              append_token = cmd_tkn_index;
              token.use_cmd_file = 1;
            }
          else
            p = parse_char (&token, 1);
          UPDATE_TOKEN;
          break;
        case '/':
          /* Unix path or VMS option start, read until non-path symbol */
          if (assignment_hack != 0)
            assignment_hack++;
          if (assignment_hack > 2)
            {
              assignment_hack = 0;          /* Reset */
              if (use_pipe_cmd == nopipe)   /* force pipe use */
                use_pipe_cmd = add_pipe;
              token_str[0] = ';';              /* add ; token */
              token_str[1] = 0;
              UPDATE_TOKEN;
            }
          p = parse_text (&token, assignment_hack);
          UPDATE_TOKEN;
          break;
        case ':':
          if ((p[1] == 0) || isspace (p[1]))
            {
              /* Unix Null command - treat as comment until next command */
              unix_echo_cmd = 0;
              p++;
              while (*p != 0)
                {
                  if (*p == ';')
                    {
                      /* Remove Null command from pipeline */
                      p++;
                      break;
                    }
                  p++;
                }
              break;
            }

          /* String assignment */
          /* := :== or : */
          if (p[1] != '=')
            p = parse_char (&token, 1);
          else if (p[2] != '=')
            p = parse_char (&token, 2);
          else
            p = parse_char (&token, 3);
          UPDATE_TOKEN;
          break;
        case '=':
          /* = or == */
          /* If this is not an echo statement, this could be a shell
             assignment.  VMS requires the target to be quoted if it
             is not a macro substitution */
          if (!unix_echo_cmd && vms_unix_simulation && (assignment_hack == 0))
            assignment_hack = 1;
          if (p[1] != '=')
            p = parse_char (&token, 1);
          else
            p = parse_char (&token, 2);
          UPDATE_TOKEN;
          break;
        case '+':
        case '-':
        case '*':
          p = parse_char (&token, 1);
          UPDATE_TOKEN;
          break;
        case '.':
          /* .xxx. operation, VMS does not require the trailing . */
          p = parse_text (&token, 0);
          UPDATE_TOKEN;
          break;
        default:
          /* Skip repetitive whitespace */
          if (isspace (*p))
            {
              p = parse_char (&token, 1);

              /* Force to a space or a tab */
              if ((token_str[0] != ' ') ||
                  (token_str[0] != '\t'))
                token_str[0] = ' ';
              UPDATE_TOKEN;

              while (isspace (*p))
                p++;
              if (assignment_hack != 0)
                assignment_hack++;
              break;
            }

          if (assignment_hack != 0)
            assignment_hack++;
          if (assignment_hack > 2)
            {
              assignment_hack = 0;          /* Reset */
              if (use_pipe_cmd == nopipe)   /* force pipe use */
                use_pipe_cmd = add_pipe;
              token_str[0] = ';';              /* add ; token */
              token_str[1] = 0;
              UPDATE_TOKEN;
            }
          p = parse_text (&token, assignment_hack);
          if (strncasecmp (token.text, "echo", 4) == 0)
            unix_echo_cmd = 1;
          else if (strncasecmp (token.text, "pipe", 4) == 0)
            use_pipe_cmd = dcl_pipe;
          UPDATE_TOKEN;
          break;
        }
    }

  /* End up here with a list of tokens to build a command line.
     Deal with errors detected during parsing.
   */
  if (token.cmd_errno != 0)
    {
      while (cmd_tokens[cmd_tkn_index] == NULL)
        free (cmd_tokens[cmd_tkn_index++]);
      child->cstatus = VMS_POSIX_EXIT_MASK | (MAKE_TROUBLE << 3);
      child->vms_launch_status = SS$_ABORT;
      /* TODO what is this "magic number" */
      child->pid = 270163; /* Special built-in */
      child->efn = 0;
      errno = token.cmd_errno;
      return 0;
    }

  /* Save any redirection to append file */
  if (append_token != -1)
    {
      int file_token;
      char * lastdot;
      char * lastdir;
      char * raw_append_file;
      file_token = append_token;
      file_token++;
      if (isspace (cmd_tokens[file_token][0]))
        file_token++;
      raw_append_file = vmsify (cmd_tokens[file_token], 0);
      /* VMS DCL needs a trailing dot if null file extension */
      lastdot = strrchr(raw_append_file, '.');
      lastdir = strrchr(raw_append_file, ']');
      if (lastdir == NULL)
        lastdir = strrchr(raw_append_file, '>');
      if (lastdir == NULL)
        lastdir = strrchr(raw_append_file, ':');
      if ((lastdot == NULL) || (lastdot > lastdir))
        {
          append_file = xmalloc (strlen (raw_append_file) + 1);
          strcpy (append_file, raw_append_file);
          strcat (append_file, ".");
        }
      else
        append_file = strdup(raw_append_file);
    }

  cmd_dsc = build_vms_cmd (cmd_tokens, use_pipe_cmd, append_token);
  if (cmd_dsc->dsc$a_pointer == NULL)
    {
      if (cmd_dsc->dsc$w_length < 0)
        {
          free (cmd_dsc);
          child->cstatus = VMS_POSIX_EXIT_MASK | (MAKE_TROUBLE << 3);
          child->vms_launch_status = SS$_ABORT;
          /* TODO what is this "magic number" */
          child->pid = 270163; /* Special built-in */
          child->efn = 0;
          return 0;
        }

      /* Only a built-in or a null command - Still need to run term AST */
      free (cmd_dsc);
      child->cstatus = VMS_POSIX_EXIT_MASK;
      child->vms_launch_status = SS$_NORMAL;
      /* TODO what is this "magic number" */
      child->pid = 270163; /* Special built-in */
      child->efn = 0;
      vmsHandleChildTerm (child);
      return 1;
    }

  if (cmd_dsc->dsc$w_length > MAX_DCL_LINE_LENGTH)
    token.use_cmd_file = 1;

  DB(DB_JOBS, (_("DCL: %s\n"), cmd_dsc->dsc$a_pointer));

  /* Enforce the creation of a command file if "vms_always_use_cmd_file" is
     non-zero.
     Further, this way DCL reads the input stream and therefore does
     'forced' symbol substitution, which it doesn't do for one-liners when
     they are 'lib$spawn'ed.

     Otherwise the behavior is:

     Create a *.com file if either the command is too long for
     lib$spawn, or if a redirect appending to a file is desired, or
     symbol substitition.
  */

  if (vms_always_use_cmd_file || token.use_cmd_file)
    {
      FILE *outfile;
      int cmd_len;

      outfile = output_tmpfile (&child->comname,
                                "sys$scratch:gnv$make_cmdXXXXXX.com");
      /*                                          012345678901234567890 */
      if (outfile == 0)
        pfatal_with_name (_("fopen (temporary file)"));
      comnamelen = strlen (child->comname);

      /* The whole DCL "script" is executed as one action, and it behaves as
         any DCL "script", that is errors stop it but warnings do not. Usually
         the command on the last line, defines the exit code.  However, with
         redirections there is a prolog and possibly an epilog to implement
         the redirection.  Both are part of the script which is actually
         executed. So if the redirection encounters an error in the prolog,
         the user actions will not run; if in the epilog, the user actions
         ran, but output is not captured. In both error cases, the error of
         redirection is passed back and not the exit code of the actions. The
         user should be able to enable DCL "script" verification with "set
         verify". However, the prolog and epilog commands are not shown. Also,
         if output redirection is used, the verification output is redirected
         into that file as well. */
      fprintf (outfile, "$ gnv$$make_verify = \"''f$verify(0)'\"\n");
      fprintf (outfile, "$ gnv$$make_pid = f$getjpi(\"\",\"pid\")\n");
      fprintf (outfile, "$ on error then $ goto gnv$$make_error\n");

      /* Handle append redirection */
      if (append_file != NULL)
        {
          /* If file does not exist, create it */
          fprintf (outfile,
                   "$ gnv$$make_al = \"gnv$$make_append''gnv$$make_pid'\"\n");
          fprintf (outfile,
                   "$ if f$search(\"%s\") .eqs. \"\" then create %s\n",
                   append_file, append_file);

          fprintf (outfile,
                   "$ open/append 'gnv$$make_al' %s\n", append_file);

          /* define sys$output to that file */
          fprintf (outfile,
                   "$ define/user sys$output 'gnv$$make_al'\n");
          DB (DB_JOBS, (_("Append output to %s\n"), append_file));
          free(append_file);
        }

      fprintf (outfile, "$ gnv$$make_verify = f$verify(gnv$$make_verify)\n");

      /* TODO:
         Only for ONESHELL there will be several commands separated by
         '\n'. But there can always be multiple continuation lines.
      */

      fprintf (outfile, "%s\n", cmd_dsc->dsc$a_pointer);
      fprintf (outfile, "$ gnv$$make_status_2 = $status\n");
      fprintf (outfile, "$ goto gnv$$make_exit\n");

      /* Exit and clean up */
      fprintf (outfile, "$ gnv$$make_error: ! 'f$verify(0)\n");
      fprintf (outfile, "$ gnv$$make_status_2 = $status\n");

      if (append_token != -1)
        {
          fprintf (outfile, "$ deassign sys$output\n");
          fprintf (outfile, "$ close 'gnv$$make_al'\n");

          DB (DB_JOBS,
              (_("Append %.*s and cleanup\n"), comnamelen-3, child->comname));
        }
      fprintf (outfile, "$ gnv$$make_exit: ! 'f$verify(0)\n");
      fprintf (outfile,
             "$ exit 'gnv$$make_status_2' + (0*f$verify(gnv$$make_verify))\n");

      fclose (outfile);

      free (cmd_dsc->dsc$a_pointer);
      cmd_dsc->dsc$a_pointer = xmalloc (256 + 4);
      sprintf (cmd_dsc->dsc$a_pointer, "$ @%s", child->comname);
      cmd_dsc->dsc$w_length = strlen (cmd_dsc->dsc$a_pointer);

      DB (DB_JOBS, (_("Executing %s instead\n"), child->comname));
    }

  child->efn = 0;
  while (child->efn < 32 || child->efn > 63)
    {
      status = LIB$GET_EF ((unsigned long *)&child->efn);
      if (!$VMS_STATUS_SUCCESS (status))
        {
          if (child->comname)
            {
              if (!ISDB (DB_JOBS))
                unlink (child->comname);
              free (child->comname);
            }
          return 0;
        }
    }

  SYS$CLREF (child->efn);

  vms_jobsefnmask |= (1 << (child->efn - 32));

  /* Export the child environment into DCL symbols */
  if (child->environment != 0)
    {
      char **ep = child->environment;
      while (*ep != 0)
        {
          vms_putenv_symbol (*ep);
          *ep++;
        }
    }

  /*
    LIB$SPAWN  [command-string]
    [,input-file]
    [,output-file]
    [,flags]
    [,process-name]
    [,process-id] [,completion-status-address] [,byte-integer-event-flag-num]
    [,AST-address] [,varying-AST-argument]
    [,prompt-string] [,cli] [,table]
  */

#ifndef DONTWAITFORCHILD
  /*
   * Code to make ctrl+c and ctrl+y working.
   * The problem starts with the synchronous case where after lib$spawn is
   * called any input will go to the child. But with input re-directed,
   * both control characters won't make it to any of the programs, neither
   * the spawning nor to the spawned one. Hence the caller needs to spawn
   * with CLI$M_NOWAIT to NOT give up the input focus. A sys$waitfr
   * has to follow to simulate the wanted synchronous behaviour.
   * The next problem is ctrl+y which isn't caught by the crtl and
   * therefore isn't converted to SIGQUIT (for a signal handler which is
   * already established). The only way to catch ctrl+y, is an AST
   * assigned to the input channel. But ctrl+y handling of DCL needs to be
   * disabled, otherwise it will handle it. Not to mention the previous
   * ctrl+y handling of DCL needs to be re-established before make exits.
   * One more: At the time of LIB$SPAWN signals are blocked. SIGQUIT will
   * make it to the signal handler after the child "normally" terminates.
   * This isn't enough. It seems reasonable for simple command lines like
   * a 'cc foobar.c' spawned in a subprocess but it is unacceptable for
   * spawning make. Therefore we need to abort the process in the AST.
   *
   * Prior to the spawn it is checked if an AST is already set up for
   * ctrl+y, if not one is set up for a channel to SYS$COMMAND. In general
   * this will work except if make is run in a batch environment, but there
   * nobody can press ctrl+y. During the setup the DCL handling of ctrl+y
   * is disabled and an exit handler is established to re-enable it.
   * If the user interrupts with ctrl+y, the assigned AST will fire, force
   * an abort to the subprocess and signal SIGQUIT, which will be caught by
   * the already established handler and will bring us back to common code.
   * After the spawn (now /nowait) a sys$waitfr simulates the /wait and
   * enables the ctrl+y be delivered to this code. And the ctrl+c too,
   * which the crtl converts to SIGINT and which is caught by the common
   * signal handler. Because signals were blocked before entering this code
   * sys$waitfr will always complete and the SIGQUIT will be processed after
   * it (after termination of the current block, somewhere in common code).
   * And SIGINT too will be delayed. That is ctrl+c can only abort when the
   * current command completes. Anyway it's better than nothing :-)
   */

  if (!setupYAstTried)
    tryToSetupYAst();
  child->vms_launch_status = lib$spawn (cmd_dsc,               /* cmd-string */
                     NULL, /* input-file */
                     NULL, /* output-file */
                     &spflags,                                 /* flags */
                     &pnamedsc,                                /* proc name */
                     &child->pid, &child->cstatus, &child->efn,
                     0, 0,
                     0, 0, 0);

  status = child->vms_launch_status;
  if ($VMS_STATUS_SUCCESS (status))
    {
      status = sys$waitfr (child->efn);
      vmsHandleChildTerm (child);
    }
#else
  child->vms_launch_status = lib$spawn (cmd_dsc,
                      NULL,
                      NULL,
                      &spflags,
                      &pnamedsc,
                      &child->pid, &child->cstatus, &child->efn,
                      vmsHandleChildTerm, child,
                      0, 0, 0);
   status = child->vms_launch_status;
#endif

  /* Free the pointer if not a command file */
  if (!vms_always_use_cmd_file && !token.use_cmd_file)
    free (cmd_dsc->dsc$a_pointer);
  free (cmd_dsc);

  if (!$VMS_STATUS_SUCCESS (status))
    {
      switch (status)
        {
        case SS$_EXQUOTA:
          errno = EPROCLIM;
          break;
        default:
          errno = EFAIL;
        }
    }

  /* Restore the VMS symbols that were changed */
  if (child->environment != 0)
    {
      char **ep = child->environment;
      while (*ep != 0)
        {
          vms_restore_symbol (*ep);
          *ep++;
        }
    }

  return (status & 1);
}
