home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 4
/
FreshFish_May-June1994.bin
/
bbs
/
mar94
/
util
/
misc
/
kalender.lha
/
Kalender
/
txt
/
Kalender.mod
< prev
next >
Wrap
Text File
|
1993-12-18
|
25KB
|
942 lines
MODULE Kalender; (* Copyright 1993 by Kai Hofmann *)
(*$ StackChk := FALSE *)
(*$ RangeChk := FALSE *)
(*$ OverflowChk := FALSE *)
(*$ NilChk := FALSE *)
(*$ CaseChk := FALSE *)
(*$ ReturnChk := FALSE *)
(*$ LargeVars := FALSE *)
(*$ EntryClear := TRUE *)
(*$ Volatile := TRUE *)
(*$ StackParms := TRUE *)
(*$ CStrings := TRUE *)
FROM SYSTEM IMPORT ADR,LONGSET;
FROM ExecD IMPORT MsgPortPtr;
FROM ExecL IMPORT Wait;
FROM Arts IMPORT returnVal,wbStarted,Assert,Terminate;
FROM InOut IMPORT WriteCard,WriteLn,WriteString,WriteInt;
FROM FileSystem IMPORT Lookup, Close, ReadChar, File, Response,
WriteChar;
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
FROM String IMPORT first,last,noOccur,Occurs,Insert,Delete,Copy,
Concat,Length,CopyPart;
FROM Conversions IMPORT ValToStr,StrToVal;
FROM Datum IMPORT GetDate,maxDays,wtstring,wochentag,tagdiff,
Weekday,GetWeek,monat;
FROM Text IMPORT normal,reverse,normc2,revc2,normc1,revc1;
FROM Window2 IMPORT action2,action2ptr,action2mem,OpenWin2,
CloseWin2,ClearWin2,OutputWin2,HandleAction2;
FROM Commands IMPORT CheckOption,GetOptionParam,Killstr,
string, strptr;
FROM ARexx IMPORT OpenRexxPort,CloseRexxPort,SendRexxMsg;
CONST
maxstr = 173 (* 80 *);
TYPE
VERSION = ARRAY [1..35] OF CHAR;
tstring = ARRAY [1..maxstr] OF CHAR;
point = POINTER TO lines;
lines = RECORD
Tag,Monat : SHORTCARD;
Jahr : CARDINAL;
Text : tstring;
last : point;
next : point;
END;
VAR
Version := VERSION{"$VER: Kalender 2.1 (18.12.1993)"};
Wochentag,Tag,Monat,OTag,OMonat,t,m : SHORTCARD;
Jahr,OJahr,j : CARDINAL;
ZeitRaum : CARDINAL;
language : SHORTCARD;
already,mark,nodata : BOOLEAN;
saveflag,save : BOOLEAN;
filename,path,argstr,arg,file : tstring;
wurzel,stat : point;
window2 : SHORTCARD;
x,y : SHORTCARD;
set : LONGSET;
cptr : strptr;
cquot,err,sign : BOOLEAN;
zr : LONGINT;
i : INTEGER;
date1,date2,state,line : tstring;
slen : SHORTCARD;
port : MsgPortPtr;
PROCEDURE delete(VAR wurzel,zeiger : point);
BEGIN
IF (wurzel # NIL) AND (zeiger # NIL) THEN
IF zeiger = wurzel THEN
wurzel := zeiger^.next;
wurzel^.last := NIL;
DEALLOCATE(zeiger,SIZE(lines));
ELSE
IF zeiger^.next # NIL THEN
zeiger^.next^.last := zeiger^.last;
END;
zeiger^.last^.next := zeiger^.next;
DEALLOCATE(zeiger,SIZE(lines));
END;
zeiger := NIL;
END;
END delete;
PROCEDURE insert(VAR wurzel : point; Tag,Monat : SHORTCARD;
Jahr : CARDINAL; Text : tstring);
VAR
new,zeiger : point;
BEGIN
ALLOCATE(new,SIZE(lines));
new^.Tag := Tag;
new^.Monat := Monat;
new^.Jahr := Jahr;
new^.Text := Text;
new^.last := NIL;
new^.next := NIL;
IF wurzel = NIL THEN
wurzel := new;
ELSIF (wurzel^.Monat > Monat) OR ((wurzel^.Monat = Monat) AND (wurzel^.Tag > Tag)) THEN
new^.next := wurzel;
wurzel^.last := new;
wurzel := new;
ELSE
zeiger := wurzel;
WHILE (zeiger # NIL) AND (zeiger^.Monat < Monat) DO
IF zeiger^.next = NIL THEN
zeiger^.next := new;
new^.last := zeiger;
RETURN;
END;
zeiger := zeiger^.next;
END;
IF zeiger^.Monat = Monat THEN
WHILE (zeiger # NIL) AND (zeiger^.Tag <= Tag) DO
IF zeiger^.next = NIL THEN
zeiger^.next := new;
new^.last := zeiger;
RETURN;
ELSIF (zeiger^.next # NIL) AND (zeiger^.next^.Monat > Monat) THEN
new^.next := zeiger^.next;
new^.last := zeiger;
zeiger^.next^.last := new;
zeiger^.next := new;
RETURN;
END;
zeiger := zeiger^.next;
END;
END;
new^.next := zeiger;
new^.last := zeiger^.last;
zeiger^.last := new;
new^.last^.next := new;
END;
END insert;
PROCEDURE konvdate(VAR Tag,Monat : SHORTCARD; VAR Jahr : CARDINAL; VAR txt : ARRAY OF CHAR);
VAR
i : SHORTCARD;
BEGIN
i := 0;
Tag := SHORTCARD(txt[i])-48;
INC(i);
IF txt[i] # "." THEN
Tag := Tag*10+(SHORTCARD(txt[i])-48);
INC(i);
END;
INC(i);
Monat := SHORTCARD(txt[i])-48;
INC(i);
IF txt[i] # "." THEN
Monat := Monat*10+SHORTCARD(txt[i])-48;
INC(i);
END;
INC(i);
WHILE txt[i] = " " DO
INC(i);
END;
Jahr := 0;
IF txt[i] # ":" THEN
Jahr := CARDINAL(txt[i])-48;
INC(i);
Jahr := Jahr*10+CARDINAL(txt[i])-48;
INC(i);
IF txt[i] # " " THEN
Jahr := Jahr*10+CARDINAL(txt[i])-48;
INC(i);
Jahr := Jahr*10+CARDINAL(txt[i])-48;
INC(i);
END;
WHILE txt[i] = " " DO
INC(i);
END;
END;
INC(i);
WHILE txt[i] = " " DO
INC(i);
END;
Delete(txt,0,i);
END konvdate;
PROCEDURE ReadDaten(VAR wurzel : point; filename : tstring) : BOOLEAN;
PROCEDURE ReadLines(VAR wurzel : point; VAR Daten : File);
VAR
data : CHAR;
daten : tstring;
i : SHORTCARD;
Tag,Monat : SHORTCARD;
Jahr : CARDINAL;
BEGIN
REPEAT
ReadChar(Daten,data);
WHILE (NOT Daten.eof) AND ((CARDINAL(data) = 10) OR (data = " ")) DO
ReadChar(Daten,data)
END;
IF NOT Daten.eof THEN
i := 1;
WHILE (CARDINAL(data) # 10) AND (i<maxstr) DO
daten[i] := data;
INC(i);
ReadChar(Daten,data);
END;
IF CARDINAL(data) # 10 THEN
REPEAT
ReadChar(Daten,data);
UNTIL CARDINAL(data) = 10;
END;
daten[i] := CHAR(0);
konvdate(Tag,Monat,Jahr,daten);
insert(wurzel,Tag,Monat,Jahr,daten);
END;
UNTIL Daten.eof OR (Daten.res # done);
END ReadLines;
VAR
Daten : File;
ok : BOOLEAN;
BEGIN
Lookup(Daten,filename,1024,FALSE);
IF Daten.res = done THEN
ok := TRUE;
ReadLines(wurzel,Daten);
ELSE
ok := FALSE;
END;
Close(Daten);
RETURN(ok);
END ReadDaten;
PROCEDURE format(z : CARDINAL; VAR c : ARRAY OF CHAR; l : SHORTCARD);
VAR
i : SHORTCARD;
BEGIN
IF (z > 0) OR (l > 0) THEN
FOR i := HIGH(c) TO 1 BY -1 DO
c[i] := c[i-1];
END;
c[0] := CHAR((z MOD 10)+48);
format(z DIV 10,c,l-1);
END;
END format;
PROCEDURE WriteDaten(wurzel : point; filename : tstring);
VAR
Daten : File;
PROCEDURE WriteLines(zeiger : point; VAR Daten : File);
PROCEDURE WriteLine(zeiger : point; VAR Daten : File);
VAR
data : ARRAY [1..5] OF CHAR;
i : SHORTCARD;
BEGIN
data := "";
format(zeiger^.Tag,data,2);
i := 1;
WHILE data[i] > CHAR(0) DO
WriteChar(Daten,data[i]);
INC(i);
END;
WriteChar(Daten,".");
data := "";
format(zeiger^.Monat,data,2);
i := 1;
WHILE data[i] > CHAR(0) DO
WriteChar(Daten,data[i]);
INC(i);
END;
WriteChar(Daten,".");
IF zeiger^.Jahr > 0 THEN
data := "";
format(zeiger^.Jahr,data,4);
i := 1;
WHILE data[i] > CHAR(0) DO
WriteChar(Daten,data[i]);
INC(i);
END;
ELSE
WriteChar(Daten," ");
WriteChar(Daten," ");
WriteChar(Daten," ");
WriteChar(Daten," ");
END;
WriteChar(Daten," ");
WriteChar(Daten,":");
WriteChar(Daten," ");
i := 1;
WHILE zeiger^.Text[i] > CHAR(0) DO
WriteChar(Daten,zeiger^.Text[i]);
INC(i);
END;
WriteChar(Daten,CHAR(10));
END WriteLine;
BEGIN
WHILE zeiger # NIL DO
WriteLine(zeiger,Daten);
zeiger := zeiger^.next;
END;
END WriteLines;
BEGIN
Lookup(Daten,filename,1024,TRUE);
IF Daten.res = done THEN
WriteLines(wurzel,Daten);
END;
Close(Daten);
END WriteDaten;
PROCEDURE search(zeiger : point; Tag,Monat : SHORTCARD) : point;
BEGIN
WHILE zeiger # NIL DO
IF zeiger^.Monat > Monat THEN
RETURN(zeiger);
ELSIF zeiger^.Monat = Monat THEN
IF zeiger^.Tag >= Tag THEN
RETURN(