|
|
DataMuseum.dkPresents historical artifacts from the history of: MIKADOS |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about MIKADOS Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 27808 (0x6ca0)
Types: TextFile
Notes: Mikados_K
Names: »SKÆRMBIL.K«
└─⟦6b1c9961a⟧ Bits:30008989 INDPERM P1
└─⟦this⟧ »SKÆRMBIL.K«
PROGRAM SKÆRMBILLEDGENERATOR;
CONST MAXFELTER=30;
MAXPOST=250;
TYPE
PARMARRAY=PACKED ARRAY (1..39) OF CHAR;
NFELT=^FELTBESKRIVELSE;
NIVEAU=(MENIG,SERGENT,LØJTNANT,KAPTAJN,MAJOR,OBERST,GENERAL,HSM,UMULIUS);
SKÆRMPOS=RECORD
X,Y:INTEGER
END;
FTYPE=(HELTAL,DOBBTAL,REEL,TEKST);
VTYPE=(HINTERVAL,DINTERVAL,RINTERVAL,DATO,CPR);
BESKRIVELSESTYPE=(FELTDESC,VALIDESC);
FELTBESKRIVELSE=RECORD
NÆSTEVAL:NFELT;
CASE DESCTYPE:BESKRIVELSESTYPE OF
FELTDESC:
(INDPOS,UDPOS:SKÆRMPOS;
KIKKENIVEAU,ÆNDRENIVEAU:NIVEAU;
EDITERING:INTEGER;
LEDETEKST,FØLGETEKST:STRING;
INDEKS:INTEGER;
LÆNGDE:INTEGER;
FORAN0:INTEGER;
CASE FELTTYPE:FTYPE OF
REEL:(DEC:INTEGER);
HELTAL,DOBBTAL,TEKST:());
VALIDESC:
(CASE VALIDITETSTYPE:VTYPE OF
HINTERVAL:(MIN,MAX:INTEGER);
DINTERVAL:(MIN1,MIN2,MAX1,MAX2:INTEGER);
RINTERVAL:(RMIN,RMAX:REAL);
DATO,CPR:())
END;
FELTFIL=FILE OF FELTBESKRIVELSE;
AR=ARRAY (-4..-4) OF INTEGER;
ARAR=PACKED ARRAY (-11..-10) OF CHAR;
RAR=ARRAY (0..0) OF REAL;
OPERATIONSPOST=RECORD
AA:ARAR;
A:AR;
AAA:RAR;
CONTENTS: ARRAY (1..MAXPOST) OF INTEGER
END;
VAR PARM:^PARMARRAY;
QUQ:^INTEGER;
FELT:NFELT;
USERNIVEAU,HUSKNIV:NIVEAU;
PICTURE:ARRAY (1..MAXFELTER) OF NFELT;
I,ANTALFELTER:INTEGER;
LINE:STRING;
POST:OPERATIONSPOST;
FFIL:FELTFIL;
FNAVN:STRING;
NIVEAUD:ARRAY (0..9) OF STRING(8);
FTYPED: ARRAY (0..4) OF STRING(8);
VTYPED: ARRAY (0..5) OF STRING(9);
(*$R-*)
(*$P*)
PROCEDURE OPRET;
TYPE ISF=FILE OF ARRAY (1..232) OF INTEGER;
KEYDESCRIPTION=ARRAY (1..9) OF ARRAY (1..3) OF INTEGER;
VAR NREC,RECSIZE,KEYFLDS,IER,L,POSI,OUTOFRANGE,FKEYS:INTEGER;
FILNAVN:STRING;
KEYDESC:KEYDESCRIPTION;
CH:STRING(1);
(*$ICREATE*)
BEGIN
CLEARSCREEN;
WRITELN('Datafilnavn:Pn');
GOTOXY(16,1);
READLN;READ(FILNAVN);
WRITELN('Antal poster');
GOTOXY(16,2);
READLN;READ(NREC);
FOR I:=1 TO MAXPOST DO POST.CONTENTS(I):=0;
RECSIZE:=0;OUTOFRANGE:=0;FKEYS:=0;KEYFLDS:=0;
FOR I:=1 TO ANTALFELTER DO
WITH PICTURE(I)^ DO
BEGIN
CASE FELTTYPE OF
HELTAL :BEGIN
POSI:=INDEKS;
L:=1
END;
DOBBTAL:BEGIN
POSI:=INDEKS;
L:=2
END;
REEL :BEGIN
POSI:=1+(INDEKS-1)*4;
L:=4
END;
TEKST :BEGIN
POSI:=(INDEKS+1) DIV 2;
L:=(LÆNGDE+1) DIV 2
END
END;
IF (POSI<1) OR (POSI+L-1>MAXPOST) THEN
OUTOFRANGE:=OUTOFRANGE+1
ELSE
BEGIN
RECSIZE:=RECSIZE+L;
IF ÆNDRENIVEAU=UMULIUS THEN
BEGIN
IF FELTTYPE>DOBBTAL THEN
FKEYS:=FKEYS+1
ELSE
BEGIN
KEYFLDS:=KEYFLDS+1;
KEYDESC(KEYFLDS,1):=POSI;
KEYDESC(KEYFLDS,2):=L;
KEYDESC(KEYFLDS,3):=1
END
END;
REPEAT
POST.CONTENTS(POSI):=POST.CONTENTS(POSI)+1;
POSI:=POSI+1;
L:=L-1
UNTIL L=0
END
END;
FOR I:=1 TO RECSIZE DO
IF POST.CONTENTS(I)>1 THEN
WRITELN('OVERLAPNING',I:5)
ELSE
IF POST.CONTENTS(I)<1 THEN WRITELN('HUL',I:5);
FOR I:=RECSIZE+1 TO MAXPOST DO
IF POST.CONTENTS(I)<>0 THEN WRITELN('FORBIER',I:5);
IF OUTOFRANGE>0 THEN WRITELN('OUTOFRANGE',OUTOFRANGE:5);
IF FKEYS>0 THEN WRITELN('IKKE-IMPLEMENTEREDE NØGLER',FKEYS:5);
WRITELN('Nøglebeskrivelse');
FOR I:=1 TO KEYFLDS DO
WRITELN(KEYDESC(I,1):10,KEYDESC(I,2):10,KEYDESC(I,3):10);
GOTOXY(1,23);
WRITELN('Skal filen oprettes J/N');
GOTOXY(27,23);
CH:='N';
EDIT(CH);
IF CH='J' THEN
BEGIN
CREATE(FILNAVN,NREC,RECSIZE,KEYFLDS,KEYDESC,IER);
FNAVN:=CONCAT(COPY(FILNAVN,1,4),'DESC:P');
FNAVN:=CONCAT(FNAVN,COPY(FILNAVN,POS(':P',FILNAVN)+2,1),':30:J');
WRITELN('IER : ',IER)
END
END;
(*$P*)
PROCEDURE INIT;
BEGIN
NIVEAUD(0):='MENIG';
NIVEAUD(1):='SERGENT';
NIVEAUD(2):='LØJTNANT';
NIVEAUD(3):='KAPTAJN';
NIVEAUD(4):='MAJOR';
NIVEAUD(5):='OBERST';
NIVEAUD(6):='GENERAL';
NIVEAUD(7):='HSM';
NIVEAUD(8):='UMULIUS';
FTYPED(0):='HELTAL';
FTYPED(1):='DOBBTAL';
FTYPED(2):='REEL';
FTYPED(3):='TEKST';
VTYPED(0):='HINTERVAL';
VTYPED(1):='DINTERVAL';
VTYPED(2):='RINTERVAL';
VTYPED(3):='DATO';
VTYPED(4):='CPR'
END;
(*$P*)
PROCEDURE LÆSDESC;
BEGIN
REWRITE(FFIL,FNAVN);
GET(FFIL);
I:=0;
WHILE FFIL^.INDPOS.X>0 DO
BEGIN
I:=I+1;
CASE FFIL^.FELTTYPE OF
REEL:NEW(PICTURE(I),FELTDESC,REEL);
HELTAL,DOBBTAL,TEKST:NEW(PICTURE(I),FELTDESC,HELTAL)
END;
FELT:=PICTURE(I);
WITH PICTURE(I)^ DO
BEGIN
DESCTYPE:=FELTDESC;
INDPOS.X:=FFIL^.INDPOS.X;
INDPOS.Y:=FFIL^.INDPOS.Y;
UDPOS.X:=FFIL^.UDPOS.X;
UDPOS.Y:=FFIL^.UDPOS.Y;
KIKKENIVEAU:=FFIL^.KIKKENIVEAU;
ÆNDRENIVEAU:=FFIL^.ÆNDRENIVEAU;
LEDETEKST:=FFIL^.LEDETEKST;
FØLGETEKST:=FFIL^.FØLGETEKST;
EDITERING:=FFIL^.EDITERING;
FELTTYPE:=FFIL^.FELTTYPE;
INDEKS:=FFIL^.INDEKS;
LÆNGDE:=FFIL^.LÆNGDE;
FORAN0:=FFIL^.FORAN0;
IF FELTTYPE=REEL THEN DEC:=FFIL^.DEC;
WHILE FFIL^.NÆSTEVAL<>NIL DO
BEGIN
GET(FFIL);
WITH FELT^ DO
CASE FFIL^.VALIDITETSTYPE OF
HINTERVAL:BEGIN
NEW(NÆSTEVAL,VALIDESC,HINTERVAL);
NÆSTEVAL^.MIN:=FFIL^.MIN;
NÆSTEVAL^.MAX:=FFIL^.MAX
END;
DINTERVAL:BEGIN
NEW(NÆSTEVAL,VALIDESC,DINTERVAL);
NÆSTEVAL^.MIN1:=FFIL^.MIN1;NÆSTEVAL^.MIN2:=FFIL^.MIN2;
NÆSTEVAL^.MAX1:=FFIL^.MAX1;NÆSTEVAL^.MAX2:=FFIL^.MAX2
END;
RINTERVAL:BEGIN
NEW(NÆSTEVAL,VALIDESC,RINTERVAL);
NÆSTEVAL^.RMIN:=FFIL^.RMIN;
NÆSTEVAL^.RMAX:=FFIL^.RMAX
END;
DATO,CPR:NEW(NÆSTEVAL,VALIDESC,DATO)
END;
FELT:=FELT^.NÆSTEVAL;
FELT^.DESCTYPE:=VALIDESC;
FELT^.VALIDITETSTYPE:=FFIL^.VALIDITETSTYPE
END;
FELT^.NÆSTEVAL:=NIL
END;
GET(FFIL)
END;
CLOSE(FFIL);
ANTALFELTER:=I
END;
(*$P*)
PROCEDURE SKRIVDESC;
BEGIN
REWRITE(FFIL,FNAVN);
FOR I:=1 TO ANTALFELTER DO
BEGIN
FELT:=PICTURE(I);
REPEAT
FFIL^:=FELT^;
PUT(FFIL);
FELT:=FELT^.NÆSTEVAL
UNTIL FELT=NIL
END;
FFIL^.DESCTYPE:=FELTDESC;
FFIL^.INDPOS.X:=0;
PUT(FFIL);
CLOSE(FFIL)
END;
(*$P*)
PROCEDURE MOVETOLINE(VAR F:NFELT);
VAR CH:STRING(1);
TAL,DECS,I:INTEGER;
RESULT,DM,DD:REAL;
BEGIN
CH:=' ';
CASE F^.FELTTYPE OF
HELTAL:BEGIN
LINE:='';
TAL:=ABS(POST.A(F^.INDEKS));
REPEAT
CH(1):=CHR(TAL MOD 10+48);
LINE:=CONCAT(CH,LINE);
TAL:=TAL DIV 10
UNTIL TAL=0;
WHILE LENGTH(LINE)<F^.FORAN0 DO LINE:=CONCAT('0',LINE);
IF POST.A(F^.INDEKS)<0 THEN LINE:=CONCAT('-',LINE)
END;
DOBBTAL:BEGIN
LINE:='';
RESULT:=ABS(POST.A(F^.INDEKS)*10000.0+POST.A(F^.INDEKS+1));
DM:=100000000.0;
REPEAT
I:=TRUNC(RESULT/DM)+48;
RESULT:=RESULT-DM*(I-48);
DM:=DM/10
UNTIL (I>48) OR (DM<1.0);
REPEAT
CH(1):=CHR(I);
LINE:=CONCAT(LINE,CH);
I:=TRUNC(RESULT/DM)+48;
RESULT:=RESULT-DM*(I-48);
DM:=DM/10.0
UNTIL DM<0.09;
WHILE LENGTH(LINE)<F^.FORAN0 DO LINE:=CONCAT('0',LINE);
IF POST.A(F^.INDEKS)*10000.0+POST.A(F^.INDEKS+1)<0.0 THEN
LINE:=CONCAT('-',LINE)
END;
TEKST:BEGIN
LINE:='';
FOR I:=F^.INDEKS TO F^.INDEKS+F^.LÆNGDE-1 DO
BEGIN
CH(1):=POST.AA(I);
LINE:=CONCAT(LINE,CH)
END
END;
REEL:BEGIN
RESULT:=ABS(POST.AAA(F^.INDEKS));
DECS:=F^.DEC;
IF DECS=0 THEN
DD:=0.0
ELSE
BEGIN
DD:=0.1;
FOR I:=1 TO DECS DO BEGIN RESULT:=RESULT*10.0;DD:=DD*10 END
END;
LINE:='';
IF F^.FORAN0=0 THEN
BEGIN
DM:=100000000000.0;
REPEAT
I:=TRUNC(RESULT/DM)+48;
RESULT:=RESULT-DM*(I-48);
DM:=DM/10.0
UNTIL (I>48) OR (DM<1.0) OR (DM=DD)
END
ELSE
BEGIN
DM:=1.0;
FOR I:=2 TO F^.FORAN0 DO DM:=DM*10.0;
I:=TRUNC(RESULT/DM)+48;
RESULT:=RESULT-DM*(I-48);
DM:=DM/10.0
END;
REPEAT
CH(1):=CHR(I);
LINE:=CONCAT(LINE,CH);
IF DM=DD THEN LINE:=CONCAT(LINE,'.');
I:=TRUNC(RESULT/DM)+48;
RESULT:=RESULT-DM*(I-48);
DM:=DM/10.0
UNTIL DM<0.09;
IF POST.AAA(F^.INDEKS)<0.0 THEN LINE:=CONCAT('-',LINE)
END
END
END;
(*$P*)
PROCEDURE NULPOST;
VAR I,J:INTEGER;
BEGIN
FOR J:=1 TO ANTALFELTER DO WITH PICTURE(J)^ DO
BEGIN
CASE FELTTYPE OF
HELTAL:POST.A(INDEKS):=0;
DOBBTAL:BEGIN
POST.A(INDEKS):=0;
POST.A(INDEKS+1):=0
END;
REEL:POST.AAA(INDEKS):=0.0;
TEKST:FOR I:=INDEKS TO LÆNGDE+INDEKS-1 DO
POST.AA(I):=' ';
END
END
END;
PROCEDURE SKRIVFELT(VAR F:NFELT);
VAR I:INTEGER;
R,DF:REAL;
BEGIN
IF USERNIVEAU>=F^.KIKKENIVEAU THEN
BEGIN
GOTOXY(F^.UDPOS.X,F^.UDPOS.Y);
WRITE(F^.LEDETEKST,' ');
MOVETOLINE(F);
WRITELN(LINE);
END
END;
PROCEDURE SKRIVPOST;
VAR I:INTEGER;
BEGIN
CLEARSCREEN;
FOR I:=1 TO ANTALFELTER DO SKRIVFELT(PICTURE(I));
END;
(*$P*)
PROCEDURE LÆSFELT(VAR F:NFELT);
VAR I,TAL,TAL1:INTEGER;
VAL:NFELT;
RESULT:REAL;
BUMMED:BOOLEAN;
(*$P*)
PROCEDURE LÆSLINIE;
VAR OK:BOOLEAN;
DECS,I,FORTEGN:INTEGER;
DM:REAL;
BEGIN
REPEAT
OK:=FALSE;
RESULT:=0.0;
TAL:=0;
TAL1:=0;
GOTOXY(F^.INDPOS.X,F^.INDPOS.Y);
WRITELN(F^.LEDETEKST,' ':F^.LÆNGDE+2,F^.FØLGETEKST);
GOTOXY(F^.INDPOS.X+LENGTH(F^.LEDETEKST)+1,F^.INDPOS.Y);
IF F^.EDITERING=0 THEN
BEGIN
READLN;READ(LINE)
END
ELSE
BEGIN
MOVETOLINE(F);
EDIT(LINE:F^.LÆNGDE);
WHILE LINE(LENGTH(LINE))=' ' DO LINE(0):=CHR(ORD(LINE(0))-1)
END;
CASE F^.FELTTYPE OF
TEKST:
IF LENGTH(LINE)<=F^.LÆNGDE THEN
BEGIN
OK:=TRUE;
WHILE LENGTH(LINE)<F^.LÆNGDE DO
IF F^.FORAN0=0 THEN
LINE:=CONCAT(LINE,' ')
ELSE
LINE:=CONCAT(' ',LINE)
END;
HELTAL,DOBBTAL:
IF LENGTH(LINE)>0 THEN
BEGIN
I:=0;
FORTEGN:=1;
IF LINE(1)='-' THEN
BEGIN
FORTEGN:=-1;
I:=1
END;
WHILE LENGTH(LINE)>I DO
BEGIN
OK:=TRUE;
I:=I+1;
IF NOT (LINE(I) IN (.'0'..'9'.)) THEN
BEGIN
OK:=FALSE;
I:=LENGTH(LINE)
END;
RESULT:=10*RESULT+ORD(LINE(I))-48
END;
RESULT:=RESULT*FORTEGN;
IF OK THEN
CASE F^.FELTTYPE OF
HELTAL:IF ABS(RESULT)<=32767 THEN TAL:=TRUNC(RESULT) ELSE OK:=FALSE;
DOBBTAL:IF ABS(RESULT)<=327679999.0 THEN
BEGIN
TAL:=TRUNC(RESULT/10000.0);
TAL1:=TRUNC(RESULT-10000.0*TAL)
END
ELSE OK:=FALSE
END
END ELSE OK:=TRUE;
REEL:
IF LENGTH(LINE)>0 THEN
BEGIN
I:=0;
FORTEGN:=1;
DECS:=-1;
IF LINE(1)='-' THEN
BEGIN
FORTEGN:=-1;
I:=1
END;
WHILE (LENGTH(LINE)>I) AND (DECS<0) DO
BEGIN
OK:=TRUE;
I:=I+1;
IF LINE(I) IN (.'0'..'9'.) THEN
RESULT:=10*RESULT+ORD(LINE(I))-48
ELSE
IF (LINE(I)='.') OR (LINE(I)=',') THEN
DECS:=0
ELSE
BEGIN
OK:=FALSE;
I:=LENGTH(LINE)
END
END;
DM:=1.0;
WHILE LENGTH(LINE)>I DO
BEGIN
I:=I+1;
DM:=DM/10.0;
IF LINE(I) IN (.'0'..'9'.) THEN
BEGIN
RESULT:=RESULT+DM*(ORD(LINE(I))-48);
DECS:=DECS+1
END
ELSE
BEGIN
OK:=FALSE;
I:=LENGTH(LINE)
END
END;
RESULT:=FORTEGN*RESULT;
IF DECS>F^.DEC THEN OK:=FALSE
END
ELSE OK:=TRUE
END
UNTIL OK
END;
(*$P*)
PROCEDURE CHECKVAL;
VAR I,DAT0,MÅNED,ÅR,MODULC:INTEGER;
CPN:ARRAY (1..10) OF INTEGER;
BEGIN
CASE VAL^.VALIDITETSTYPE OF
HINTERVAL:
BUMMED:=((TAL<VAL^.MIN) OR (TAL>VAL^.MAX));
DINTERVAL:
BUMMED:=((TAL*10000.0+TAL1<VAL^.MIN1*10000.0+VAL^.MIN2) OR
(TAL*10000.0+TAL1>VAL^.MAX1*10000.0+VAL^.MAX2));
RINTERVAL:
BUMMED:=((RESULT<VAL^.RMIN) OR (RESULT>VAL^.RMAX));
DATO:
IF LENGTH(LINE)=6 THEN
BEGIN
ÅR:=10*(ORD(LINE(1))-48)+ORD(LINE(2))-48;
MÅNED:=10*(ORD(LINE(3))-48)+ORD(LINE(4))-48;
DAT0:=10*(ORD(LINE(5))-48)+ORD(LINE(6))-48;
IF (DAT0<1) OR (MÅNED<1) OR (MÅNED>12) OR (DAT0>31) THEN BUMMED:=TRUE;
IF NOT BUMMED THEN
CASE MÅNED OF
4,6,9,11: IF DAT0>30 THEN BUMMED:=TRUE;
2: IF (DAT0>29) OR ((DAT0=29) AND (ÅR MOD 4 <>0)) THEN BUMMED:=TRUE
END
END
ELSE BUMMED:=TRUE;
CPR:
IF LENGTH(LINE)=10 THEN
BEGIN
FOR I:=1 TO 10 DO CPN(I):=ORD(LINE(I))-48;
DAT0:=CPN(1)*10+CPN(2);
MÅNED:=CPN(3)*10+CPN(4);
ÅR:=CPN(5)*10+CPN(6);
IF (DAT0<1) OR (MÅNED<1) OR (MÅNED>12) OR (DAT0>31) THEN BUMMED:=TRUE;
IF NOT BUMMED THEN
CASE MÅNED OF
4,6,9,11: IF DAT0>30 THEN BUMMED:=TRUE;
2: IF (DAT0>29) OR ((DAT0=29) AND (ÅR MOD 4<>0)) THEN BUMMED:=TRUE
END;
IF NOT BUMMED THEN
BEGIN
MODULC:=CPN(1)*4+CPN(2)*3+CPN(3)*2+CPN(4)*7+CPN(5)*6+CPN(6)*5+CPN(7)*4+
CPN(8)*3+CPN(9)*2+CPN(10);
IF MODULC MOD 11<>0 THEN BUMMED:=TRUE
END
END
ELSE BUMMED:=TRUE;
END
END;
(*$P*)
(*PROCEDURE LÆSFELT*)
BEGIN
IF USERNIVEAU>=F^.ÆNDRENIVEAU THEN
BEGIN
REPEAT
LÆSLINIE;
VAL:=F^.NÆSTEVAL;
BUMMED:=FALSE;
WHILE (VAL<>NIL) AND (NOT BUMMED) DO
BEGIN
CHECKVAL;
VAL:=VAL^.NÆSTEVAL
END
UNTIL NOT BUMMED;
CASE F^.FELTTYPE OF
HELTAL:POST.A(F^.INDEKS):=TAL;
DOBBTAL:BEGIN
POST.A(F^.INDEKS):=TAL;
POST.A(F^.INDEKS+1):=TAL1
END;
REEL:POST.AAA(F^.INDEKS):=RESULT;
TEKST:FOR I:=1 TO F^.LÆNGDE DO
POST.AA(I+F^.INDEKS-1):=LINE(I)
END
END
END;
(*$P*)
PROCEDURE SKRIVVALI(VAR F:NFELT);
BEGIN
CLEARSCREEN;
WRITELN('Validitetstype',' ':6,VTYPED(ORD(F^.VALIDITETSTYPE)));
CASE F^.VALIDITETSTYPE OF
HINTERVAL:
WRITELN('Minimum',' ':13,F^.MIN:10,' ':10,'Maksimum',' ':12,F^.MAX:10);
DINTERVAL:
WRITELN('Minimum',' ':13,F^.MIN1*10000.0+F^.MIN2:10:-2,' ':10,
'Maksimum',' ':12,F^.MAX1*10000.0+F^.MAX2:10:-2);
RINTERVAL:
WRITELN('Minimum',' ':13,F^.RMIN:10:2,' ':10,'Maksimum',' ':12,
F^.RMAX:10:2);
DATO,CPR:WRITELN
END
END;
(*$P*)
PROCEDURE INDVALI(VAR F:NFELT);
VAR I:INTEGER;
R:REAL;
BEGIN
REPEAT
GOTOXY(1,3);
WRITELN('Validitetstype');
GOTOXY(20,3);
READLN;READ(VTYPED(5));
I:=0;
WHILE VTYPED(I)<>VTYPED(5) DO I:=I+1
UNTIL (I>=0) AND (I<=4);
CASE I OF
0:BEGIN
F^.VALIDITETSTYPE:=HINTERVAL;
GOTOXY(1,5);
WRITELN('Minimum');
GOTOXY(20,5);
READLN;READ(F^.MIN);
GOTOXY(31,5);
WRITELN('Maksimum');
GOTOXY(50,5);
READLN;READ(F^.MAX)
END;
1:BEGIN
F^.VALIDITETSTYPE:=DINTERVAL;
GOTOXY(1,5);
WRITELN('Minimum');
GOTOXY(20,5);
READLN;READ(R);
F^.MIN1:=TRUNC(R/10000.0);
F^.MIN2:=TRUNC(R-F^.MIN1*10000.0);
GOTOXY(31,5);
WRITELN('Maksimum');
GOTOXY(50,5);
READLN;READ(R);
F^.MAX1:=TRUNC(R/10000.0);
F^.MAX2:=TRUNC(R-F^.MAX1*10000.0)
END;
2:BEGIN
F^.VALIDITETSTYPE:=RINTERVAL;
GOTOXY(1,5);
WRITELN('Minimum');
GOTOXY(20,5);
READLN;READ(F^.RMIN);
GOTOXY(31,5);
WRITELN('Maksimum');
GOTOXY(50,5);
READLN;READ(F^.RMAX)
END;
3:F^.VALIDITETSTYPE:=DATO;
4:F^.VALIDITETSTYPE:=CPR
END
END;
(*$P*)
PROCEDURE SKRIVPARAMS(VAR F:NFELT);
BEGIN
CLEARSCREEN;
WITH F^ DO
BEGIN
WRITELN(' 1 Indpos X Y',' ':10,INDPOS.X:10,INDPOS.Y:10);
WRITELN(' 2 Udpos X Y',' ':10,UDPOS.X:10,UDPOS.Y:10);
WRITELN(' 3 Kikkeniveau',' ':9,NIVEAUD(ORD(KIKKENIVEAU)));
WRITELN(' 4 Ændreniveau',' ':9,NIVEAUD(ORD(ÆNDRENIVEAU)));
WRITELN(' 5 Ledetekst',' ':11,LEDETEKST);
WRITELN(' 6 Følgetekst',' ':10,FØLGETEKST);
WRITELN(' 7 Editering',' ':11,EDITERING:10);
WRITELN(' 8 Indeks',' ':14,INDEKS:10);
WRITELN(' 9 Længde',' ':14,LÆNGDE:10);
WRITELN('10 Foran0',' ':14,FORAN0:10);
WRITE('11 Felttype',' ':12,FTYPED(ORD(FELTTYPE)));
IF FELTTYPE=REEL THEN WRITELN(' ':10,'Dec',DEC:5) ELSE WRITELN
END
END;
(*$P*)
PROCEDURE INDPARAM(VAR F:NFELT;PARAMNR:INTEGER);
VAR I:INTEGER;
BEGIN
CASE PARAMNR OF
1:BEGIN
GOTOXY(4,1);
WRITELN('Indpos X Y');
GOTOXY(20,1);
READLN;READ(F^.INDPOS.X,F^.INDPOS.Y)
END;
2:BEGIN
GOTOXY(4,2);
WRITELN('Udpos X Y');
GOTOXY(20,2);
READLN;READ(F^.UDPOS.X,F^.UDPOS.Y)
END;
3:BEGIN
REPEAT
GOTOXY(4,3);
WRITELN('Kikkeniveau');
GOTOXY(20,3);
READLN;READ(NIVEAUD(9));
I:=0;
WHILE NIVEAUD(I)<>NIVEAUD(9) DO I:=I+1
UNTIL (I>=0) AND (I<=8);
CASE I OF
0:F^.KIKKENIVEAU:=MENIG;
1:F^.KIKKENIVEAU:=SERGENT;
2:F^.KIKKENIVEAU:=LØJTNANT;
3:F^.KIKKENIVEAU:=KAPTAJN;
4:F^.KIKKENIVEAU:=MAJOR;
5:F^.KIKKENIVEAU:=OBERST;
6:F^.KIKKENIVEAU:=GENERAL;
7:F^.KIKKENIVEAU:=HSM;
8:F^.KIKKENIVEAU:=UMULIUS
END
END;
4:BEGIN
REPEAT
GOTOXY(4,4);
WRITELN('Ændreniveau');
GOTOXY(20,4);
READLN;READ(NIVEAUD(9));
I:=0;
WHILE NIVEAUD(I)<>NIVEAUD(9) DO I:=I+1
UNTIL (I>=0) AND (I<=8);
CASE I OF
0:F^.ÆNDRENIVEAU:=MENIG;
1:F^.ÆNDRENIVEAU:=SERGENT;
2:F^.ÆNDRENIVEAU:=LØJTNANT;
3:F^.ÆNDRENIVEAU:=KAPTAJN;
4:F^.ÆNDRENIVEAU:=MAJOR;
5:F^.ÆNDRENIVEAU:=OBERST;
6:F^.ÆNDRENIVEAU:=GENERAL;
7:F^.ÆNDRENIVEAU:=HSM;
8:F^.ÆNDRENIVEAU:=UMULIUS
END
END;
5:BEGIN
GOTOXY(4,5);
WRITELN('Ledetekst');
GOTOXY(20,5);
READLN;READ(F^.LEDETEKST)
END;
6:BEGIN
GOTOXY(4,6);
WRITELN('Følgetekst');
GOTOXY(20,6);
READLN;READ(F^.FØLGETEKST)
END;
7:BEGIN
GOTOXY(4,7);
WRITELN('Editering 0-1');
GOTOXY(20,7);
READLN;READ(F^.EDITERING)
END;
8:BEGIN
GOTOXY(4,8);
WRITELN('Indeks');
GOTOXY(20,8);
READLN;READ(F^.INDEKS)
END;
9:BEGIN
GOTOXY(4,9);
WRITELN('Længde');
GOTOXY(20,9);
READLN;READ(F^.LÆNGDE)
END;
10:BEGIN
GOTOXY(4,10);
WRITELN('Foran0');
GOTOXY(20,10);
READLN;READ(F^.FORAN0)
END;
11:BEGIN
REPEAT
GOTOXY(4,11);
WRITELN('Felttype');
GOTOXY(20,11);
READLN;READ(FTYPED(4));
I:=0;
WHILE FTYPED(I)<>FTYPED(4) DO I:=I+1
UNTIL (I>=0) AND (I<=3);
CASE I OF
2:BEGIN
F^.FELTTYPE:=REEL;
GOTOXY(30,11);
WRITELN('Dec');
GOTOXY(40,11);
READLN;READ(F^.DEC)
END;
0:F^.FELTTYPE:=HELTAL;
1:F^.FELTTYPE:=DOBBTAL;
3:F^.FELTTYPE:=TEKST
END
END
END
END;
(*$P*)
PROCEDURE VEDLFD(VAR F:NFELT);
VAR I:INTEGER;
BEGIN
REPEAT
SKRIVPARAMS(F);
GOTOXY(1,23);
WRITELN('Feltnr, 0 for færdig');
GOTOXY(22,23);
READLN;READ(I);
IF (USERNIVEAU>=HSM) OR ((I<>8) AND (I<>9) AND (I<>11) AND
((I<>3) OR (USERNIVEAU>=F^.KIKKENIVEAU)) AND
((I<>4) OR (USERNIVEAU>=F^.ÆNDRENIVEAU))) THEN
INDPARAM(F,I)
UNTIL I=0
END;
(*$P*)
PROCEDURE MAINPD;
VAR I:INTEGER;
CH:STRING(1);
NF,F:NFELT;
BEGIN
REPEAT
CLEARSCREEN;
FOR I:=1 TO ANTALFELTER DO
WRITELN(I:3,' ':5,PICTURE(I)^.LEDETEKST);
GOTOXY(1,23);
WRITELN('Feltnr, 0 for færdig');
GOTOXY(22,23);
READLN;READ(I);
IF (I>0) AND (I<=ANTALFELTER) THEN
BEGIN
VEDLFD(PICTURE(I));
F:=PICTURE(I);
CH:='J';
WHILE (F^.NÆSTEVAL<>NIL) AND (CH='J') DO
BEGIN
GOTOXY(1,23);
WRITELN('Næste validitet J/N',' ':58);
GOTOXY(21,23);
EDIT(CH);
IF CH='J' THEN
BEGIN
F:=F^.NÆSTEVAL;
SKRIVVALI(F);
GOTOXY(1,23);
WRITELN('Ændres J/N',' ':68);
GOTOXY(12,23);
EDIT(CH);
IF (CH='J') AND (USERNIVEAU>=HSM) THEN
INDVALI(F)
ELSE
CH:='J'
END
END;
GOTOXY(1,23);
WRITELN('Slet: S, Tilføj: T, Færdig: F');
CH:='F';
GOTOXY(34,23);
EDIT(CH);
IF USERNIVEAU>=HSM THEN
CASE CH(1) OF
'S':IF F^.NÆSTEVAL<>NIL THEN F^.NÆSTEVAL:=F^.NÆSTEVAL^.NÆSTEVAL;
'T':BEGIN
NEW(NF,VALIDESC);
NF^.DESCTYPE:=VALIDESC;
INDVALI(NF);
NF^.NÆSTEVAL:=F^.NÆSTEVAL;
F^.NÆSTEVAL:=NF
END
END
END
UNTIL I=0
END;
(*$P*)
PROCEDURE CREATEPD;
VAR FRA,TIL,I:INTEGER;
CH:STRING(1);
F:NFELT;
BEGIN
GOTOXY(1,23);
WRITELN('Tilføjelse: T, Sletning: S, Flytning: F, Afslutning: A');
GOTOXY(56,23);
CH:='T';
EDIT(CH);
WHILE CH<>'A' DO
BEGIN
CASE CH(1) OF
'T':BEGIN
CLEARSCREEN;
ANTALFELTER:=ANTALFELTER+1;
NEW(PICTURE(ANTALFELTER),FELTDESC);
F:=PICTURE(ANTALFELTER);
F^.DESCTYPE:=FELTDESC;
FOR I:=1 TO 11 DO INDPARAM(F,I);
VEDLFD(F);
REPEAT
GOTOXY(1,23);
WRITELN('Flere validitetscheck J/N');
GOTOXY(30,23);
CH:='J';
EDIT(CH);
IF CH='J' THEN
BEGIN
NEW(F^.NÆSTEVAL,VALIDESC);
F^.DESCTYPE:=VALIDESC;
F:=F^.NÆSTEVAL;
REPEAT
CLEARSCREEN;
INDVALI(F);
SKRIVVALI(F);
GOTOXY(1,23);
WRITELN('Validitetscheck OK J/N',' ':56);
GOTOXY(30,23);
EDIT(CH)
UNTIL CH='J'
END
UNTIL CH<>'J';
F^.NÆSTEVAL:=NIL;
END;
'S':BEGIN
PICTURE(ANTALFELTER):=NIL;
ANTALFELTER:=ANTALFELTER-1
END;
'F':BEGIN
GOTOXY(1,20);
WRITELN('FRA TIL');
GOTOXY(9,20);
READLN;READ(FRA,TIL);
F:=PICTURE(FRA);
IF FRA<TIL THEN
FOR I:=FRA TO TIL-1 DO PICTURE(I):=PICTURE(I+1)
ELSE
FOR I:=FRA DOWNTO TIL+1 DO PICTURE(I):=PICTURE(I-1);
PICTURE(TIL):=F
END
END;
GOTOXY(1,23);
WRITELN('Tilføjelse: T, Sletning: S, Flytning: F, Afslutning: A');
GOTOXY(56,23);
CH:='T';
EDIT(CH)
END
END;
(*$P*)
PROCEDURE LISTDESC;
BEGIN
WRITELN(LIST);
WRITELN(LIST,FNAVN);
WRITELN(LIST);
WRITELN(LIST,'Felt Ledetekst',' ':21,'Følgetekst');
WRITELN(LIST,' ':5,'Kikkeniveau Indpos Edit Ændreniveau',
' Udpos Længde Foran0');
WRITELN(LIST,' ':5,'Felttype Indeks Decimaler');
WRITELN(LIST,' ':15,'Validitetstype Minimum Maximum');
WRITELN(LIST);
WRITELN(LIST);
FOR I:=1 TO ANTALFELTER DO
BEGIN
FELT:=PICTURE(I);
WITH FELT^ DO
BEGIN
WRITELN(LIST,I:4,' ',LEDETEKST,' ':30-LENGTH(LEDETEKST),FØLGETEKST);
WRITELN(LIST,' ':5,NIVEAUD(ORD(KIKKENIVEAU)),
' ':10-LENGTH(NIVEAUD(ORD(KIKKENIVEAU))),INDPOS.X:5,INDPOS.Y:5,
EDITERING:5,
' ':5,NIVEAUD(ORD(ÆNDRENIVEAU)),
' ':11-LENGTH(NIVEAUD(ORD(ÆNDRENIVEAU))),UDPOS.X:5,UDPOS.Y:5,
LÆNGDE:7,FORAN0:7);
WRITE(LIST,' ':5,FTYPED(ORD(FELTTYPE)),
' ':11-LENGTH(FTYPED(ORD(FELTTYPE))),INDEKS:4);
IF FELTTYPE=REEL THEN WRITELN(LIST,DEC:12) ELSE WRITELN(LIST)
END;
FELT:=FELT^.NÆSTEVAL;
WHILE FELT<>NIL DO
BEGIN
WRITE(LIST,' ':15,VTYPED(ORD(FELT^.VALIDITETSTYPE)),
' ':15-LENGTH(VTYPED(ORD(FELT^.VALIDITETSTYPE))));
CASE FELT^.VALIDITETSTYPE OF
HINTERVAL:WRITELN(LIST,FELT^.MIN:12,FELT^.MAX:17);
DINTERVAL:WRITELN(LIST,FELT^.MIN1*10000.0+FELT^.MIN2:12:-2,
FELT^.MAX1*10000.0+FELT^.MAX2:17:-2);
RINTERVAL:WRITELN(LIST,FELT^.RMIN:12:2,FELT^.RMAX:17:2);
DATO,CPR: WRITELN(LIST)
END;
FELT:=FELT^.NÆSTEVAL
END;
WRITELN(LIST)
END;
PAGE(LIST)
END;
(*$P*)
(*HOVEDPROGRAM*)
BEGIN
INIT;
USERNIVEAU:=MENIG;
I:=ORD(PARM^(1))-48;
WHILE I>0 DO
BEGIN
USERNIVEAU:=SUCC(USERNIVEAU);
I:=I-1
END;
CLEARSCREEN;
ANTALFELTER:=0;
FNAVN:='NONE';
WRITELN('Input-fil');
GOTOXY(11,1);
EDIT(FNAVN:16);
IF POS('NONE',FNAVN)<>1 THEN LÆSDESC;
REPEAT
CLEARSCREEN;
WRITELN('1 Opbygning af feltbeskrivelse');
WRITELN('2 Ændring af eksisterende feltbeskrivelse');
WRITELN('3 Simulering');
WRITELN('4 Oprettelse af datafil');
WRITELN('5 Printerudskrift af feltbeskrivelse');
WRITELN('Vælg 0-5');
REPEAT
GOTOXY(12,6);
READLN;READ(I)
UNTIL (I>=0) AND (I<=5);
CASE I OF
1:IF USERNIVEAU>=HSM THEN CREATEPD;
2:MAINPD;
3:BEGIN
HUSKNIV:=USERNIVEAU;
USERNIVEAU:=UMULIUS;
NULPOST;
SKRIVPOST;
REPEAT
READLN;
FOR I:=1 TO ANTALFELTER DO
LÆSFELT(PICTURE(I));
READLN;READ(I);
IF I<>-1 THEN SKRIVPOST
UNTIL I=-1;
USERNIVEAU:=HUSKNIV
END;
4:IF USERNIVEAU>=HSM THEN OPRET;
5:LISTDESC
END
UNTIL I=0;
CLEARSCREEN;
WRITELN('Output-fil');
GOTOXY(12,1);
EDIT(FNAVN:16);
IF FNAVN<>' ' THEN SKRIVDESC;
FNAVN:=' ';
FNAVN(1):=PARM^(1);
CHAIN('L *1',CONCAT('HOVED:P2,',FNAVN),QUQ);
IF IORESULT<>0 THEN WRITELN('IORESULT ',IORESULT)
END.