/* _main.c Copyright (C) 1985  Lattice, Inc. */

/**
 | The code that opens a window associated with the input/output
 | streams when the program is called from the Workbench has been
 | deleted. Obviously writing something to stdout/stderr means
 | to call for the guru...
**/

#include <stdio.h>
#include <fcntl.h>
#include <ios1.h>
#include <string.h>
#include <stdlib.h>
#include <workbench/startup.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <proto/dos.h>
#include <proto/exec.h>

#define MAXARG 32
#define QUOTE  '"'
#define ESCAPE '*'
#define ESC    '\027'
#define NL     '\n'

#define isspace(c) ((c == ' ')||(c == '\t') || (c == '\n'))

extern int _fmode,_iomode;

extern struct UFB _ufbs[];
static int argc;                        /* arg count */
static char **targv, *argv[MAXARG];     /* arg pointers */
static void badarg(char *program);

extern struct WBStartup *WBenchMsg;

/**
*
* name         _main - process command line, open files, and call "main"
*
* synopsis     _main(line);
*              char *line;     ptr to command line that caused execution
*
* description   This function performs the standard pre-processing for
*               the main module of a C program.  It accepts a command
*               line of the form
*
*                       pgmname arg1 arg2 ...
*
*               and builds a list of pointers to each argument.  The first
*               pointer is to the program name.  For some environments, the
*               standard I/O files are also opened, using file names that
*               were set up by the OS interface module XCMAIN.
*
**/

void _main(line)
register char *line;
{
  register char **pargv;
  register int x;
  char *argbuf;

/*
*
* Build argument pointer list
*
*/

  while (argc < MAXARG) {
    while (isspace(*line))  line++;
    if (*line == '\0')      break;
    pargv = &argv[argc++];
    if (*line == QUOTE) {
      argbuf = *pargv = ++line;  /* ptr inside quoted string */
      while (*line != QUOTE) {
        if (*line == ESCAPE) {
          line++;
          switch (*line) {
            case 'E':
              *argbuf++ = ESC;
              break;
            case 'N':
              *argbuf++ = NL;
              break;
            default:
              *argbuf++ = *line;
          }
          line++;
        } else {
          *argbuf++ = *line++;
        }
      }
      line++;
      *argbuf = '\0'; /* terminate arg */
    } else {
      *pargv = line;
      while ((*line != '\0') && (!isspace(*line))) line++;
      if (*line == '\0')  break;
         else *line++ = '\0';  /* terminate arg */
    }
  }  /* while */
  targv = (argc == 0) ? (char **)WBenchMsg : (char **)&argv[0];

/*
*
* Open standard files
*
*/

  if (argc == 0) {
  } else {
    _ufbs[0].ufbfh = Input();
    _ufbs[1].ufbfh = Output();
    _ufbs[2].ufbfh = Open("*", MODE_OLDFILE);
    x = UFB_NC;

    _ufbs[0].ufbflg |= UFB_RA | O_RAW | x;
    _ufbs[1].ufbflg |= UFB_WA | O_RAW | x;
    _ufbs[2].ufbflg |= UFB_RA | UFB_WA | O_RAW;

    x = (_fmode) ? 0 : _IOXLAT;
    stdin->_file = 0;
    stdin->_flag = _IOREAD | x;
    stdout->_file = 1;
    stdout->_flag = _IOWRT | x;
    stderr->_file = 2;
    stderr->_flag = _IORW | x;
  }

  main(argc,targv);              /* call main function */
  _exit(0);
}
