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

⟦3f2175b1d⟧ TextFile

    Length: 13888 (0x3640)
    Types: TextFile
    Notes: Mikados_K
    Names: »OBEY.K«

Derivation

└─⟦5630b2e42⟧ Bits:30009005 START APRIL 1985 aft april 1985 (PASCAL kildetekster)
    └─⟦this⟧ »OBEY.K« 
└─⟦6c21327e0⟧ Bits:30008986 LINIMATIC K-FILER (IKKE HELT UPTODTATE)
    └─⟦this⟧ »OBEY.K« 

Mikados K File

(*$P*)
PROCEDURE OBEY;
VAR RZ,RS,NS,I,SIZE,REST,PREDKEY,SUCCKEY:INTEGER;
PROCEDURE PEXTRACT(RESPOS:INTEGER);
(*UDTRÆK NØGLE AF POST , OG GEM I KEY*)
VAR I:INTEGER;
    J,KP :POSTADR;
BEGIN
  WITH FILEHEAD(CURRHEAD) DO
  FOR I:=1 TO KEYFLDS DO            
  BEGIN                             
    KP:=KEYPOS(I)-1;                
    FOR J:=1 TO KEYLNG(I) DO        
    BEGIN                           
      KEY(RESPOS):=REC^(KP+J);        
      RESPOS:=RESPOS+1              
    END                             
  END                               
END;
(*$P*)
PROCEDURE RELEASKEY;
BEGIN
  WITH USER(CURRUSER) DO
  WITH FILES(CURRHEAD) DO
  BEGIN
    IF KEYSTART<AVAILKEY THEN
    BEGIN
      RZ:=0;
      IF FILEHEAD(CURRHEAD).KEYSIZE>1 THEN
      BEGIN
        KEY(KEYSTART):=AVAILKEY;
        KEY(KEYSTART+1):=FILEHEAD(CURRHEAD).KEYSIZE
      END
      ELSE KEY(KEYSTART):=-AVAILKEY;
      AVAILKEY:=KEYSTART 
    END 
    ELSE
    BEGIN
      RZ:=AVAILKEY;
      WHILE ABS(KEY(RZ))<KEYSTART DO RZ:=ABS(KEY(RZ));
      IF FILEHEAD(CURRHEAD).KEYSIZE>1 THEN
      BEGIN
        KEY(KEYSTART):=ABS(KEY(RZ));
        KEY(KEYSTART+1):=FILEHEAD(CURRHEAD).KEYSIZE
      END
      ELSE KEY(KEYSTART):=-ABS(KEY(RZ));
      IF KEY(RZ)<0 THEN
        KEY(RZ):=-KEYSTART
      ELSE
        KEY(RZ):=KEYSTART 
    END;
    IF ABS(KEY(KEYSTART))<TOTALKEYSIZE THEN
    IF KEYSTART+FILEHEAD(CURRHEAD).KEYSIZE=ABS(KEY(KEYSTART)) THEN
    BEGIN
      IF KEY(ABS(KEY(KEYSTART)))<0 THEN
        RS:=1
      ELSE
        RS:=KEY(ABS(KEY(KEYSTART))+1);
      KEY(KEYSTART):=ABS(KEY(ABS(KEY(KEYSTART))));
      KEY(KEYSTART+1):=FILEHEAD(CURRHEAD).KEYSIZE+RS
    END;
    IF RZ>0 THEN
    BEGIN
      IF KEY(RZ)<0 THEN RS:=1 ELSE RS:=KEY(RZ+1);
      IF RZ+RS=ABS(KEY(RZ)) THEN
      BEGIN
        IF KEY(ABS(KEY(RZ)))<0 THEN
          NS:=1
        ELSE
          NS:=KEY(ABS(KEY(RZ))+1);
        KEY(RZ):=ABS(KEY(ABS(KEY(RZ))));
        KEY(RZ+1):=RS+NS
      END
    END;
    KEYSTART:=0
  END
