PROGRAM SK[RMBILLEDGENERATOR;CONST MAXFELTER=30;      MAXPOST=250;TYPE'PARMARRAY=PACKED ARRAY (1..39) OF CHAR;'NFELT=^FELTBESKRIVELSE;INIVEAU=(MENIG,SERGENT,L\JTNANT,KAPTAJN,MAJOR,OBERST,GENERAL,HSM,UMULIUS);I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3        POST.CONTENTS(POSI):=POST.CONTENTS(POSI)+1;3        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4      IF POST.CONTENTS(I)<1 THEN WRITELN('HUL',I:5);4   FOR I:=RECSIZE+1 TO MAXPOST DO 7    IF POST.CONTENTS(I)<>0 THEN WRITELN('FORBIER',I:5);7:  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5    CREATE(FILNAVN,NREC,RECSIZE,KEYFLDS,KEYDESC,IER);5.    FNAVN:=CONCAT(COPY(FILNAVN,1,4),'DESC:P');.E    FNAVN:=CONCAT(FNAVN,COPY(FILNAVN,POS(':P',FILNAVN)+2,1),':30:J');E    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);'8    HELTAL,DOBBTAL,TEKST:NEW(PICTURE(I),FELTDESC,HELTAL)8    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7                      NEW(N[STEVAL,VALIDESC,HINTERVAL);7/                      N[STEVAL^.MIN:=FFIL^.MIN;/.                      N[STEVAL^.MAX:=FFIL^.MAX.                    END;          DINTERVAL:BEGIN7                      NEW(N[STEVAL,VALIDESC,DINTERVAL);7L                      N[STEVAL^.MIN1:=FFIL^.MIN1;N[STEVAL^.MIN2:=FFIL^.MIN2;LK                      N[STEVAL^.MAX1:=FFIL^.MAX1;N[STEVAL^.MAX2:=FFIL^.MAX2K                    END;          RINTERVAL:BEGIN7                      NEW(N[STEVAL,VALIDESC,RINTERVAL);71                      N[STEVAL^.RMIN:=FFIL^.RMIN;10                      N[STEVAL^.RMAX:=FFIL^.RMAX0                    END;.          DATO,CPR:NEW(N[STEVAL,VALIDESC,DATO).        END;        FELT:=FELT^.N[STEVAL;!        FELT^.DESCTYPE:=VALIDESC;!2        FELT^.VALIDITETSTYPE:=FFIL^.VALIDITETSTYPE2
      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;F               WHILE LENGTH(LINE)<F^.FORAN0 DO LINE:=CONCAT('0',LINE);FA               IF POST.A(F^.INDEKS)<0 THEN LINE:=CONCAT('-',LINE)A             END;     DOBBTAL:BEGIN               LINE:='';J               RESULT:=ABS(POST.A(F^.INDEKS)*10000.0+POST.A(F^.INDEKS+1));J               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;F               WHILE LENGTH(LINE)<F^.FORAN0 DO LINE:=CONCAT('0',LINE);FH               IF POST.A(F^.INDEKS)*10000.0+POST.A(F^.INDEKS+1)<0.0 THENH'                 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0               RESULT:=ABS(POST.AAA(F^.INDEKS));0               DECS:=F^.DEC;               IF DECS=0 THEN                 DD:=0.0               ELSE               BEGIN                 DD:=0.1;L                 FOR I:=1 TO DECS DO BEGIN RESULT:=RESULT*10.0;DD:=DD*10 ENDL               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4                 UNTIL (I>48) OR (DM<1.0) OR (DM=DD)4               END               ELSE               BEGIN                 DM:=1.0;6                 FOR I:=2 TO F^.FORAN0 DO DM:=DM*10.0;6(                 I:=TRUNC(RESULT/DM)+48;(*                 RESULT:=RESULT-DM*(I-48);*                 DM:=DM/10.0               END;               REPEAT                 CH(1):=CHR(I);'                 LINE:=CONCAT(LINE,CH);'6                 IF DM=DD THEN LINE:=CONCAT(LINE,'.');6(                 I:=TRUNC(RESULT/DM)+48;(*                 RESULT:=RESULT-DM*(I-48);*                 DM:=DM/10.0               UNTIL DM<0.09;E               IF POST.AAA(F^.INDEKS)<0.0 THEN LINE:=CONCAT('-',LINE)E             END	      END	END;(*$P*)PROCEDURE NULPOST;VAR I,J:INTEGER;BEGIN0  FOR J:=1 TO ANTALFELTER DO WITH PICTURE(J)^ DO0  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;3  FOR I:=1 TO ANTALFELTER DO SKRIVFELT(PICTURE(I));3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);$8    WRITELN(F^.LEDETEKST,' ':F^.L[NGDE+2,F^.F\LGETEKST);8;    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);B      WHILE LINE(LENGTH(LINE))=' ' DO LINE(0):=CHR(ORD(LINE(0))-1)B    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J      HELTAL:IF ABS(RESULT)<=32767 THEN TAL:=TRUNC(RESULT) ELSE OK:=FALSE;J.      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:7    BUMMED:=((RESULT<VAL^.RMIN) OR (RESULT>VAL^.RMAX));7  DATO:    IF LENGTH(LINE)=6 THEN	    BEGIN	/      ]R:=10*(ORD(LINE(1))-48)+ORD(LINE(2))-48;/2      M]NED:=10*(ORD(LINE(3))-48)+ORD(LINE(4))-48;21      DAT0:=10*(ORD(LINE(5))-48)+ORD(LINE(6))-48;1L      IF (DAT0<1) OR (M]NED<1) OR (M]NED>12) OR (DAT0>31) THEN BUMMED:=TRUE;L      IF NOT BUMMED THEN      CASE M]NED OF-      4,6,9,11: IF DAT0>30 THEN BUMMED:=TRUE;-I      2: IF (DAT0>29) OR ((DAT0=29) AND (]R MOD 4 <>0)) THEN BUMMED:=TRUEI	      END	    END    ELSE BUMMED:=TRUE;  CPR:    IF LENGTH(LINE)=10 THEN	    BEGIN	0      FOR I:=1 TO 10 DO CPN(I):=ORD(LINE(I))-48;0      DAT0:=CPN(1)*10+CPN(2);      M]NED:=CPN(3)*10+CPN(4);      ]R:=CPN(5)*10+CPN(6);L      IF (DAT0<1) OR (M]NED<1) OR (M]NED>12) OR (DAT0>31) THEN BUMMED:=TRUE;L      IF NOT BUMMED THEN      CASE M]NED OF-      4,6,9,11: IF DAT0>30 THEN BUMMED:=TRUE;-H      2: IF (DAT0>29) OR ((DAT0=29) AND (]R MOD 4<>0)) THEN BUMMED:=TRUEH
      END;
      IF NOT BUMMED THEN      BEGINM      MODULC:=CPN(1)*4+CPN(2)*3+CPN(3)*2+CPN(4)*7+CPN(5)*6+CPN(6)*5+CPN(7)*4+M(              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;A  WRITELN('Validitetstype',' ':6,VTYPED(ORD(F^.VALIDITETSTYPE)));A  CASE F^.VALIDITETSTYPE OF
HINTERVAL:
K    WRITELN('Minimum',' ':13,F^.MIN:10,' ':10,'Maksimum',' ':12,F^.MAX:10);K
DINTERVAL:
B    WRITELN('Minimum',' ':13,F^.MIN1*10000.0+F^.MIN2:10:-2,' ':10,B=            'Maksimum',' ':12,F^.MAX1*10000.0+F^.MAX2:10:-2);=
RINTERVAL:
C    WRITELN('Minimum',' ':13,F^.RMIN:10:2,' ':10,'Maksimum',' ':12,CC                                                     F^.RMAX:10:2);C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);/0    WRITELN(' 7 Editering',' ':11,EDITERING:10);0*    WRITELN(' 8 Indeks',' ':14,INDEKS:10);**    WRITELN(' 9 L{ngde',' ':14,L[NGDE:10);**    WRITELN('10 Foran0',' ':14,FORAN0:10);*6    WRITE('11 Felttype',' ':12,FTYPED(ORD(FELTTYPE)));6B    IF FELTTYPE=REEL THEN WRITELN(' ':10,'Dec',DEC:5) ELSE WRITELNB  ENDEND;(*$P*)0PROCEDURE INDPARAM(VAR F:NFELT;PARAMNR:INTEGER);0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>3       ((I<>3) OR (USERNIVEAU>=F^.KIKKENIVEAU)) AND35       ((I<>4) OR (USERNIVEAU>=F^.[NDRENIVEAU))) THEN5       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);0          IF (CH='J') AND (USERNIVEAU>=HSM) THEN0            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F      'S':IF F^.N[STEVAL<>NIL THEN F^.N[STEVAL:=F^.N[STEVAL^.N[STEVAL;F      '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);D  WRITELN('Tilf|jelse: T, Sletning: S, Flytning: F, Afslutning: A');D  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);3          WRITELN('Validitetscheck OK J/N',' ':56);3          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5      FOR I:=FRA TO TIL-1 DO PICTURE(I):=PICTURE(I+1)5    ELSE:      FOR I:=FRA DOWNTO TIL+1 DO PICTURE(I):=PICTURE(I-1);:    PICTURE(TIL):=F  END  END;  GOTOXY(1,23);D  WRITELN('Tilf|jelse: T, Sletning: S, Flytning: F, Afslutning: A');D  GOTOXY(56,23);
  CH:='T';

  EDIT(CH)
  ENDEND;(*$P*)PROCEDURE LISTDESC;BEGIN  WRITELN(LIST);  WRITELN(LIST,FNAVN);  WRITELN(LIST);5  WRITELN(LIST,'Felt Ledetekst',' ':21,'F|lgetekst');5A  WRITELN(LIST,' ':5,'Kikkeniveau   Indpos Edit     [ndreniveau',A)             '     Udpos L{ngde Foran0');)<  WRITELN(LIST,' ':5,'Felttype  Indeks          Decimaler');<F  WRITELN(LIST,' ':15,'Validitetstype      Minimum          Maximum');F  WRITELN(LIST);  WRITELN(LIST);  FOR I:=1 TO ANTALFELTER DO  BEGIN    FELT:=PICTURE(I);    WITH FELT^ DO	    BEGIN	J      WRITELN(LIST,I:4,' ',LEDETEKST,' ':30-LENGTH(LEDETEKST),F\LGETEKST);J3      WRITELN(LIST,' ':5,NIVEAUD(ORD(KIKKENIVEAU)),3M              ' ':10-LENGTH(NIVEAUD(ORD(KIKKENIVEAU))),INDPOS.X:5,INDPOS.Y:5,MM                                                                 EDITERING:5,M.              ' ':5,NIVEAUD(ORD([NDRENIVEAU)),.M                ' ':11-LENGTH(NIVEAUD(ORD([NDRENIVEAU))),UDPOS.X:5,UDPOS.Y:5,MM                                                          L[NGDE:7,FORAN0:7);M-      WRITE(LIST,' ':5,FTYPED(ORD(FELTTYPE)),-;            ' ':11-LENGTH(FTYPED(ORD(FELTTYPE))),INDEKS:4);;C      IF FELTTYPE=REEL THEN WRITELN(LIST,DEC:12) ELSE WRITELN(LIST)C    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"8      HINTERVAL:WRITELN(LIST,FELT^.MIN:12,FELT^.MAX:17);8A      DINTERVAL:WRITELN(LIST,FELT^.MIN1*10000.0+FELT^.MIN2:12:-2,AI                                    FELT^.MAX1*10000.0+FELT^.MAX2:17:-2);I>      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');.9    WRITELN('2 [ndring af eksisterende feltbeskrivelse');9    WRITELN('3 Simulering');'    WRITELN('4 Oprettelse af datafil');'4    WRITELN('5 Printerudskrift af feltbeskrivelse');4    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);4  CHAIN('L       *1',CONCAT('HOVED:P2,',FNAVN),QUQ);43  IF IORESULT<>0 THEN WRITELN('IORESULT ',IORESULT)3 END.  ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc0