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

#include "stdio.h"
#include "ios1.h"

#include "workbench/startup.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"

#define MAXARG 32              /* maximum command line arguments */
#define QUOTE  '"'

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

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

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

#define MAXWINDOW 40
extern struct WBStartup *WBenchMsg;
static char window[MAXWINDOW] = "con:10/10/320/80/";
static struct Process *process, *FindTask();
static struct FileHandle *handle;

/**
*
* 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.
*
**/
_main(line)
register char *line;
{
register char **pargv;
register int x;

/*
*
* 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 */
/*
*
* Open standard files
*
*/
#ifndef TINY

if (argc == 0)		/* running under workbench	*/
	{
	strncat(window, WBenchMsg->sm_ArgList->wa_Name,MAXWINDOW);
	_ufbs[0].ufbfh = Open(window,MODE_NEWFILE);
	_ufbs[1].ufbfh = _ufbs[0].ufbfh;
	_ufbs[1].ufbflg = UFB_NC;
	_ufbs[2].ufbfh = _ufbs[0].ufbfh;
	_ufbs[2].ufbflg = UFB_NC;
	handle = (struct FileHandle *)(_ufbs[0].ufbfh << 2);
	process = FindTask(0);
	process->pr_ConsoleTask = handle->fh_Type;
	x = 0;
	}
else			/* running under CLI		*/
	{
	_ufbs[0].ufbfh = Input();
	_ufbs[1].ufbfh = Output();
	_ufbs[2].ufbfh = Open("*", MODE_OLDFILE);
	x = UFB_NC;			/* do not close CLI defaults	*/
	}

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

stdin->_file = _ufbs[0].ufbfh;
stdin->_flag = _IOREAD;
stdout->_file = _ufbs[1].ufbfh;
stdout->_flag = _IOWRT;
stderr->_file = _ufbs[2].ufbfh;
stderr->_flag = _IOWRT;

/*	establish control-c handler */

_ONBREAK = CXBRK;

#endif

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

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

