DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦9c27de943⟧ TextFile

    Length: 2688 (0xa80)
    Types: TextFile
    Names: »ADDKEY.PAS«

Derivation

└─⟦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« 

TextFile


(***********************************************************)
(*                                                         *)
(*                   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»