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

#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              /* maximum command line arguments */
#define QUOTE  '"'

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

#ifndef TINY
extern int _fmode,_iomode;
extern int (*_ONBREAK)();
extern int CXBRK();
#endif

extern struct UFB _ufbs[];
int argc;                       /* arg count */
char **targv, *argv[MAXARG];     /* arg pointers */

#define MAXWINDOW 40
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;
struct Process *process;
struct FileHandle *handle;

/*
*
* Build argument pointer list
*
*/
while (argc < MAXARG)
        {
        while (isspace(*line))  line++;
        if (*line == '\0')      break;
        pargv = &argv[argc++];
        if (*line == QUOTE)
                {
                *pargv = ++line;  /* ptr inside quoted string */
                while ((*line != '\0') && (*line != QUOTE)) line++;
                if (*line == '\0')  _exit(1);
                else                *line++ = '\0';  /* terminate arg */
                }
        else            /* non-quoted arg */
                {
                *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
*
*/
#ifndef TINY

if (argc == 0)          /* running under workbench      */
        {
        _ufbs[0].ufbfh = NULL;
        _ufbs[1].ufbfh =  Open("Nil:",MODE_NEWFILE);
        _ufbs[1].ufbflg = UFB_NC;
        _ufbs[2].ufbfh = _ufbs[1].ufbfh;
        _ufbs[2].ufbflg = UFB_NC;
        handle = (struct FileHandle *)(_ufbs[0].ufbfh << 2);
        process = (struct Process *)FindTask(0);
        process->pr_ConsoleTask = (APTR)handle->fh_Type;
        x = 0;
        }
else                    /* running under CLI            */
        {
        _ufbs[0].ufbfh = Input();
        _ufbs[1].ufbfh = Output();
        _ufbs[2].ufbfh = Open("Nil:", MODE_NEWFILE);
        x = UFB_NC;                     /* do not close CLI defaults    */
        }

_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;

/*      establish control-c handler */

_ONBREAK = CXBRK;

#endif

/*
*
* Call user's main program
*
*/

main(argc,targv);              /* call main function */
#ifndef TINY
exit(0);
#else
_exit(0);
#endif
}
