#define VERSION "1.18" #define LAST_CHANGED "920229" static char VersionTag[] = "\0$VER: DT v" VERSION " - MLO " LAST_CHANGED ; #define OUT_WINDOW_MAX_HT 100 extern struct IntuitionBase *IntuitionBase; /* _main.c Copyright (C) 1985 Lattice, Inc. * Slightly hacked by MLO for DT.c */ #include #include #include #include #include #include #include #include #include #include #include #include "mlo.h" #include "proto.h" #define MAXARG 32 /* maximum command line arguments */ #define QUOTE '"' #define isspace(c) ((c == ' ') || (c == '\t') || (c == '\n')) extern int _fmode; extern int (*_ONBREAK)(); extern struct UFB _ufbs[]; static int argc = 0; /* arg count */ static char **targv; /* arg pointers */ static char *argv[MAXARG]; #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( register char *line ){ register char **pargv; register int x; struct Process *process; struct FileHandle *handle; static char window[MAXWINDOW+18]; /* * * 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 { *pargv = line; /* non-quoted arg */ while ((*line != '\0') && (!isspace(*line))) line++; if (*line == '\0') break; else *line++ = '\0'; /* terminate arg */ } } targv = (argc == 0) ? (char **) WBenchMsg : (char **) &argv[0]; /* * * Open standard files * */ if (argc == 0) { long lock; /* running under workbench */ int sWidth, sHeight; /* Open intuition library */ if ((IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0L)) == NULL) cleanup(SYS_ABORT_CODE); lock = LockIBase(0); sWidth = IntuitionBase->ActiveScreen->Width; sHeight = IntuitionBase->ActiveScreen->Height; UnlockIBase(lock); if (sHeight > OUT_WINDOW_MAX_HT) sHeight = OUT_WINDOW_MAX_HT; sprintf(window, "Con:0/0/%d/%d/\"DT\" - v%s - MLO %s ", sWidth, sHeight, VERSION, LAST_CHANGED); _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(NULL); process->pr_ConsoleTask = (APTR) handle->fh_Type; x = 0; } else { _ufbs[0].ufbfh = Input(); /* running under CLI */ _ufbs[1].ufbfh = Output(); _ufbs[2].ufbfh = Open("*", MODE_OLDFILE); 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; /* Print header (if from CLI) */ if (argc) fprintf(stdout, "\n\t\"DT\" - v%s - MLO %s\n\n", VERSION, LAST_CHANGED); /* Call user's main program */ main(argc, targv); exit(0); }