#include "words.h"
#define  ID_STRING "Words.File\n"


UWORD __chip icData[] =
{
/* Plane 0 */
    0xFFFF,0xFFFF,0xFFF8,0xFFFF,0xFFFF,0xFFF0,0xFFFF,0xFFFF,
    0xFFE0,0xFFFF,0xFFFF,0xFFC0,0xFF3C,0xFFFF,0x01C0,0xFF99,
    0xFFFF,0xF3C0,0xFF83,0xFFFF,0xE7C0,0xFFC7,0xFFFF,0xCFC0,
    0xFFC3,0xFFFF,0x9FC0,0xFF91,0xFF87,0x3FC0,0xFF38,0xFF33,
    0x01C0,0xFFFF,0xFF33,0xFFC0,0xFFFF,0xFF03,0xFFC0,0xFFFF,
    0xFF33,0xFFC0,0xFFFF,0x3D33,0xFFC0,0xFFFF,0x9933,0xFFC0,
    0xFFFF,0x83FF,0xFFC0,0xFFFF,0xC7FF,0xFFC0,0xFFFF,0xE7FF,
    0xFFC0,0xFFFF,0xE7FF,0xFFC0,0xFFFF,0xE7FF,0xFFC0,0xFFFF,
    0xFFFF,0xFFC0,0xFFFF,0xFFFF,0xFFC0,0xFFFF,0xFFFF,0xFFC0,
    0xE000,0x0000,0x0000,0xC000,0x0000,0x0000,0x8000,0x0000,
    0x0000,0x0000,0x0000,0x0000,
/* Plane 1 */
    0x0000,0x0000,0x0004,0x0000,0x0000,0x000C,0x0000,0x0000,
    0x001C,0x0000,0x0000,0x003C,0x0FFF,0xFFFF,0xFFFC,0x0FFF,
    0xFFFF,0xFFFC,0x0E3D,0xFFFE,0x1BFC,0x0F1B,0xFFFF,0xF7FC,
    0x0FBF,0xFFFF,0xEFFC,0x0FE7,0xFFFF,0xDFFC,0x0FC3,0xFFCF,
    0xFFFC,0x0F33,0xFEEE,0x7FFC,0x0E79,0xFEFE,0x03FC,0x0FFF,
    0xFEEF,0xFFFC,0x0FFF,0xFEEF,0xFFFC,0x0FFF,0xFEEF,0xFFFC,
    0x0FFE,0x3C27,0xFFFC,0x0FFF,0x1BFF,0xFFFC,0x0FFF,0x9FFF,
    0xFFFC,0x0FFF,0xDFFF,0xFFFC,0x0FFF,0xDFFF,0xFFFC,0x0FFF,
    0xCFFF,0xFFFC,0x0FFF,0xCFFF,0xFFFC,0x0FFF,0xFFFF,0xFFFC,
    0x1FFF,0xFFFF,0xFFFC,0x3FFF,0xFFFF,0xFFFC,0x7FFF,0xFFFF,
    0xFFFC,0xFFFF,0xFFFF,0xFFFC,
};

struct Image icI1 =
{
    0, 0,			/* Upper left corner */
    46, 28, 2,			/* Width, Height, Depth */
    icData,		/* Image data */
    0x0003, 0x0000,		/* PlanePick, PlaneOnOff */
    NULL			/* Next image */
};

struct DiskObject icon =
{
    WB_DISKMAGIC,		/* Magic Number */
    WB_DISKVERSION,		/* Version */
    {				/* Embedded Gadget Structure */
	NULL,			/* Next Gadget Pointer */
	0, 0, 46, 29,		/* Left,Top,Width,Height */
	GADGIMAGE | GADGHCOMP,	/* Flags */
	RELVERIFY,		/* Activation Flags */
	BOOLGADGET,		/* Gadget Type */
	(APTR)&icI1,	/* Render Image */
	NULL,			/* Select Image */
	NULL,			/* Gadget Text */
	NULL,			/* Mutual Exclude */
	NULL,			/* Special Info */
	0,			/* Gadget ID */
	NULL,			/* User Data */
    },
    WBPROJECT,			/* Icon Type */
    (STRPTR)"Lyr-O-Mat",  	/* Default Tool */
    NULL,			/* Tool Type Array */
    NO_ICON_POSITION,		/* Current X */
    NO_ICON_POSITION,		/* Current Y */
    NULL,			/* Drawer Structure */
    NULL,			/* Tool Window */
    0				/* Stack Size */
};