END;
(*$P*)
PROCEDURE OUVRIR;
BEGIN 
  WITH USER(CURRUSER) DO
  IF FILES(CURRHEAD).STATUS=LUKKET THEN
  BEGIN
    CASE BESKED.IREC OF
    2:FILES(CURRHEAD).STATUS:=LÆS;
    3:
    BEGIN
      FILES(CURRHEAD).STATUS:=SKRIV;
      FOR I:=1 TO MAXUSERS DO
      IF USER(I).FILES(CURRHEAD).STATUS=XXCLUSIV THEN
      BEGIN
        IER:=-26;
        I:=MAXUSERS
      END 
    END;
    5:
    BEGIN
      FILES(CURRHEAD).STATUS:=XXCLUSIV;
      FOR I:=1 TO MAXUSERS DO
      IF USER(I).FILES(CURRHEAD).STATUS IN (.SKRIV..XXCLUSIV.) THEN
      BEGIN
        IER:=-27;
        I:=MAXUSERS
      END 
    END 
    OTHERWISE IER:=-28;
    IF IER<>0 THEN BEGIN FILES(CURRHEAD).STATUS:=LUKKET;EXIT(OBEY) END;
    IF NOT FILEHEAD(CURRHEAD).FILEOPEN THEN UDFØR;
    IF NOT (-IER IN (.0,18,19.)) THEN EXIT(OBEY);
    IF NOT FILEHEAD(CURRHEAD).FILEINIT THEN IER:=-12;
    PREDKEY:=0;
    I:=AVAILKEY;
    WHILE I<=TOTALKEYSIZE DO
    BEGIN
      IF KEY(I)<0 THEN SIZE:=1 ELSE SIZE:=KEY(I+1);
      IF SIZE>=FILEHEAD(CURRHEAD).KEYSIZE THEN
      BEGIN
        FILES(CURRHEAD).KEYSTART:=I;
        SUCCKEY:=ABS(KEY(I));
        REST:=SIZE-FILEHEAD(CURRHEAD).KEYSIZE;
        IF REST>0 THEN
        BEGIN
          I:=I+FILEHEAD(CURRHEAD).KEYSIZE;
          IF REST>1 THEN
          BEGIN
            KEY(I):=SUCCKEY;
            KEY(I+1):=REST
          END
          ELSE KEY(I):=-SUCCKEY
        END
        ELSE I:=SUCCKEY;
        IF PREDKEY=0 THEN AVAILKEY:=I ELSE 
        IF KEY(PREDKEY)>0 THEN KEY(PREDKEY):=I ELSE KEY(PREDKEY):=-I;
        I:=TOTALKEYSIZE+1
      END
      ELSE
      BEGIN
        PREDKEY:=I;
        I:=ABS(KEY(I))
      END
    END;
    IF FILES(CURRHEAD).KEYSTART=0 THEN
    BEGIN
      IER:=-29;
      EXIT(OBEY)
    END
 
 
 
  END ELSE IER:=-25;
END;
(*$P*)
PROCEDURE FERMEZ;
BEGIN
  WITH USER(CURRUSER) DO
  BEGIN
    FILES(CURRHEAD).STATUS:=LUKKET;
    FOR I:=1 TO MAXUSERS DO
    IF USER(I).FILES(CURRHEAD).STATUS<>LUKKET THEN I:=MAXUSERS+10;
    IF I<MAXUSERS+10 THEN
    BEGIN
      UDFØR;
      IF IER<>0 THEN EXIT(OBEY);
      FILEHEAD(CURRHEAD).NBUC:=AVAILHEAD;
      AVAILHEAD:=CURRHEAD;
      HEADBASE(CURRFILE):=0;
      CURRZONE:=FILEHEAD(CURRHEAD).BUT;
      IF CURRZONE<AVAILZONE THEN
      BEGIN
        RZ:=0;
        Z(CURRZONE):=AVAILZONE;
        Z(CURRZONE+1):=FILEHEAD(CURRHEAD).AZSIZE;
        AVAILZONE:=CURRZONE
      END
      ELSE
      BEGIN
        RZ:=AVAILZONE;
        WHILE Z(RZ)<CURRZONE DO RZ:=Z(RZ);
        Z(CURRZONE):=Z(RZ);
        Z(CURRZONE+1):=FILEHEAD(CURRHEAD).AZSIZE;
        Z(RZ):=CURRZONE
      END;
      IF Z(CURRZONE)<MZONESIZE THEN
      IF CURRZONE+Z(CURRZONE+1)=Z(CURRZONE) THEN
      BEGIN
        Z(CURRZONE+1):=Z(CURRZONE+1)+Z(Z(CURRZONE)+1);
        Z(CURRZONE):=Z(Z(CURRZONE))
      END;
      IF RZ>0 THEN
      BEGIN
        IF RZ+Z(RZ+1)=Z(RZ) THEN
        BEGIN
          Z(RZ+1):=Z(RZ+1)+Z(Z(RZ)+1);
          Z(RZ):=Z(Z(RZ))
        END
      END 
    END;
    RELEASKEY
  END
