Trailing-Edge
-
PDP-10 Archives
-
RMS-10_T10_704_FT2_880425
-
10,7/rms10/rmssrc/rmstrn.b36
There are 6 other files named rmstrn.b36 in the archive. Click here to see a list.
MODULE TRUNC =
BEGIN
GLOBAL BIND TRUNV = 1^24 + 0^18 + 7; !EDIT DATE: 6-APR-77
%([
FUNCTION: THIS MODULE CONTAINS ROUTINES WHICH PROCESS
THE $TRUNCATE MACRO IN RMS-20.
AUTHOR: S. BLOUNT
THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
!COPYRIGHT (C) 1977, 1979 BY DIGITAL EQUIPMENT CORPORATION
********** TABLE OF CONTENTS **************
ROUTINE FUNCTION
======= ========
$TRUNCATE PROCESSOR FOR $TRUNCATE MACRO
REVISION HISTORY:
EDIT WHO DATE PURPOSE
==== === ==== =======
1 JK 5-AUG-76 NEW ASCII CHANGES.
2 JK 12-AUG-76 $CONNECT; $TRUNCATE IS ILLEGAL.
3 SB 22-DEC-76 CHANGE ER$TRU TO ER$IOP
4 SB 22-FEB-77 GIVE ER$CUR IF NO RP, DONT PMAP PAGES IF PAGE 0
5 SB 24-FEB-77 FIX EDIT 4, DONT CHECK FOR SUCCESS
6 SB 6-APR-77 CHANGE HYBYTE AND FLGTRUNC TO RST
*************************************************
* *
* NEW REVISION HISTORY *
* *
*************************************************
****************** Start RMS-10 V1.1 *********************
********************* TOPS-10 ONLY ***********************
PRODUCT MODULE SPR
EDIT EDIT QAR DESCRIPTION
====== ====== ===== ===========
100 7 Dev Make declarations for routine names
be EXTERNAL ROUTINE so RMS will compile
under BLISS V4 (RMT, 10/22/85).
***** END OF REVISION HISTORY *****
])%
%([ EXTERNAL DECLARATIONS ])%
EXTERNAL ROUTINE
CRASH,
DUMP,
GTBYTE,
RSETUP,
WRITEBUFFER;
%([ ERROR MESSAGES REFERENCED WITHIN THIS MODULE ])%
EXTERNAL
MSGFAILURE; ! ROUTINE FAILURE
REQUIRE 'RMSREQ';
EXTDECLARATIONS;
! $TRUNCATE
! =========
! PROCESSOR FOR $TRUNCATE MACRO.
!
! THE $TRUNCATE MACRO LOGICALLY REMOVES ALL RECORDS
! IN THE FILE, BEGINNING WITH THE RECORD DESIGNATED
! BY THE "CURRENT RECORD POINTER", AND INCLUDING ALL
! SUBSEQUENT RECORDS UNTIL THE END-OF-FILE IS REACHED.
! NOT ONLY ARE THE RECORDS LOGICALLY REMOVED FROM THE
! FILE, BUT THE PAGES WHICH HELD THEM ARE ALSO PHYSICALLY
! DESTROYED, THUS SHRINKING THE SIZE OF THE FILE.
! THE FOLLOWING RESTRICTIONS ARE IMPOSED ON THE USE
! OF THE $TRUNCATE MACRO:
!
! 1. VALID ONLY FOR SEQUENTIAL FILES (INCLUDING ASCII,LSA)
!
! 2. ONLY ONE RAB CAN BE ACTIVE (I.E., $CONNECTED)
!
! 3. THE FILE MUST BE OPEN FOR EXCLUSIVE ACCESS.
!
! 4. FILE MUST RESIDE ON DIRECT-ACCESS DEVICE.
!
! 5. THERE MUST BE A "CURRENT RECORD".
! THE FORMAT OF THE $TRUNCATE MACRO IS:
!
! $TRUNCATE <RAB-ADDR> [,ERROR-ADDRESS]
!
! RAB FIELDS WHICH ARE USED AS INPUT TO $TRUNCATE:
!
! ISI INTERNAL STREAM IDENTIFIER
!
!
! RAB FIELDS RETURNED TO USER:
!
! STS COMPLETION STATUS CODE
! INPUT:
! ADDRESS OF USER RECORD BLOCK
! ADDRESS OF USER ERROR ROUTINE
! OUTPUT:
! <STATUS FIELD>
! GLOBALS USED:
! GTBYTE
!
! NOTES:
!
! 1. THIS ROUTINE CURRENTLY PMAPS ALL PAGES AWAY FROM AN
! ASCII FILE IF IT IS $TRUNCATED (ALL PAGES FROM THE CURRENT
! PAGE TO PAGE 777). IT DOES NOT PMAP AWAY PAGES BEYOND 777
! BECAUSE THE MONITOR WILL GIVE AN ERROR IF THERE IS NO PAGE
! TABLE FOR THE LONG-FILE PAGES.
GLOBAL ROUTINE %NAME('$TRUNCATE') ( BLOCK, ERRORRETURN ) =
BEGIN
ARGUMENT (BLOCK,BASEADD);
ARGUMENT (ERRORRETURN,BASEADD);
LOCAL
CRP,
FILEPOINTER,
PAGECOUNT,
P_IN_FILE,
TEMP,
PTR;
MAP
FILEPOINTER: POINTER;
RMSENTRY ( $TRUNCATE );
%([ FETCH THE USER'S RAB ADDRESS AND HIS ERROR ROUTINE ADDRESS ])%
RAB = .BLOCK; ! FETCH RAB ADDRESS
ERRADR = .ERRORRETURN; ! AND USER ERROR ADDRESS
%([ SET UP SYSTEM-WIDE POINTERS AND MAKE SURE THAT
THE USER SPECIFIED $TRUNCATE ACCESS IN HIS FAC FIELD ])%
CALLRSETUP (PCI (AXTRN)); ! SET UP THINGS
%([ MAKE SURE THIS IS A DISK FILE ])%
IF NOT DASD THEN USERERROR (ER$DEV); ! MUST BE A DISK
%([ THIS MUST BE A SEQUENTIAL FILE WITH ONLY ONE CONNECTED RAB ])%
IF FILEORG GEQ ORGREL ! STREAM OR SEQ FILE
OR
( .RST [ FLINK ] ISNT .FST ) ! ONLY ONE RAB IS CONNECTED
THEN USERERROR (ER$IOP);
%([ FILE MUST BE OPENED FOR EXCLUSIVE ACCESS ])%
IF SHAREACCESS ISNT AXNIL THEN USERERROR (ER$XCL);
%([ FOR SEQUENTIAL RMS FILES, DO THE FOLLOWING... ])%
IF SEQFILE
THEN
BEGIN
%([ THERE MUST BE A VALID RECORD POINTER FOR THIS
$TRUNCATE TO SUCCEED. THIS IS ONLY POSSIBLE IF
THE LAST OPERATION WAS A SUCCESSFUL $FIND OR $GET ])%
IF ( .RST [ RSTLASTOPER ] ISNT C$FIND
AND
.RST [ RSTLASTOPER ] ISNT C$GET )
THEN
USERERROR ( ER$CUR ); ! BAD RECORD POINTER
%([ LOCATE THE CURRENT RECORD IN OUR CURRENT BUFFER ])%
CRP = .RST [ RSTDATARFA ];
CALLGTBYTE ( %(BYTE)% LCI (CRP), ! LOCATE RECORD
%(FLAG)% PCI (FALSE));
%([ FETCH A POINTER TO THE CURRENT RECORD ])%
FILEPOINTER = .RST [ RSTPAGPTR ]; ! GET POINTER TO BUFFER
FILEPOINTER [ WHOLEWORD ] = ZERO; ! CLEAR 1ST WORD
%([ WE HAVE NOW MAPPED THE RECORD INTO OUT BUFFER,
AND ZEROED THE HEADER WORD. BUT THIS IS NOT
ENOUGH TO GUARENTEE A GOOD EOF MARK BECAUSE
THE NEXT RECORD THAT WE WRITE MAY CAUSE A
NON-ZERO WORD TO BE TAKEN AS THE HEADER OF A
NON-EXISTENT RECORD. THEREFORE, WE MUST CLEAR
THE ENTIRE PAGE FROM THIS WORD DOWN. IF THE
HEADER IS THE LAST WORD IN THE PAGE, THEN WE
CAN STOP. ])%
IF ( .FILEPOINTER AND OFSETMASK ) ISNT OFSETMASK
THEN %(WE ARE NOT AT THE BOTTOM OF THE PAGE)%
MOVEWORDS ( %(FROM)% .FILEPOINTER,
%(TO)% .FILEPOINTER + 1,
%(SIZE)% ( .FILEPOINTER OR OFSETMASK ) - .FILEPOINTER );
P_IN_FILE = $CALL (SIZEFILE, .FST [FSTJFN]); !GET WORD CNT
RST [ RSTNRP ] = .CRP; ! RESET NRP TO OLD CRP
SIZEOFFILE = .CRP; !CROCK
END %( OF TRUNCATION TO SEQUENTIAL FILES )%
ELSE BEGIN %( TO TRUNCATE A STREAM/LSA FILE )%
%([ DO WE HAVE A CURRENT RECORD? ])%
IF ENDOFFILE OR .RST [ RSTLASTOPER ] IS C$CONNECT
THEN USERERROR ( ER$CUR ); ! ** NOT POSITIONED **
%([ SET 'CRP' TO THE BEGINNING OF THE CURRENT, PHYSICAL REC ])%
CRP = .RST [ RSTDATARFA ] - .RST [ RSTRHSIZE ]; !CRP IN CHARS
SETFLAG ( RST [ RSTFLAGS ], FLGEOF ); ! SET EOF
$CALL (POSASCFIL, .FST [FSTJFN], .CRP); !REPOS FILE
P_IN_FILE = $CALL (SIZEFILE, .FST [FSTJFN]); !GET CHAR CNT
P_IN_FILE = (.P_IN_FILE+4) MOD 5; !WORD CNT
END; %( OF TRUNCATION FOR ASCII/LSA FILES )%
%([ DESTROY ALL FILE PAGES FROM THIS PAGE FORWARD.
THIS WILL GUARANTEE THAT ANY EXISTING DATA IN THE FILE
WILL GO AWAY AND WILL NOT BE CONFUSED LATER FOR AN EOF MARK ])%
%([ BUT, DON'T DO IT IF THERE IS NO CURRENT PAGE YET
(I.E., THE CURRENT FILE PAGE IS -1) ])%
IF ( TEMP = (.CURRENTFILEPAGE + 1 ) ) ISNT ZERO
THEN BEGIN
P_IN_FILE = (.P_IN_FILE+511) MOD 512; !WORDS TO PAGES
$CALL (TRUNCFILE,
%( JFN )% .FST [ FSTJFN],
%( NEXT PAGE)% .TEMP,
%( NUMBER OF PAGES )% .P_IN_FILE - .CURRENTFILEPAGE - 1 );
END;
SETFLAG ( RST [ RSTFLAGS ] , FLGTRUNC ); ! REMEMBER THIS $TRUNCATE
RST [ RSTDATARFA ] = ZERO; ! CLEAR OUT RECORD POINTER
RAB [ RABRFA ] = ZERO; ! UNDEFINED CRP
RST [ RSTHYBYTE ] = .CRP; ! RESET HIGHEST WRITTEN BYTE
USEREXIT ! RETURN TO USER
END; %( OF $TRUNCATE )%
END
ELUDOM