|
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 - 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»