/* Copyright (C) 1986,1987 by Manx Software Systems, Inc. */

/*
 *      This is common startup code for both the CLI and the WorkBench.
 *      When called from the WorkBench, argc is 0 and argv points to a
 *      WBStartup type of structure.
 */

#include <fcntl.h>
#include <exec/alerts.h>
#include <exec/memory.h>
#include <libraries/dosextens.h>
#include "roguestar.h"
#include <functions.h>

extern long _savsp, _stkbase;

extern int errno;
extern int Enable_Abort;
extern int _argc;
extern char **_argv;

struct RogueStartup *RogueStartMsg;
char **environ;

extern struct _dev *_devtab;
extern short _numdev;

_main(alen, aptr)
long alen;
char *aptr;
{
  register struct Process *pp;
  register char **argv;
  register int  argc;

  struct Process *_FindTask();
  void *_OpenLibrary(), *_GetMsg(), *_AllocMem();
  long _Input(), _Output(), _Open();

  if((_devtab = _AllocMem(_numdev*(long)sizeof(struct _dev),MEMF_CLEAR)) == 0) {
   nomem:
    Alert(AG_NoMemory, 0L);
  }

  _devtab[0].mode = O_RDONLY;
  _devtab[1].mode = _devtab[2].mode = O_WRONLY;

  _stkbase = _savsp - *((long *)_savsp+1) + 8;
  *(long *)_stkbase = 0x4d414e58L;

  pp = _FindTask(0L);
  if(alen) {
    _cli_parse(pp, alen, aptr);
    argc=_argc;
    argv=_argv;
    Enable_Abort = 1;
    _devtab[0].mode |= O_STDIO;             /* shouldn't close if CLI */
    _devtab[1].mode |= O_STDIO;
    goto normsetup;
  }
  else {
    int i;
    char *window;
    long wind;
    struct FileHandle *fhp;

    _WaitPort(&pp->pr_MsgPort);
    RogueStartMsg = (struct RogueStartup *)GetMsg(&pp->pr_MsgPort);
    if(RogueStartMsg->rs_dummy==0) {
      argv=RogueStartMsg->rs_argv;
      argc=RogueStartMsg->rs_argc;
      environ=RogueStartMsg->rs_environ;
      pp->pr_CurrentDir=RogueStartMsg->rs_CurrentDir;
      CurrentDir(RogueStartMsg->rs_CurrentDir);

      if(window=RogueStartMsg->rs_ToolWindow) {
        if(wind = _Open(window, MODE_OLDFILE)) {
          fhp = (struct FileHandle *) (wind << 2);
          pp->pr_ConsoleTask = (APTR) fhp->fh_Type;
          pp->pr_CIS = (BPTR)wind;
          pp->pr_COS = (BPTR)_Open("*", MODE_OLDFILE);
          goto normsetup;
        }
      }
      else if(RogueStartMsg->rs_fhc) {
        for(i=0; i<RogueStartMsg->rs_fhc; i++) {
          _devtab[i].fd=RogueStartMsg->rs_fhv[i];
          if(i<32) {
            if((RogueStartMsg->rs_closebits[0]&(1L << i))==0) {
              _devtab[i].mode |= O_STDIO;   /* shouldn't close if CLI */
            }
          }
        }
        pp->pr_CIS=_devtab[0].fd;
        pp->pr_COS=_devtab[1].fd;
      }
      else {
       normsetup:
        _devtab[0].fd = _Input();
        if(_devtab[1].fd = _Output())
                _devtab[2].fd = _Open("*", MODE_OLDFILE);
      }
    }
    else {
      _exit(254);
    }
  }
  _exit(main(argc, argv));
}



