DataMuseum.dk

Presents historical artifacts from the history of:

MIKADOS

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

See our Wiki for more about MIKADOS

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦d8ed3edcc⟧ TextFile

    Length: 9984 (0x2700)
    Types: TextFile
    Notes: Mikados_K
    Names: »INSERT.K«

Derivation

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

Mikados K File

(*$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;

Full view