END;
(*$P*)
PROCEDURE REED;
VAR I,J:INTEGER;
BEGIN
  WITH USER(CURRUSER) DO
  BEGIN
    PEXTRACT(FILES(CURRHEAD).KEYSTART);
    IF CURRFUNC=LÆSPOSTX THEN
    BEGIN
      FOR I:=1 TO MAXUSERS DO
      IF (USER(I).FILES(CURRHEAD).STATUS=XCLUSIV) AND (I<>CURRUSER) THEN
      BEGIN
        FOR J:=1 TO FILEHEAD(CURRHEAD).KEYSIZE DO
        IF KEY(J-1+USER(I).FILES(CURRHEAD).KEYSTART)<>
           KEY(J-1+USER(CURRUSER).FILES(CURRHEAD).KEYSTART) THEN J:=10000;
        IF J<10000 THEN
        BEGIN
          FILES(CURRHEAD).STATUS:=SKRIV;
          IER:=-31;
          EXIT(OBEY)
        END
      END
    END;
    UDFØR;   
    IF CURRFUNC=LÆSPOSTX THEN
    BEGIN
      IF FILES(CURRHEAD).STATUS=SKRIV THEN FILES(CURRHEAD).STATUS:=XCLUSIV
    END
    ELSE
      IF FILES(CURRHEAD).STATUS=XCLUSIV THEN FILES(CURRHEAD).STATUS:=SKRIV
  END   
END;
(*$P*)
PROCEDURE NÆKST;
VAR I,J:INTEGER;
BEGIN
  WITH USER(CURRUSER) DO
  BEGIN
    UDFØR;
    PEXTRACT(FILES(CURRHEAD).KEYSTART);
    IF CURRFUNC=NÆSTEX THEN
    BEGIN
      FOR I:=1 TO MAXUSERS DO
      IF (USER(I).FILES(CURRHEAD).STATUS=XCLUSIV) AND (I<>CURRUSER) THEN
      BEGIN
        FOR J:=1 TO FILEHEAD(CURRHEAD).KEYSIZE DO
        IF KEY(J-1+USER(I).FILES(CURRHEAD).KEYSTART)<>
           KEY(J-1+USER(CURRUSER).FILES(CURRHEAD).KEYSTART) THEN J:=10000;
        IF J<10000 THEN
        BEGIN
          FILES(CURRHEAD).STATUS:=SKRIV;
          IER:=-31;
          EXIT(OBEY)
        END
      END
    END;
    IF CURRFUNC=NÆSTEX THEN
    BEGIN
      IF FILES(CURRHEAD).STATUS=SKRIV THEN FILES(CURRHEAD).STATUS:=XCLUSIV
    END
    ELSE
      IF FILES(CURRHEAD).STATUS=XCLUSIV THEN FILES(CURRHEAD).STATUS:=SKRIV
  END   
END;
(*$P*)
PROCEDURE ERASAVE;  
VAR I,J:INTEGER;
    HKEY:ARRAY (.1..MAXKEYSIZE.) OF INTEGER;
BEGIN
  WITH USER(CURRUSER) DO
  BEGIN
    IF FILES(CURRHEAD).STATUS=XCLUSIV THEN
    BEGIN
      FOR I:=1 TO FILEHEAD(CURRHEAD).KEYSIZE DO
          HKEY(I):=KEY(I-1+FILES(CURRHEAD).KEYSTART);
      PEXTRACT(FILES(CURRHEAD).KEYSTART);
      FOR I:=1 TO FILEHEAD(CURRHEAD).KEYSIZE DO
          IF KEY(I-1+FILES(CURRHEAD).KEYSTART)<>HKEY(I) THEN I:=10000;
      IF I>10000 THEN 
      BEGIN
        FILES(CURRHEAD).STATUS:=SKRIV;
        IER:=-33;
        EXIT(OBEY)
      END
    END;
    UDFØR;
    IF CURRFUNC<>GEMPOST THEN
    BEGIN
      PEXTRACT(FILES(CURRHEAD).KEYSTART);                                   
      IF CURRFUNC=SLETX THEN                                               
      BEGIN                                                                 
        FOR I:=1 TO MAXUSERS DO                                             
        IF (USER(I).FILES(CURRHEAD).STATUS=XCLUSIV) AND (I<>CURRUSER) THEN  
        BEGIN                                                               
          FOR J:=1 TO FILEHEAD(CURRHEAD).KEYSIZE DO                         
          IF KEY(J-1+USER(I).FILES(CURRHEAD).KEYSTART)<>                    
             KEY(J-1+USER(CURRUSER).FILES(CURRHEAD).KEYSTART) THEN J:=10000;
          IF J<10000 THEN                                                   
          BEGIN                                                             
            FILES(CURRHEAD).STATUS:=SKRIV;                                  
            IER:=-31;                                                       
            EXIT(OBEY)                                                      
          END                                                               
        END                                                                 
      END                                                                   
    END;
    IF CURRFUNC IN (.SLET,GEMPOST.) THEN
       IF FILES(CURRHEAD).STATUS=XCLUSIV THEN FILES(CURRHEAD).STATUS:=SKRIV
  END
