home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / gui / guicreator / demos / videothek / videothek_myfunctions.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-04  |  4.8 KB  |  183 lines

  1. #include "Videothek_Includes.h"
  2. #include "Videothek_AppStruct.h"
  3. #include "Videothek_MyFunctions.h"
  4.  
  5. void LoadData(struct App *userdata)
  6. {
  7.    BPTR fp=Open("Videothek:Daten",MODE_OLDFILE);
  8.    if (fp)
  9.       {
  10.       char filmtitel[50],kassette[10],minuten[10],art[10],quelle[10];
  11.       Eintrag E;
  12.       while (FGets(fp,filmtitel,sizeof(filmtitel)))
  13.          {
  14.          FGets(fp,(STRPTR)kassette,sizeof(kassette));
  15.          FGets(fp,(STRPTR)minuten,sizeof(minuten));
  16.          FGets(fp,(STRPTR)quelle,sizeof(quelle));
  17.          FGets(fp,(STRPTR)art,sizeof(art));
  18.          filmtitel[strlen(filmtitel)-1]=0;
  19.          strcpy(E.Filmtitel,filmtitel);
  20.          E.Kassette=atoi(kassette);
  21.          E.Minuten =atoi(minuten);
  22.          E.Quelle  =atoi(quelle);
  23.          E.Art     =atoi(art);
  24.          Einfueg(userdata->ListeEintraege,&E);
  25.          }
  26.       Close(fp);
  27.       }
  28.    else PrintFault(IoErr(),"Achtung");
  29. }
  30.  
  31. void SaveData(struct App *userdata)
  32. {
  33.    BPTR fp=Open("Videothek:Daten",MODE_NEWFILE);
  34.    if (fp)
  35.       {
  36.       Eintrag *E;
  37.       for (E=userdata->ListeEintraege.anfang;E;E=E->next)
  38.          FPrintf(fp,"%s\n%ld\n%ld\n%ld\n%ld\n",E->Filmtitel,E->Kassette,E->Minuten,E->Quelle,E->Art);
  39.       Close(fp);
  40.       }
  41.    else PrintFault(IoErr(),"Achtung");
  42. }
  43.  
  44. /*************************************************************************/
  45. /*                                                                       */
  46. /*   Unterprogramme für die Listenverwaltung                             */
  47. /*                                                                       */
  48. /*************************************************************************/
  49.  
  50. struct NameNode {
  51.     struct Node nn_Node;        /* System Node structure */
  52.     UBYTE  nn_Data[80];         /* Node-specific data */
  53. };
  54.  
  55. #define NAMENODE_ID   100       /* The type of "NameNode" */
  56.  
  57. void Init(Liste &L)
  58. {
  59.    L.anfang = NULL;
  60.    L.ende   = NULL;
  61. }
  62.  
  63. Eintrag *Einfueg(Liste &L,Eintrag *eintrag)
  64. {
  65.    Eintrag *neu = AllocVec(sizeof(struct Eintrag),MEMF_PUBLIC|MEMF_CLEAR);
  66.  
  67.    if (neu)
  68.       {
  69.       Eintrag *pos;
  70.  
  71.       neu->Kassette=eintrag->Kassette;
  72.       neu->Minuten =eintrag->Minuten;
  73.       neu->Quelle  =eintrag->Quelle;
  74.       neu->Art     =eintrag->Art;
  75.       strcpy(neu->Filmtitel,eintrag->Filmtitel);
  76.  
  77.       // Richtige Position zun Einfügen suchen:
  78.       pos = L.anfang;
  79.  
  80.       while (pos!=0 && strcmp(pos->Filmtitel,eintrag->Filmtitel)<0) pos = pos->next;
  81.  
  82.       // Element in Liste einhängen, dabei diverse Sonderfälle beachten:
  83.  
  84.       if (pos == 0)                // Sonderfall: Anfügen an das Ende der Liste
  85.          {
  86.          Eintrag *alt = L.ende;    // altes Listenende
  87.  
  88.          if (alt != 0)             // allgemeiner Unter-Fall: wirklich anhängen
  89.             {
  90.             alt->next = neu;
  91.             neu->prev = alt;
  92.             neu->next = 0;
  93.             L.ende = neu;
  94.             }
  95.          else                      // spezieller Spezialfall: Liste ist noch leer
  96.             {
  97.             neu->next = 0;
  98.             neu->prev = 0;
  99.             L.anfang = neu;
  100.             L.ende = neu;
  101.             }
  102.          }
  103.       else if (pos->prev == 0)     // Sonderfall: Neues Element an Listenanfang hängen
  104.          {
  105.          pos->prev = neu;
  106.          neu->next = pos;
  107.          neu->prev = 0;
  108.          L.anfang = neu;
  109.          }
  110.       else                         // allgemeiner Fall: Element in Liste einhängen
  111.          {
  112.          Eintrag *vor = pos->prev; // "neu" zwischen "vor" und "pos" einhängen:
  113.          vor->next = neu;
  114.          neu->prev = vor;
  115.          neu->next = pos;
  116.          pos->prev = neu;
  117.          }
  118.  
  119.       // Fertig, Zeiger auf neues Element zurückgeben:
  120.       return neu;
  121.       }
  122.    else return NULL;
  123. }
  124.  
  125. void AllesLoeschen(Liste &L)
  126. {
  127.    Eintrag *p = L.anfang;
  128.    while (p)
  129.       {
  130.       Eintrag *hilf = p;
  131.       p=p->next;
  132.       FreeVec(hilf);
  133.       }
  134.    /* end-while */
  135.    Init(L);
  136. }
  137.  
  138. void Loeschen(Liste &L, Eintrag *E)
  139. {
  140.    // Vorgänger und Nachfolger des zu löschenden Elements
  141.    Eintrag *vor = E->prev, *nach = E->next;
  142.  
  143.    if (vor)
  144.       vor->next = nach;
  145.    else
  146.       L.anfang = nach;
  147.  
  148.    if (nach)
  149.       nach->prev = vor;
  150.    else
  151.      L.ende = vor;
  152.  
  153.    FreeVec(E);
  154. }
  155.  
  156. void AddName(struct List *list, UBYTE *name)
  157. {
  158.    struct NameNode *namenode = AllocVec(sizeof(struct NameNode),MEMF_PUBLIC|MEMF_CLEAR);
  159.    if (namenode)
  160.       {
  161.       strcpy(namenode->nn_Data,name);
  162.       namenode->nn_Node.ln_Name = namenode->nn_Data;
  163.       namenode->nn_Node.ln_Type = NAMENODE_ID;
  164.       namenode->nn_Node.ln_Pri  = 0;
  165.       AddTail((struct List *)list,(struct Node *)namenode);
  166.       }
  167.    else PrintFault(ERROR_NO_FREE_STORE,"Achtung");
  168. }
  169.  
  170. void FreeNameNodes(struct List *list)
  171. {
  172.    struct NameNode *worknode;
  173.    struct NameNode *nextnode;
  174.  
  175.    worknode = (struct NameNode *)(list->lh_Head); /* First node */
  176.    while (nextnode = (struct NameNode *)(worknode->nn_Node.ln_Succ))
  177.       {
  178.       FreeVec(worknode);
  179.       worknode = nextnode;
  180.       }
  181.    /* end-while */
  182. }
  183.