|
|
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: 9984 (0x2700)
Types: TextFile
Notes: Mikados_K
Names: »INSERT.K«
└─⟦5630b2e42⟧ Bits:30009005 START APRIL 1985 aft april 1985 (PASCAL kildetekster)
└─⟦this⟧ »INSERT.K«
└─⟦6c21327e0⟧ Bits:30008986 LINIMATIC K-FILER (IKKE HELT UPTODTATE)
└─⟦this⟧ »INSERT.K«
(*$P*)
PROCEDURE INSERT(VAR F:ISF);
VAR I,K:INTEGER;
PROCEDURE SKAFENTOM;
VAR TOMBUC,TOMBLK,TOMADR,CURRBUC:INTEGER;
FUNCTION IBLTADR:INTEGER;
BEGIN
WITH FILEHEAD(CURRHEAD) DO
IBLTADR:=BUT+(CURRBUC-1)*ENTRYSIZE
END;
PROCEDURE COPYKEY(TIL,FRA,SIZE:INTEGER);
VAR I:INTEGER;
BEGIN
I:=TIL+SIZE;
REPEAT
Z(TIL):=Z(FRA);
TIL:=TIL+1;
FRA:=FRA+1
UNTIL TIL=I
END;
PROCEDURE FORSKYD(FULD,TOM,BLTSTART:INTEGER);
VAR INCR:INTEGER;
BEGIN
IF TOM>FULD THEN INCR:=-1 ELSE INCR:=1;
WHILE TOM<>FULD DO
BEGIN
WITH FILEHEAD(CURRHEAD) DO
COPYKEY(BLTSTART+(TOM-1)*ENTRYSIZE,
BLTSTART+(TOM+INCR-1)*ENTRYSIZE,ENTRYSIZE);
TOM:=TOM+INCR
END
END;
(*$P*)
BEGIN (*SKAFENTOM*)
WITH FILEHEAD(CURRHEAD) DO
IF BLKINUSE<NBLK THEN (*DER FINDES TOMME BLOKKE*)
BEGIN
TOMBUC:=0;
IF Z(BUT+1+(BUCINZONE-1)*ENTRYSIZE)<=RECPRBUC-RECPRBLK THEN
BEGIN (*DER ER CHANCE FOR EN TOM BLOK I DENNE BUCKET*)
TOMBLK:=1;
WHILE TOMBUC=0 DO (*SØG FREMAD*)
IF TOMBLK>BLKPRBUC THEN
TOMBUC:=-1 (*IKKE FUNDET*)
ELSE
IF Z(BLT+1+(TOMBLK-1)*ENTRYSIZE)=0 THEN
BEGIN (*FUNDET*)
TOMBUC:=BUCINZONE;
TOMADR:=Z(BLT+(TOMBLK-1)*ENTRYSIZE);
IF TOMBLK<BLKINZONE THEN BLKINZONE:=BLKINZONE-1;
FORSKYD(BLKINZONE+1,TOMBLK,BLT);
Z(BLT+BLKINZONE*ENTRYSIZE):=TOMADR;
Z(BLT+BLKINZONE*ENTRYSIZE+1):=0
END
ELSE TOMBLK:=TOMBLK+1 (*IKKE FUNDET ENDNU*)
END;
(*IKKE FUNDET ENDNU OG PLADS TIL EKSTRA BLOKTABEL*)
IF (TOMBUC<=0) AND (BLTSIZE+ENTRYSIZE<=HELPBLT) THEN
BEGIN (*DER SKAL OG KAN LEDES I ANDRE BUCKETS*)
CURRBUC:=BUCINZONE+1;
TOMBUC:=0;
WHILE TOMBUC=0 DO
BEGIN
IF CURRBUC<1 THEN CURRBUC:=2*BUCINZONE+1-CURRBUC;
IF CURRBUC>NBUC THEN CURRBUC:=2*BUCINZONE-CURRBUC;
IF CURRBUC>0 THEN
BEGIN
IF Z(IBLTADR+1)<=RECPRBUC-RECPRBLK THEN
BEGIN (*MULIGHED FOR TOM BLOK I CURRBUC*)
COPSEGS(F,Z(IBLTADR),BLTSIZE,1,LÆS);
TOMBLK:=1;
WHILE TOMBUC=0 DO
IF TOMBLK>BLKPRBUC THEN
TOMBUC:=-1
ELSE
IF Z(2+(TOMBLK-1)*ENTRYSIZE)=0 THEN
TOMBUC:=CURRBUC
ELSE
TOMBLK:=TOMBLK+1
END;
IF TOMBUC<=0 THEN
BEGIN (*IKKE PLADS I CURRBUC*)
IF CURRBUC>BUCINZONE THEN
CURRBUC:=2*BUCINZONE-CURRBUC
ELSE
CURRBUC:=2*BUCINZONE+1-CURRBUC;
TOMBUC:=0
END
ELSE
TOMADR:=Z(1+(TOMBLK-1)*ENTRYSIZE)
END
ELSE
BEGIN
IER:=-106;
EXIT(UDFØR)
END
END;
(*NU ER TOMBUC,TOMBLK,TOMADR IORDEN, OG BLOKTABELLEN MED PLADS I ER INDLÆST*)
IF TOMBUC>BUCINZONE THEN
BEGIN
IF BLKINZONE=BLKPRBUC THEN
BEGIN
(*INDSÆT TOM BLOK I STARTEN AF NÆSTE BUCKET*)
Z(1):=TOMADR;
Z(2):=0
END
ELSE
BEGIN
(*FLYT SIDSTE BLOK TIL STARTEN AF NÆSTE BUCKET*)
COPYKEY(1,BLT+(BLKPRBUC-1)*ENTRYSIZE,ENTRYSIZE);
(*ÅBEN ET HUL I BLOKTABELLEN*)
FORSKYD(BLKINZONE+1,BLKPRBUC,BLT);
(*INDSÆT TOM BLOK I DETTE HUL*)
Z(BLT+BLKINZONE*ENTRYSIZE):=TOMADR;
Z(BLT+BLKINZONE*ENTRYSIZE+1):=0;
(*TÆL BUCKETS NUM NED MED NUM FRA DEN FJERNEDE BLOK*)
Z(BUT+(BUCINZONE-1)*ENTRYSIZE+1):=
Z(BUT+(BUCINZONE-1)*ENTRYSIZE+1)-Z(2);
(*SÆT BUCKETS KEY=NY SIDSTE BLOKS KEY*)
IF BLKINZONE+1<BLKPRBUC THEN
COPYKEY(BUT+(BUCINZONE-1)*ENTRYSIZE+2,
BLT+(BLKPRBUC-1)*ENTRYSIZE+2,KEYSIZE)
ELSE
COPYKEY(BUT+(BUCINZONE-1)*ENTRYSIZE+2,
BLT+(BLKPRBUC-2)*ENTRYSIZE+2,KEYSIZE)
END;
CURRBUC:=BUCINZONE;
REPEAT
CURRBUC:=CURRBUC+1;
(*INDLÆS NÆSTE BLOKTABEL FORSKUDT ET ENTRY*)
COPSEGS(F,Z(IBLTADR),BLTSIZE,1+ENTRYSIZE,LÆS);
IF CURRBUC<TOMBUC THEN
BEGIN
(*UDSKRIV BLOKTABEL FORSKUDT ET ENTRY TILBAGE*)
COPSEGS(F,Z(IBLTADR),BLTSIZE,1,SKRIV);
(*KORRIGER NUM MED DEN INDSKUDTE BLOK - DEN UDSKUDTE BLOK*)
Z(IBLTADR+1):=Z(IBLTADR+1)+Z(2)-Z(2+BLTSIZE);
(*SÆT BUCKETS KEY=NY SIDSTE BLOKS KEY*)
COPYKEY(IBLTADR+2,(BLKPRBUC-1)*ENTRYSIZE+3,KEYSIZE);
COPYKEY(1,BLTSIZE+1,ENTRYSIZE)
END
UNTIL CURRBUC=TOMBUC;
(*BUCKET MED TOM BLOK ER NU INDLÆST*)
FORSKYD(BLKPRBUC+1,TOMBLK+1,1);(*FJERN DEN FUNDNE TOMME BLOK*)
IF (Z(IBLTADR+1)=0) AND (Z(2)>0) THEN
BEGIN (*FORSKYD IND I TOM BUCKET*)
BUCINUSE:=BUCINUSE+1;
(*SÆT BUCKETS NUM,KEY=NY BLOKS NUM,KEY*)
COPYKEY(IBLTADR+1,2,KEYSIZE+1)
END
ELSE (*OPTÆL BUCKETS NUM MED INDSKUDT BLOK*)
Z(IBLTADR+1):=Z(IBLTADR+1)+Z(2);
COPSEGS(F,Z(IBLTADR),BLTSIZE,1,SKRIV)
END
ELSE
BEGIN
(*TOMBUC<BUCINZONE*)
IF BLKINZONE=1 THEN
BEGIN
(*INDSÆT TOM BLOK SIDST I FORRIGE BUCKET*)
Z(BLTSIZE+1):=TOMADR;
Z(BLTSIZE+2):=0
END
ELSE
BEGIN
(*FLYT FØRSTE BLOK TIL SIDST I FORRIGE BUCKET*)
COPYKEY(1+BLKPRBUC*ENTRYSIZE,BLT,ENTRYSIZE);
(*ÅBEN ET HUL I BLOKTABELLEN*)
FORSKYD(BLKINZONE-1,1,BLT);
(*INDSÆT TOM BLOK I DETTE HUL*)
Z(BLT+(BLKINZONE-2)*ENTRYSIZE):=TOMADR;
Z(BLT+(BLKINZONE-2)*ENTRYSIZE+1):=0;
(*TÆL BUCKETS NUM NED MED NUM FRA DEN FJERNEDE BLOK*)
Z(BUT+(BUCINZONE-1)*ENTRYSIZE+1):=
Z(BUT+(BUCINZONE-1)*ENTRYSIZE+1)-Z(BLTSIZE+2)
END;
CURRBUC:=BUCINZONE;
REPEAT
CURRBUC:=CURRBUC-1;
(*INDLÆS NÆSTE BLOKTABEL ET ENTRY*)
COPSEGS(F,Z(IBLTADR),BLTSIZE,1,LÆS);
IF CURRBUC>TOMBUC THEN
BEGIN
(*UDSKRIV BLOKTABEL FORSKUDT ET ENTRY FREMAD*)
COPSEGS(F,Z(IBLTADR),BLTSIZE,1+ENTRYSIZE,SKRIV);
(*KORRIGER NUM MED DEN INDSKUDTE BLOK - DEN UDSKUDTE BLOK*)
Z(IBLTADR+1):=Z(IBLTADR+1)-Z(2)+Z(2+BLTSIZE);
(*SÆT BUCKETS KEY=NY SIDSTE BLOKS KEY, HVIS DER ER NOGET I DEN*)
IF Z(2+BLTSIZE)>0 THEN
COPYKEY(IBLTADR+2,BLTSIZE+3,KEYSIZE);
COPYKEY(BLTSIZE+1,1,ENTRYSIZE)
END
UNTIL CURRBUC=TOMBUC;
(*BUCKET MED TOM BLOK ER NU INDLÆST*)
FORSKYD(BLKPRBUC+1,TOMBLK,1);(*FJERN DEN FUNDNE TOMME BLOK*)
IF Z((BLKPRBUC-1)*ENTRYSIZE+2)>0 THEN
BEGIN
IF Z(IBLTADR+1)=0 THEN BUCINUSE:=BUCINUSE+1;
(*SÆT BUCKETS KEY=NY BLOKS KEY*)
COPYKEY(IBLTADR+2,(BLKPRBUC-1)*ENTRYSIZE+3,KEYSIZE);
(*OPTÆL BUCKETS NUM MED INDSKUDT BLOK*)
Z(IBLTADR+1):=Z(IBLTADR+1)+Z((BLKPRBUC-1)*ENTRYSIZE+2)
END;
COPSEGS(F,Z(IBLTADR),BLTSIZE,1,SKRIV)
END
END
END
END;
(*$P*)
BEGIN (*INSERT*)
WITH FILEHEAD(CURRHEAD) DO
IF FILEOPEN THEN
IF NOT FILEINIT THEN
BEGIN
IER:=0;
IF INITREC=0 THEN BEGIN IER:=-10; EXIT(INSERT) END;
IF RECINUSE>0 THEN
BEGIN
EXTRACT(BLK+(BLKENTRY-1)*RECSIZE,KEY1);
REXTRACT(KEY2);
IF COMPARE(KEY1,KEY2)>=0
THEN BEGIN IER:=-11;EXIT(INSERT) END
END;
K:=RECINUSE MOD IRPRBUC;
I:=RECINUSE DIV IRPRBUC+1;
READTABLE(F,I);
I:=K DIV IRPRBLK+1;
READBLOCK(F,I,1);
BLKENTRY:= K MOD IRPRBLK+1;
K:=BLK+(BLKENTRY-1)*RECSIZE;
MOVELEFT(REC^(1),Z(K),2*RECSIZE);
(* FOR I:=1 TO RECSIZE DO Z(K+I):=REC^(I); *)
SÆTKEY(BLKENTRY);
ØGNUM;
BLKCHG:=TRUE;
IF RECINUSE=INITREC THEN FILEINIT:=TRUE
END
ELSE
IF RECINUSE<NREC THEN
BEGIN
FINDPOST(F);
IF IER=-1 THEN
BEGIN
IF (Z(BLT+(BLKINZONE-1)*ENTRYSIZE+1)=RECPRBLK) AND
((Z(BLT+BLKINZONE*ENTRYSIZE+1)=RECPRBLK) OR (BLKINZONE=BLKPRBUC)) AND
((Z(BLT+(BLKINZONE-2)*ENTRYSIZE+1)=RECPRBLK) OR (BLKINZONE=1)) THEN
SKAFENTOM;
IER:=0;
IF BLKENTRY<=Z(BLT+(BLKINZONE-1)*ENTRYSIZE+1) THEN
FSKDIBLK(BLKENTRY);
K:=BLK+(BLKENTRY-1)*RECSIZE;
MOVELEFT(REC^(1),Z(K),2*RECSIZE);
(* FOR I:=1 TO RECSIZE DO Z(K+I):=REC^(I);*)
BLKCHG:=TRUE;
IF Z(BLT+(BLKINZONE-1)*ENTRYSIZE+1)=RECPRBLK THEN
FSKDUBLK(F)
ELSE
IF BLKENTRY=Z(BLT+(BLKINZONE-1)*ENTRYSIZE+1)+1 THEN SÆTKEY(BLKENTRY);
ØGNUM
END
ELSE IF IER=0 THEN IER:=-7
END
ELSE IER:=-8 ELSE IER:=-3
END;