home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d564 / dopro.lha / DoPro / src.lzh / DoProDat.c < prev    next >
C/C++ Source or Header  |  1991-10-07  |  3KB  |  136 lines

  1. /***************************************************************************/
  2. /*                                       */
  3. /*        D O P R O   V1.5                       */
  4. /*                                       */
  5. /***************************************************************************/
  6. /*                                       */
  7. /* This file defines the data structures and routines for loading, saving  */
  8. /* and maintaning of the database                       */
  9. /*                                       */
  10. /***************************************************************************/
  11.  
  12. /* maximum length of a screen title */
  13. #define MaxTitleLen 40
  14.  
  15. /* structure for data saving */
  16. struct MyNewScreen
  17. {
  18.     WORD LeftEdge, TopEdge, Width, Height, Depth;
  19.     WORD OldLeftEdge, OldTopEdge, OldWidth, OldHeight;
  20.     UBYTE DetailPen, BlockPen;
  21.     UWORD ViewModes;
  22.     UWORD Type;
  23.     UBYTE DefaultTitle[MaxTitleLen];
  24.  
  25.     BOOL  Topaz;
  26.     ULONG DisplayID;
  27.     struct MyNewScreen *Next;
  28. };
  29.  
  30. #define mnsSize sizeof(struct MyNewScreen)
  31.  
  32. /* the list of MyNewScreen structures */
  33. static struct MyNewScreen *Root = NULL;
  34.  
  35. /* compares a MyNewsScreen with a NewScreen */
  36. static BOOL CompScreen(struct MyNewScreen *mns, struct NewScreen *ns)
  37. {
  38.  return   (mns->OldLeftEdge == ns->LeftEdge)
  39.        && (mns->OldTopEdge == ns->TopEdge)
  40.        && (mns->OldWidth == ns->Width)
  41.        && (mns->OldHeight == ns->Height)
  42.        && (mns->Depth == ns->Depth)
  43.        && (mns->DetailPen == ns->DetailPen)
  44.        && (mns->BlockPen == ns->BlockPen)
  45.        && (mns->ViewModes == ns->ViewModes)
  46.        && (mns->Type == ns->Type)
  47.        && (!strncmp(mns->DefaultTitle, ns->DefaultTitle, MaxTitleLen));
  48. }
  49.  
  50. /* tries to find the screen in database */
  51. ULONG CheckScreen(struct NewScreen *ns)
  52. {
  53.  struct MyNewScreen *List = Root;
  54.  extern struct TextAttr MyAttr;
  55.  
  56.  /* screen already in list ? */
  57.  while ((List != NULL) && (!CompScreen(List, ns))) List = List->Next;
  58.  
  59.  if (!List)
  60.  {
  61.   /* no! */
  62.   List = AllocMem(mnsSize, MEMF_ANY);
  63.   List->OldLeftEdge = ns->LeftEdge;
  64.   List->OldTopEdge = ns->TopEdge;
  65.   List->OldWidth = ns->Width;
  66.   List->OldHeight = ns->Height;
  67.   List->Depth = ns->Depth;
  68.   List->DetailPen = ns->DetailPen;
  69.   List->BlockPen = ns->BlockPen;
  70.   List->ViewModes = ns->ViewModes;
  71.   List->Type = ns->Type;
  72.   strncpy(List->DefaultTitle, ns->DefaultTitle, MaxTitleLen);
  73.   List->Topaz = FALSE;
  74.  
  75.   /* show the requester */
  76.   List->DisplayID = ScreenRequest(ns, &List->Topaz);
  77.  
  78.   List->LeftEdge = ns->LeftEdge;
  79.   List->TopEdge = ns->TopEdge;
  80.   List->Width = ns->Width;
  81.   List->Height = ns->Height;
  82.  
  83.   List->Next = Root;
  84.  
  85.   Root = List;
  86.  }
  87.  
  88.  ns->LeftEdge = List->LeftEdge;
  89.  ns->TopEdge = List->TopEdge;
  90.  ns->Width = List->Width;
  91.  ns->Height = List->Height;
  92.  if (List->Topaz) ns->Font = &MyAttr;
  93.  
  94.  /* return the new DisplayID */
  95.  return List->DisplayID;
  96. }
  97.  
  98. /* save the database and free it */
  99. void SaveData(void)
  100. {
  101.  struct MyNewScreen *List, *Next;
  102.  BPTR             File;
  103.  
  104.  File = Open("s:DoPro.config", MODE_NEWFILE);
  105.  List = Root;
  106.  if (List) Next = List->Next;
  107.  
  108.  while (List)
  109.  {
  110.   Write(File, List, mnsSize);
  111.   FreeMem(List, mnsSize);
  112.   List = Next;
  113.   if (List) Next = List->Next;
  114.  }
  115.  Close(File);
  116. }
  117.  
  118. /* load and allocate the database */
  119. void LoadData(void)
  120. {
  121.  struct MyNewScreen *List;
  122.  BPTR             File;
  123.  
  124.  if (File = Open("s:DoPro.config", MODE_OLDFILE))
  125.  {
  126.   List = AllocMem(mnsSize, MEMF_ANY);
  127.   while (Read(File, List, mnsSize) == mnsSize)
  128.   {
  129.    List->Next = Root;
  130.    Root = List;
  131.    List = AllocMem(mnsSize, MEMF_ANY);
  132.   }
  133.   FreeMem(List, mnsSize);
  134.   Close(File);
  135.  }
  136. }