END;
(*$P*)
BEGIN
  WITH USER(CURRUSER) DO       
  BEGIN
(*PAS PÅ DATASTRUKTUR NÅR OBEY MISLYKKES*)
    CASE PROGRAMNR OF
    -1:IF CURRFUNC IN
       (.ÅBEN..INITIER,UAFMELD..PAFMELD,RETURNHEAD,RETURNSTAT.) THEN IER:=-22;
     0:IF CURRFUNC IN                                                         
       (.ÅBEN..INITIER,PAFMELD,RETURNHEAD,RETURNSTAT.) THEN IER:=-24 
       ELSE IF CURRFUNC IN (.UTILMELD,STOPSYS.) THEN IER:=-21 
    OTHERWISE
       IF CURRFUNC IN (.UTILMELD..PTILMELD,STOPSYS.) THEN IER:=-23;
    IF IER<>0 THEN EXIT(OBEY);
 
    IF CURRFUNC IN (.LUK..INITIER,RETURNHEAD.) THEN
       IF FILES(CURRHEAD).STATUS=LUKKET THEN BEGIN IER:=-3;EXIT(OBEY) END;
     
    IF CURRFUNC IN (.LÆSPOSTX,NÆSTEX,INDSÆT,INITIER.) THEN
       IF FILES(CURRHEAD).STATUS=LÆS THEN BEGIN IER:=-30;EXIT(OBEY) END;
 
    IF CURRFUNC IN (.SLET,SLETX,GEMPOST.) THEN
       IF NOT (FILES(CURRHEAD).STATUS IN (.XCLUSIV,XXCLUSIV.)) THEN
       BEGIN
         IER:=-32;
         EXIT(OBEY)
       END;
 
    CASE CURRFUNC OF                                                          
    ÅBEN:OUVRIR;
    LUK :FERMEZ;
    LÆSPOST,LÆSPOSTX:REED;
    NÆSTE,NÆSTEX:NÆKST;
    SLET,SLETX,GEMPOST:ERASAVE;
 
    INDSÆT:WITH FILES(CURRHEAD) DO
           BEGIN
             UDFØR;
             PEXTRACT(KEYSTART);
             IF STATUS=XCLUSIV THEN STATUS:=SKRIV
           END;
 
    INITIER:BEGIN
              IREC:=BESKED.IREC;
              UDFØR
            END;
 
    UTILMELD:                                                                 
    BEGIN                                                                     
      PROGRAMNR:=0;                                            
      IF NROFUSERS=MAXUSERS THEN
      BEGIN
        IER:=-34;
        EXIT(OBEY)
      END;
      NROFUSERS:=NROFUSERS+1                                                  
    END;
 
    UAFMELD:                                                                  
    BEGIN                                                                     
      PROGRAMNR:=-1;                                           
      NROFUSERS:=NROFUSERS-1;                                                 
      FOR CURRHEAD:=1 TO MAXOPENFILES DO WITH FILES(CURRHEAD) DO
      IF STATUS<>LUKKET THEN                                                  
      BEGIN                                                             
        STATUS:=LUKKET;                                                 
        RELEASKEY
      END                                                               
    END;
 
    PTILMELD:PROGRAMNR:=BESKED.INFO;
 
    PAFMELD:PROGRAMNR:=0;
 
    STOPSYS:BEGIN
              IF BESKED.INFO=1 THEN NROFUSERS:=0;
              IER:=NROFUSERS 
            END;
 
    RETURNHEAD:RETURNEZ;
     
    RETURNSTAT:
    BEGIN
      REC^(1):=USER(STATUSER).PROGRAMNR;
      FOR CURRFILE:=1 TO MAXFILES DO
        IF HEADBASE(CURRFILE)=0 THEN REC^(CURRFILE+1):=ORD(LUKKET)
        ELSE 
        REC^(CURRFILE+1):=ORD(USER(STATUSER).FILES(HEADBASE(CURRFILE)).STATUS)
    END 
 
    END (*CASE CURRFUNC*)
  END   
END;

Full view