/*
***************************************************************************
*
* Datei:
*    RSysMain.c
*
* Inhalt:
*
* Bemerkungen:
*    Startup-Routinen von RSys; ruft das Hauptprogramm auf.
*
* Erstellungsdatum:
*    07-Jul-93    Rolf Böhme
*
* Änderungen:
*    07-Jul-93    Rolf Böhme    Erstellung
*
***************************************************************************
*/

#include "RSysfunc.h"

extern long _savsp,
      _stkbase;

extern int errno;
extern int Enable_Abort;

extern int _argc,
      _arg_len;
extern char **_argv,
     *_arg_lin;
extern struct WBStartup *WBenchMsg;

extern struct _dev *_devtab;
extern short _numdev;

extern char hotkey[HOTKEYS][30];

extern UBYTE autocon[];

void  _cli_parse(struct Process *pp, long alen, char *aptr);

extern struct Library *IconBase;

int bpc = 0, bgc = 0;
long bpp = 0x00000000L;
int winddetail = 0,windblock = 1,menudetail = 0;
char *RSysName = NULL;

extern char _dir[], _file[];

void
_wb_parse(void)
{
   return;
};

static long
ahtoi(char *String)
{
	long Value = 0;
	char c;

	while(c = *String)
	{
		Value <<= 4;

		if(c >= '0' && c <= '9')
			Value |= (c & 15);
		else
			Value |= (c & 15) + 9;

		++String;
	}

	return(Value);
}

void
_icon_parse(char *progname)
{
   register char *cp;
   register struct DiskObject *dop;

   if (IconBase = OpenLibrary((UBYTE *) "icon.library", 0L))
   {
      if (dop = GetDiskObject((UBYTE *) progname))
      {
         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "CX_HOTKEY"))
            strcpy(&hotkey[0][0], cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "CX_CRYPT"))
            strcpy(&hotkey[1][0], cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "CX_FINDFILE"))
            strcpy(&hotkey[2][0], cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "CX_FORMAT"))
            strcpy(&hotkey[3][0], cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "CX_HUNKLIST"))
            strcpy(&hotkey[4][0], cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "CX_CRC"))
            strcpy(&hotkey[5][0], cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "CX_SAVEWINDOW"))
            strcpy(&hotkey[6][0], cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "NOFASTMODE"))
            Flags.fastmode = 0;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "NOSORT"))
            Flags.sortmode = 0;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "WORKINGBAR"))
            Flags.workingbar = 1;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "AUTOFRONT"))
            Flags.autofront = 1;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "MOUSEWINDOW"))
            Flags.mousewindow = 1;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "TOPAZFONT"))
            Flags.sysfont = 1;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "NOSAVEASKING"))
            Flags.saveasking = 0;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "NOAPPICON"))
            Flags.appicon = 0;

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "OUTWINDOW"))
            strcpy((char *)autocon,cp);
         else
            strcpy((char *)autocon,"CON:/40//150/Sys - Window/auto/close");

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "BACKPATTERNCOL"))
            bpc = atoi(cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "BACKGROUNDCOL"))
            bgc = atoi(cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "BACKPATTERN"))
            bpp = ahtoi(cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "DETAILPEN"))
            winddetail = atoi(cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "BLOCKPEN"))
            windblock = atoi(cp);

         if (cp = (char *)FindToolType((UBYTE **) dop->do_ToolTypes,(UBYTE *) "MENUPEN"))
            menudetail = atoi(cp);

         FreeDiskObject(dop);
      }

      CloseLibrary(IconBase);
      IconBase = NULL;
   }

   return;
}

void
_main(long alen, char *aptr)
{
   register struct Process *pp;

   SysBase = *(struct ExecBase **) 4;

   if (SysBase->LibNode.lib_Version < 37)
   {
      if (alen)
         PutStr((UBYTE *)"WB 2.0 Only!");

      exit(0);
   }

   if (_devtab = AllocMem(_numdev * (long)sizeof(struct _dev),
                          MEMF_CLEAR))
   {
      LastID = SYSTEMINFO;

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

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

      pp = (struct Process *) FindTask(0L);

      strcpy(hotkey[0], "lshift rshift y");
      strcpy(hotkey[1], "lshift rshift k");
      strcpy(hotkey[2], "lshift rshift s");
      strcpy(hotkey[3], "lshift rshift f");
      strcpy(hotkey[4], "lshift rshift h");
      strcpy(hotkey[5], "lshift rshift c");
      strcpy(hotkey[6], "lshift rshift w");

      if (pp->pr_CLI)
      {
         _cli_parse(pp, alen, aptr);

         RSysName = AllocVec(MAXFULLNAME, MEMF_CLEAR);
         if (RSysName)
         {
            NameFromLock(GetProgramDir(), (UBYTE *) RSysName, MAXFULLNAME);
            strcpy(_dir,RSysName);
            strcpy(_file,(char *)FilePart((UBYTE *) _argv[0]));

            AddPart((UBYTE *) RSysName, FilePart((UBYTE *) _argv[0]), MAXFULLNAME);
         }

         Enable_Abort = 1;

         _devtab[0].mode |= O_STDIO;    /* shouldn't close if CLI */
         _devtab[1].mode |= O_STDIO;
      }
      else
      {
         WaitPort(&pp->pr_MsgPort);

         WBenchMsg = (struct WBStartup *) GetMsg(&pp->pr_MsgPort);

         if (WBenchMsg->sm_ArgList)
         {
            NameFromLock(WBenchMsg->sm_ArgList->wa_Lock,
                         (UBYTE *) _dir, MAXFULLNAME);
            strcpy(_file,
                   (char *)FilePart((UBYTE *)WBenchMsg->sm_ArgList->wa_Name));

            RSysName = AllocVec(strlen(WBenchMsg->sm_ArgList->wa_Name) + 1, MEMF_CLEAR);
            if (RSysName)
               strcpy(RSysName, WBenchMsg->sm_ArgList->wa_Name);

            CurrentDir(WBenchMsg->sm_ArgList->wa_Lock);
         }
         _argv = (char **)WBenchMsg;
      }

      if (RSysName)
         _icon_parse(RSysName);

      _devtab[0].fd = Input();
      _devtab[1].fd = Output();

      if (pp->pr_ConsoleTask)
         _devtab[2].fd = Open((UBYTE *) "*", (long)MODE_OLDFILE);

      main(_argc, _argv);
   }
   else
      Alert(AG_NoMemory);

   return;
}
