User Tools

Site Tools


cdc:nos2.source:opl.opl871:deck:fsework.001

Deck FSEWORK Part 001

2 Modifications

Listing Sections

Source

Seq #  *Modification Id* Act 
----------------------------+
02118  M01S02105.fsework +++|*
02119  M01S02106.fsework +++|*         SPLITAPEND FINISHES ITS PROCESSING BY SETTING UP PARAMETERS
02120  M01S02107.fsework +++|*         FOR THE POSSIBLE CALLING OF ANY SPLIT ROUTINE FOR THE NEXT
02121  M01S02108.fsework +++|*         HIGHER LEVEL.  NOTE THAT ALL SPLIT ROUTINES ANTICIPATE THAT
02122  M01S02109.fsework +++|*         THE CALLER WILL ITERATE SO LONG AS PARAMETERS INDICATE THAT
02123  M01S02110.fsework +++|*         MORE SPLITTING NEEDS TO BE DONE.  SINCE EACH SPLIT ROUTINE
02124  M01S02111.fsework +++|*         DECREMENTS THE CURRENT TREE LEVEL, THE EFFECT IS TO WORK
02125  M01S02112.fsework +++|*         FROM THE BOTTOM OF THE TREE TOWARDS THE ROOT, SPLITTING
02126  M01S02113.fsework +++|*         UNTIL A LEVEL IS REACHED WHERE EVERYTHING FITS.
02127  M01S02114.fsework +++|*
02128  M01S02115.fsework +++|*         ENTRY  P<NEW> - LOCATION OF OVERFLOW TEXT.
02129  M01S02116.fsework +++|*                NWNEW - NUMBER OF WORDS IN OVERFLOW TEXT.
02130  M01S02117.fsework +++|*                PL - CURRENT LEVEL IN TREE PATH.
02131  M01S02118.fsework +++|*                ALL PATH CONTROLS SETUP.
02132  M01S02119.fsework +++|*                ALL CACHE CONTROLS SETUP.
02133  M01S02120.fsework +++|*
02134  M01S02121.fsework +++|*         EXIT   PL - DECREMENTED.
02135  M01S02122.fsework +++|*                SECTOR AT ORIGINAL TREE LEVEL REBUILT TO CONTAIN
02136  M01S02123.fsework +++|*                    OVERFLOW TEXT.
02137  M01S02124.fsework +++|*                PREVIOUS SECTOR AT ORIGINAL TREE LEVEL RELEASED.
02138  M01S02125.fsework +++|*                NWNEW, NEWBEFORE, NWAFTER - SET FOR ITERATION.
02139  M01S02126.fsework +++|*                NEWDA, NEWNL - SET FOR ITERATION.
02140  M01S02127.fsework +++|*                DISP, PADISP[NEW PL] - INCREMENTED FOR ITERATION.
02141  M01S02128.fsework +++|*
02142  M01S02129.fsework +++|*         CALLS  ALLOC, ALLOCCACHE, MOVEWD.
02143  M01S02130.fsework +++|*
02144  M01S02131.fsework +++|*         USES   P<TOO>.
02145  M01S02132.fsework +++|#
02146  M01S02133.fsework +++|    CLEAN;                   # CLEAN OLD BLOCK   #
02147  M01S02134.fsework +++|
02148  M01S02135.fsework +++|    ALLOC;                   # BUILD NEW BLOCK   #
02149  M01S02136.fsework +++|    ALLOCCACHE;
02150  M01S02137.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02151  M01S02138.fsework +++|    MOVEWD(NWNEW,NEW,TOO);
02152  M01S02139.fsework +++|    PAFINAL[PL] = NWNEW;
02153  M01S02140.fsework +++|    PADIRTY[PL] = TRUE;
02154  M01S02141.fsework +++|
02155  M01S02142.fsework +++|    PADISP[PL] = 1;          # FIX UP PATH       #
02156  M01S02143.fsework +++|    PAFIRST[PL] = FIRST;
02157  M01S02144.fsework +++|    PALAST[PL] = LAST;
02158  M01S02145.fsework +++|
02159  M01S02146.fsework +++|    NEWDA[0] = PADA[PL];     # BUILD NEW DIR ENTRY         #
02160  M01S02147.fsework +++|    NEWNL[0] = PALAST[PL] - PAFIRST[PL] + 1;
02161  M01S02148.fsework +++|    NWNEW = 1;
02162  M01S02149.fsework +++|
02163  M01S02150.fsework +++|    PL = PL - 1;             # SET UP NEXT PASS  #
02164  M01S02151.fsework +++|    NWBEFORE = PADISP[PL];
02165  M01S02152.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02166  M01S02153.fsework +++|    DISP = PADISP[PL] + 1;
02167  M01S02154.fsework +++|    PADISP[PL] = DISP;
02168  M01S02155.fsework +++|    IOEND
02169  M01S02156.fsework +++|PAGE
02170  M01S02157.fsework +++|  PROC SPLITBEFORE;
02171  M01S02158.fsework +++|    IOBEGIN(SPLITBEFORE)
02172  M01S02159.fsework +++|#
02173  M01S02160.fsework +++|**        SPLITBEFORE - SPLIT SECTOR JUST BEFORE INSERTION POINT.
02174  M01S02161.fsework +++|*
02175  M01S02162.fsework +++|*         SPLITBEFORE IS USED TO OVERFLOW ANY NON-ROOT SECTOR UNDER
02176  M01S02163.fsework +++|*         THE CONDITION THAT THE OVERFLOW TEXT MUST BE INSERTED
02177  M01S02164.fsework +++|*         SOMEWHERE IN THE MIDDLE OF THE TEXT ALREADY CONTAINED IN
02178  M01S02165.fsework +++|*         THE SECTOR, AND NEW TEXT WOULD NOT FIT WITHIN THE FIRST
02179  M01S02166.fsework +++|*         SECTOR OF THE NEW PAIR.  THUS, THE SECTOR IS SPLIT JUST IN
02180  M01S02167.fsework +++|*         FRONT OF THE INSERTION POINT, AND THE SECOND SECTOR
02181  M01S02168.fsework +++|*         RESULTING FROM THE SPLIT WILL START WITH THE OVERFLOW TEXT
02182  M01S02169.fsework +++|*         AND CONTINUE WITH THE REMAINING TEXT SPLIT OUT OF THE
02183  M01S02170.fsework +++|*         ORIGINAL SECTOR.
02184  M01S02171.fsework +++|*
02185  M01S02172.fsework +++|*         SINCE SOME EXISTING TEXT MUST BE REMOVED FROM THE CURRENT
02186  M01S02173.fsework +++|*         SECTOR, IT IS NOT POSSIBLE TO KEEP USING THE SAME SECTOR,
02187  M01S02174.fsework +++|*         UNDER THE RULE THAT NOTHING CAN BE POINTED TO WITHOUT FIRST
02188  M01S02175.fsework +++|*         EXISTING ON DISK.  THEREFORE, TWO COMPLETELY NEW SECTORS
02189  M01S02176.fsework +++|*         ARE CREATED AND THE ORIGINAL SECTOR BECOMES A FRAGMENT.
02190  M01S02177.fsework +++|*         SINCE THE INSERTED TEXT GOES INTO THE SECOND SECTOR OF THE
02191  M01S02178.fsework +++|*         NEW PAIR, THAT IS THE SECTOR WHICH IS LEFT AS THE CURRENT
02192  M01S02179.fsework +++|*         SECTOR FOR THIS TREE PATH LEVEL.
02193  M01S02180.fsework +++|*
02194  M01S02181.fsework +++|*         SPLITBEFORE REQUIRES THAT AT LEAST ONE CACHE FRAME IS
02195  M01S02182.fsework +++|*         AVAILABLE FOR ALLOCATION.  THE EXISTING CACHE FRAME FOR
02196  M01S02183.fsework +++|*         THIS TREE LEVEL IS RECYCLED TO PROVIDE THE SECOND SECTOR OF
02197  M01S02184.fsework +++|*         CAPACITY.  THE EXISTING CACHE FRAME IS FIRST SUBJECTED TO
02198  M01S02185.fsework +++|*         THE NORMAL "CLEAN" ROUTINE TO ASSURE THAT ANY PENDING
02199  M01S02186.fsework +++|*         CHANGES ARE FLUSHED TO DISK.
02200  M01S02187.fsework +++|*
02201  M01S02188.fsework +++|*         SPLITBEFORE FINISHES ITS PROCESSING BY SETTING UP PARAMETERS
02202  M01S02189.fsework +++|*         FOR THE POSSIBLE CALLING OF ANY SPLIT ROUTINE FOR THE NEXT
02203  M01S02190.fsework +++|*         HIGHER LEVEL.  NOTE THAT ALL SPLIT ROUTINES ANTICIPATE THAT
02204  M01S02191.fsework +++|*         THE CALLER WILL ITERATE SO LONG AS PARAMETERS INDICATE THAT
02205  M01S02192.fsework +++|*         MORE SPLITTING NEEDS TO BE DONE.  SINCE EACH SPLIT ROUTINE
02206  M01S02193.fsework +++|*         DECREMENTS THE CURRENT TREE LEVEL, THE EFFECT IS TO WORK
02207  M01S02194.fsework +++|*         FROM THE BOTTOM OF THE TREE TOWARDS THE ROOT, SPLITTING
02208  M01S02195.fsework +++|*         UNTIL A LEVEL IS REACHED WHERE EVERYTHING FITS.
02209  M01S02196.fsework +++|*
02210  M01S02197.fsework +++|*         ENTRY  P<NEW> - LOCATION OF OVERFLOW TEXT.
02211  M01S02198.fsework +++|*                NWNEW - NUMBER OF WORDS IN OVERFLOW TEXT.
02212  M01S02199.fsework +++|*                PL - CURRENT LEVEL IN TREE PATH.
02213  M01S02200.fsework +++|*                ALL PATH CONTROLS SETUP.
02214  M01S02201.fsework +++|*                ALL CACHE CONTROLS SETUP.
02215  M01S02202.fsework +++|*
02216  M01S02203.fsework +++|*         EXIT   PL - DECREMENTED.
02217  M01S02204.fsework +++|*                SECTOR AT ORIGINAL TREE LEVEL REBUILT TO CONTAIN
02218  M01S02205.fsework +++|*                    OVERFLOW TEXT AND SPLIT-OFF ORGINAL TEXT.
02219  M01S02206.fsework +++|*                PREVIOUS SECTOR AT ORIGINAL TREE LEVEL RELEASED.
02220  M01S02207.fsework +++|*                NWNEW, NEWBEFORE, NWAFTER - SET FOR ITERATION.
02221  M01S02208.fsework +++|*                NEWDA, NEWNL - SET FOR ITERATION.
02222  M01S02209.fsework +++|*                DISP, PADISP[NEW PL] - INCREMENTED FOR ITERATION.
02223  M01S02210.fsework +++|*
02224  M01S02211.fsework +++|*         CALLS  ALLOC, ALLOCCACHE, MOVEWD, LAST.
02225  M01S02212.fsework +++|*
02226  M01S02213.fsework +++|*         USES   P<TOO>.
02227  M01S02214.fsework +++|#
02228  M01S02215.fsework +++|
02229  M01S02216.fsework +++|    P<FROM> = LOC(BFPRU[PACACHE[PL]]) + 1;      # SAVE OLD DATA     #
02230  M01S02217.fsework +++|    MOVEWD(PAFINAL[PL],FROM,OBF);
02231  M01S02218.fsework +++|
02232  M01S02219.fsework +++|    DEALLOC;                 # FREE UP OLD BLOCK #
02233  M01S02220.fsework +++|
02234  M01S02221.fsework +++|    ALLOC;                   # BUILD OFF BLOCK   #
02235  M01S02222.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02236  M01S02223.fsework +++|    MOVEWD(NWBEFORE,OBF,TOO);
02237  M01S02224.fsework +++|    PAFINAL[PL] = NWBEFORE;
02238  M01S02225.fsework +++|
02239  M01S02226.fsework +++|    ODA = PADA[PL];          # REMEMBER THIS     #
02240  M01S02227.fsework +++|    ONL = FIRST - PAFIRST[PL];
02241  M01S02228.fsework +++|
02242  M01S02229.fsework +++|    PADIRTY[PL] = TRUE;      # GET RID OF OFF BLOCK        #
02243  M01S02230.fsework +++|    CLEAN;
02244  M01S02231.fsework +++|
02245  M01S02232.fsework +++|    ALLOC;                   # BUILD NEW BLOCK   #
02246  M01S02233.fsework +++|    ALLOCCACHE;
02247  M01S02234.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02248  M01S02235.fsework +++|    MOVEWD(NWNEW,NEW,TOO);
02249  M01S02236.fsework +++|    P<FROM> = LOC(OBF) + DISP-1;
02250  M01S02237.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWNEW + 1;
02251  M01S02238.fsework +++|    MOVEWD(NWAFTER,FROM,TOO);
02252  M01S02239.fsework +++|    PAFINAL[PL] = NWNEW + NWAFTER;
02253  M01S02240.fsework +++|    PADIRTY[PL] = TRUE;
02254  M01S02241.fsework +++|
02255  M01S02242.fsework +++|    PADISP[PL] = PADISP[PL] - NWBEFORE;          # FIX UP PATH       #
02256  M01S02243.fsework +++|    PAFIRST[PL] == FIRST;
02257  M01S02244.fsework +++|    PALAST[PL] = PALAST[PL] + NL;
02258  M01S02245.fsework +++|    LAST = PALAST[PL];
02259  M01S02246.fsework +++|
02260  M01S02247.fsework +++|    NEWDA[0] = ODA;          # BUILD NEW DIR ENTRIES       #
02261  M01S02248.fsework +++|    NEWNL[0] = ONL;
02262  M01S02249.fsework +++|    NEWDA[1] = PADA[PL];
02263  M01S02250.fsework +++|    NEWNL[1] = PALAST[PL] - PAFIRST[PL] + 1;
02264  M01S02251.fsework +++|    NWNEW = 2;
02265  M01S02252.fsework +++|
02266  M01S02253.fsework +++|    PL = PL - 1;             # SET UP NEXT PASS  #
02267  M01S02254.fsework +++|    NWBEFORE = PADISP[PL] - 1;
02268  M01S02255.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02269  M01S02256.fsework +++|    DISP = PADISP[PL] + 1;
02270  M01S02257.fsework +++|    PADISP[PL] = DISP;
02271  M01S02258.fsework +++|    IOEND
02272  M01S02259.fsework +++|PAGE
02273  M01S02260.fsework +++|  PROC SPLITAFTER;
02274  M01S02261.fsework +++|    IOBEGIN(SPLITAFTER)
02275  M01S02262.fsework +++|#
02276  M01S02263.fsework +++|**        SPLITAFTER - SPLIT SECTOR JUST AFTER INSERTION POINT.
02277  M01S02264.fsework +++|*
02278  M01S02265.fsework +++|*         SPLITAFTER IS USED TO OVERFLOW ANY NON-ROOT SECTOR UNDER
02279  M01S02266.fsework +++|*         THE CONDITION THAT THE OVERFLOW TEXT MUST BE INSERTED
02280  M01S02267.fsework +++|*         SOMEWHERE IN THE MIDDLE OF THE TEXT ALREADY CONTAINED IN
02281  M01S02268.fsework +++|*         THE SECTOR, AND NEW TEXT WOULD FIT WITHIN THE FIRST
02282  M01S02269.fsework +++|*         SECTOR OF THE NEW PAIR.  THUS, THE SECTOR IS SPLIT JUST
02283  M01S02270.fsework +++|*         BEYOND THE INSERTED TEXT, AND THE SECOND SECTOR
02284  M01S02271.fsework +++|*         RESULTING FROM THE SPLIT WILL START WITH THE REMAINING
02285  M01S02272.fsework +++|*         TEXT SPLIT OUT OF THE ORGINAL SECTOR.
02286  M01S02273.fsework +++|*
02287  M01S02274.fsework +++|*         SINCE SOME EXISTING TEXT MUST BE REMOVED FROM THE CURRENT
02288  M01S02275.fsework +++|*         SECTOR, IT IS NOT POSSIBLE TO KEEP USING THE SAME SECTOR,
02289  M01S02276.fsework +++|*         UNDER THE RULE THAT NOTHING CAN BE POINTED TO WITHOUT FIRST
02290  M01S02277.fsework +++|*         EXISTING ON DISK.  THEREFORE, TWO COMPLETELY NEW SECTORS
02291  M01S02278.fsework +++|*         ARE CREATED AND THE ORIGINAL SECTOR BECOMES A FRAGMENT.
02292  M01S02279.fsework +++|*         SINCE THE INSERTED TEXT GOES INTO THE FIRST SECTOR OF THE
02293  M01S02280.fsework +++|*         NEW PAIR, THAT IS THE SECTOR WHICH IS LEFT AS THE CURRENT
02294  M01S02281.fsework +++|*         SECTOR FOR THIS TREE PATH LEVEL.
02295  M01S02282.fsework +++|*
02296  M01S02283.fsework +++|*         SPLITAFTER REQUIRES THAT AT LEAST ONE CACHE FRAME IS
02297  M01S02284.fsework +++|*         AVAILABLE FOR ALLOCATION.  THE EXISTING CACHE FRAME FOR
02298  M01S02285.fsework +++|*         THIS TREE LEVEL IS RECYCLED TO PROVIDE THE SECOND SECTOR OF
02299  M01S02286.fsework +++|*         CAPACITY.  THE EXISTING CACHE FRAME IS FIRST SUBJECTED TO
02300  M01S02287.fsework +++|*         THE NORMAL "CLEAN" ROUTINE TO ASSURE THAT ANY PENDING
02301  M01S02288.fsework +++|*         CHANGES ARE FLUSHED TO DISK.
02302  M01S02289.fsework +++|*
02303  M01S02290.fsework +++|*         SPLITAFTER FINISHES ITS PROCESSING BY SETTING UP PARAMETERS
02304  M01S02291.fsework +++|*         FOR THE POSSIBLE CALLING OF ANY SPLIT ROUTINE FOR THE NEXT
02305  M01S02292.fsework +++|*         HIGHER LEVEL.  NOTE THAT ALL SPLIT ROUTINES ANTICIPATE THAT
02306  M01S02293.fsework +++|*         THE CALLER WILL ITERATE SO LONG AS PARAMETERS INDICATE THAT
02307  M01S02294.fsework +++|*         MORE SPLITTING NEEDS TO BE DONE.  SINCE EACH SPLIT ROUTINE
02308  M01S02295.fsework +++|*         DECREMENTS THE CURRENT TREE LEVEL, THE EFFECT IS TO WORK
02309  M01S02296.fsework +++|*         FROM THE BOTTOM OF THE TREE TOWARDS THE ROOT, SPLITTING
02310  M01S02297.fsework +++|*         UNTIL A LEVEL IS REACHED WHERE EVERYTHING FITS.
02311  M01S02298.fsework +++|*
02312  M01S02299.fsework +++|*         ENTRY  P<NEW> - LOCATION OF OVERFLOW TEXT.
02313  M01S02300.fsework +++|*                NWNEW - NUMBER OF WORDS IN OVERFLOW TEXT.
02314  M01S02301.fsework +++|*                PL - CURRENT LEVEL IN TREE PATH.
02315  M01S02302.fsework +++|*                ALL PATH CONTROLS SETUP.
02316  M01S02303.fsework +++|*                ALL CACHE CONTROLS SETUP.
02317  M01S02304.fsework +++|*
02318  M01S02305.fsework +++|*         EXIT   PL - DECREMENTED.
02319  M01S02306.fsework +++|*                SECTOR AT ORIGINAL TREE LEVEL REBUILT TO CONTAIN
02320  M01S02307.fsework +++|*                    OVERFLOW TEXT AND SPLIT-OFF ORGINAL TEXT.
02321  M01S02308.fsework +++|*                PREVIOUS SECTOR AT ORIGINAL TREE LEVEL RELEASED.
02322  M01S02309.fsework +++|*                NWNEW, NEWAFTER, NWAFTER - SET FOR ITERATION.
02323  M01S02310.fsework +++|*                NEWDA, NEWNL - SET FOR ITERATION.
02324  M01S02311.fsework +++|*                DISP, PADISP[NEW PL] - INCREMENTED FOR ITERATION.
02325  M01S02312.fsework +++|*
02326  M01S02313.fsework +++|*         CALLS  ALLOC, ALLOCCACHE, MOVEWD, CLEAN, DEALLOC.
02327  M01S02314.fsework +++|*
02328  M01S02315.fsework +++|*         USES   P<TOO>, FIRST, LAST.
02329  M01S02316.fsework +++|#
02330  M01S02317.fsework +++|
02331  M01S02318.fsework +++|    P<FROM> = LOC(BFPRU[PACACHE[PL]]) + 1;      # SAVE OLD DATA     #
02332  M01S02319.fsework +++|    MOVEWD(PAFINAL[PL],FROM,OBF);
02333  M01S02320.fsework +++|
02334  M01S02321.fsework +++|    DEALLOC;                 # FREE UP OLD BLOCK #
02335  M01S02322.fsework +++|
02336  M01S02323.fsework +++|    ALLOC;                   # BUILD OFF BLOCK   #
02337  M01S02324.fsework +++|    P<FROM> = LOC(OBF) + DISP-1;
02338  M01S02325.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02339  M01S02326.fsework +++|    MOVEWD(NWAFTER,FROM,TOO);
02340  M01S02327.fsework +++|    PAFINAL[PL] = NWAFTER;
02341  M01S02328.fsework +++|
02342  M01S02329.fsework +++|    ODA = PADA[PL];          # REMEMBER THIS     #
02343  M01S02330.fsework +++|    ONL = PALAST[PL] + NL - LAST;
02344  M01S02331.fsework +++|
02345  M01S02332.fsework +++|    PADIRTY[PL] = TRUE;      # GET RID OF OFF BLOCK        #
02346  M01S02333.fsework +++|    CLEAN;
02347  M01S02334.fsework +++|
02348  M01S02335.fsework +++|    ALLOC;                   # BUILD NEW BLOCK   #
02349  M01S02336.fsework +++|    ALLOCCACHE;
02350  M01S02337.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02351  M01S02338.fsework +++|    MOVEWD(NWBEFORE,OBF,TOO);
02352  M01S02339.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWBEFORE + 1;
02353  M01S02340.fsework +++|    MOVEWD(NWNEW,NEW,TOO);
02354  M01S02341.fsework +++|    PAFINAL[PL] = NWBEFORE + NWNEW;
02355  M01S02342.fsework +++|    PADIRTY[PL] = TRUE;
02356  M01S02343.fsework +++|
02357  M01S02344.fsework +++|    FIRST = PAFIRST[PL];     # FIX UP PATH       #
02358  M01S02345.fsework +++|    LAST == PALAST[PL];
02359  M01S02346.fsework +++|    LAST = LAST + NL;
02360  M01S02347.fsework +++|
02361  M01S02348.fsework +++|    NEWDA[0] = PADA[PL];     # BUILD NEW DIR ENTRIES       #
02362  M01S02349.fsework +++|    NEWNL[0] = PALAST[PL] - PAFIRST[PL] + 1;
02363  M01S02350.fsework +++|    NEWDA[1] = ODA;
02364  M01S02351.fsework +++|    NEWNL[1] = ONL;
02365  M01S02352.fsework +++|    NWNEW = 2;
02366  M01S02353.fsework +++|
02367  M01S02354.fsework +++|    PL = PL - 1;             # SET UP NEXT PASS  #
02368  M01S02355.fsework +++|    NWBEFORE = PADISP[PL] - 1;
02369  M01S02356.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02370  M01S02357.fsework +++|    DISP = PADISP[PL] + 1;
02371  M01S02358.fsework +++|    IOEND
02372  M01S02359.fsework +++|PAGE
02373  M01S02360.fsework +++|PROC CHANGE;                 # CHANGE TREE       #
02374  M01S02361.fsework +++|  IOBEGIN(CHANGE)
02375  M01S02362.fsework +++|#
02376  M01S02363.fsework +++|**        CHANGE - APPLY CHANGES TO TREE STRUCTURE.
02377  M01S02364.fsework +++|*
02378  M01S02365.fsework +++|*         CHANGE IS THE PRINCIPAL ALGORITHM USED TO MANIPULATE THE
02379  M01S02366.fsework +++|*         TREE STRUCTURE.  CHANGE IS DESIGNED TO BE CALLED BY THE
02380  M01S02367.fsework +++|*         INS, REP, AND DEL ENTRY POINTS.  THE ALGORITHM WORKS IN
02381  M01S02368.fsework +++|*         THREE PHASES.  THE FIRST PHASE TAKES CARE OF CASES WHERE AN
02382  M01S02369.fsework +++|*         INSERTION OF A LINE OR THE REPLACEMENT OF A LINE WITH AN
02383  M01S02370.fsework +++|*         ENLARGED VERSION WILL CAUSE THE CURRENT DATA SECTOR (THE
02384  M01S02371.fsework +++|*         BOTTOM LEVEL OF THE TREE STRUCTURE) TO OUTGROW THE SECTOR
02385  M01S02372.fsework +++|*         CAPACITY AND CAUSE SPLITTING INTO TWO SECTORS.  THIS CAUSES
02386  M01S02373.fsework +++|*         ADDITIONAL DIRECTORY ENTRIES TO BE REQUIRED IN THE HIGHER
02387  M01S02374.fsework +++|*         TREE LEVELS, WHICH CAN IN TURN CAUSE ONE OR MORE DIRECTORY
02388  M01S02375.fsework +++|*         LEVELS TO BE SPLIT INTO MULTIPLE SECTORS.  IN THE EXTREME
02389  M01S02376.fsework +++|*         CASE, THE ROOT LEVEL OF THE TREE MAY OVERFLOW, IN WHICH
02390  M01S02377.fsework +++|*         CASE A NEW INTERMEDIATE LEVEL OF THE TREE MUST BE CREATED,
02391  M01S02378.fsework +++|*         WITH THE ROOT SECTOR CONVERTED INTO A DIRECTORY FOR THE
02392  M01S02379.fsework +++|*         INTERMEDIATE LEVEL.
02393  M01S02380.fsework +++|*
02394  M01S02381.fsework +++|*         AFTER THE FIRST PHASE HAS EXHAUSTED ITS ITERATION, THE
02395  M01S02382.fsework +++|*         SECOND PHASE TAKES OVER, IDENTIFYING ANY TREE LEVEL
02396  M01S02383.fsework +++|*         STARTING WITH THE DATA LEVEL WHICH HAS BECOME EMPTY AS THE
02397  M01S02384.fsework +++|*         RESULT OF DELETIONS.  THE SECOND PHASE IS THUS MUTUALLY
02398  M01S02385.fsework +++|*         EXCLUSIVE OF THE FIRST PHASE.
02399  M01S02386.fsework +++|*
02400  M01S02387.fsework +++|*         THE THIRD PHASE IS A CLEANUP OPERATION.  WHILE EACH OF THE
02401  M01S02388.fsework +++|*         FIRST TWO PHASES MAY BE A NO-OP, (AND AT LEAST ONE OF THE
02402  M01S02389.fsework +++|*         FIRST TWO PHASES WILL INDEED BE A NO-OP), THE THIRD PHASE
02403  M01S02390.fsework +++|*         ALWAYS IS IN EFFECT.  THE CLEANUP OPERATION CONSISTS OF THE
02404  M01S02391.fsework +++|*         APPLICATION OF LEFT-OVER CHANGES.  LEFTOVER CHANGES MAY
02405  M01S02392.fsework +++|*         CONSTITUTE THE ENTIRE CHANGE IF NEITHER PRELIMINARY PHASE
02406  M01S02393.fsework +++|*         WAS NEEDED, OR IF ONE OF THE FIRST TWO PHASES WAS USED,
02407  M01S02394.fsework +++|*         THEN IT WILL HAVE LEFT RESIDUAL CHANGES TO BE APPLIED ONE
02408  M01S02395.fsework +++|*         LEVEL CLOSER TO THE ROOT THAN THE LAST LEVEL AFFECTED BY
02409  M01S02396.fsework +++|*         THE SPLITTING OR COLLAPSING.
02410  M01S02397.fsework +++|*
02411  M01S02398.fsework +++|*         ACTUAL APPLICATION OF CHANGES, WHETHER PERFORMED BY THE
02412  M01S02399.fsework +++|*         THIRD PHASE OF THE CHANGE ROUTINE, OR WITHIN ONE OF THE
02413  M01S02400.fsework +++|*         SPLIT ROUTINES SELECTED BY THE FIRST PHASE OF THE CHANGE
02414  M01S02401.fsework +++|*         ROUTINE, SIMPLY CONSIST OF OPENING UP A GAP AT THE RIGHT
02415  M01S02402.fsework +++|*         MEMORY LOCATION, OF ZERO, POSITIVE, OR NEGATIVE LENGTH, AND
02416  M01S02403.fsework +++|*         MOVING IN THE TEXT OF THE CHANGE, WHICH CAN CONSIST OF ZERO
02417  M01S02404.fsework +++|*         OR MORE WORDS.
02418  M01S02405.fsework +++|*
02419  M01S02406.fsework +++|*         THE CLEANUP PHASE ALSO INCREMENTS OR DECREMENTS THE COUNT
02420  M01S02407.fsework +++|*         OF LINES BRACKETED BY EACH LEVEL OF THE TREE.
02421  M01S02408.fsework +++|*
02422  M01S02409.fsework +++|*         ENTRY  PALVL - DEEPEST LEVEL IN TREE STRUCTURE.
02423  M01S02410.fsework +++|*                PL - CURRENT TREE LEVEL MUST EQUAL PALVL.
02424  M01S02411.fsework +++|*                NL - CHANGE IN NUMBER OF LINES IN WORKFILE.
02425  M01S02412.fsework +++|*                NWBEFORE - NUMBER OF WORDS BEFORE POINT OF CHANGE.
02426  M01S02413.fsework +++|*                NWAFTER - NUMBER OF WORDS AFTER POINT OF CHANGE.
02427  M01S02414.fsework +++|*                NWNEW - NUMBER OF WORDS IN CHANGED TEXT.
02428  M01S02415.fsework +++|*                DISP - POINTS JUST AFTER CURRENT LINE.
02429  M01S02416.fsework +++|*                LINEBUF - CONTAINS TEXT OF CHANGE.
02430  M01S02417.fsework +++|*                ALL PATH CONTROLS - SETUP.
02431  M01S02418.fsework +++|*                ALL CACHE CONTROLS - SETUP.
02432  M01S02419.fsework +++|*
02433  M01S02420.fsework +++|*         EXIT   PL - ZERO.
02434  M01S02421.fsework +++|*                PALVL - INCREMENTED/DECREMENTED IF TREE DEPTH CHANGED.
02435  M01S02422.fsework +++|*                DISP, CURNW - BRACKET NEW CURRENT LINE.
02436  M01S02423.fsework +++|*                ALL PATH, CACHE CONTROLS - UPDATED.
02437  M01S02424.fsework +++|*                FET AND CIRCULAR BUFFER USED IF NEEDED.
02438  M01S02425.fsework +++|*
02439  M01S02426.fsework +++|*         CALLS  COUNTCACHE, FLUSHCACHE, SPLITTOP, SPLITAPEND,
02440  M01S02427.fsework +++|*                SPLITBEFORE, SPLITAFTER, RECLAIMCACHE, DEALLOC, CLEAN,
02441  M01S02428.fsework +++|*                MOVEWD.
02442  M01S02429.fsework +++|*
02443  M01S02430.fsework +++|*         USES   P<NEW>, P<FROM>, P<TOO>, FIRST, LAST, NWNEW,
02444  M01S02431.fsework +++|*                NWBEFORE, NWAFTER, NL.
02445  M01S02432.fsework +++|#
02446  M01S02433.fsework +++|  P<NEW> = LOC(LINEBUF);         # SET THINGS UP     #
02447  M01S02434.fsework +++|  FIRST = CURRENT + NL;
02448  M01S02435.fsework +++|  LAST = FIRST;
02449  M01S02436.fsework +++|  CURNW = NWNEW;
02450  M01S02437.fsework +++|
02451  M01S02438.fsework +++|  FOR PL = PL WHILE NWBEFORE+NWNEW+NWAFTER GR 63 DO
02452  M01S02439.fsework +++|    BEGIN                     # DO ALL SPLITS     #
02453  M01S02440.fsework +++|    IF COUNTCACHE LQ 2 THEN FLUSHCACHE;
02454  M01S02441.fsework +++|    IF PL EQ 0 THEN SPLITTOP;
02455  M01S02442.fsework +++|    IF NWBEFORE EQ PAFINAL[PL] THEN SPLITAPEND;
02456  M01S02443.fsework +++|    ELSE IF NWBEFORE+NWNEW LQ 63 THEN SPLITAFTER;
02457  M01S02444.fsework +++|    ELSE SPLITBEFORE;
02458  M01S02445.fsework +++|    RECLAIMCACHE;
02459  M01S02446.fsework +++|    P<NEW> = LOC(NDIR);
02460  M01S02447.fsework +++|    END
02461  M01S02448.fsework +++|
02462  M01S02449.fsework +++|  FOR PL = PL WHILE NWBEFORE+NWNEW+NWAFTER EQ 0 DO
02463  M01S02450.fsework +++|    BEGIN                     # DO ALL COLLAPSING #
02464  M01S02451.fsework +++|    DEALLOC;
02465  M01S02452.fsework +++|    CLEAN;                   # TO FREE UP CACHE FRAME #
02466  M01S02453.fsework +++|    PALVL = PALVL - 1;
02467  M01S02454.fsework +++|    PL = PL - 1;
02468  M01S02455.fsework +++|    NWBEFORE = PADISP[PL] - 1;
02469  M01S02456.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02470  M01S02457.fsework +++|    DISP = PADISP[PL] + 1;
02471  M01S02458.fsework +++|    END
02472  M01S02459.fsework +++|
02473  M01S02460.fsework +++|  P<FROM> = LOC(BFPRU[PACACHE[PL]]) + DISP;        # SLIDE AFTER       #
02474  M01S02461.fsework +++|  P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWBEFORE +NWNEW + 1;
02475  M01S02462.fsework +++|  MOVEWD(NWAFTER,FROM,TOO);
02476  M01S02463.fsework +++|
02477  M01S02464.fsework +++|  P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWBEFORE + 1; # MOVE IN NEW  #
02478  M01S02465.fsework +++|  MOVEWD(NWNEW,NEW,TOO);
02479  M01S02466.fsework +++|
02480  M01S02467.fsework +++|  PAFINAL[PL] = NWBEFORE + NWNEW + NWAFTER;
02481  M01S02468.fsework +++|  PADIRTY[PL] = TRUE;
02482  M01S02469.fsework +++|  PALAST[PL] = PALAST[PL] + NL;        # FIX UP PATH       #
02483  M01S02470.fsework +++|
02484  M01S02471.fsework +++|  FOR PL = PL-1 STEP -1 UNTIL 0 DO     # UPDATE HIGHER DIRS       #
02485  M01S02472.fsework +++|    BEGIN
02486  M01S02473.fsework +++|    P<PRU> = LOC(BFPRU[PACACHE[PL]]);
02487  M01S02474.fsework +++|    DIRNL[PADISP[PL]] = DIRNL[PADISP[PL]] + NL;
02488  M01S02475.fsework +++|    PADIRTY[PL] = TRUE;
02489  M01S02476.fsework +++|    PALAST[PL] = PALAST[PL] + NL;
02490  M01S02477.fsework +++|    END
02491  M01S02478.fsework +++|
02492  M01S02479.fsework +++|  CURRENT = CURRENT + NL;          # UPDATE CURRENT       #
02493  M01S02480.fsework +++|
02494  M01S02481.fsework +++|  IOEND
02495  M01S02482.fsework +++|PAGE
02496  M01S02483.fsework +++|
02497  M01S02484.fsework +++|PROC INS;
02498  M01S02485.fsework +++|  IOBEGIN(INS)
02499  M01S02486.fsework +++|#
02500  M01S02487.fsework +++|**        INS - INTERFACE FOR INSERTION OF LINES.
02501  M01S02488.fsework +++|*
02502  M01S02489.fsework +++|*         ENTRY  CURRENT - CURRENT LINE.
02503  M01S02490.fsework +++|*                LINEBUF - LINE IMAGE.
02504  M01S02491.fsework +++|*                ALL PATH AND CACHE CONTROLS SETUP.
02505  M01S02492.fsework +++|*
02506  M01S02493.fsework +++|*         EXIT   CURRENT - INCREMENETED.
02507  M01S02494.fsework +++|*                ALL PATH AND CACHE CONTROL UPDATED.
02508  M01S02495.fsework +++|*
02509  M01S02496.fsework +++|*         CALLS  LINESZ, CHANGE, WIOSTAT.
02510  M01S02497.fsework +++|*
02511  M01S02498.fsework +++|*         USES   PL, DISP, NL, NWBEFORE, NWNEW, NWAFTER, DISP.
02512  M01S02499.fsework +++|#
02513  M01S02500.fsework +++|  CONTROL IFEQ MULTI,1;
02514  M01S02501.fsework +++|    WIOSTAT(0);               # ACCUMULATE LINE ACCESES #
02515  M01S02502.fsework +++|  CONTROL FI;
02516  M01S02503.fsework +++|
02517  M01S02504.fsework +++|  PL = PALVL;                # STANDARD INITCHANGE         #
02518  M01S02505.fsework +++|  DISP = PADISP[PL];
02519  M01S02506.fsework +++|
02520  M01S02507.fsework +++|  NL = 1;
02521  M01S02508.fsework +++|  NWBEFORE = DISP + CURNW - 1;
02522  M01S02509.fsework +++|  NWNEW = LINESZ(LINEBUF);
02523  M01S02510.fsework +++|  NWAFTER = PAFINAL[PL] - DISP - CURNW + 1;
02524  M01S02511.fsework +++|  DISP = DISP + CURNW;
02525  M01S02512.fsework +++|
02526  M01S02513.fsework +++|  PADISP[PL] = DISP;
02527  M01S02514.fsework +++|
02528  M01S02515.fsework +++|  CHANGE;
02529  M01S02516.fsework +++|  IOEND
02530  M01S02517.fsework +++|
02531  M01S02518.fsework +++|PROC REP;
02532  M01S02519.fsework +++|  IOBEGIN(REP)
02533  M01S02520.fsework +++|#
02534  M01S02521.fsework +++|**        REP - INTERFACE FOR REPLACEMENT OF LINES.
02535  M01S02522.fsework +++|*
02536  M01S02523.fsework +++|*         ENTRY  CURRENT - CURRENT LINE.
02537  M01S02524.fsework +++|*                LINEBUF - LINE IMAGE.
02538  M01S02525.fsework +++|*                ALL PATH AND CACHE CONTROLS SETUP.
02539  M01S02526.fsework +++|*
02540  M01S02527.fsework +++|*         EXIT   CURRENT - UNCHANGED.
02541  M01S02528.fsework +++|*                ALL PATH AND CACHE CONTROL UPDATED.
02542  M01S02529.fsework +++|*
02543  M01S02530.fsework +++|*         CALLS  LINESZ, CHANGE, WIOSTAT.
02544  M01S02531.fsework +++|*
02545  M01S02532.fsework +++|*         USES   PL, DISP, NL, NWBEFORE, NWNEW, NWAFTER, DISP.
02546  M01S02533.fsework +++|#
02547  M01S02534.fsework +++|
02548  M01S02535.fsework +++|  CONTROL IFEQ MULTI,1;
02549  M01S02536.fsework +++|    WIOSTAT(0);               # ACCUMULATE LINE ACCESES #
02550  M01S02537.fsework +++|  CONTROL FI;
02551  M01S02538.fsework +++|
02552  M01S02539.fsework +++|  PL = PALVL;                # STANDARD INITCHANGE         #
02553  M01S02540.fsework +++|  DISP = PADISP[PL];
02554  M01S02541.fsework +++|
02555  M01S02542.fsework +++|  NL = 0;
02556  M01S02543.fsework +++|  NWBEFORE = DISP - 1;
02557  M01S02544.fsework +++|  NWNEW = LINESZ(LINEBUF);
02558  M01S02545.fsework +++|  NWAFTER = PAFINAL[PL] - DISP - CURNW + 1;
02559  M01S02546.fsework +++|  DISP = DISP + CURNW;
02560  M01S02547.fsework +++|
02561  M01S02548.fsework +++|  CHANGE;
02562  M01S02549.fsework +++|  IOEND
02563  M01S02550.fsework +++|
02564  M01S02551.fsework +++|PROC DEL;
02565  M01S02552.fsework +++|  IOBEGIN(DEL)
02566  M01S02553.fsework +++|#
02567  M01S02554.fsework +++|**        DEL - INTERFACE FOR DELETION OF LINES.
02568  M01S02555.fsework +++|*
02569  M01S02556.fsework +++|*         ENTRY  CURRENT - CURRENT LINE.
02570  M01S02557.fsework +++|*                ALL PATH AND CACHE CONTROLS SETUP.
02571  M01S02558.fsework +++|*                DELETCTL - POST-POSITIONING INCREMENT.
02572  M01S02559.fsework +++|*
02573  M01S02560.fsework +++|*         EXIT   CURRENT - INCREMENTED IF DELETCTL WAS ONE.
02574  M01S02561.fsework +++|*                LINEBUF - NEW CURRENT LINE IS READ UP.
02575  M01S02562.fsework +++|*                ALL PATH AND CACHE CONTROL UPDATED.
02576  M01S02563.fsework +++|*                DELETCTL - FORCED ZERO IF DELETED LAST LINE.
02577  M01S02564.fsework +++|*
02578  M01S02565.fsework +++|*         CALLS  CHANGE, WIOSTAT, POSR.
02579  M01S02566.fsework +++|*
02580  M01S02567.fsework +++|*         USES   PL, DISP, NL, NWBEFORE, NWNEW, NWAFTER, DISP,
02581  M01S02568.fsework +++|*                P<MVLNBUF>, NEWCURL.
02582  M01S02569.fsework +++|#
02583  M01S02570.fsework +++|
02584  M01S02571.fsework +++|  CONTROL IFEQ MULTI,1;
02585  M01S02572.fsework +++|    WIOSTAT(0);               # ACCUMULATE LINE ACCESES #
02586  M01S02573.fsework +++|  CONTROL FI;
02587  M01S02574.fsework +++|
02588  M01S02575.fsework +++|  PL = PALVL;                # STANDARD INITCHANGE         #
02589  M01S02576.fsework +++|  DISP = PADISP[PL];
02590  M01S02577.fsework +++|
02591  M01S02578.fsework +++|  NL = -1;
02592  M01S02579.fsework +++|  NWBEFORE = DISP - 1;
02593  M01S02580.fsework +++|  NWNEW = 0;
02594  M01S02581.fsework +++|  NWAFTER = PAFINAL[PL] - DISP - CURNW + 1;
02595  M01S02582.fsework +++|  DISP = DISP + CURNW;
02596  M01S02583.fsework +++|
02597  M01S02584.fsework +++|  CHANGE;
02598  M01S02585.fsework +++|
02599  M01S02586.fsework +++|  IF PALAST[0] LQ CURRENT THEN DELETCTL=0;
02600  M01S02587.fsework +++|  CURRENT=CURRENT+DELETCTL;
02601  M01S02588.fsework +++|  NEWCURL=CURRENT;
02602  M01S02589.fsework +++|  P<MVLNBUF>=LOC(LINEBUF);
02603  M01S02590.fsework +++|  POSR;
02604  M01S02591.fsework +++|  P<MVLNBUF>=0;
02605  M01S02592.fsework +++|
02606  M01S02593.fsework +++|  IOEND
02607  M01S02594.fsework +++|PAGE
02608  M01S02595.fsework +++|PROC INIT;
02609  M01S02596.fsework +++|  BEGIN
02610  M01S02597.fsework +++|#
02611  M01S02598.fsework +++|**        INIT - INITIALIZE MEMORY CELLS FOR WORKIO.
02612  M01S02599.fsework +++|*
02613  M01S02600.fsework +++|*         ENTRY  NO CONDITIONS.
02614  M01S02601.fsework +++|*
02615  M01S02602.fsework +++|*         EXIT   P<LINEBUF> -POINTS TO LIN ARRAY.
02616  M01S02603.fsework +++|*                ALL ELEMENTS OF PATH ARRAY - NOMINAL.
02617  M01S02604.fsework +++|*                ALL CACHE CONTROLS - NOMINAL.
02618  M01S02605.fsework +++|*                READ LIST (RDLIST, RDIN, RDOUT) - EMPTY.
02619  M01S02606.fsework +++|*                FLAGS (IOACT, IOREAD, IOWRITE) - FALSE.
02620  M01S02607.fsework +++|*                ARRAYLEN, DATALEN, ARRAYPRUS, DATAPRUS - INITIALIZED.
02621  M01S02608.fsework +++|*                SEGEMENTVER - ZEROED OUT.
02622  M01S02609.fsework +++|#
02623  M01S02610.fsework +++|  P<LINEBUF>=LOC(LIN);
02624  M01S02611.fsework +++|
02625  M01S02612.fsework +++|  FOR PL = 1 STEP 1 UNTIL MAXDEPTH DO  # INIT PATH         #
02626  M01S02613.fsework +++|    BEGIN
02627  M01S02614.fsework +++|    PAFIRST[PL] = 0;
02628  M01S02615.fsework +++|    PALAST[PL] = 0;
02629  M01S02616.fsework +++|    PADISP[PL] = 0;
02630  M01S02617.fsework +++|    PAHEAD[PL] = 0;
02631  M01S02618.fsework +++|    END
02632  M01S02619.fsework +++|
02633  M01S02620.fsework +++|  FOR PL = 0 STEP 1 UNTIL MAXCACHE DO  # INIT CACHE CTL    #
02634  M01S02621.fsework +++|    BEGIN
02635  M01S02622.fsework +++|    CACHEOWNED[PL]=FALSE; CACHEDIRTY[PL]=FALSE;
02636  M01S02623.fsework +++|    CACHEAGE[PL]=-1;
02637  M01S02624.fsework +++|    BFHEAD[PL]=0;
02638  M01S02625.fsework +++|    END
02639  M01S02626.fsework +++|
02640  M01S02627.fsework +++|  FOR RDIN = 0 STEP 1 UNTIL RDLIM DO RDLIST[RDIN] = 0;
02641  M01S02628.fsework +++|
02642  M01S02629.fsework +++|  IOACT = FALSE;             # INIT IO #
02643  M01S02630.fsework +++|  IOAPEND = FALSE;
02644  M01S02631.fsework +++|  IOWRITE = FALSE;
02645  M01S02632.fsework +++|  IOREAD = FALSE;
02646  M01S02633.fsework +++|
02647  M01S02634.fsework +++|  CURNW = 0;
02648  M01S02635.fsework +++|
02649  M01S02636.fsework +++|  SEGMENTVER=0;
02650  M01S02637.fsework +++|  ARRAYLEN=LOC(ARRAYEND)-LOC(ARRAYSTART);
02651  M01S02638.fsework +++|  ARRAYPRUS=(ARRAYLEN+O"77")/O"100";
02652  M01S02639.fsework +++|  DATALEN=LOC(DATAEND)-LOC(DATASTART);
02653  M01S02640.fsework +++|  DATAPRUS=(DATALEN+O"77")/O"100";
02654  M01S02641.fsework +++|
02655  M01S02642.fsework +++|  END
02656  M01S02643.fsework +++|PAGE
02657  M01S02644.fsework +++|PROC RESUMIO;
02658  M01S02645.fsework +++|  IOBEGIN(RESUMIO)
02659  M01S02646.fsework +++|#
02660  M01S02647.fsework +++|**        RESUMIO - RESUME EDITOR STATUS FROM LEFTOVER WORKFILE.
02661  M01S02648.fsework +++|*
02662  M01S02649.fsework +++|*         RESUMIO ATTEMPTS TO VALIDATE A FILE AS CONTAINING THE TEXT
02663  M01S02650.fsework +++|*         AND STATUS LEFT BY A PREVIOUS EDIT SESSION, OR BY A
02664  M01S02651.fsework +++|*         SINGLE/MULTI USER TRANSITION.  SINCE THE SCALAR AND ARRAY
02665  M01S02652.fsework +++|*         DATA SEGMENTS CONTAIN NEARLY ALL EDITOR DATA, SUCCESSFUL
02666  M01S02653.fsework +++|*         EXECUTION OF RESUMIO CHANGES EVERYTHING.
02667  M01S02654.fsework +++|*
02668  M01S02655.fsework +++|*         THE FOLLOWING CONDITIONS ARE REQUIRED TO VALIDATE AN
02669  M01S02656.fsework +++|*         APPARENT WORKFILE AS A LEGITIMATE BASIS FOR RESUMPTION --
02670  M01S02657.fsework +++|*
02671  M01S02658.fsework +++|*                1. THE FIRST WORD MUST BE FORMATTED AS A ROOT SECTOR
02672  M01S02659.fsework +++|*                HEADER WORD.  THE DISK ADDRESS FIELD MUST BE ONE AND
02673  M01S02660.fsework +++|*                THE TOP FLAG MUST BE ON AND THE DIRECTORY AND DATA
02674  M01S02661.fsework +++|*                FLAGS MUST BE UNEQUAL.
02675  M01S02662.fsework +++|*
02676  M01S02663.fsework +++|*                2. THE FIRST RECORD OF THE FILE MUST BE OF LENGTH
02677  M01S02664.fsework +++|*                64 WORDS LONGER THAN THE SCALAR DATA SEGMENT, AND
02678  M01S02665.fsework +++|*                THE SECOND RECORD OF THE FILE MUST EXACTLY MATCH
02679  M01S02666.fsework +++|*                THE LENGTH OF THE ARRAY SEGMENT.
02680  M01S02667.fsework +++|*
02681  M01S02668.fsework +++|*                3. THE SEGMENTLEN1 AND SEGMENTLEN2 FIELDS OF THE SCALAR
02682  M01S02669.fsework +++|*                SEGMENT MUST MATCH THE ABOVE LENGTHS, AND THE
02683  M01S02670.fsework +++|*                SEGMENTVER FIELD MUST MATCH THE VERSION NUMBER
02684  M01S02671.fsework +++|*                COMPILED INTO THIS PROGRAM.
02685  M01S02672.fsework +++|*
02686  M01S02673.fsework +++|*         AFTER READING UP ALL EDITOR DATA, THE FOLLOWING WORKIO
02687  M01S02674.fsework +++|*         CONTROLS ARE RE-INITIALIZED - THE PATH VECTOR IS REFRESHED
02688  M01S02675.fsework +++|*         TO MATCH THE CURRENT LINE, THE SCHEDULING FLAGS (IOACT,
02689  M01S02676.fsework +++|*         IOREAD, ETC.) ARE CLEARED, MAXDA AND DANEXT ARE BASED ON
02690  M01S02677.fsework +++|*         FILE SIZE, AND SEGMENTVER IS CLEARED.  THE WORKFILE IS THEN
02691  M01S02678.fsework +++|*         IMMEDIATELY CHECKPOINTED SO THAT IT CANNOT BE RESUMED
02692  M01S02679.fsework +++|*         AGAIN, THUS INTERLOCKING IT.
02693  M01S02680.fsework +++|*
02694  M01S02681.fsework +++|*         ENTRY  NO CONDITIONS.
02695  M01S02682.fsework +++|*
02696  M01S02683.fsework +++|*         EXIT   EVERYTHING IN THE WHOLE EDITOR IS CHANGED.
02697  M01S02684.fsework +++|*                IORESUMED - SUCCESS/FAILURE INDICATOR.
02698  M01S02685.fsework +++|*
02699  M01S02686.fsework +++|*         CALLS  INIT, INITFET, BUFUSAGE, ALLOCCACHE, RDWBUF, READ,
02700  M01S02687.fsework +++|*                WAIT, TRAGIC, SKIPEI, POSR, CLEANALL.
02701  M01S02688.fsework +++|#
02702  M01S02689.fsework +++|  INIT;
02703  M01S02690.fsework +++|  IORESUMED=FALSE;
02704  M01S02691.fsework +++|  INITFET(DISK,DSKSIZ);
02705  M01S02692.fsework +++|
02706  M01S02693.fsework +++|  REWIND(FET,0);             # TRY TO READ PRU 1 #
02707  M01S02694.fsework +++|  WAIT;
02708  M01S02695.fsework +++|  READ(FET,0);
02709  M01S02696.fsework +++|  WAIT;
02710  M01S02697.fsework +++|
02711  M01S02698.fsework +++|  IF BUFUSAGE GR O"100" THEN
02712  M01S02699.fsework +++|    BEGIN
02713  M01S02700.fsework +++|    PL=0;
02714  M01S02701.fsework +++|    PADA[0]=1;
02715  M01S02702.fsework +++|    ALLOCCACHE;
02716  M01S02703.fsework +++|    P<TOO>=LOC(BFPRU[PACACHE[0]]);
02717  M01S02704.fsework +++|    RDWBUF(O"100");
02718  M01S02705.fsework +++|    PAHEAD[0] = BFHEAD[PACACHE[0]];
02719  M01S02706.fsework +++|    END
02720  M01S02707.fsework +++|
02721  M01S02708.fsework +++|  IF PADA[0] EQ 1 AND PATOP[0]
02722  M01S02709.fsework +++|    AND BOOLDIFF(PADIR[0],PADATA[0]) THEN
02723  M01S02710.fsework +++|    BEGIN
02724  M01S02711.fsework +++|
02725  M01S02712.fsework +++|    # READ FIRST FOUR WORDS TO VERIFY SEGMENT DESCRIPTORS #
02726  M01S02713.fsework +++|    P<TOO>=LOC(DATASTART);
02727  M01S02714.fsework +++|    NWNEW=BUFUSAGE;
02728  M01S02715.fsework +++|    NWNEW=MIN(NWNEW,4);
02729  M01S02716.fsework +++|    RDWBUF(NWNEW);
02730  M01S02717.fsework +++|    IORESUMED=FALSE;
02731  M01S02718.fsework +++|    IF SEGMENTVER NQ IOVERSION OR SEGMENTLEN1 NQ DATALEN
02732  M01S02719.fsework +++|      OR SEGMENTLEN2 NQ ARRAYLEN THEN IORET
02733  M01S02720.fsework +++|
02734  M01S02721.fsework +++|    # SEGMENT DESCRIPTORS VALID, READ REST OF SCALAR SEGMENT #
02735  M01S02722.fsework +++|    P<TOO>=LOC(DATASTART)+4;
02736  M01S02723.fsework +++|    NWNEW=BUFUSAGE;
02737  M01S02724.fsework +++|    NWNEW=MIN(DATALEN-4,NWNEW);
02738  M01S02725.fsework +++|    RDWBUF(NWNEW);
02739  M01S02726.fsework +++|    READ(FET,0);
02740  M01S02727.fsework +++|    WAIT;
02741  M01S02728.fsework +++|
02742  M01S02729.fsework +++|    # READ ARRAY SEGMENT #
02743  M01S02730.fsework +++|    P<TOO>=LOC(ARRAYSTART);
02744  M01S02731.fsework +++|    NWNEW=BUFUSAGE;
02745  M01S02732.fsework +++|    NWNEW=MIN(ARRAYLEN,NWNEW);
02746  M01S02733.fsework +++|    RDWBUF(NWNEW);
02747  M01S02734.fsework +++|
02748  M01S02735.fsework +++|    IF ABORTED THEN TRAGIC(ERRSTRING);
02749  M01S02736.fsework +++|
02750  M01S02737.fsework +++|    SKIPEI(FET,0);
02751  M01S02738.fsework +++|    WAIT;
02752  M01S02739.fsework +++|    MAXDA=FETCRI-1;
02753  M01S02740.fsework +++|    DANEXT=FETCRI;
02754  M01S02741.fsework +++|
02755  M01S02742.fsework +++|    PADISP[0] = 1;           # SET UP PATH[0]    #
02756  M01S02743.fsework +++|    PAFIRST[0] = 0;
02757  M01S02744.fsework +++|    PALAST[0] = -1;
02758  M01S02745.fsework +++|    P<PRU> = LOC(BFPRU[PACACHE[0]]);
02759  M01S02746.fsework +++|    IF PADIR[0] THEN
02760  M01S02747.fsework +++|      BEGIN
02761  M01S02748.fsework +++|      FOR DISP = 1 STEP 1 UNTIL PAFINAL[0]
02762  M01S02749.fsework +++|        DO PALAST[0] = PALAST[0] + DIRNL[DISP];
02763  M01S02750.fsework +++|      END
02764  M01S02751.fsework +++|    ELSE                     # NOTE INTERNAL CHARSET SIGN BIT USAGE  #
02765  M01S02752.fsework +++|      BEGIN
02766  M01S02753.fsework +++|      FOR DISP = 1 STEP 1 UNTIL PAFINAL[0]
02767  M01S02754.fsework +++|        DO IF B<0,1>DATWORD[DISP] NQ 0 THEN PALAST[0] = PALAST[0] + 1;
02768  M01S02755.fsework +++|      END
02769  M01S02756.fsework +++|
02770  M01S02757.fsework +++|    IORESUMED=TRUE;          # RESET FLAGS READ WITH DATA  #
02771  M01S02758.fsework +++|    IOACT=FALSE;
02772  M01S02759.fsework +++|    IOREAD=FALSE;
02773  M01S02760.fsework +++|    IOWRITE=FALSE;
02774  M01S02761.fsework +++|    IOAPEND=FALSE;
02775  M01S02762.fsework +++|
02776  M01S02763.fsework +++|    PALVL = 0;               # BUILD REST OF PATH          #
02777  M01S02764.fsework +++|    NEWCURL=0;
02778  M01S02765.fsework +++|    P<MVLNBUF>=LOC(LINEBUF);
02779  M01S02766.fsework +++|    POSR;
02780  M01S02767.fsework +++|    P<MVLNBUF>=0;
02781  M01S02768.fsework +++|
02782  M01S02769.fsework +++|    SEGMENTVER=0;            # INTERLOCK FILE ONWESHIP     #
02783  M01S02770.fsework +++|    CLEANALL;
02784  M01S02771.fsework +++|
02785  M01S02772.fsework +++|    END
02786  M01S02773.fsework +++|
02787  M01S02774.fsework +++|  IOEND
02788  M01S02775.fsework +++|PAGE
02789  M01S02776.fsework +++|
02790  M01S02777.fsework +++|CONTROL IFEQ SINGLE,1;
02791  M01S02778.fsework +++|
02792  M01S02779.fsework +++|PROC INITIO;
02793  M01S02780.fsework +++|  IOBEGIN(INITIO)
02794  M01S02781.fsework +++|#
02795  M01S02782.fsework +++|**        INITIO - FORMAT A NEW WORKFILE.
02796  M01S02783.fsework +++|*
02797  M01S02784.fsework +++|*         INITIO IS USED TO BUILD A WORKFILE FROM SCRATCH OR TO
02798  M01S02785.fsework +++|*         DISCARD OLD WORKFILE CONTENT AND REFRESH IT.
02799  M01S02786.fsework +++|*
02800  M01S02787.fsework +++|*         ENTRY  NO CONDITIONS.
02801  M01S02788.fsework +++|*
02802  M01S02789.fsework +++|*         EXIT   FILE INITIALIZED.
02803  M01S02790.fsework +++|*                ALL PATH CONTROLS NOMINAL.
02804  M01S02791.fsework +++|*                ALL CACHE CONTROL NOMINAL.
02805  M01S02792.fsework +++|*                MAXDA - ZERO
02806  M01S02793.fsework +++|*                DANEXT - FIRST ALLOCATABLE DISK ADDRESS RIGHT AFTER
02807  M01S02794.fsework +++|*                    ROOT SECTOR, AND SCALAR AND ARRAY DATA SEGMENTS.
02808  M01S02795.fsework +++|*                IORESUMED - TRUE TO SHOW WORKIO ACTIVE.
02809  M01S02796.fsework +++|*                SEGMENTVER - ZERO IN MEMORY AND ON DISK TO INTERLOCK.
02810  M01S02797.fsework +++|*
02811  M01S02798.fsework +++|*         CALLS  INITFET, EVICT, WAIT, INIT, ALLOCCACHE, CLEANALL.
02812  M01S02799.fsework +++|#
02813  M01S02800.fsework +++|  INITFET(DISK,DSKSIZ);
02814  M01S02801.fsework +++|  EVICT(FET,0);
02815  M01S02802.fsework +++|  WAIT;
02816  M01S02803.fsework +++|
02817  M01S02804.fsework +++|  INIT;
02818  M01S02805.fsework +++|  MAXDA = 0;                 # SET MAXDA AND DANEXT        #
02819  M01S02806.fsework +++|  DANEXT = 2+DATAPRUS+ARRAYPRUS;
02820  M01S02807.fsework +++|
02821  M01S02808.fsework +++|  PAHEAD[0] = 0;             # BUILD TOP BLOCK   #
02822  M01S02809.fsework +++|  PADATA[0] = TRUE;
02823  M01S02810.fsework +++|  PATOP[0] = TRUE;
02824  M01S02811.fsework +++|  PADIRTY[0] = TRUE;
02825  M01S02812.fsework +++|  PADA[0] = 1;
02826  M01S02813.fsework +++|  PAFINAL[0] = 1;
02827  M01S02814.fsework +++|  PL=0;
02828  M01S02815.fsework +++|  ALLOCCACHE;
02829  M01S02816.fsework +++|  P<PRU> = LOC(BFPRU[PACACHE[0]]);
02830  M01S02817.fsework +++|  DATWORD[1] = NULLIN;
02831  M01S02818.fsework +++|  CURNW = 1;
02832  M01S02819.fsework +++|
02833  M01S02820.fsework +++|  PADEPTH[0] = 0;
02834  M01S02821.fsework +++|  PADISP[0] = 1;             # SET UP PATH       #
02835  M01S02822.fsework +++|  PAFIRST[0] = 0;
02836  M01S02823.fsework +++|  PALAST[0] = 0;
02837  M01S02824.fsework +++|  PALVL = 0;
02838  M01S02825.fsework +++|  CURRENT = 0;
02839  M01S02826.fsework +++|  IORESUMED=TRUE;            # SHOW WORKIO ALIVE #
02840  M01S02827.fsework +++|
02841  M01S02828.fsework +++|  SEGMENTVER = 0;            # INTERLOCK FILE OWNERSHIP    #
02842  M01S02829.fsework +++|  CLEANALL;
02843  M01S02830.fsework +++|
02844  M01S02831.fsework +++|  IOEND
02845  M01S02832.fsework +++|
02846  M01S02833.fsework +++|CONTROL FI;
02847  M01S02834.fsework +++|PAGE
02848  M01S02835.fsework +++|PROC CHECKIO;
02849  M01S02836.fsework +++|  IOBEGIN(CHECKIO)
02850  M01S02837.fsework +++|#
02851  M01S02838.fsework +++|**        CHECKIO - CHECKPOINT WORKFILE.
02852  M01S02839.fsework +++|*
02853  M01S02840.fsework +++|*         CHECKIO IS USED TO ASSURE THAT ALL MEMORY DATA IS FULLY
02854  M01S02841.fsework +++|*         WRITTEN TO DISK.  THIS CAN BE USED TO PREPARE FOR END OF
02855  M01S02842.fsework +++|*         JOB STEP OR FOR TRANSITION BETWEEN SINGLE AND MULTIPLE USER
02856  M01S02843.fsework +++|*         VERSIONS OF THE EDITOR.  BY CHECKPOINTING THE WORKFILE, IT
02857  M01S02844.fsework +++|*         BECOMES POSSIBLE TO EXECUTE THE RESUMIO ROUTINE AND FULLY
02858  M01S02845.fsework +++|*         RESTORE THE EDITOR STATUS.
02859  M01S02846.fsework +++|*
02860  M01S02847.fsework +++|*         ENTRY  IORESUMED - SHOWS WHETHER WORKFILE MANAGER EVER ACTIVE.
02861  M01S02848.fsework +++|*                CURRENT - CURRENT LINE ORDINAL.
02862  M01S02849.fsework +++|*
02863  M01S02850.fsework +++|*         EXIT   SEGMENTVER, SEGMENTLEN1, SEGMENTLEN2 - SETUP.
02864  M01S02851.fsework +++|*                CACHE FLUSHED, FET AND CIRCULAR BUFFER COMPLETE.
02865  M01S02852.fsework +++|*
02866  M01S02853.fsework +++|*         CALLS  CLEANALL.
02867  M01S02854.fsework +++|#
02868  M01S02855.fsework +++|  IF NOT IORESUMED THEN IORET  # WORKIO NEVER ALIVE          #
02869  M01S02856.fsework +++|
02870  M01S02857.fsework +++|  SAVECURL=CURRENT;
02871  M01S02858.fsework +++|  SEGMENTVER = IOVERSION;    # SHOW VALID WORKFILE FORMAT  #
02872  M01S02859.fsework +++|  SEGMENTLEN1 = DATALEN;
02873  M01S02860.fsework +++|  SEGMENTLEN2 = ARRAYLEN;
02874  M01S02861.fsework +++|  CLEANALL;                  # WRITE OUT WHOLE PATH        #
02875  M01S02862.fsework +++|
02876  M01S02863.fsework +++|  IOEND
02877  M01S02864.fsework +++|
02878  M01S02865.fsework +++|
02879  M01S02866.fsework +++|  END TERM
cdc/nos2.source/opl.opl871/deck/fsework.001.txt ยท Last modified: by 127.0.0.1