|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2688 (0xa80)
Types: TextFile
Names: »ADDKEY.PAS«
└─⟦0d02879d3⟧ Bits:30004605 COMPAS Pascal version 3.03
└─⟦this⟧ »ADDKEY.PAS«
└─⟦c96461903⟧ Bits:30002787 SW1602 COMPAS Pascal Version 3.07 Release 1.1
└─⟦this⟧ »ADDKEY.PAS«
(***********************************************************)
(* *)
(* C-FILE Version 1.00 *)
(* *)
(* ADDKEY module *)
(* *)
(* Copyright (C) 1984 by *)
(* Poly-Data microcenter ApS *)
(* *)
(***********************************************************)
(*$A+,K-,R-*)
PROCEDURE ADDKEY(VAR IDXF: INDEXFILE; VAR PDR: INTEGER; VAR PK);
VAR
PKEY: C_KEYSTR AT PK;
NPR,MPR,C,I,K,L: INTEGER;
PASSUP: BOOLEAN;
N,M: C_NODRCP;
PE,TE: C_IDXREC;
(*$A-*)
PROCEDURE SEARCH(NPR: INTEGER);
VAR
R: INTEGER;
(*$A+*)
PROCEDURE INSERT;
BEGIN
C_GETN(IDXF,NPR,N);
WITH N^ DO
BEGIN
IF NE<NODESIZE THEN
BEGIN
NE:=NE+1; FOR I:=NE DOWNTO R+2 DO EÆIÅ:=EÆI-1Å;
EÆR+1Å:=PE; PASSUP:=FALSE;
END ELSE
BEGIN
C_NEWN(IDXF,MPR,M);
IF R<=NODEHALF THEN
BEGIN
IF R=NODEHALF THEN TE:=PE ELSE
BEGIN
TE:=EÆNODEHALFÅ;
FOR I:=NODEHALF DOWNTO R+2 DO EÆIÅ:=EÆI-1Å;
EÆR+1Å:=PE;
END;
FOR I:=1 TO NODEHALF DO M^.EÆIÅ:=EÆI+NODEHALFÅ;
END ELSE
BEGIN
R:=R-NODEHALF; TE:=EÆNODEHALF+1Å;
FOR I:=1 TO R-1 DO M^.EÆIÅ:=EÆI+NODEHALF+1Å;
M^.EÆRÅ:=PE;
FOR I:=R+1 TO NODEHALF DO M^.EÆIÅ:=EÆI+NODEHALFÅ;
END;
NE:=NODEHALF;
M^.NE:=NODEHALF; M^.NR0:=TE.NR; TE.NR:=MPR;
PE:=TE; C_UPDN(M);
END;
END;
C_UPDN(N);
END;
BEGIN
IF NPR=0 THEN
BEGIN
PASSUP:=TRUE;
WITH PE DO
BEGIN
KEY:=PKEY; DR:=PDR; NR:=0;
END;
END ELSE
BEGIN
C_GETN(IDXF,NPR,N);
WITH N^ DO
BEGIN
L:=1; R:=NE;
REPEAT
K:=(L+R) DIV 2;
C:=C_CKEY(PKEY,EÆKÅ.KEY,PDR,EÆKÅ.DR,IDXF.DUPKEY);
IF C<=0 THEN R:=K-1; IF C>=0 THEN L:=K+1;
UNTIL R<L;
IF L-R>1 THEN
BEGIN
OK:=FALSE; PASSUP:=FALSE;
END ELSE
BEGIN
IF R=0 THEN SEARCH(NR0) ELSE SEARCH(EÆRÅ.NR);
IF PASSUP THEN INSERT;
END;
END;
END;
END;
BEGIN
WITH IDXF DO
BEGIN
C_XKEY(PKEY,KLEN); OK:=TRUE; SEARCH(RR);
IF PASSUP THEN
BEGIN
NPR:=RR; C_NEWN(IDXF,RR,N);
WITH N^ DO
BEGIN
NE:=1; NR0:=NPR; EÆ1Å:=PE;
END;
C_UPDN(N);
END;
END;
END;
«eof»