home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 10 / telefon / cache.inc < prev    next >
Encoding:
Text File  |  1987-07-30  |  5.6 KB  |  176 lines

  1. (*------------------------------------------------------------*)
  2. (*                         CACHE.INC                          *)
  3. (*       Cache-Modul fuer die B-Baume der Telefondatei        *)
  4. (*------------------------------------------------------------*)
  5. (* Der Cache wird auf seine Anfangswerte gesetzt, nach dem    *)
  6. (* Aufruf ist er leer. Eventuell vorhandene Datensaetze       *)
  7. (* werden nicht gerettet.                                     *)
  8. PROCEDURE init_cache;
  9.  
  10. VAR cnr: INTEGER;
  11.  
  12. BEGIN
  13.   FOR cnr := 0 TO cache_anz DO BEGIN
  14.     cache[cnr].update := FALSE;
  15.     cache[cnr].snr := -1;
  16.     cache[cnr].stat := Pred(MaxInt)
  17.   END
  18. END;
  19. (*------------------------------------------------------------*)
  20. (* Alle seit dem letzten Lesezugriff geaenderten und alle     *)
  21. (* neuen Datensaetze werden aus der Cache gerettet.           *)
  22. PROCEDURE save_cache;
  23.  
  24. VAR nr: INTEGER;
  25.  
  26. BEGIN
  27.   FOR nr := 0 TO cache_anz DO BEGIN
  28.     IF cache[nr].update THEN BEGIN
  29.       Seek(bbaum, cache[nr].snr);
  30.       Write(bbaum, cache[nr].seite)
  31.     END
  32.   END
  33. END;
  34. (*------------------------------------------------------------*)
  35. (*      Cache oeffnen (Parameter = TRUE) bzw. schliessen.     *)
  36. PROCEDURE access(on: BOOLEAN);
  37. BEGIN
  38.   IF on THEN BEGIN
  39.     ReSet(bbaum);  ReSet(freiseiten);
  40.     ReSet(datei);  ReSet(freisaetze);
  41.     init_cache
  42.   END
  43.   ELSE BEGIN
  44.     save_cache;
  45.     Close(bbaum);  Close(freiseiten);
  46.     Close(datei);  Close(freisaetze)
  47.   END
  48. END;
  49. (*------------------------------------------------------------*)
  50. (*  Cache-Position der angegebene Seite suchen, wenn nicht    *)
  51. (*            vorhanden, wird -1 zurueckgegeben.              *)
  52. PROCEDURE search_cache_nr(seiten_nr: fileindex;
  53.                           VAR cache_nr: INTEGER);
  54.  
  55. VAR cnr: INTEGER;
  56.  
  57. BEGIN
  58.   cache_nr := -1;
  59.   FOR cnr := 0 TO cache_anz DO
  60.     IF cache[cnr].snr=seiten_nr THEN cache_nr := cnr
  61.     ELSE IF cache[cnr].snr >= 0 THEN
  62.            cache[cnr].stat := Succ(cache[cnr].stat);
  63.   IF cache_nr >= 0 THEN cache[cache_nr].stat := 0
  64. END;
  65. (*------------------------------------------------------------*)
  66. (* Bisher unbenutzte bzw. am laengsten nicht mehr benutzte    *)
  67. (* Cache-Adresse suchen, ggf. Datensatz retten.               *)
  68. PROCEDURE search_unused_cache_nr(VAR cache_nr: INTEGER);
  69.  
  70. VAR cnr, max_stat: INTEGER;
  71.  
  72. BEGIN
  73.   max_stat := 0;
  74.   FOR cnr := 0 TO cache_anz DO BEGIN
  75.     IF cache[cnr].stat>max_stat THEN BEGIN
  76.       max_stat := cache[cnr].stat;
  77.       cache_nr := cnr
  78.     END
  79.   END;
  80.   IF cache[cache_nr].update THEN BEGIN
  81.     Seek(bbaum, cache[cache_nr].snr);
  82.     Write(bbaum, cache[cache_nr].seite)
  83.   END;
  84.   cache[cache_nr].stat := 0;  cache[cache_nr].update := FALSE
  85. END;
  86. (*------------------------------------------------------------*)
  87. (* Seite unter Beruecksichtigung d. Cache a. Indexdatei lesen *)
  88. PROCEDURE get_page(seiten_nr: fileindex; VAR seite: Page);
  89.  
  90. VAR cache_nr: INTEGER;
  91.  
  92. BEGIN
  93.   search_cache_nr(seiten_nr, cache_nr);
  94.   IF cache_nr >= 0 THEN seite := cache[cache_nr].seite
  95.   ELSE BEGIN
  96.     Seek(bbaum, seiten_nr);  Read(bbaum, seite);
  97.     search_unused_cache_nr(cache_nr);
  98.     cache[cache_nr].snr := seiten_nr;
  99.     cache[cache_nr].seite := seite
  100.   END
  101. END;
  102. (*------------------------------------------------------------*)
  103. (*  Seite unter Beruecks. d. Cache i.d. Indexdatei speichern  *)
  104. PROCEDURE put_page(seiten_nr: fileindex; VAR seite: Page);
  105.  
  106. VAR cache_nr: INTEGER;
  107.  
  108. BEGIN
  109.   search_cache_nr(seiten_nr, cache_nr);
  110.   IF cache_nr < 0 THEN BEGIN
  111.     search_unused_cache_nr(cache_nr);
  112.     cache[cache_nr].snr := seiten_nr
  113.   END;
  114.   cache[cache_nr].seite := seite; cache[cache_nr].update := TRUE
  115. END;
  116. (*------------------------------------------------------------*)
  117. (*  Neue Seite erzeugen, vorhandene Freiseite wird verwendet. *)
  118. PROCEDURE generate_page(seite: Page; VAR seiten_nr: fileindex);
  119.  
  120. VAR nr: INTEGER;
  121.     folgeseite: Page;
  122.     fs_nr: fileindex;
  123.  
  124. BEGIN
  125.   seiten_nr := -1;  Seek(freiseiten, 0);
  126.   WHILE NOT(Eof(freiseiten)) AND (seiten_nr<0) DO
  127.     Read(freiseiten, seiten_nr);
  128.   IF seiten_nr < 0 THEN BEGIN (*neue Seite anhaengen*)
  129.     seiten_nr := FileSize(bbaum);
  130.     Seek(bbaum, seiten_nr); Write(bbaum, seite)
  131.   END
  132.   ELSE BEGIN (*Freivermerk aus Freiseite-Liste streichen*)
  133.     fs_nr := -1;
  134.     Seek(freiseiten, FilePos(freiseiten)-1);
  135.     Write(freiseiten, fs_nr)
  136.   END;
  137.   put_page(seiten_nr, seite);
  138.   FOR nr := 0 TO seite.anz DO BEGIN
  139.     IF seite.nf[nr] > 0 THEN BEGIN
  140.       get_page(seite.nf[nr], folgeseite);
  141.       folgeseite.vg := seiten_nr;
  142.       put_page(seite.nf[nr], folgeseite)
  143.     END
  144.   END
  145. END;
  146. (*------------------------------------------------------------*)
  147. (* Angegebene Seite freigeben, falls Wurzelseite, wird der    *)
  148. (* Zeiger auf der Nullseite auf 0 fuer "leerer Baum" gesetzt. *)
  149. PROCEDURE remove_page(seite: Page; seiten_nr: fileindex);
  150.  
  151. VAR fs_nr: fileindex;
  152.  
  153. BEGIN
  154.   Seek(freiseiten, 0); fs_nr := -1;
  155.    WHILE NOT(Eof(freiseiten)) AND (fs_nr<>0) DO
  156.       Read(freiseiten, fs_nr);
  157.    IF fs_nr = 0 THEN Seek(freiseiten, FilePos(freiseiten)-1);
  158.    Write(freiseiten, seiten_nr);
  159.    IF seite.vg = 0 THEN put_page(0, seite)
  160. END;
  161. (*------------------------------------------------------------*)
  162. (* Systemdateien auf Diskette ggf. loeschen u. neu erzeugen   *)
  163. PROCEDURE create;
  164.  
  165. VAR nullseite: Page;
  166.  
  167. BEGIN
  168.   ReWrite(datei);  ReWrite(freisaetze);
  169.   ReWrite(bbaum);  ReWrite(freiseiten);
  170.   init_cache;  nullseite.vg := 0;
  171.   put_page(0, nullseite);
  172.   access(FALSE)
  173. END;
  174. (*------------------------------------------------------------*)
  175. (*                    Ende CACHE.INC                          *)
  176.