/* Start from Workbench */

#include <workbench/startup.h>
#include <workbench/workbench.h>

#define __NOLIBBASE__
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/icon.h>
#include "WBFlags.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXFILES 500

#ifdef __GNUC__
#define MYSTRCMP strcasecmp
#define MYSTRNCMP strncasecmp
#else
#define MYSTRCMP strcmp
#define MYSTRNCMP strncmp
#endif

struct Library *IconBase = NULL;

extern struct WBArg *wb_arg;
extern int NumPictures;
extern BPTR olddir;

/* Flags */
extern short WBFiles;

extern struct WBFlags WBFlags;
extern struct WBFlags OldFlags;


void ParseToolTypes(struct WBArg *wbarg, int initial);

BPTR olddir;

void FillWB(struct WBStartup *argmsg)
{
 LONG ktr;

 /* open icon.library, will be closed by CloseDisplay() */

 if(!IconBase)
 {
   if(!(IconBase = OpenLibrary((UBYTE *)"icon.library",33)))
   {
     printf("Could not open icon.library V33 or higher.\n");
     return;
   }
 }

 wb_arg = argmsg->sm_ArgList;

 if(wb_arg->wa_Lock != 0)
 {
   olddir = CurrentDir(wb_arg->wa_Lock);
 }

 ParseToolTypes(wb_arg, 1);

 if(olddir)
 {
   CurrentDir(olddir);
   olddir=0;
 }

 if(argmsg->sm_NumArgs <= 1) return;

 WBFiles=1;

 NumPictures = argmsg->sm_NumArgs - 1;
 
 /* printf("NumPictures: %d\n", NumPictures); */
 wb_arg++; 
}

void ParseToolTypes(struct WBArg *wbarg, int initial)
{
 struct DiskObject *dobj;
 UBYTE **toolarray;
 char *s;

 /* initialize OldFlags even if tool type processing fails */

 if(initial) memcpy(&OldFlags, &WBFlags, sizeof(struct WBFlags));

 if(!IconBase)
 {
   if(!(IconBase = OpenLibrary((UBYTE *)"icon.library",33)))
   {
     printf("Could not open icon.library V33 or higher.\n");
     return;
   }
 }

 if(wbarg)
 if((*wbarg->wa_Name) && (dobj=GetDiskObject(wbarg->wa_Name)))
 {
   toolarray = (UBYTE **)dobj->do_ToolTypes;
   
   if(s=(char *)FindToolType(toolarray, "ARGS"))
   {
     int i=0;
     #ifndef __GNUC__
     strupr(s);
     #endif
     while(1)
     {
       while(s[i] != 0 && s[i] != '-') i++;
       if(s[i] == '-')
       {
         /* printf("Argument found.\n"); */
         if(!MYSTRNCMP(&s[i], "-GRAY", 5)) WBFlags.GrayEnable=1;

         else if(!MYSTRNCMP(&s[i], "-VGA", 4)) WBFlags.VGAenable=1;

         else if(!MYSTRNCMP(&s[i], "-SUPER72", 8)) WBFlags.SUPER72enable=1;

         else if(!MYSTRNCMP(&s[i], "-NOSMOOTH", 9)) WBFlags.NoSmooth=1;

         else if(!MYSTRNCMP(&s[i], "-FIT", 4)) WBFlags.ScaleFit=1;

         else if(!MYSTRNCMP(&s[i], "-DCT FAST", 9)) WBFlags.DCTFast=1;

         else if(!MYSTRNCMP(&s[i], "-DCT INT", 8)) WBFlags.DCTFast=0;

         else if(!MYSTRNCMP(&s[i], "-SCALE 1/1", 10)) WBFlags.scale=1;

         else if(!MYSTRNCMP(&s[i], "-SCALE 1/2", 10)) WBFlags.scale=2;

         else if(!MYSTRNCMP(&s[i], "-SCALE 1/4", 10)) WBFlags.scale=4;

         else if(!MYSTRNCMP(&s[i], "-SCALE 1/8", 10)) WBFlags.scale=8;
         
         else if(!MYSTRNCMP(&s[i], "-SMR", 4) && initial) WBFlags.SMRenable=1;

         else if(!MYSTRNCMP(&s[i], "-NOGRAY", 7) && !initial) WBFlags.GrayEnable=0;

         else if(!MYSTRNCMP(&s[i], "-NOVGA", 6) && !initial) WBFlags.VGAenable=0;

         else if(!MYSTRNCMP(&s[i], "-NOSUPER72", 10) && !initial) WBFlags.SUPER72enable=0;

         else if(!MYSTRNCMP(&s[i], "-SMOOTH", 7) && !initial) WBFlags.NoSmooth=0;

         else if(!MYSTRNCMP(&s[i], "-NOFIT", 6) && !initial) WBFlags.ScaleFit=0;

         else if(!MYSTRNCMP(&s[i], "-MAXMEM ", 8) && initial)
         {
           char ch = 'x';
           if (sscanf(&s[i+7], "%ld%c", &WBFlags.MaxMem, &ch) >= 1)
           {
             if (ch == 'm' || ch == 'M') WBFlags.MaxMem *= 1000L;
             WBFlags.MaxMemFlag = 1;
           }
         }
         i++;
       }
       else break;
     }
     if(initial) memcpy(&OldFlags, &WBFlags, sizeof(struct WBFlags));
   }
   FreeDiskObject(dobj);
 }
}
