home *** CD-ROM | disk | FTP | other *** search
- /* _arpmain.c -- Startup code for arp.library under Lattice.
- *
- * Modified from _main.c supplied by Lattice Inc.
- * Copyright (c) 1988 by Scott Ballantyne
- * Freely useable (at your own risk, of course).
- *
- * Lattice now has an arp 'wrapper', like manx does, so most if not
- * all of the native compiler libraries and features can be used,
- * including onexit()
- * SDB
- */
-
- #include <stdio.h>
- #include <fcntl.h>
- #include <ios1.h>
- #include <string.h>
-
- #include <exec/alerts.h>
- #include <workbench/startup.h>
- #include <libraries/dos.h>
- #include <libraries/dosextens.h>
- #include "libraries/arpbase.h"
- #include <proto/dos.h>
- #include <proto/exec.h>
- #include "arpfunctions.h"
-
- extern int _fmode,_iomode;
- extern int (*_ONBREAK)();
- extern int CXBRK();
-
- extern char *CLI_Template;
- extern char *CLI_Help;
-
- extern struct DosLibrary *DOSBase;
-
- extern struct UFB _ufbs[];
- int argc; /* arg count */
- char *targv;
-
- #define MAXWINDOW 40
- extern struct WBStartup *WBenchMsg;
-
- /* If a WB process, line is a pointer to NULL, otherwise, is a pointer
- * to a reconstructed command line.
- */
-
- void _main(line)
- register char *line;
- {
- register char **pargv;
- register char *c;
- register int x;
-
- if ( *line != '\0' )
- {
- /* Argument parsing alla GADS(): calc sizeof(argv) we need */
- for (x = 3, c = CLI_Template; *c; c++)
- if (*c == ',')
- x++;
- /* Following line will give a warning, just ignore it,
- * lattice is *so* stupid sometimes.
- */
- if ( (pargv = (char **)ArpAlloc( x * sizeof(*pargv))) == NULL)
- exit(20);
- pargv[0] = line; /* Program name */
- while ( *line > ' ') /* Advance to first command */
- line++;
- *line++ = '\0';
-
- argc = GADS(line, strlen(line), CLI_Help, (pargv+1), CLI_Template);
- if (argc < 0 )
- {
- Printf("Bad Args for %s: %s\n", pargv[0], pargv[1]);
- exit(20);
- }
- argc++;
-
- _ufbs[0].ufbfh = Input();
- _ufbs[1].ufbfh = Output();
- _ufbs[2].ufbfh = Open("*", MODE_OLDFILE);
- x = UFB_NC; /* do not close CLI defaults */
- }
- else /* From WorkBench */
- {
- struct Process *process;
- struct FileHandle *handle;
- static char window[MAXWINDOW+18];
-
- argc = 0;
- pargv = (char **)WBenchMsg;
- strcpy(window, "con:10/10/320/80/");
- 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 = (struct Process *)FindTask(0);
- process->pr_ConsoleTask = (APTR)handle->fh_Type;
- x = 0;
- }
-
- _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;
-
- main(argc,targv = (char *)pargv); /* call main function */
- exit(0);
- }
-
-