/**
 ***************************************************************************
 *
 * Datei:
 *      RSysMain.c
 *
 * Inhalt:
 *
 *      --- Globale Routinen ---
 *
 *    void _icon_parse ( char *progname );
 *    void _main ( long alen , char *aptr );
 *    void _wb_parse ( void );
 *
 *      --- Lokale  Routinen ---
 *
 *
 * 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 "RSys.h"
#include "protos.h"

//extern int Enable_Abort;


#define QUOTE       '"'
#define ESCAPE '*'
#define NL '\n'


extern char __stdiowin[];
extern char __stdiov37[];

static int argc;		/* arg count */
static char **targv, **argv;	/* arg pointers */


extern char _dir[], _file[];

static DISKOBJECT *dop;

/* 
 *********************
 */

static char *
ToolType (char *type)
{
  return (char *) FindToolType ((UBYTE **) dop->do_ToolTypes,
				(UBYTE *) (type));
}

/* 
 *********************
 */

void
_icon_parse (char *progname)
{
  char *cp;

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

	  if (cp = ToolType ("CX_CRYPT"))
	    strcpy (&hotkey[1][0], cp);

	  if (cp = ToolType ("CX_FINDFILE"))
	    strcpy (&hotkey[2][0], cp);

	  if (cp = ToolType ("CX_FORMAT"))
	    strcpy (&hotkey[3][0], cp);

	  if (cp = ToolType ("CX_HUNKLIST"))
	    strcpy (&hotkey[4][0], cp);

	  if (cp = ToolType ("CX_CRC"))
	    strcpy (&hotkey[5][0], cp);

	  if (cp = ToolType ("CX_SAVEWINDOW"))
	    strcpy (&hotkey[6][0], cp);

	  if (cp = ToolType ("CX_FILEREQUEST"))
	    strcpy (&hotkey[7][0], cp);

	  if (cp = ToolType ("NOFASTMODE"))
	    Flags.fastmode = 0;

	  if (cp = ToolType ("NOSORT"))
	    Flags.sortmode = 0;

	  if (cp = ToolType ("WORKINGBAR"))
	    Flags.workingbar = 1;

	  if (cp = ToolType ("AUTOFRONT"))
	    Flags.autofront = 1;

	  if (cp = ToolType ("MOUSEWINDOW"))
	    Flags.mousewindow = 1;

	  if (cp = ToolType ("TOPAZFONT"))
	    Flags.sysfont = 1;

	  if (cp = ToolType ("NOSAVEASKING"))
	    Flags.saveasking = 0;

	  if (cp = ToolType ("TEXTFORMATTER"))
	    Flags.textformat = 1;

	  if (cp = ToolType ("NOAPPICON"))
	    Flags.appicon = 0;

	  if (cp = ToolType ("BACKPATTERNCOL"))
	    bpc = atoi (cp);

	  if (cp = ToolType ("BACKGROUNDCOL"))
	    bgc = atoi (cp);

	  if (cp = ToolType ("BACKPATTERN"))
	    bpp = ahtoi (cp);

	  if (cp = ToolType ("DETAILPEN"))
	    winddetail = atoi (cp);

	  if (cp = ToolType ("BLOCKPEN"))
	    windblock = atoi (cp);

	  if (cp = ToolType ("MENUPEN"))
	    menudetail = atoi (cp);

	  if (cp = ToolType ("HARDWAREDATA"))
	    strcpy ((char *) RSysFiles.Hardware, cp);

	  if (cp = ToolType ("LIBOFFDATA"))
	    strcpy ((char *) RSysFiles.LibOffsets, cp);

	  if (cp = ToolType ("AGUIDEDOC"))
	    strcpy ((char *) RSysFiles.Guide, cp);

	  if (cp = ToolType ("AGUIDECONTEXT"))
	    strcpy ((char *) RSysFiles.GuideContext, cp);

	  if (cp = ToolType ("ACTIONFILE"))
	    strcpy ((char *) RSysFiles.ActionFile, cp);

	  if (cp = ToolType ("ICONX"))
	    iconx = atoi (cp);

	  if (cp = ToolType ("ICONY"))
	    icony = atoi (cp);

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

	  if (cp = ToolType ("LISTHEIGHT"))
	    {
	      listviewheight = atoi (cp);

	      if (listviewheight == -1)
		listviewheight = 1000;
	      else if (listviewheight < 2)
		listviewheight = 10;

	      SysHeight += (listviewheight - 10) * 8;
	    }

	  FreeDiskObject (dop);
	}

      CloseLibrary (IconBase);

      IconBase = NULL;
    }

}
/*
 * __ main from SAS example (thanks SASSY folks :)
 */
