#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 <stdio.h>
#include <fcntl.h>
#include <ios1.h>
#include <stdlib.h>
#include <workbench/startup.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <intuition/intuitionbase.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#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);
}
