' Routinen zur Verwaltung des Cookie-Jar (ab TOS 1.06)
'
' von Gregor Duchalski, Baueracker 15a, 4690 Herne 1
' eMail: GREGOR DUCHALSKI @ DO im MausNet
'
' last change 29.06.92
' ------------------------------------------------------------------------------
' Ab TOS 1.06 legt das TOS eine Liste mit Variablen an, den sog. Cookie-Jar.
' Ein Eintrag besteht aus einer 4stelligen Kennung und einem LONG-Wert, dessen
' Bedeutung vom Cookie abh„ngt. So legt das Programm NVDI einen Cookie mit der
' Kennung 'NVDI' an, sein Wert zeigt auf die Adresse einer Datenstruktur, mit
' der der User das Programm manipulieren kann.
' N„heres entnehmen Sie bitte entsprechender Fachliteratur.
' ------------------------------------------------------------------------------
' Als Beispiel lesen wir den vom TOS angelegten CPU-Cookie aus, der ber den
' verwendeten Prozessor Auskunft gibt.
'
IF @get_cookie("_CPU",wert%)
  PRINT "Der '_CPU' Cookie hat den Wert ";wert%
  PRINT "Prozessor ";68000+wert%
ENDIF
'
> FUNCTION get_cookie(b$,VAR b%)
$F%
LOCAL a%,a$
'
' Sucht den Cookie b$. Wird er gefunden, so wird TRUE zurckgegeben und
' b% enth„lt den Wert des Cookies.
'
a%=LPEEK(1440)               ! Adresse des Cookie-Jar
'
IF a%=0                      ! Kein Cookie-Jar
  RETURN FALSE
ENDIF
'
DO WHILE {a%}<>0             ! Solange nicht Nullcookie...
  '
  a$=MKL$({a%})
  ADD a%,8
  '
LOOP UNTIL b$=a$             ! ...oder bis Eintrag gefunden
'
IF b$=a$                     ! Eintrag gefunden...
  b%={SUB(a%,4)}             ! Wert zurck
  RETURN TRUE
ENDIF
'
RETURN FALSE                 ! Eintrag nicht vorhanden
ENDFUNC
> FUNCTION set_cookie(b$,b%)
LOCAL a&,b&,a%,a$
'
' Tr„gt den Cookie b$ mit dem Wert b% im Cookie-Jar ein
'
a%=LPEEK(1440)               ! Adresse des Cookie-Jar
'
IF a%=0                      ! Kein Cookiejar...
RETURN FALSE
ENDIF
'
a&=@cookie_size              ! Anzahl maximale Eintr„ge
'
REPEAT
'
INC b&                     ! Anzahl Eintr„ge erh”hen
'
a$=MKL$({a%})              ! Eintrag auslesen...
EXIT IF a$=c$              ! ...Nullcookie, Ausgang
'
ADD a%,8
'
UNTIL a$=b$
'
IF a$=b$                     ! Cookie schon vorhanden...
{SUB(a%,4)}=b%             ! ...Wert berschreiben
'
ELSE IF a&<b&                ! Nicht vorhanden, aber noch Platz...
{a%}=CVL(b$)               ! ...Cookie eintragen
{ADD(a%,4)}=b%
{ADD(a%,8)}=0              ! ...Nullcookie dahinter
{ADD(a%,12)}=a&
'
ENDIF
'
RETURN TRUE
ENDFUNC
> FUNCTION cookie_size
$F%
LOCAL a%
'
' Ermittelt die Anzahl der maximal m”glichen Eintr„ge im Cookie-Jar (norm. 16)
'
a%=LPEEK(1440)               ! Adresse des Cookie-Jar
'
IF a%=0                      ! Kein Cookie-Jar
RETURN 0
ENDIF
'
WHILE {a%}<>0                ! Nullcookie suchen
ADD a%,8
WEND
'
RETURN {ADD(a%,4)}           ! Wert zurck
ENDFUNC