void __stdargs
__main (char *line)

{
  char *argbuf;
  int i;

/***
*     First count the number of arguments
***/

  argbuf = line;
  for (argc = 0;; argc++)
    {
      while (isspace (*line))
	line++;
      if (*line == '\0')
	break;
      if (*line == QUOTE)
	{
	  line++;
	  while (*line != QUOTE && *line != 0)
	    {
	      if (*line == ESCAPE)
		{
		  line++;
		  if (*line == 0)
		    break;
		}
	      line++;
	    }
	  if (*line)
	    line++;
	}
      else
	/* non-quoted arg */
	{
	  while ((*line != '\0') && (!isspace (*line)))
	    line++;
	  if (*line == '\0')
	    break;
	}
    }

  if (argc)
    {
      argv = AllocMem ((argc + 1) * sizeof (char *), MEMF_CLEAR);
      if (argv == NULL)
	exit (20);

      /***
      *     Build argument pointer list
      ***/
      i = 0;
      line = argbuf;
      while (1)
	{
	  while (isspace (*line))
	    line++;
	  if (*line == '\0')
	    break;
	  if (*line == QUOTE)
	    {
	      argbuf = argv[i++] = ++line;	/* ptr inside quoted string */
	      while (*line != QUOTE && *line != 0)
		{
		  if (*line == ESCAPE)
		    {
		      line++;
		      switch (*line)
			{
			case '\0':
			  *argbuf = 0;
			  goto linedone;
			case 'E':
			  *argbuf++ = ESC;
			  break;
			case 'N':
			  *argbuf++ = NL;
			  break;
			default:
			  *argbuf++ = *line;
			}
		      line++;
		    }
		  else
		    {
		      *argbuf++ = *line++;
		    }
		}
	      if (*line)
		line++;
	      *argbuf++ = '\0';	/* terminate arg */
	    }
	  else
	    /* non-quoted arg */
	    {
	      argv[i++] = line;
	      while ((*line != '\0') && (!isspace (*line)))
		line++;
	      if (*line == '\0')
		break;
	      else
		*line++ = '\0';	/* terminate arg */
	    }
	}			/* while */
    }
linedone:

  targv = (argc == 0) ? (char **) _WBenchMsg : (char **) &argv[0];


/***
*     Call user's main program
***/

  was_main (argc, targv);	/* call main function */

  exit (0);
}

/* 
 *********************
 */
void
MEMCLEANUP_DESTRUCTOR (argcleanup)
{
  if (argc && argv)
    FreeMem (argv, (argc + 1) * sizeof (char *));
}


/* 
 *********************
 */


void
was_main (long alen, char **aptr)
{
  PROCESS *pp;

  SysBase = *(EXECBASE **) 4;

  if (SysBase->LibNode.lib_Version < 36)
    {
      if (alen)
	Write (Output (), (UBYTE *) "WB 2.0 ONLY!\n", 13);
      exit (0);
    }

  if (DOSBase = (DOSLIBRARY *) OpenLibrary ((STRPTR) "dos.library", 36L))
    {
      LastID = SYSTEMINFO;

      pp = (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");
      strcpy (hotkey[7], "lshift rshift esc");

      if (pp->pr_CLI)
	{

	  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;
	}
      else
	{
	  WaitPort (&pp->pr_MsgPort);

	  WBenchMsg = (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);

      main (argc, argv);
    }
}
