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 
----------------------------+
02105  M00S02092.fsework +++|*         SECTOR REMAINS JUST AS IT IS, AND A NEW SECTOR IS
02106  M00S02093.fsework +++|*         CONSTRUCTED WHICH CONTAINS PRECISELY THE OVERFLOW TEXT.
02107  M00S02094.fsework +++|*         SINCE NO EXISTING TEXT LEAVES THE SECTOR, THERE IS NO NEED
02108  M00S02095.fsework +++|*         TO DISCARD IT AND BUILD TWO COMPLETELY NEW SECTORS.  THUS,
02109  M00S02096.fsework +++|*         SPLITAPEND IS MORE EFFICIENT THAN SPLITBEFORE OR
02110  M00S02097.fsework +++|*         SPLITAFTER.
02111  M00S02098.fsework +++|*
02112  M00S02099.fsework +++|*         THE NEWLY BUILT SECTOR BECOMES THE CURRENT SECTOR FOR THIS
02113  M00S02100.fsework +++|*         LEVEL OF THE TREE.  THE ORIGINAL SECTOR IS RELEASED FROM
02114  M00S02101.fsework +++|*         OWNERSHIP.
02115  M00S02102.fsework +++|*
02116  M00S02103.fsework +++|*         SPLITAPEND REQUIRES THAT AT LEAST ONE CACHE FRAME IS
02117  M00S02104.fsework +++|*         AVAILABLE FOR ALLOCATION.
02118  M00S02105.fsework +++|*
02119  M00S02106.fsework +++|*         SPLITAPEND FINISHES ITS PROCESSING BY SETTING UP PARAMETERS
02120  M00S02107.fsework +++|*         FOR THE POSSIBLE CALLING OF ANY SPLIT ROUTINE FOR THE NEXT
02121  M00S02108.fsework +++|*         HIGHER LEVEL.  NOTE THAT ALL SPLIT ROUTINES ANTICIPATE THAT
02122  M00S02109.fsework +++|*         THE CALLER WILL ITERATE SO LONG AS PARAMETERS INDICATE THAT
02123  M00S02110.fsework +++|*         MORE SPLITTING NEEDS TO BE DONE.  SINCE EACH SPLIT ROUTINE
02124  M00S02111.fsework +++|*         DECREMENTS THE CURRENT TREE LEVEL, THE EFFECT IS TO WORK
02125  M00S02112.fsework +++|*         FROM THE BOTTOM OF THE TREE TOWARDS THE ROOT, SPLITTING
02126  M00S02113.fsework +++|*         UNTIL A LEVEL IS REACHED WHERE EVERYTHING FITS.
02127  M00S02114.fsework +++|*
02128  M00S02115.fsework +++|*         ENTRY  P<NEW> - LOCATION OF OVERFLOW TEXT.
02129  M00S02116.fsework +++|*                NWNEW - NUMBER OF WORDS IN OVERFLOW TEXT.
02130  M00S02117.fsework +++|*                PL - CURRENT LEVEL IN TREE PATH.
02131  M00S02118.fsework +++|*                ALL PATH CONTROLS SETUP.
02132  M00S02119.fsework +++|*                ALL CACHE CONTROLS SETUP.
02133  M00S02120.fsework +++|*
02134  M00S02121.fsework +++|*         EXIT   PL - DECREMENTED.
02135  M00S02122.fsework +++|*                SECTOR AT ORIGINAL TREE LEVEL REBUILT TO CONTAIN
02136  M00S02123.fsework +++|*                    OVERFLOW TEXT.
02137  M00S02124.fsework +++|*                PREVIOUS SECTOR AT ORIGINAL TREE LEVEL RELEASED.
02138  M00S02125.fsework +++|*                NWNEW, NEWBEFORE, NWAFTER - SET FOR ITERATION.
02139  M00S02126.fsework +++|*                NEWDA, NEWNL - SET FOR ITERATION.
02140  M00S02127.fsework +++|*                DISP, PADISP[NEW PL] - INCREMENTED FOR ITERATION.
02141  M00S02128.fsework +++|*
02142  M00S02129.fsework +++|*         CALLS  ALLOC, ALLOCCACHE, MOVEWD.
02143  M00S02130.fsework +++|*
02144  M00S02131.fsework +++|*         USES   P<TOO>.
02145  M00S02132.fsework +++|#
02146  M00S02133.fsework +++|    CLEAN;                   # CLEAN OLD BLOCK   #
02147  M00S02134.fsework +++|
02148  M00S02135.fsework +++|    ALLOC;                   # BUILD NEW BLOCK   #
02149  M00S02136.fsework +++|    ALLOCCACHE;
02150  M00S02137.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02151  M00S02138.fsework +++|    MOVEWD(NWNEW,NEW,TOO);
02152  M00S02139.fsework +++|    PAFINAL[PL] = NWNEW;
02153  M00S02140.fsework +++|    PADIRTY[PL] = TRUE;
02154  M00S02141.fsework +++|
02155  M00S02142.fsework +++|    PADISP[PL] = 1;          # FIX UP PATH       #
02156  M00S02143.fsework +++|    PAFIRST[PL] = FIRST;
02157  M00S02144.fsework +++|    PALAST[PL] = LAST;
02158  M00S02145.fsework +++|
02159  M00S02146.fsework +++|    NEWDA[0] = PADA[PL];     # BUILD NEW DIR ENTRY         #
02160  M00S02147.fsework +++|    NEWNL[0] = PALAST[PL] - PAFIRST[PL] + 1;
02161  M00S02148.fsework +++|    NWNEW = 1;
02162  M00S02149.fsework +++|
02163  M00S02150.fsework +++|    PL = PL - 1;             # SET UP NEXT PASS  #
02164  M00S02151.fsework +++|    NWBEFORE = PADISP[PL];
02165  M00S02152.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02166  M00S02153.fsework +++|    DISP = PADISP[PL] + 1;
02167  M00S02154.fsework +++|    PADISP[PL] = DISP;
02168  M00S02155.fsework +++|    IOEND
02169  M00S02156.fsework +++|PAGE
02170  M00S02157.fsework +++|  PROC SPLITBEFORE;
02171  M00S02158.fsework +++|    IOBEGIN(SPLITBEFORE)
02172  M00S02159.fsework +++|#
02173  M00S02160.fsework +++|**        SPLITBEFORE - SPLIT SECTOR JUST BEFORE INSERTION POINT.
02174  M00S02161.fsework +++|*
02175  M00S02162.fsework +++|*         SPLITBEFORE IS USED TO OVERFLOW ANY NON-ROOT SECTOR UNDER
02176  M00S02163.fsework +++|*         THE CONDITION THAT THE OVERFLOW TEXT MUST BE INSERTED
02177  M00S02164.fsework +++|*         SOMEWHERE IN THE MIDDLE OF THE TEXT ALREADY CONTAINED IN
02178  M00S02165.fsework +++|*         THE SECTOR, AND NEW TEXT WOULD NOT FIT WITHIN THE FIRST
02179  M00S02166.fsework +++|*         SECTOR OF THE NEW PAIR.  THUS, THE SECTOR IS SPLIT JUST IN
02180  M00S02167.fsework +++|*         FRONT OF THE INSERTION POINT, AND THE SECOND SECTOR
02181  M00S02168.fsework +++|*         RESULTING FROM THE SPLIT WILL START WITH THE OVERFLOW TEXT
02182  M00S02169.fsework +++|*         AND CONTINUE WITH THE REMAINING TEXT SPLIT OUT OF THE
02183  M00S02170.fsework +++|*         ORIGINAL SECTOR.
02184  M00S02171.fsework +++|*
02185  M00S02172.fsework +++|*         SINCE SOME EXISTING TEXT MUST BE REMOVED FROM THE CURRENT
02186  M00S02173.fsework +++|*         SECTOR, IT IS NOT POSSIBLE TO KEEP USING THE SAME SECTOR,
02187  M00S02174.fsework +++|*         UNDER THE RULE THAT NOTHING CAN BE POINTED TO WITHOUT FIRST
02188  M00S02175.fsework +++|*         EXISTING ON DISK.  THEREFORE, TWO COMPLETELY NEW SECTORS
02189  M00S02176.fsework +++|*         ARE CREATED AND THE ORIGINAL SECTOR BECOMES A FRAGMENT.
02190  M00S02177.fsework +++|*         SINCE THE INSERTED TEXT GOES INTO THE SECOND SECTOR OF THE
02191  M00S02178.fsework +++|*         NEW PAIR, THAT IS THE SECTOR WHICH IS LEFT AS THE CURRENT
02192  M00S02179.fsework +++|*         SECTOR FOR THIS TREE PATH LEVEL.
02193  M00S02180.fsework +++|*
02194  M00S02181.fsework +++|*         SPLITBEFORE REQUIRES THAT AT LEAST ONE CACHE FRAME IS
02195  M00S02182.fsework +++|*         AVAILABLE FOR ALLOCATION.  THE EXISTING CACHE FRAME FOR
02196  M00S02183.fsework +++|*         THIS TREE LEVEL IS RECYCLED TO PROVIDE THE SECOND SECTOR OF
02197  M00S02184.fsework +++|*         CAPACITY.  THE EXISTING CACHE FRAME IS FIRST SUBJECTED TO
02198  M00S02185.fsework +++|*         THE NORMAL "CLEAN" ROUTINE TO ASSURE THAT ANY PENDING
02199  M00S02186.fsework +++|*         CHANGES ARE FLUSHED TO DISK.
02200  M00S02187.fsework +++|*
02201  M00S02188.fsework +++|*         SPLITBEFORE FINISHES ITS PROCESSING BY SETTING UP PARAMETERS
02202  M00S02189.fsework +++|*         FOR THE POSSIBLE CALLING OF ANY SPLIT ROUTINE FOR THE NEXT
02203  M00S02190.fsework +++|*         HIGHER LEVEL.  NOTE THAT ALL SPLIT ROUTINES ANTICIPATE THAT
02204  M00S02191.fsework +++|*         THE CALLER WILL ITERATE SO LONG AS PARAMETERS INDICATE THAT
02205  M00S02192.fsework +++|*         MORE SPLITTING NEEDS TO BE DONE.  SINCE EACH SPLIT ROUTINE
02206  M00S02193.fsework +++|*         DECREMENTS THE CURRENT TREE LEVEL, THE EFFECT IS TO WORK
02207  M00S02194.fsework +++|*         FROM THE BOTTOM OF THE TREE TOWARDS THE ROOT, SPLITTING
02208  M00S02195.fsework +++|*         UNTIL A LEVEL IS REACHED WHERE EVERYTHING FITS.
02209  M00S02196.fsework +++|*
02210  M00S02197.fsework +++|*         ENTRY  P<NEW> - LOCATION OF OVERFLOW TEXT.
02211  M00S02198.fsework +++|*                NWNEW - NUMBER OF WORDS IN OVERFLOW TEXT.
02212  M00S02199.fsework +++|*                PL - CURRENT LEVEL IN TREE PATH.
02213  M00S02200.fsework +++|*                ALL PATH CONTROLS SETUP.
02214  M00S02201.fsework +++|*                ALL CACHE CONTROLS SETUP.
02215  M00S02202.fsework +++|*
02216  M00S02203.fsework +++|*         EXIT   PL - DECREMENTED.
02217  M00S02204.fsework +++|*                SECTOR AT ORIGINAL TREE LEVEL REBUILT TO CONTAIN
02218  M00S02205.fsework +++|*                    OVERFLOW TEXT AND SPLIT-OFF ORGINAL TEXT.
02219  M00S02206.fsework +++|*                PREVIOUS SECTOR AT ORIGINAL TREE LEVEL RELEASED.
02220  M00S02207.fsework +++|*                NWNEW, NEWBEFORE, NWAFTER - SET FOR ITERATION.
02221  M00S02208.fsework +++|*                NEWDA, NEWNL - SET FOR ITERATION.
02222  M00S02209.fsework +++|*                DISP, PADISP[NEW PL] - INCREMENTED FOR ITERATION.
02223  M00S02210.fsework +++|*
02224  M00S02211.fsework +++|*         CALLS  ALLOC, ALLOCCACHE, MOVEWD, LAST.
02225  M00S02212.fsework +++|*
02226  M00S02213.fsework +++|*         USES   P<TOO>.
02227  M00S02214.fsework +++|#
02228  M00S02215.fsework +++|
02229  M00S02216.fsework +++|    P<FROM> = LOC(BFPRU[PACACHE[PL]]) + 1;      # SAVE OLD DATA     #
02230  M00S02217.fsework +++|    MOVEWD(PAFINAL[PL],FROM,OBF);
02231  M00S02218.fsework +++|
02232  M00S02219.fsework +++|    DEALLOC;                 # FREE UP OLD BLOCK #
02233  M00S02220.fsework +++|
02234  M00S02221.fsework +++|    ALLOC;                   # BUILD OFF BLOCK   #
02235  M00S02222.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02236  M00S02223.fsework +++|    MOVEWD(NWBEFORE,OBF,TOO);
02237  M00S02224.fsework +++|    PAFINAL[PL] = NWBEFORE;
02238  M00S02225.fsework +++|
02239  M00S02226.fsework +++|    ODA = PADA[PL];          # REMEMBER THIS     #
02240  M00S02227.fsework +++|    ONL = FIRST - PAFIRST[PL];
02241  M00S02228.fsework +++|
02242  M00S02229.fsework +++|    PADIRTY[PL] = TRUE;      # GET RID OF OFF BLOCK        #
02243  M00S02230.fsework +++|    CLEAN;
02244  M00S02231.fsework +++|
02245  M00S02232.fsework +++|    ALLOC;                   # BUILD NEW BLOCK   #
02246  M00S02233.fsework +++|    ALLOCCACHE;
02247  M00S02234.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02248  M00S02235.fsework +++|    MOVEWD(NWNEW,NEW,TOO);
02249  M00S02236.fsework +++|    P<FROM> = LOC(OBF) + DISP-1;
02250  M00S02237.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWNEW + 1;
02251  M00S02238.fsework +++|    MOVEWD(NWAFTER,FROM,TOO);
02252  M00S02239.fsework +++|    PAFINAL[PL] = NWNEW + NWAFTER;
02253  M00S02240.fsework +++|    PADIRTY[PL] = TRUE;
02254  M00S02241.fsework +++|
02255  M00S02242.fsework +++|    PADISP[PL] = PADISP[PL] - NWBEFORE;          # FIX UP PATH       #
02256  M00S02243.fsework +++|    PAFIRST[PL] == FIRST;
02257  M00S02244.fsework +++|    PALAST[PL] = PALAST[PL] + NL;
02258  M00S02245.fsework +++|    LAST = PALAST[PL];
02259  M00S02246.fsework +++|
02260  M00S02247.fsework +++|    NEWDA[0] = ODA;          # BUILD NEW DIR ENTRIES       #
02261  M00S02248.fsework +++|    NEWNL[0] = ONL;
02262  M00S02249.fsework +++|    NEWDA[1] = PADA[PL];
02263  M00S02250.fsework +++|    NEWNL[1] = PALAST[PL] - PAFIRST[PL] + 1;
02264  M00S02251.fsework +++|    NWNEW = 2;
02265  M00S02252.fsework +++|
02266  M00S02253.fsework +++|    PL = PL - 1;             # SET UP NEXT PASS  #
02267  M00S02254.fsework +++|    NWBEFORE = PADISP[PL] - 1;
02268  M00S02255.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02269  M00S02256.fsework +++|    DISP = PADISP[PL] + 1;
02270  M00S02257.fsework +++|    PADISP[PL] = DISP;
02271  M00S02258.fsework +++|    IOEND
02272  M00S02259.fsework +++|PAGE
02273  M00S02260.fsework +++|  PROC SPLITAFTER;
02274  M00S02261.fsework +++|    IOBEGIN(SPLITAFTER)
02275  M00S02262.fsework +++|#
02276  M00S02263.fsework +++|**        SPLITAFTER - SPLIT SECTOR JUST AFTER INSERTION POINT.
02277  M00S02264.fsework +++|*
02278  M00S02265.fsework +++|*         SPLITAFTER IS USED TO OVERFLOW ANY NON-ROOT SECTOR UNDER
02279  M00S02266.fsework +++|*         THE CONDITION THAT THE OVERFLOW TEXT MUST BE INSERTED
02280  M00S02267.fsework +++|*         SOMEWHERE IN THE MIDDLE OF THE TEXT ALREADY CONTAINED IN
02281  M00S02268.fsework +++|*         THE SECTOR, AND NEW TEXT WOULD FIT WITHIN THE FIRST
02282  M00S02269.fsework +++|*         SECTOR OF THE NEW PAIR.  THUS, THE SECTOR IS SPLIT JUST
02283  M00S02270.fsework +++|*         BEYOND THE INSERTED TEXT, AND THE SECOND SECTOR
02284  M00S02271.fsework +++|*         RESULTING FROM THE SPLIT WILL START WITH THE REMAINING
02285  M00S02272.fsework +++|*         TEXT SPLIT OUT OF THE ORGINAL SECTOR.
02286  M00S02273.fsework +++|*
02287  M00S02274.fsework +++|*         SINCE SOME EXISTING TEXT MUST BE REMOVED FROM THE CURRENT
02288  M00S02275.fsework +++|*         SECTOR, IT IS NOT POSSIBLE TO KEEP USING THE SAME SECTOR,
02289  M00S02276.fsework +++|*         UNDER THE RULE THAT NOTHING CAN BE POINTED TO WITHOUT FIRST
02290  M00S02277.fsework +++|*         EXISTING ON DISK.  THEREFORE, TWO COMPLETELY NEW SECTORS
02291  M00S02278.fsework +++|*         ARE CREATED AND THE ORIGINAL SECTOR BECOMES A FRAGMENT.
02292  M00S02279.fsework +++|*         SINCE THE INSERTED TEXT GOES INTO THE FIRST SECTOR OF THE
02293  M00S02280.fsework +++|*         NEW PAIR, THAT IS THE SECTOR WHICH IS LEFT AS THE CURRENT
02294  M00S02281.fsework +++|*         SECTOR FOR THIS TREE PATH LEVEL.
02295  M00S02282.fsework +++|*
02296  M00S02283.fsework +++|*         SPLITAFTER REQUIRES THAT AT LEAST ONE CACHE FRAME IS
02297  M00S02284.fsework +++|*         AVAILABLE FOR ALLOCATION.  THE EXISTING CACHE FRAME FOR
02298  M00S02285.fsework +++|*         THIS TREE LEVEL IS RECYCLED TO PROVIDE THE SECOND SECTOR OF
02299  M00S02286.fsework +++|*         CAPACITY.  THE EXISTING CACHE FRAME IS FIRST SUBJECTED TO
02300  M00S02287.fsework +++|*         THE NORMAL "CLEAN" ROUTINE TO ASSURE THAT ANY PENDING
02301  M00S02288.fsework +++|*         CHANGES ARE FLUSHED TO DISK.
02302  M00S02289.fsework +++|*
02303  M00S02290.fsework +++|*         SPLITAFTER FINISHES ITS PROCESSING BY SETTING UP PARAMETERS
02304  M00S02291.fsework +++|*         FOR THE POSSIBLE CALLING OF ANY SPLIT ROUTINE FOR THE NEXT
02305  M00S02292.fsework +++|*         HIGHER LEVEL.  NOTE THAT ALL SPLIT ROUTINES ANTICIPATE THAT
02306  M00S02293.fsework +++|*         THE CALLER WILL ITERATE SO LONG AS PARAMETERS INDICATE THAT
02307  M00S02294.fsework +++|*         MORE SPLITTING NEEDS TO BE DONE.  SINCE EACH SPLIT ROUTINE
02308  M00S02295.fsework +++|*         DECREMENTS THE CURRENT TREE LEVEL, THE EFFECT IS TO WORK
02309  M00S02296.fsework +++|*         FROM THE BOTTOM OF THE TREE TOWARDS THE ROOT, SPLITTING
02310  M00S02297.fsework +++|*         UNTIL A LEVEL IS REACHED WHERE EVERYTHING FITS.
02311  M00S02298.fsework +++|*
02312  M00S02299.fsework +++|*         ENTRY  P<NEW> - LOCATION OF OVERFLOW TEXT.
02313  M00S02300.fsework +++|*                NWNEW - NUMBER OF WORDS IN OVERFLOW TEXT.
02314  M00S02301.fsework +++|*                PL - CURRENT LEVEL IN TREE PATH.
02315  M00S02302.fsework +++|*                ALL PATH CONTROLS SETUP.
02316  M00S02303.fsework +++|*                ALL CACHE CONTROLS SETUP.
02317  M00S02304.fsework +++|*
02318  M00S02305.fsework +++|*         EXIT   PL - DECREMENTED.
02319  M00S02306.fsework +++|*                SECTOR AT ORIGINAL TREE LEVEL REBUILT TO CONTAIN
02320  M00S02307.fsework +++|*                    OVERFLOW TEXT AND SPLIT-OFF ORGINAL TEXT.
02321  M00S02308.fsework +++|*                PREVIOUS SECTOR AT ORIGINAL TREE LEVEL RELEASED.
02322  M00S02309.fsework +++|*                NWNEW, NEWAFTER, NWAFTER - SET FOR ITERATION.
02323  M00S02310.fsework +++|*                NEWDA, NEWNL - SET FOR ITERATION.
02324  M00S02311.fsework +++|*                DISP, PADISP[NEW PL] - INCREMENTED FOR ITERATION.
02325  M00S02312.fsework +++|*
02326  M00S02313.fsework +++|*         CALLS  ALLOC, ALLOCCACHE, MOVEWD, CLEAN, DEALLOC.
02327  M00S02314.fsework +++|*
02328  M00S02315.fsework +++|*         USES   P<TOO>, FIRST, LAST.
02329  M00S02316.fsework +++|#
02330  M00S02317.fsework +++|
02331  M00S02318.fsework +++|    P<FROM> = LOC(BFPRU[PACACHE[PL]]) + 1;      # SAVE OLD DATA     #
02332  M00S02319.fsework +++|    MOVEWD(PAFINAL[PL],FROM,OBF);
02333  M00S02320.fsework +++|
02334  M00S02321.fsework +++|    DEALLOC;                 # FREE UP OLD BLOCK #
02335  M00S02322.fsework +++|
02336  M00S02323.fsework +++|    ALLOC;                   # BUILD OFF BLOCK   #
02337  M00S02324.fsework +++|    P<FROM> = LOC(OBF) + DISP-1;
02338  M00S02325.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02339  M00S02326.fsework +++|    MOVEWD(NWAFTER,FROM,TOO);
02340  M00S02327.fsework +++|    PAFINAL[PL] = NWAFTER;
02341  M00S02328.fsework +++|
02342  M00S02329.fsework +++|    ODA = PADA[PL];          # REMEMBER THIS     #
02343  M00S02330.fsework +++|    ONL = PALAST[PL] + NL - LAST;
02344  M00S02331.fsework +++|
02345  M00S02332.fsework +++|    PADIRTY[PL] = TRUE;      # GET RID OF OFF BLOCK        #
02346  M00S02333.fsework +++|    CLEAN;
02347  M00S02334.fsework +++|
02348  M00S02335.fsework +++|    ALLOC;                   # BUILD NEW BLOCK   #
02349  M00S02336.fsework +++|    ALLOCCACHE;
02350  M00S02337.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + 1;
02351  M00S02338.fsework +++|    MOVEWD(NWBEFORE,OBF,TOO);
02352  M00S02339.fsework +++|    P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWBEFORE + 1;
02353  M00S02340.fsework +++|    MOVEWD(NWNEW,NEW,TOO);
02354  M00S02341.fsework +++|    PAFINAL[PL] = NWBEFORE + NWNEW;
02355  M00S02342.fsework +++|    PADIRTY[PL] = TRUE;
02356  M00S02343.fsework +++|
02357  M00S02344.fsework +++|    FIRST = PAFIRST[PL];     # FIX UP PATH       #
02358  M00S02345.fsework +++|    LAST == PALAST[PL];
02359  M00S02346.fsework +++|    LAST = LAST + NL;
02360  M00S02347.fsework +++|
02361  M00S02348.fsework +++|    NEWDA[0] = PADA[PL];     # BUILD NEW DIR ENTRIES       #
02362  M00S02349.fsework +++|    NEWNL[0] = PALAST[PL] - PAFIRST[PL] + 1;
02363  M00S02350.fsework +++|    NEWDA[1] = ODA;
02364  M00S02351.fsework +++|    NEWNL[1] = ONL;
02365  M00S02352.fsework +++|    NWNEW = 2;
02366  M00S02353.fsework +++|
02367  M00S02354.fsework +++|    PL = PL - 1;             # SET UP NEXT PASS  #
02368  M00S02355.fsework +++|    NWBEFORE = PADISP[PL] - 1;
02369  M00S02356.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02370  M00S02357.fsework +++|    DISP = PADISP[PL] + 1;
02371  M00S02358.fsework +++|    IOEND
02372  M00S02359.fsework +++|PAGE
02373  M00S02360.fsework +++|PROC CHANGE;                 # CHANGE TREE       #
02374  M00S02361.fsework +++|  IOBEGIN(CHANGE)
02375  M00S02362.fsework +++|#
02376  M00S02363.fsework +++|**        CHANGE - APPLY CHANGES TO TREE STRUCTURE.
02377  M00S02364.fsework +++|*
02378  M00S02365.fsework +++|*         CHANGE IS THE PRINCIPAL ALGORITHM USED TO MANIPULATE THE
02379  M00S02366.fsework +++|*         TREE STRUCTURE.  CHANGE IS DESIGNED TO BE CALLED BY THE
02380  M00S02367.fsework +++|*         INS, REP, AND DEL ENTRY POINTS.  THE ALGORITHM WORKS IN
02381  M00S02368.fsework +++|*         THREE PHASES.  THE FIRST PHASE TAKES CARE OF CASES WHERE AN
02382  M00S02369.fsework +++|*         INSERTION OF A LINE OR THE REPLACEMENT OF A LINE WITH AN
02383  M00S02370.fsework +++|*         ENLARGED VERSION WILL CAUSE THE CURRENT DATA SECTOR (THE
02384  M00S02371.fsework +++|*         BOTTOM LEVEL OF THE TREE STRUCTURE) TO OUTGROW THE SECTOR
02385  M00S02372.fsework +++|*         CAPACITY AND CAUSE SPLITTING INTO TWO SECTORS.  THIS CAUSES
02386  M00S02373.fsework +++|*         ADDITIONAL DIRECTORY ENTRIES TO BE REQUIRED IN THE HIGHER
02387  M00S02374.fsework +++|*         TREE LEVELS, WHICH CAN IN TURN CAUSE ONE OR MORE DIRECTORY
02388  M00S02375.fsework +++|*         LEVELS TO BE SPLIT INTO MULTIPLE SECTORS.  IN THE EXTREME
02389  M00S02376.fsework +++|*         CASE, THE ROOT LEVEL OF THE TREE MAY OVERFLOW, IN WHICH
02390  M00S02377.fsework +++|*         CASE A NEW INTERMEDIATE LEVEL OF THE TREE MUST BE CREATED,
02391  M00S02378.fsework +++|*         WITH THE ROOT SECTOR CONVERTED INTO A DIRECTORY FOR THE
02392  M00S02379.fsework +++|*         INTERMEDIATE LEVEL.
02393  M00S02380.fsework +++|*
02394  M00S02381.fsework +++|*         AFTER THE FIRST PHASE HAS EXHAUSTED ITS ITERATION, THE
02395  M00S02382.fsework +++|*         SECOND PHASE TAKES OVER, IDENTIFYING ANY TREE LEVEL
02396  M00S02383.fsework +++|*         STARTING WITH THE DATA LEVEL WHICH HAS BECOME EMPTY AS THE
02397  M00S02384.fsework +++|*         RESULT OF DELETIONS.  THE SECOND PHASE IS THUS MUTUALLY
02398  M00S02385.fsework +++|*         EXCLUSIVE OF THE FIRST PHASE.
02399  M00S02386.fsework +++|*
02400  M00S02387.fsework +++|*         THE THIRD PHASE IS A CLEANUP OPERATION.  WHILE EACH OF THE
02401  M00S02388.fsework +++|*         FIRST TWO PHASES MAY BE A NO-OP, (AND AT LEAST ONE OF THE
02402  M00S02389.fsework +++|*         FIRST TWO PHASES WILL INDEED BE A NO-OP), THE THIRD PHASE
02403  M00S02390.fsework +++|*         ALWAYS IS IN EFFECT.  THE CLEANUP OPERATION CONSISTS OF THE
02404  M00S02391.fsework +++|*         APPLICATION OF LEFT-OVER CHANGES.  LEFTOVER CHANGES MAY
02405  M00S02392.fsework +++|*         CONSTITUTE THE ENTIRE CHANGE IF NEITHER PRELIMINARY PHASE
02406  M00S02393.fsework +++|*         WAS NEEDED, OR IF ONE OF THE FIRST TWO PHASES WAS USED,
02407  M00S02394.fsework +++|*         THEN IT WILL HAVE LEFT RESIDUAL CHANGES TO BE APPLIED ONE
02408  M00S02395.fsework +++|*         LEVEL CLOSER TO THE ROOT THAN THE LAST LEVEL AFFECTED BY
02409  M00S02396.fsework +++|*         THE SPLITTING OR COLLAPSING.
02410  M00S02397.fsework +++|*
02411  M00S02398.fsework +++|*         ACTUAL APPLICATION OF CHANGES, WHETHER PERFORMED BY THE
02412  M00S02399.fsework +++|*         THIRD PHASE OF THE CHANGE ROUTINE, OR WITHIN ONE OF THE
02413  M00S02400.fsework +++|*         SPLIT ROUTINES SELECTED BY THE FIRST PHASE OF THE CHANGE
02414  M00S02401.fsework +++|*         ROUTINE, SIMPLY CONSIST OF OPENING UP A GAP AT THE RIGHT
02415  M00S02402.fsework +++|*         MEMORY LOCATION, OF ZERO, POSITIVE, OR NEGATIVE LENGTH, AND
02416  M00S02403.fsework +++|*         MOVING IN THE TEXT OF THE CHANGE, WHICH CAN CONSIST OF ZERO
02417  M00S02404.fsework +++|*         OR MORE WORDS.
02418  M00S02405.fsework +++|*
02419  M00S02406.fsework +++|*         THE CLEANUP PHASE ALSO INCREMENTS OR DECREMENTS THE COUNT
02420  M00S02407.fsework +++|*         OF LINES BRACKETED BY EACH LEVEL OF THE TREE.
02421  M00S02408.fsework +++|*
02422  M00S02409.fsework +++|*         ENTRY  PALVL - DEEPEST LEVEL IN TREE STRUCTURE.
02423  M00S02410.fsework +++|*                PL - CURRENT TREE LEVEL MUST EQUAL PALVL.
02424  M00S02411.fsework +++|*                NL - CHANGE IN NUMBER OF LINES IN WORKFILE.
02425  M00S02412.fsework +++|*                NWBEFORE - NUMBER OF WORDS BEFORE POINT OF CHANGE.
02426  M00S02413.fsework +++|*                NWAFTER - NUMBER OF WORDS AFTER POINT OF CHANGE.
02427  M00S02414.fsework +++|*                NWNEW - NUMBER OF WORDS IN CHANGED TEXT.
02428  M00S02415.fsework +++|*                DISP - POINTS JUST AFTER CURRENT LINE.
02429  M00S02416.fsework +++|*                LINEBUF - CONTAINS TEXT OF CHANGE.
02430  M00S02417.fsework +++|*                ALL PATH CONTROLS - SETUP.
02431  M00S02418.fsework +++|*                ALL CACHE CONTROLS - SETUP.
02432  M00S02419.fsework +++|*
02433  M00S02420.fsework +++|*         EXIT   PL - ZERO.
02434  M00S02421.fsework +++|*                PALVL - INCREMENTED/DECREMENTED IF TREE DEPTH CHANGED.
02435  M00S02422.fsework +++|*                DISP, CURNW - BRACKET NEW CURRENT LINE.
02436  M00S02423.fsework +++|*                ALL PATH, CACHE CONTROLS - UPDATED.
02437  M00S02424.fsework +++|*                FET AND CIRCULAR BUFFER USED IF NEEDED.
02438  M00S02425.fsework +++|*
02439  M00S02426.fsework +++|*         CALLS  COUNTCACHE, FLUSHCACHE, SPLITTOP, SPLITAPEND,
02440  M00S02427.fsework +++|*                SPLITBEFORE, SPLITAFTER, RECLAIMCACHE, DEALLOC, CLEAN,
02441  M00S02428.fsework +++|*                MOVEWD.
02442  M00S02429.fsework +++|*
02443  M00S02430.fsework +++|*         USES   P<NEW>, P<FROM>, P<TOO>, FIRST, LAST, NWNEW,
02444  M00S02431.fsework +++|*                NWBEFORE, NWAFTER, NL.
02445  M00S02432.fsework +++|#
02446  M00S02433.fsework +++|  P<NEW> = LOC(LINEBUF);         # SET THINGS UP     #
02447  M00S02434.fsework +++|  FIRST = CURRENT + NL;
02448  M00S02435.fsework +++|  LAST = FIRST;
02449  M00S02436.fsework +++|  CURNW = NWNEW;
02450  M00S02437.fsework +++|
02451  M00S02438.fsework +++|  FOR PL = PL WHILE NWBEFORE+NWNEW+NWAFTER GR 63 DO
02452  M00S02439.fsework +++|    BEGIN                     # DO ALL SPLITS     #
02453  M00S02440.fsework +++|    IF COUNTCACHE LQ 2 THEN FLUSHCACHE;
02454  M00S02441.fsework +++|    IF PL EQ 0 THEN SPLITTOP;
02455  M00S02442.fsework +++|    IF NWBEFORE EQ PAFINAL[PL] THEN SPLITAPEND;
02456  M00S02443.fsework +++|    ELSE IF NWBEFORE+NWNEW LQ 63 THEN SPLITAFTER;
02457  M00S02444.fsework +++|    ELSE SPLITBEFORE;
02458  M00S02445.fsework +++|    RECLAIMCACHE;
02459  M00S02446.fsework +++|    P<NEW> = LOC(NDIR);
02460  M00S02447.fsework +++|    END
02461  M00S02448.fsework +++|
02462  M00S02449.fsework +++|  FOR PL = PL WHILE NWBEFORE+NWNEW+NWAFTER EQ 0 DO
02463  M00S02450.fsework +++|    BEGIN                     # DO ALL COLLAPSING #
02464  M00S02451.fsework +++|    DEALLOC;
02465  M00S02452.fsework +++|    CLEAN;                   # TO FREE UP CACHE FRAME #
02466  M00S02453.fsework +++|    PALVL = PALVL - 1;
02467  M00S02454.fsework +++|    PL = PL - 1;
02468  M00S02455.fsework +++|    NWBEFORE = PADISP[PL] - 1;
02469  M00S02456.fsework +++|    NWAFTER = PAFINAL[PL] - PADISP[PL];
02470  M00S02457.fsework +++|    DISP = PADISP[PL] + 1;
02471  M00S02458.fsework +++|    END
02472  M00S02459.fsework +++|
02473  M00S02460.fsework +++|  P<FROM> = LOC(BFPRU[PACACHE[PL]]) + DISP;        # SLIDE AFTER       #
02474  M00S02461.fsework +++|  P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWBEFORE +NWNEW + 1;
02475  M00S02462.fsework +++|  MOVEWD(NWAFTER,FROM,TOO);
02476  M00S02463.fsework +++|
02477  M00S02464.fsework +++|  P<TOO> = LOC(BFPRU[PACACHE[PL]]) + NWBEFORE + 1; # MOVE IN NEW  #
02478  M00S02465.fsework +++|  MOVEWD(NWNEW,NEW,TOO);
02479  M00S02466.fsework +++|
02480  M00S02467.fsework +++|  PAFINAL[PL] = NWBEFORE + NWNEW + NWAFTER;
02481  M00S02468.fsework +++|  PADIRTY[PL] = TRUE;
02482  M00S02469.fsework +++|  PALAST[PL] = PALAST[PL] + NL;        # FIX UP PATH       #
02483  M00S02470.fsework +++|
02484  M00S02471.fsework +++|  FOR PL = PL-1 STEP -1 UNTIL 0 DO     # UPDATE HIGHER DIRS       #
02485  M00S02472.fsework +++|    BEGIN
02486  M00S02473.fsework +++|    P<PRU> = LOC(BFPRU[PACACHE[PL]]);
02487  M00S02474.fsework +++|    DIRNL[PADISP[PL]] = DIRNL[PADISP[PL]] + NL;
02488  M00S02475.fsework +++|    PADIRTY[PL] = TRUE;
02489  M00S02476.fsework +++|    PALAST[PL] = PALAST[PL] + NL;
02490  M00S02477.fsework +++|    END
02491  M00S02478.fsework +++|
02492  M00S02479.fsework +++|  CURRENT = CURRENT + NL;          # UPDATE CURRENT       #
02493  M00S02480.fsework +++|
02494  M00S02481.fsework +++|  IOEND
02495  M00S02482.fsework +++|PAGE
02496  M00S02483.fsework +++|
02497  M00S02484.fsework +++|PROC INS;
02498  M00S02485.fsework +++|  IOBEGIN(INS)
02499  M00S02486.fsework +++|#
02500  M00S02487.fsework +++|**        INS - INTERFACE FOR INSERTION OF LINES.
02501  M00S02488.fsework +++|*
02502  M00S02489.fsework +++|*         ENTRY  CURRENT - CURRENT LINE.
02503  M00S02490.fsework +++|*                LINEBUF - LINE IMAGE.
02504  M00S02491.fsework +++|*                ALL PATH AND CACHE CONTROLS SETUP.
02505  M00S02492.fsework +++|*
02506  M00S02493.fsework +++|*         EXIT   CURRENT - INCREMENETED.
02507  M00S02494.fsework +++|*                ALL PATH AND CACHE CONTROL UPDATED.
02508  M00S02495.fsework +++|*
02509  M00S02496.fsework +++|*         CALLS  LINESZ, CHANGE, WIOSTAT.
02510  M00S02497.fsework +++|*
02511  M00S02498.fsework +++|*         USES   PL, DISP, NL, NWBEFORE, NWNEW, NWAFTER, DISP.
02512  M00S02499.fsework +++|#
02513  M00S02500.fsework +++|  CONTROL IFEQ MULTI,1;
02514  M00S02501.fsework +++|    WIOSTAT(0);               # ACCUMULATE LINE ACCESES #
02515  M00S02502.fsework +++|  CONTROL FI;
02516  M00S02503.fsework +++|
02517  M00S02504.fsework +++|  PL = PALVL;                # STANDARD INITCHANGE         #
02518  M00S02505.fsework +++|  DISP = PADISP[PL];
02519  M00S02506.fsework +++|
02520  M00S02507.fsework +++|  NL = 1;
02521  M00S02508.fsework +++|  NWBEFORE = DISP + CURNW - 1;
02522  M00S02509.fsework +++|  NWNEW = LINESZ(LINEBUF);
02523  M00S02510.fsework +++|  NWAFTER = PAFINAL[PL] - DISP - CURNW + 1;
02524  M00S02511.fsework +++|  DISP = DISP + CURNW;
02525  M00S02512.fsework +++|
02526  M00S02513.fsework +++|  PADISP[PL] = DISP;
02527  M00S02514.fsework +++|
02528  M00S02515.fsework +++|  CHANGE;
02529  M00S02516.fsework +++|  IOEND
02530  M00S02517.fsework +++|
02531  M00S02518.fsework +++|PROC REP;
02532  M00S02519.fsework +++|  IOBEGIN(REP)
02533  M00S02520.fsework +++|#
02534  M00S02521.fsework +++|**        REP - INTERFACE FOR REPLACEMENT OF LINES.
02535  M00S02522.fsework +++|*
02536  M00S02523.fsework +++|*         ENTRY  CURRENT - CURRENT LINE.
02537  M00S02524.fsework +++|*                LINEBUF - LINE IMAGE.
02538  M00S02525.fsework +++|*                ALL PATH AND CACHE CONTROLS SETUP.
02539  M00S02526.fsework +++|*
02540  M00S02527.fsework +++|*         EXIT   CURRENT - UNCHANGED.
02541  M00S02528.fsework +++|*                ALL PATH AND CACHE CONTROL UPDATED.
02542  M00S02529.fsework +++|*
02543  M00S02530.fsework +++|*         CALLS  LINESZ, CHANGE, WIOSTAT.
02544  M00S02531.fsework +++|*
02545  M00S02532.fsework +++|*         USES   PL, DISP, NL, NWBEFORE, NWNEW, NWAFTER, DISP.
02546  M00S02533.fsework +++|#
02547  M00S02534.fsework +++|
02548  M00S02535.fsework +++|  CONTROL IFEQ MULTI,1;
02549  M00S02536.fsework +++|    WIOSTAT(0);               # ACCUMULATE LINE ACCESES #
02550  M00S02537.fsework +++|  CONTROL FI;
02551  M00S02538.fsework +++|
02552  M00S02539.fsework +++|  PL = PALVL;                # STANDARD INITCHANGE         #
02553  M00S02540.fsework +++|  DISP = PADISP[PL];
02554  M00S02541.fsework +++|
02555  M00S02542.fsework +++|  NL = 0;
02556  M00S02543.fsework +++|  NWBEFORE = DISP - 1;
02557  M00S02544.fsework +++|  NWNEW = LINESZ(LINEBUF);
02558  M00S02545.fsework +++|  NWAFTER = PAFINAL[PL] - DISP - CURNW + 1;
02559  M00S02546.fsework +++|  DISP = DISP + CURNW;
02560  M00S02547.fsework +++|
02561  M00S02548.fsework +++|  CHANGE;
02562  M00S02549.fsework +++|  IOEND
02563  M00S02550.fsework +++|
02564  M00S02551.fsework +++|PROC DEL;
02565  M00S02552.fsework +++|  IOBEGIN(DEL)
02566  M00S02553.fsework +++|#
02567  M00S02554.fsework +++|**        DEL - INTERFACE FOR DELETION OF LINES.
02568  M00S02555.fsework +++|*
02569  M00S02556.fsework +++|*         ENTRY  CURRENT - CURRENT LINE.
02570  M00S02557.fsework +++|*                ALL PATH AND CACHE CONTROLS SETUP.
02571  M00S02558.fsework +++|*                DELETCTL - POST-POSITIONING INCREMENT.
02572  M00S02559.fsework +++|*
02573  M00S02560.fsework +++|*         EXIT   CURRENT - INCREMENTED IF DELETCTL WAS ONE.
02574  M00S02561.fsework +++|*                LINEBUF - NEW CURRENT LINE IS READ UP.
02575  M00S02562.fsework +++|*                ALL PATH AND CACHE CONTROL UPDATED.
02576  M00S02563.fsework +++|*                DELETCTL - FORCED ZERO IF DELETED LAST LINE.
02577  M00S02564.fsework +++|*
02578  M00S02565.fsework +++|*         CALLS  CHANGE, WIOSTAT, POSR.
02579  M00S02566.fsework +++|*
02580  M00S02567.fsework +++|*         USES   PL, DISP, NL, NWBEFORE, NWNEW, NWAFTER, DISP,
02581  M00S02568.fsework +++|*                P<MVLNBUF>, NEWCURL.
02582  M00S02569.fsework +++|#
02583  M00S02570.fsework +++|
02584  M00S02571.fsework +++|  CONTROL IFEQ MULTI,1;
02585  M00S02572.fsework +++|    WIOSTAT(0);               # ACCUMULATE LINE ACCESES #
02586  M00S02573.fsework +++|  CONTROL FI;
02587  M00S02574.fsework +++|
02588  M00S02575.fsework +++|  PL = PALVL;                # STANDARD INITCHANGE         #
02589  M00S02576.fsework +++|  DISP = PADISP[PL];
02590  M00S02577.fsework +++|
02591  M00S02578.fsework +++|  NL = -1;
02592  M00S02579.fsework +++|  NWBEFORE = DISP - 1;
02593  M00S02580.fsework +++|  NWNEW = 0;
02594  M00S02581.fsework +++|  NWAFTER = PAFINAL[PL] - DISP - CURNW + 1;
02595  M00S02582.fsework +++|  DISP = DISP + CURNW;
02596  M00S02583.fsework +++|
02597  M00S02584.fsework +++|  CHANGE;
02598  M00S02585.fsework +++|
02599  M00S02586.fsework +++|  IF PALAST[0] LQ CURRENT THEN DELETCTL=0;
02600  M00S02587.fsework +++|  CURRENT=CURRENT+DELETCTL;
02601  M00S02588.fsework +++|  NEWCURL=CURRENT;
02602  M00S02589.fsework +++|  P<MVLNBUF>=LOC(LINEBUF);
02603  M00S02590.fsework +++|  POSR;
02604  M00S02591.fsework +++|  P<MVLNBUF>=0;
02605  M00S02592.fsework +++|
02606  M00S02593.fsework +++|  IOEND
02607  M00S02594.fsework +++|PAGE
02608  M00S02595.fsework +++|PROC INIT;
02609  M00S02596.fsework +++|  BEGIN
02610  M00S02597.fsework +++|#
02611  M00S02598.fsework +++|**        INIT - INITIALIZE MEMORY CELLS FOR WORKIO.
02612  M00S02599.fsework +++|*
02613  M00S02600.fsework +++|*         ENTRY  NO CONDITIONS.
02614  M00S02601.fsework +++|*
02615  M00S02602.fsework +++|*         EXIT   P<LINEBUF> -POINTS TO LIN ARRAY.
02616  M00S02603.fsework +++|*                ALL ELEMENTS OF PATH ARRAY - NOMINAL.
02617  M00S02604.fsework +++|*                ALL CACHE CONTROLS - NOMINAL.
02618  M00S02605.fsework +++|*                READ LIST (RDLIST, RDIN, RDOUT) - EMPTY.
02619  M00S02606.fsework +++|*                FLAGS (IOACT, IOREAD, IOWRITE) - FALSE.
02620  M00S02607.fsework +++|*                ARRAYLEN, DATALEN, ARRAYPRUS, DATAPRUS - INITIALIZED.
02621  M00S02608.fsework +++|*                SEGEMENTVER - ZEROED OUT.
02622  M00S02609.fsework +++|#
02623  M00S02610.fsework +++|  P<LINEBUF>=LOC(LIN);
02624  M00S02611.fsework +++|
02625  M00S02612.fsework +++|  FOR PL = 1 STEP 1 UNTIL MAXDEPTH DO  # INIT PATH         #
02626  M00S02613.fsework +++|    BEGIN
02627  M00S02614.fsework +++|    PAFIRST[PL] = 0;
02628  M00S02615.fsework +++|    PALAST[PL] = 0;
02629  M00S02616.fsework +++|    PADISP[PL] = 0;
02630  M00S02617.fsework +++|    PAHEAD[PL] = 0;
02631  M00S02618.fsework +++|    END
02632  M00S02619.fsework +++|
02633  M00S02620.fsework +++|  FOR PL = 0 STEP 1 UNTIL MAXCACHE DO  # INIT CACHE CTL    #
02634  M00S02621.fsework +++|    BEGIN
02635  M00S02622.fsework +++|    CACHEOWNED[PL]=FALSE; CACHEDIRTY[PL]=FALSE;
02636  M00S02623.fsework +++|    CACHEAGE[PL]=-1;
02637  M00S02624.fsework +++|    BFHEAD[PL]=0;
02638  M00S02625.fsework +++|    END
02639  M00S02626.fsework +++|
02640  M00S02627.fsework +++|  FOR RDIN = 0 STEP 1 UNTIL RDLIM DO RDLIST[RDIN] = 0;
02641  M00S02628.fsework +++|
02642  M00S02629.fsework +++|  IOACT = FALSE;             # INIT IO #
02643  M00S02630.fsework +++|  IOAPEND = FALSE;
02644  M00S02631.fsework +++|  IOWRITE = FALSE;
02645  M00S02632.fsework +++|  IOREAD = FALSE;
02646  M00S02633.fsework +++|
02647  M00S02634.fsework +++|  CURNW = 0;
02648  M00S02635.fsework +++|
02649  M00S02636.fsework +++|  SEGMENTVER=0;
02650  M00S02637.fsework +++|  ARRAYLEN=LOC(ARRAYEND)-LOC(ARRAYSTART);
02651  M00S02638.fsework +++|  ARRAYPRUS=(ARRAYLEN+O"77")/O"100";
02652  M00S02639.fsework +++|  DATALEN=LOC(DATAEND)-LOC(DATASTART);
02653  M00S02640.fsework +++|  DATAPRUS=(DATALEN+O"77")/O"100";
02654  M00S02641.fsework +++|
02655  M00S02642.fsework +++|  END
02656  M00S02643.fsework +++|PAGE
02657  M00S02644.fsework +++|PROC RESUMIO;
02658  M00S02645.fsework +++|  IOBEGIN(RESUMIO)
02659  M00S02646.fsework +++|#
02660  M00S02647.fsework +++|**        RESUMIO - RESUME EDITOR STATUS FROM LEFTOVER WORKFILE.
02661  M00S02648.fsework +++|*
02662  M00S02649.fsework +++|*         RESUMIO ATTEMPTS TO VALIDATE A FILE AS CONTAINING THE TEXT
02663  M00S02650.fsework +++|*         AND STATUS LEFT BY A PREVIOUS EDIT SESSION, OR BY A
02664  M00S02651.fsework +++|*         SINGLE/MULTI USER TRANSITION.  SINCE THE SCALAR AND ARRAY
02665  M00S02652.fsework +++|*         DATA SEGMENTS CONTAIN NEARLY ALL EDITOR DATA, SUCCESSFUL
02666  M00S02653.fsework +++|*         EXECUTION OF RESUMIO CHANGES EVERYTHING.
02667  M00S02654.fsework +++|*
02668  M00S02655.fsework +++|*         THE FOLLOWING CONDITIONS ARE REQUIRED TO VALIDATE AN
02669  M00S02656.fsework +++|*         APPARENT WORKFILE AS A LEGITIMATE BASIS FOR RESUMPTION --
02670  M00S02657.fsework +++|*
02671  M00S02658.fsework +++|*                1. THE FIRST WORD MUST BE FORMATTED AS A ROOT SECTOR
02672  M00S02659.fsework +++|*                HEADER WORD.  THE DISK ADDRESS FIELD MUST BE ONE AND
02673  M00S02660.fsework +++|*                THE TOP FLAG MUST BE ON AND THE DIRECTORY AND DATA
02674  M00S02661.fsework +++|*                FLAGS MUST BE UNEQUAL.
02675  M00S02662.fsework +++|*
02676  M00S02663.fsework +++|*                2. THE FIRST RECORD OF THE FILE MUST BE OF LENGTH
02677  M00S02664.fsework +++|*                64 WORDS LONGER THAN THE SCALAR DATA SEGMENT, AND
02678  M00S02665.fsework +++|*                THE SECOND RECORD OF THE FILE MUST EXACTLY MATCH
02679  M00S02666.fsework +++|*                THE LENGTH OF THE ARRAY SEGMENT.
02680  M00S02667.fsework +++|*
02681  M00S02668.fsework +++|*                3. THE SEGMENTLEN1 AND SEGMENTLEN2 FIELDS OF THE SCALAR
02682  M00S02669.fsework +++|*                SEGMENT MUST MATCH THE ABOVE LENGTHS, AND THE
02683  M00S02670.fsework +++|*                SEGMENTVER FIELD MUST MATCH THE VERSION NUMBER
02684  M00S02671.fsework +++|*                COMPILED INTO THIS PROGRAM.
02685  M00S02672.fsework +++|*
02686  M00S02673.fsework +++|*         AFTER READING UP ALL EDITOR DATA, THE FOLLOWING WORKIO
02687  M00S02674.fsework +++|*         CONTROLS ARE RE-INITIALIZED - THE PATH VECTOR IS REFRESHED
02688  M00S02675.fsework +++|*         TO MATCH THE CURRENT LINE, THE SCHEDULING FLAGS (IOACT,
02689  M00S02676.fsework +++|*         IOREAD, ETC.) ARE CLEARED, MAXDA AND DANEXT ARE BASED ON
02690  M00S02677.fsework +++|*         FILE SIZE, AND SEGMENTVER IS CLEARED.  THE WORKFILE IS THEN
02691  M00S02678.fsework +++|*         IMMEDIATELY CHECKPOINTED SO THAT IT CANNOT BE RESUMED
02692  M00S02679.fsework +++|*         AGAIN, THUS INTERLOCKING IT.
02693  M00S02680.fsework +++|*
02694  M00S02681.fsework +++|*         ENTRY  NO CONDITIONS.
02695  M00S02682.fsework +++|*
02696  M00S02683.fsework +++|*         EXIT   EVERYTHING IN THE WHOLE EDITOR IS CHANGED.
02697  M00S02684.fsework +++|*                IORESUMED - SUCCESS/FAILURE INDICATOR.
02698  M00S02685.fsework +++|*
02699  M00S02686.fsework +++|*         CALLS  INIT, INITFET, BUFUSAGE, ALLOCCACHE, RDWBUF, READ,
02700  M00S02687.fsework +++|*                WAIT, TRAGIC, SKIPEI, POSR, CLEANALL.
02701  M00S02688.fsework +++|#
02702  M00S02689.fsework +++|  INIT;
02703  M00S02690.fsework +++|  IORESUMED=FALSE;
02704  M00S02691.fsework +++|  INITFET(DISK,DSKSIZ);
02705  M00S02692.fsework +++|
02706  M00S02693.fsework +++|  REWIND(FET,0);             # TRY TO READ PRU 1 #
02707  M00S02694.fsework +++|  WAIT;
02708  M00S02695.fsework +++|  READ(FET,0);
02709  M00S02696.fsework +++|  WAIT;
02710  M00S02697.fsework +++|
02711  M00S02698.fsework +++|  IF BUFUSAGE GR O"100" THEN
02712  M00S02699.fsework +++|    BEGIN
02713  M00S02700.fsework +++|    PL=0;
02714  M00S02701.fsework +++|    PADA[0]=1;
02715  M00S02702.fsework +++|    ALLOCCACHE;
02716  M00S02703.fsework +++|    P<TOO>=LOC(BFPRU[PACACHE[0]]);
02717  M00S02704.fsework +++|    RDWBUF(O"100");
02718  M00S02705.fsework +++|    PAHEAD[0] = BFHEAD[PACACHE[0]];
02719  M00S02706.fsework +++|    END
02720  M00S02707.fsework +++|
02721  M00S02708.fsework +++|  IF PADA[0] EQ 1 AND PATOP[0]
02722  M00S02709.fsework +++|    AND BOOLDIFF(PADIR[0],PADATA[0]) THEN
02723  M00S02710.fsework +++|    BEGIN
02724  M00S02711.fsework +++|
02725  M00S02712.fsework +++|    # READ FIRST FOUR WORDS TO VERIFY SEGMENT DESCRIPTORS #
02726  M00S02713.fsework +++|    P<TOO>=LOC(DATASTART);
02727  M00S02714.fsework +++|    NWNEW=BUFUSAGE;
02728  M00S02715.fsework +++|    NWNEW=MIN(NWNEW,4);
02729  M00S02716.fsework +++|    RDWBUF(NWNEW);
02730  M00S02717.fsework +++|    IORESUMED=FALSE;
02731  M00S02718.fsework +++|    IF SEGMENTVER NQ IOVERSION OR SEGMENTLEN1 NQ DATALEN
02732  M00S02719.fsework +++|      OR SEGMENTLEN2 NQ ARRAYLEN THEN IORET
02733  M00S02720.fsework +++|
02734  M00S02721.fsework +++|    # SEGMENT DESCRIPTORS VALID, READ REST OF SCALAR SEGMENT #
02735  M00S02722.fsework +++|    P<TOO>=LOC(DATASTART)+4;
02736  M00S02723.fsework +++|    NWNEW=BUFUSAGE;
02737  M00S02724.fsework +++|    NWNEW=MIN(DATALEN-4,NWNEW);
02738  M00S02725.fsework +++|    RDWBUF(NWNEW);
02739  M00S02726.fsework +++|    READ(FET,0);
02740  M00S02727.fsework +++|    WAIT;
02741  M00S02728.fsework +++|
02742  M00S02729.fsework +++|    # READ ARRAY SEGMENT #
02743  M00S02730.fsework +++|    P<TOO>=LOC(ARRAYSTART);
02744  M00S02731.fsework +++|    NWNEW=BUFUSAGE;
02745  M00S02732.fsework +++|    NWNEW=MIN(ARRAYLEN,NWNEW);
02746  M00S02733.fsework +++|    RDWBUF(NWNEW);
02747  M00S02734.fsework +++|
02748  M00S02735.fsework +++|    IF ABORTED THEN TRAGIC(ERRSTRING);
02749  M00S02736.fsework +++|
02750  M00S02737.fsework +++|    SKIPEI(FET,0);
02751  M00S02738.fsework +++|    WAIT;
02752  M00S02739.fsework +++|    MAXDA=FETCRI-1;
02753  M00S02740.fsework +++|    DANEXT=FETCRI;
02754  M00S02741.fsework +++|
02755  M00S02742.fsework +++|    PADISP[0] = 1;           # SET UP PATH[0]    #
02756  M00S02743.fsework +++|    PAFIRST[0] = 0;
02757  M00S02744.fsework +++|    PALAST[0] = -1;
02758  M00S02745.fsework +++|    P<PRU> = LOC(BFPRU[PACACHE[0]]);
02759  M00S02746.fsework +++|    IF PADIR[0] THEN
02760  M00S02747.fsework +++|      BEGIN
02761  M00S02748.fsework +++|      FOR DISP = 1 STEP 1 UNTIL PAFINAL[0]
02762  M00S02749.fsework +++|        DO PALAST[0] = PALAST[0] + DIRNL[DISP];
02763  M00S02750.fsework +++|      END
02764  M00S02751.fsework +++|    ELSE                     # NOTE INTERNAL CHARSET SIGN BIT USAGE  #
02765  M00S02752.fsework +++|      BEGIN
02766  M00S02753.fsework +++|      FOR DISP = 1 STEP 1 UNTIL PAFINAL[0]
02767  M00S02754.fsework +++|        DO IF B<0,1>DATWORD[DISP] NQ 0 THEN PALAST[0] = PALAST[0] + 1;
02768  M00S02755.fsework +++|      END
02769  M00S02756.fsework +++|
02770  M00S02757.fsework +++|    IORESUMED=TRUE;          # RESET FLAGS READ WITH DATA  #
02771  M00S02758.fsework +++|    IOACT=FALSE;
02772  M00S02759.fsework +++|    IOREAD=FALSE;
02773  M00S02760.fsework +++|    IOWRITE=FALSE;
02774  M00S02761.fsework +++|    IOAPEND=FALSE;
02775  M00S02762.fsework +++|
02776  M00S02763.fsework +++|    PALVL = 0;               # BUILD REST OF PATH          #
02777  M00S02764.fsework +++|    NEWCURL=0;
02778  M00S02765.fsework +++|    P<MVLNBUF>=LOC(LINEBUF);
02779  M00S02766.fsework +++|    POSR;
02780  M00S02767.fsework +++|    P<MVLNBUF>=0;
02781  M00S02768.fsework +++|
02782  M00S02769.fsework +++|    SEGMENTVER=0;            # INTERLOCK FILE ONWESHIP     #
02783  M00S02770.fsework +++|    CLEANALL;
02784  M00S02771.fsework +++|
02785  M00S02772.fsework +++|    END
02786  M00S02773.fsework +++|
02787  M00S02774.fsework +++|  IOEND
02788  M00S02775.fsework +++|PAGE
02789  M00S02776.fsework +++|
02790  M00S02777.fsework +++|CONTROL IFEQ SINGLE,1;
02791  M00S02778.fsework +++|
02792  M00S02779.fsework +++|PROC INITIO;
02793  M00S02780.fsework +++|  IOBEGIN(INITIO)
02794  M00S02781.fsework +++|#
02795  M00S02782.fsework +++|**        INITIO - FORMAT A NEW WORKFILE.
02796  M00S02783.fsework +++|*
02797  M00S02784.fsework +++|*         INITIO IS USED TO BUILD A WORKFILE FROM SCRATCH OR TO
02798  M00S02785.fsework +++|*         DISCARD OLD WORKFILE CONTENT AND REFRESH IT.
02799  M00S02786.fsework +++|*
02800  M00S02787.fsework +++|*         ENTRY  NO CONDITIONS.
02801  M00S02788.fsework +++|*
02802  M00S02789.fsework +++|*         EXIT   FILE INITIALIZED.
02803  M00S02790.fsework +++|*                ALL PATH CONTROLS NOMINAL.
02804  M00S02791.fsework +++|*                ALL CACHE CONTROL NOMINAL.
02805  M00S02792.fsework +++|*                MAXDA - ZERO
02806  M00S02793.fsework +++|*                DANEXT - FIRST ALLOCATABLE DISK ADDRESS RIGHT AFTER
02807  M00S02794.fsework +++|*                    ROOT SECTOR, AND SCALAR AND ARRAY DATA SEGMENTS.
02808  M00S02795.fsework +++|*                IORESUMED - TRUE TO SHOW WORKIO ACTIVE.
02809  M00S02796.fsework +++|*                SEGMENTVER - ZERO IN MEMORY AND ON DISK TO INTERLOCK.
02810  M00S02797.fsework +++|*
02811  M00S02798.fsework +++|*         CALLS  INITFET, EVICT, WAIT, INIT, ALLOCCACHE, CLEANALL.
02812  M00S02799.fsework +++|#
02813  M00S02800.fsework +++|  INITFET(DISK,DSKSIZ);
02814  M00S02801.fsework +++|  EVICT(FET,0);
02815  M00S02802.fsework +++|  WAIT;
02816  M00S02803.fsework +++|
02817  M00S02804.fsework +++|  INIT;
02818  M00S02805.fsework +++|  MAXDA = 0;                 # SET MAXDA AND DANEXT        #
02819  M00S02806.fsework +++|  DANEXT = 2+DATAPRUS+ARRAYPRUS;
02820  M00S02807.fsework +++|
02821  M00S02808.fsework +++|  PAHEAD[0] = 0;             # BUILD TOP BLOCK   #
02822  M00S02809.fsework +++|  PADATA[0] = TRUE;
02823  M00S02810.fsework +++|  PATOP[0] = TRUE;
02824  M00S02811.fsework +++|  PADIRTY[0] = TRUE;
02825  M00S02812.fsework +++|  PADA[0] = 1;
02826  M00S02813.fsework +++|  PAFINAL[0] = 1;
02827  M00S02814.fsework +++|  PL=0;
02828  M00S02815.fsework +++|  ALLOCCACHE;
02829  M00S02816.fsework +++|  P<PRU> = LOC(BFPRU[PACACHE[0]]);
02830  M00S02817.fsework +++|  DATWORD[1] = NULLIN;
02831  M00S02818.fsework +++|  CURNW = 1;
02832  M00S02819.fsework +++|
02833  M00S02820.fsework +++|  PADEPTH[0] = 0;
02834  M00S02821.fsework +++|  PADISP[0] = 1;             # SET UP PATH       #
02835  M00S02822.fsework +++|  PAFIRST[0] = 0;
02836  M00S02823.fsework +++|  PALAST[0] = 0;
02837  M00S02824.fsework +++|  PALVL = 0;
02838  M00S02825.fsework +++|  CURRENT = 0;
02839  M00S02826.fsework +++|  IORESUMED=TRUE;            # SHOW WORKIO ALIVE #
02840  M00S02827.fsework +++|
02841  M00S02828.fsework +++|  SEGMENTVER = 0;            # INTERLOCK FILE OWNERSHIP    #
02842  M00S02829.fsework +++|  CLEANALL;
02843  M00S02830.fsework +++|
02844  M00S02831.fsework +++|  IOEND
02845  M00S02832.fsework +++|
02846  M00S02833.fsework +++|CONTROL FI;
02847  M00S02834.fsework +++|PAGE
02848  M00S02835.fsework +++|PROC CHECKIO;
02849  M00S02836.fsework +++|  IOBEGIN(CHECKIO)
02850  M00S02837.fsework +++|#
02851  M00S02838.fsework +++|**        CHECKIO - CHECKPOINT WORKFILE.
02852  M00S02839.fsework +++|*
02853  M00S02840.fsework +++|*         CHECKIO IS USED TO ASSURE THAT ALL MEMORY DATA IS FULLY
02854  M00S02841.fsework +++|*         WRITTEN TO DISK.  THIS CAN BE USED TO PREPARE FOR END OF
02855  M00S02842.fsework +++|*         JOB STEP OR FOR TRANSITION BETWEEN SINGLE AND MULTIPLE USER
02856  M00S02843.fsework +++|*         VERSIONS OF THE EDITOR.  BY CHECKPOINTING THE WORKFILE, IT
02857  M00S02844.fsework +++|*         BECOMES POSSIBLE TO EXECUTE THE RESUMIO ROUTINE AND FULLY
02858  M00S02845.fsework +++|*         RESTORE THE EDITOR STATUS.
02859  M00S02846.fsework +++|*
02860  M00S02847.fsework +++|*         ENTRY  IORESUMED - SHOWS WHETHER WORKFILE MANAGER EVER ACTIVE.
02861  M00S02848.fsework +++|*                CURRENT - CURRENT LINE ORDINAL.
02862  M00S02849.fsework +++|*
02863  M00S02850.fsework +++|*         EXIT   SEGMENTVER, SEGMENTLEN1, SEGMENTLEN2 - SETUP.
02864  M00S02851.fsework +++|*                CACHE FLUSHED, FET AND CIRCULAR BUFFER COMPLETE.
02865  M00S02852.fsework +++|*
02866  M00S02853.fsework +++|*         CALLS  CLEANALL.
02867  M00S02854.fsework +++|#
02868  M00S02855.fsework +++|  IF NOT IORESUMED THEN IORET  # WORKIO NEVER ALIVE          #
02869  M00S02856.fsework +++|
02870  M00S02857.fsework +++|  SAVECURL=CURRENT;
02871  M00S02858.fsework +++|  SEGMENTVER = IOVERSION;    # SHOW VALID WORKFILE FORMAT  #
02872  M00S02859.fsework +++|  SEGMENTLEN1 = DATALEN;
02873  M00S02860.fsework +++|  SEGMENTLEN2 = ARRAYLEN;
02874  M00S02861.fsework +++|  CLEANALL;                  # WRITE OUT WHOLE PATH        #
02875  M00S02862.fsework +++|
02876  M00S02863.fsework +++|  IOEND
02877  M00S02864.fsework +++|
02878  M00S02865.fsework +++|
02879  M00S02866.fsework +++|  END TERM
cdc/nos2.source/opl.opl871/deck/fsework.001.txt ยท Last modified: by 127.0.0.1