struct TagItem       FRTags[] =
                     {
                      ASL_Hail,NULL,
                      ASL_FuncFlags,0L,
                      ASL_LeftEdge,0L,
                      ASL_TopEdge,0L,
                      ASL_Dir,0L,
                      ASL_Pattern,(ULONG)"~(#?.info)",
                      ASL_File,0L,
                      TAG_DONE,0L
                     };


struct EasyStruct ExistsReq =
       {
        0L,0L,(UBYTE *)"Lyr-O-Mat... Error",
              (UBYTE *)"The File\n%s\nalready exists !",
              (UBYTE *)" Overwrite | CANCEL",
       };

struct EasyStruct wrongfileReq =
       {
        0L,0L,(UBYTE *)"Lyr-O-Mat... Error",
              (UBYTE *)"The file\n%s\n does not exist or\nis not a .wds file",
              (UBYTE *)"CANCEL",
       };


void saveAll(ULONG mode,UBYTE *title)
{
 struct Node *p,*c,*w;
 UBYTE fname[256];
 int write_it = FALSE;
 struct  FileRequester *FileReq;
 FILE *file;
 FRTags[0].ti_Data = (ULONG)title;
 FRTags[1].ti_Data = FILF_SAVE;
 FRTags[4].ti_Data = (ULONG)winfo.l_dir;
 FRTags[6].ti_Data = (ULONG)winfo.l_name;
 if(mode != MODE_SAVECONFIG)
 {
  if(FileReq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,FRTags))
  {
   if(RequestFile(FileReq))
   {
    strcpy(winfo.s_name,FileReq->rf_File);
    strcpy(winfo.s_dir,FileReq->rf_Dir);
    strcpy(fname,winfo.s_dir);
    AddPart(fname,winfo.s_name,256);
   }
   FreeAslRequest((APTR)FileReq);
  }
 }
 else
 {
  strcpy(fname,"s:");
  AddPart(fname,"Lyr-O-Mat_config.wds",256);
 }
 if( checkfile(fname,MODE_CHECKEXIST))
 {
  if(EasyRequest(Project0Wnd,&ExistsReq,NULL,fname) == 1) write_it = TRUE;
 }
 else write_it = TRUE;
 if(write_it)
 {
  if(file = fopen(fname,"w"))
  {
   fprintf(file,"%s",ID_STRING);
   if(edit.s_p == 1)
   {
    for(p = winfo.pattern.lh_Head;p->ln_Succ;p = p->ln_Succ)
    {
     fprintf(file,"%s\n",p->ln_Name);   
    }
    if(edit.pmode)
      fprintf(file,"_pmode\n");
    else
      fprintf(file,"_tmode\n");
   }
   if(edit.s_c == 1)
   {  
    for(c = winfo.class.lh_Head;c->ln_Succ;c = c->ln_Succ)
    {
     fprintf(file,"#%s\n",c->ln_Name);
     for(w = ((struct classnode *)c)->cl_Words.lh_Head;w->ln_Succ;w = w->ln_Succ)
     {
      fprintf(file,"?%s\n",w->ln_Name);
     }
    }
   }
   if(edit.writeicon)
   {
    BPTR lock;
    strcpy(winfo.icon_name,fname);
    strcat(winfo.icon_name,".info");
    if(lock = Lock(winfo.icon_name,SHARED_LOCK))UnLock(lock);
     else
      PutDiskObject(fname,&icon);
   }
   fclose(file);
  }
 }
}
void loadAll(ULONG mode,UBYTE *title)
{
 UBYTE fname[512];
 UBYTE id[256];
 struct  FileRequester *FileReq;
 FILE  *file;
 UBYTE *s;
 int attempt_load = FALSE;
 FRTags[0].ti_Data = (ULONG)title;
 FRTags[1].ti_Data = 0L;
 FRTags[4].ti_Data = (ULONG)winfo.l_dir;
 FRTags[6].ti_Data = (ULONG)winfo.l_name;
 if(mode != MODE_LOADCONFIG)
 {
  if(FileReq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,FRTags))
  {
   if(RequestFile(FileReq))
   {
    strcpy(winfo.l_name,FileReq->rf_File);
    strcpy(winfo.l_dir,FileReq->rf_Dir);
    strcpy(fname,winfo.l_dir);
    AddPart(fname,winfo.l_name,512);
    attempt_load = TRUE;
   }
   FreeAslRequest((APTR)FileReq);
  }
 }
 else
 {
  strcpy(fname,winfo.d_dir);
  AddPart(fname,winfo.d_name,256);
  if(file = fopen(fname,"r"))
  {
   fclose(file);
   attempt_load = TRUE;
  }
 }
 if(!attempt_load)return;
 if((mode != MODE_LOADCONFIG ) && (!checkfile(fname,MODE_CHECKFILE)))
 {
  EasyRequest(Project0Wnd,&wrongfileReq,NULL,fname);
 }
 else
 {
  list_off(LIST_PT);list_off(LIST_CL);list_off(LIST_WD);
  GT_SetGadgetAttrs(Project0Gadgets[GDX_addtemplate],Project0Wnd,NULL,
                   GA_Disabled,TRUE,TAG_DONE);
  GT_SetGadgetAttrs(Project0Gadgets[GDX_addclass],Project0Wnd,NULL,
                   GA_Disabled,TRUE,TAG_DONE);
  GT_SetGadgetAttrs(Project0Gadgets[GDX_addword],Project0Wnd,NULL,
                   GA_Disabled,TRUE,TAG_DONE);
  SetWindowTitles(Project0Wnd,title,(UBYTE *)-1L);
  edit.pmode = 1;
  GT_SetGadgetAttrs(Project0Gadgets[GDX_mode],Project0Wnd,NULL,
                    GTCY_Active,0,TAG_DONE);
  if(file = fopen(fname,"r"))
  {
   if(mode == MODE_LOADFILE)delAll();
   fgets(id,256,file);
   while(fgets(id,256,file))
   {
    s = id + strlen(id) - 1;
    while((*s == ' ') || (*s == '\n'))*s-- = '\0';
    switch(*id)
    {
     case     '_' : if(!stricmp(id,"_pmode"))
                    {
                     edit.pmode = 1;
                     GT_SetGadgetAttrs(Project0Gadgets[GDX_mode],Project0Wnd,NULL,
                     GTCY_Active,0,TAG_DONE);
                    }
                    else
                    if(!stricmp(id,"_tmode"))
                    {
                     edit.pmode = 0;
                     GT_SetGadgetAttrs(Project0Gadgets[GDX_mode],Project0Wnd,NULL,
                     GTCY_Active,1,TAG_DONE);   
                    }
                    break;
     case     '#' : if( (edit.l_c == 1) && 
                        (*(id + 1)    ) &&
                        (!(FindName(&winfo.class,id + 1)))
                      )
                      newclass(id + 1);
                      winfo.currentclass = (struct classnode *)FindName(&winfo.class,id + 1);
                    break;
     case     '?' : if((edit.l_c == 1) && 
                       (*(id + 1)    ) &&
                       (!(FindName(&winfo.currentclass->cl_Words,id + 1)))
                      )
                      newword(id + 1);
                    break;
     case     ';' : break;
     case     '+' :  
     default      : if(
                       (edit.l_p == 1) && 
                       (*id          ) &&
                       (!(FindName(&winfo.pattern,id)))
                      )
                      newpattern(id);
                    break;
    }
   }
   fclose(file);
  }
  GT_SetGadgetAttrs(Project0Gadgets[GDX_addtemplate],Project0Wnd,NULL,
                   GA_Disabled,FALSE,TAG_DONE);
  GT_SetGadgetAttrs(Project0Gadgets[GDX_addclass],Project0Wnd,NULL,
                   GA_Disabled,FALSE,TAG_DONE);
  GT_SetGadgetAttrs(Project0Gadgets[GDX_addword],Project0Wnd,NULL,
                   GA_Disabled,FALSE,TAG_DONE);
  SetWindowTitles(Project0Wnd,Project0Wdt,(UBYTE *)-1L);
  list_on(LIST_PT);list_on(LIST_CL);list_on(LIST_WD);
 }
}

void RequestFName()
{
}

int checkfile(UBYTE *fname,ULONG mode)
{
 int   rc = FALSE;
 FILE *file;
 UBYTE check[20];
 switch(mode)
 {
  case MODE_CHECKEXIST : if(file = fopen(fname,"r"))
                          {
                           rc = TRUE;
                           fclose(file);
                          }
                          break;
  case MODE_CHECKFILE   : if(file = fopen(fname,"r"))
                          {
                           fgets(check,20,file);
                           if(!strcmp(check,ID_STRING))rc = TRUE;
                           fclose(file);
                          }
                          break;
 }                   
 return rc;
}

struct classnode *LookForClass(UBYTE *cls)
{
 struct Node *c;
 for(c = winfo.class.lh_Head;c->ln_Succ;c = c->ln_Succ)
 {
  if(!strncmp(c->ln_Name,cls,strlen(cls)))return (struct classnode *)c;
 }  
 return NULL;
}