home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 52 / af052sub.adf / lyr-o-mat.lha / Lyr-O-Mat / Source / Source.lha / words_file.c < prev    next >
C/C++ Source or Header  |  1993-05-09  |  10KB  |  327 lines

  1. #include "words.h"
  2. #define  ID_STRING "Words.File\n"
  3.  
  4.  
  5. UWORD __chip icData[] =
  6. {
  7. /* Plane 0 */
  8.     0xFFFF,0xFFFF,0xFFF8,0xFFFF,0xFFFF,0xFFF0,0xFFFF,0xFFFF,
  9.     0xFFE0,0xFFFF,0xFFFF,0xFFC0,0xFF3C,0xFFFF,0x01C0,0xFF99,
  10.     0xFFFF,0xF3C0,0xFF83,0xFFFF,0xE7C0,0xFFC7,0xFFFF,0xCFC0,
  11.     0xFFC3,0xFFFF,0x9FC0,0xFF91,0xFF87,0x3FC0,0xFF38,0xFF33,
  12.     0x01C0,0xFFFF,0xFF33,0xFFC0,0xFFFF,0xFF03,0xFFC0,0xFFFF,
  13.     0xFF33,0xFFC0,0xFFFF,0x3D33,0xFFC0,0xFFFF,0x9933,0xFFC0,
  14.     0xFFFF,0x83FF,0xFFC0,0xFFFF,0xC7FF,0xFFC0,0xFFFF,0xE7FF,
  15.     0xFFC0,0xFFFF,0xE7FF,0xFFC0,0xFFFF,0xE7FF,0xFFC0,0xFFFF,
  16.     0xFFFF,0xFFC0,0xFFFF,0xFFFF,0xFFC0,0xFFFF,0xFFFF,0xFFC0,
  17.     0xE000,0x0000,0x0000,0xC000,0x0000,0x0000,0x8000,0x0000,
  18.     0x0000,0x0000,0x0000,0x0000,
  19. /* Plane 1 */
  20.     0x0000,0x0000,0x0004,0x0000,0x0000,0x000C,0x0000,0x0000,
  21.     0x001C,0x0000,0x0000,0x003C,0x0FFF,0xFFFF,0xFFFC,0x0FFF,
  22.     0xFFFF,0xFFFC,0x0E3D,0xFFFE,0x1BFC,0x0F1B,0xFFFF,0xF7FC,
  23.     0x0FBF,0xFFFF,0xEFFC,0x0FE7,0xFFFF,0xDFFC,0x0FC3,0xFFCF,
  24.     0xFFFC,0x0F33,0xFEEE,0x7FFC,0x0E79,0xFEFE,0x03FC,0x0FFF,
  25.     0xFEEF,0xFFFC,0x0FFF,0xFEEF,0xFFFC,0x0FFF,0xFEEF,0xFFFC,
  26.     0x0FFE,0x3C27,0xFFFC,0x0FFF,0x1BFF,0xFFFC,0x0FFF,0x9FFF,
  27.     0xFFFC,0x0FFF,0xDFFF,0xFFFC,0x0FFF,0xDFFF,0xFFFC,0x0FFF,
  28.     0xCFFF,0xFFFC,0x0FFF,0xCFFF,0xFFFC,0x0FFF,0xFFFF,0xFFFC,
  29.     0x1FFF,0xFFFF,0xFFFC,0x3FFF,0xFFFF,0xFFFC,0x7FFF,0xFFFF,
  30.     0xFFFC,0xFFFF,0xFFFF,0xFFFC,
  31. };
  32.  
  33. struct Image icI1 =
  34. {
  35.     0, 0,            /* Upper left corner */
  36.     46, 28, 2,            /* Width, Height, Depth */
  37.     icData,        /* Image data */
  38.     0x0003, 0x0000,        /* PlanePick, PlaneOnOff */
  39.     NULL            /* Next image */
  40. };
  41.  
  42. struct DiskObject icon =
  43. {
  44.     WB_DISKMAGIC,        /* Magic Number */
  45.     WB_DISKVERSION,        /* Version */
  46.     {                /* Embedded Gadget Structure */
  47.     NULL,            /* Next Gadget Pointer */
  48.     0, 0, 46, 29,        /* Left,Top,Width,Height */
  49.     GADGIMAGE | GADGHCOMP,    /* Flags */
  50.     RELVERIFY,        /* Activation Flags */
  51.     BOOLGADGET,        /* Gadget Type */
  52.     (APTR)&icI1,    /* Render Image */
  53.     NULL,            /* Select Image */
  54.     NULL,            /* Gadget Text */
  55.     NULL,            /* Mutual Exclude */
  56.     NULL,            /* Special Info */
  57.     0,            /* Gadget ID */
  58.     NULL,            /* User Data */
  59.     },
  60.     WBPROJECT,            /* Icon Type */
  61.     (STRPTR)"Lyr-O-Mat",      /* Default Tool */
  62.     NULL,            /* Tool Type Array */
  63.     NO_ICON_POSITION,        /* Current X */
  64.     NO_ICON_POSITION,        /* Current Y */
  65.     NULL,            /* Drawer Structure */
  66.     NULL,            /* Tool Window */
  67.     0                /* Stack Size */
  68. };
  69.  
  70.  
  71.  
  72. struct TagItem       FRTags[] =
  73.                      {
  74.                       ASL_Hail,NULL,
  75.                       ASL_FuncFlags,0L,
  76.                       ASL_LeftEdge,0L,
  77.                       ASL_TopEdge,0L,
  78.                       ASL_Dir,0L,
  79.                       ASL_Pattern,(ULONG)"~(#?.info)",
  80.                       ASL_File,0L,
  81.                       TAG_DONE,0L
  82.                      };
  83.  
  84.  
  85. struct EasyStruct ExistsReq =
  86.        {
  87.         0L,0L,(UBYTE *)"Lyr-O-Mat... Error",
  88.               (UBYTE *)"The File\n%s\nalready exists !",
  89.               (UBYTE *)" Overwrite | CANCEL",
  90.        };
  91.  
  92. struct EasyStruct wrongfileReq =
  93.        {
  94.         0L,0L,(UBYTE *)"Lyr-O-Mat... Error",
  95.               (UBYTE *)"The file\n%s\n does not exist or\nis not a .wds file",
  96.               (UBYTE *)"CANCEL",
  97.        };
  98.  
  99.  
  100. void saveAll(ULONG mode,UBYTE *title)
  101. {
  102.  struct Node *p,*c,*w;
  103.  UBYTE fname[256];
  104.  int write_it = FALSE;
  105.  struct  FileRequester *FileReq;
  106.  FILE *file;
  107.  FRTags[0].ti_Data = (ULONG)title;
  108.  FRTags[1].ti_Data = FILF_SAVE;
  109.  FRTags[4].ti_Data = (ULONG)winfo.l_dir;
  110.  FRTags[6].ti_Data = (ULONG)winfo.l_name;
  111.  if(mode != MODE_SAVECONFIG)
  112.  {
  113.   if(FileReq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,FRTags))
  114.   {
  115.    if(RequestFile(FileReq))
  116.    {
  117.     strcpy(winfo.s_name,FileReq->rf_File);
  118.     strcpy(winfo.s_dir,FileReq->rf_Dir);
  119.     strcpy(fname,winfo.s_dir);
  120.     AddPart(fname,winfo.s_name,256);
  121.    }
  122.    FreeAslRequest((APTR)FileReq);
  123.   }
  124.  }
  125.  else
  126.  {
  127.   strcpy(fname,"s:");
  128.   AddPart(fname,"Lyr-O-Mat_config.wds",256);
  129.  }
  130.  if( checkfile(fname,MODE_CHECKEXIST))
  131.  {
  132.   if(EasyRequest(Project0Wnd,&ExistsReq,NULL,fname) == 1) write_it = TRUE;
  133.  }
  134.  else write_it = TRUE;
  135.  if(write_it)
  136.  {
  137.   if(file = fopen(fname,"w"))
  138.   {
  139.    fprintf(file,"%s",ID_STRING);
  140.    if(edit.s_p == 1)
  141.    {
  142.     for(p = winfo.pattern.lh_Head;p->ln_Succ;p = p->ln_Succ)
  143.     {
  144.      fprintf(file,"%s\n",p->ln_Name);   
  145.     }
  146.     if(edit.pmode)
  147.       fprintf(file,"_pmode\n");
  148.     else
  149.       fprintf(file,"_tmode\n");
  150.    }
  151.    if(edit.s_c == 1)
  152.    {  
  153.     for(c = winfo.class.lh_Head;c->ln_Succ;c = c->ln_Succ)
  154.     {
  155.      fprintf(file,"#%s\n",c->ln_Name);
  156.      for(w = ((struct classnode *)c)->cl_Words.lh_Head;w->ln_Succ;w = w->ln_Succ)
  157.      {
  158.       fprintf(file,"?%s\n",w->ln_Name);
  159.      }
  160.     }
  161.    }
  162.    if(edit.writeicon)
  163.    {
  164.     BPTR lock;
  165.     strcpy(winfo.icon_name,fname);
  166.     strcat(winfo.icon_name,".info");
  167.     if(lock = Lock(winfo.icon_name,SHARED_LOCK))UnLock(lock);
  168.      else
  169.       PutDiskObject(fname,&icon);
  170.    }
  171.    fclose(file);
  172.   }
  173.  }
  174. }
  175. void loadAll(ULONG mode,UBYTE *title)
  176. {
  177.  UBYTE fname[512];
  178.  UBYTE id[256];
  179.  struct  FileRequester *FileReq;
  180.  FILE  *file;
  181.  UBYTE *s;
  182.  int attempt_load = FALSE;
  183.  FRTags[0].ti_Data = (ULONG)title;
  184.  FRTags[1].ti_Data = 0L;
  185.  FRTags[4].ti_Data = (ULONG)winfo.l_dir;
  186.  FRTags[6].ti_Data = (ULONG)winfo.l_name;
  187.  if(mode != MODE_LOADCONFIG)
  188.  {
  189.   if(FileReq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,FRTags))
  190.   {
  191.    if(RequestFile(FileReq))
  192.    {
  193.     strcpy(winfo.l_name,FileReq->rf_File);
  194.     strcpy(winfo.l_dir,FileReq->rf_Dir);
  195.     strcpy(fname,winfo.l_dir);
  196.     AddPart(fname,winfo.l_name,512);
  197.     attempt_load = TRUE;
  198.    }
  199.    FreeAslRequest((APTR)FileReq);
  200.   }
  201.  }
  202.  else
  203.  {
  204.   strcpy(fname,winfo.d_dir);
  205.   AddPart(fname,winfo.d_name,256);
  206.   if(file = fopen(fname,"r"))
  207.   {
  208.    fclose(file);
  209.    attempt_load = TRUE;
  210.   }
  211.  }
  212.  if(!attempt_load)return;
  213.  if((mode != MODE_LOADCONFIG ) && (!checkfile(fname,MODE_CHECKFILE)))
  214.  {
  215.   EasyRequest(Project0Wnd,&wrongfileReq,NULL,fname);
  216.  }
  217.  else
  218.  {
  219.   list_off(LIST_PT);list_off(LIST_CL);list_off(LIST_WD);
  220.   GT_SetGadgetAttrs(Project0Gadgets[GDX_addtemplate],Project0Wnd,NULL,
  221.                    GA_Disabled,TRUE,TAG_DONE);
  222.   GT_SetGadgetAttrs(Project0Gadgets[GDX_addclass],Project0Wnd,NULL,
  223.                    GA_Disabled,TRUE,TAG_DONE);
  224.   GT_SetGadgetAttrs(Project0Gadgets[GDX_addword],Project0Wnd,NULL,
  225.                    GA_Disabled,TRUE,TAG_DONE);
  226.   SetWindowTitles(Project0Wnd,title,(UBYTE *)-1L);
  227.   edit.pmode = 1;
  228.   GT_SetGadgetAttrs(Project0Gadgets[GDX_mode],Project0Wnd,NULL,
  229.                     GTCY_Active,0,TAG_DONE);
  230.   if(file = fopen(fname,"r"))
  231.   {
  232.    if(mode == MODE_LOADFILE)delAll();
  233.    fgets(id,256,file);
  234.    while(fgets(id,256,file))
  235.    {
  236.     s = id + strlen(id) - 1;
  237.     while((*s == ' ') || (*s == '\n'))*s-- = '\0';
  238.     switch(*id)
  239.     {
  240.      case     '_' : if(!stricmp(id,"_pmode"))
  241.                     {
  242.                      edit.pmode = 1;
  243.                      GT_SetGadgetAttrs(Project0Gadgets[GDX_mode],Project0Wnd,NULL,
  244.                      GTCY_Active,0,TAG_DONE);
  245.                     }
  246.                     else
  247.                     if(!stricmp(id,"_tmode"))
  248.                     {
  249.                      edit.pmode = 0;
  250.                      GT_SetGadgetAttrs(Project0Gadgets[GDX_mode],Project0Wnd,NULL,
  251.                      GTCY_Active,1,TAG_DONE);   
  252.                     }
  253.                     break;
  254.      case     '#' : if( (edit.l_c == 1) && 
  255.                         (*(id + 1)    ) &&
  256.                         (!(FindName(&winfo.class,id + 1)))
  257.                       )
  258.                       newclass(id + 1);
  259.                       winfo.currentclass = (struct classnode *)FindName(&winfo.class,id + 1);
  260.                     break;
  261.      case     '?' : if((edit.l_c == 1) && 
  262.                        (*(id + 1)    ) &&
  263.                        (!(FindName(&winfo.currentclass->cl_Words,id + 1)))
  264.                       )
  265.                       newword(id + 1);
  266.                     break;
  267.      case     ';' : break;
  268.      case     '+' :  
  269.      default      : if(
  270.                        (edit.l_p == 1) && 
  271.                        (*id          ) &&
  272.                        (!(FindName(&winfo.pattern,id)))
  273.                       )
  274.                       newpattern(id);
  275.                     break;
  276.     }
  277.    }
  278.    fclose(file);
  279.   }
  280.   GT_SetGadgetAttrs(Project0Gadgets[GDX_addtemplate],Project0Wnd,NULL,
  281.                    GA_Disabled,FALSE,TAG_DONE);
  282.   GT_SetGadgetAttrs(Project0Gadgets[GDX_addclass],Project0Wnd,NULL,
  283.                    GA_Disabled,FALSE,TAG_DONE);
  284.   GT_SetGadgetAttrs(Project0Gadgets[GDX_addword],Project0Wnd,NULL,
  285.                    GA_Disabled,FALSE,TAG_DONE);
  286.   SetWindowTitles(Project0Wnd,Project0Wdt,(UBYTE *)-1L);
  287.   list_on(LIST_PT);list_on(LIST_CL);list_on(LIST_WD);
  288.  }
  289. }
  290.  
  291. void RequestFName()
  292. {
  293. }
  294.  
  295. int checkfile(UBYTE *fname,ULONG mode)
  296. {
  297.  int   rc = FALSE;
  298.  FILE *file;
  299.  UBYTE check[20];
  300.  switch(mode)
  301.  {
  302.   case MODE_CHECKEXIST : if(file = fopen(fname,"r"))
  303.                           {
  304.                            rc = TRUE;
  305.                            fclose(file);
  306.                           }
  307.                           break;
  308.   case MODE_CHECKFILE   : if(file = fopen(fname,"r"))
  309.                           {
  310.                            fgets(check,20,file);
  311.                            if(!strcmp(check,ID_STRING))rc = TRUE;
  312.                            fclose(file);
  313.                           }
  314.                           break;
  315.  }                   
  316.  return rc;
  317. }
  318.  
  319. struct classnode *LookForClass(UBYTE *cls)
  320. {
  321.  struct Node *c;
  322.  for(c = winfo.class.lh_Head;c->ln_Succ;c = c->ln_Succ)
  323.  {
  324.   if(!strncmp(c->ln_Name,cls,strlen(cls)))return (struct classnode *)c;
  325.  }  
  326.  return NULL;
  327. }