.TITLE RECSUB .IDENT /V7.02/ ;************************************************************************** ; ; RECSUB ; ; THIS MODULE CONTAINS ROUTINES USED TO READ FROM AND WRITE TO THE ; ACCOUNTING SYSTEM DATA FILE, LB:[0,0]ACCOUNTS.DAT. ALL I/O IS ; DONE ON LOGICAL UNIT 3. ; ; VERSION: V7 APRIL 1981 ; ; STEVE THOMPSON ; SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA NY 14853 ; ; REVISION HISTORY ; ---------------- ; ; SMT731 28-JUL-81 ALLOWED FOR BUFFER LENGTHS TO EXCEED 40. ; WORDS WITH LONG OPTION TEXT FROM MACNT ; ;************************************************************************** .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,OPEN$A,OPEN$W .MCALL GET$,PUT$,GTIM$S,CLOSE$ .MCALL MRKT$S,WTSE$S FILDF$ ; DEFINE TRANSACTION BUFFER LENGTHS LUN3 = 3 ; THIS FILE ALWAYS USES THIS LOGICAL UNIT NUMBER DEFSIZ = -20. ; INITIAL SIZE = 20 BLOCKS (NONCONTIGUOUS) EXTSIZ = -10. ; EXTEND SIZE = 10 BLOCKS RECLEN = 0 ; DATA BUFFER LENGTH .IIF GT F.LBYE-RECLEN,RECLEN=F.LBYE .IIF GT F.LDSK-RECLEN,RECLEN=F.LDSK .IIF GT F.LSET-RECLEN,RECLEN=F.LSET .IIF GT F.LUPD-RECLEN,RECLEN=F.LUPD .IIF GT F.LBLK-RECLEN,RECLEN=F.LBLK .IIF GT F.LMMA-RECLEN,RECLEN=F.LMMA .IIF GT F.LCHA-RECLEN,RECLEN=F.LCHA .IIF GT F.LMAS-RECLEN,RECLEN=F.LMAS .IIF GT F.LDMS-RECLEN,RECLEN=F.LDMS $RFFDB::FDBDF$ ; DATA FILE FILE DESCRIPTOR BLOCK FDAT$A R.VAR,,,DEFSIZ,EXTSIZ FDRC$A ,$RFREC,RECLEN FDOP$A LUN3,RECDSP,,FO.APD,FA.ENB!FA.DLK $RFREC::.BLKB RECLEN ; DATA BUFFER .EVEN $RFLEN::.WORD RECLEN ; ACTUAL RECORD LENGTH WORD RECDSP: .WORD DEVSIZ,DEVNAM ; DATASET DESCRIPTOR .WORD DIRSIZ,DIRNAM ; .WORD FILSIZ,FILNAM ; DEVNAM: .ASCII /LB0:/ ; DEVICE FOR ACCOUNTING DATA FILE DEVSIZ=.-DEVNAM ; DIRNAM: .ASCII /[0,0]/ ; UFD FOR ACCOUNTING DATA FILE DIRSIZ=.-DIRNAM ; FILNAM: .ASCII /ACCOUNTS.DAT/ ; NAME OF ACCOUNTING DATA FILE FILSIZ=.-FILNAM ; (ALWAYS LATEST VERSION) .EVEN ;+ ; *** $RFOPN ; ; THIS ROUTINE IS CALLED TO OPEN (WITH APPEND) THE ACCOUNTING ; RECORDS FILE. IF IT DOES NOT EXIST, THE FILE IS CREATED WITH ; SYSTEM OWNERSHIP AND SUITABLE ACCESS RIGHTS. IF THE FILE ; IS OPENED SUCCESSFULLY, THE CODE WORD OF THE DATA BUFFER IS ; ZEROED, THE CURRENT DATE AND TIME ARE INSERTED INTO THE BUFFER ; AND THE REMAINDER IS ZEROED. ; ; INPUTS: ; R2 OPEN ERROR COUNTER IF ENTRY AT $RFOP1 ; ; OUTPUTS: ; R0 TRANSACTION FILE FDB ADDRESS ; R2 USED ; CC FILE OPENED OK, DATA RECORD INITIALISED ; CS FILE OPEN ERROR (R0 CONTAINS FDB ADDRESS) ; ;- $RFOPN::MOV #5,R2 ; INITIALISE OPEN ERROR COUNTER $RFOP1::OPEN$A #$RFFDB ; OPEN DATA FILE WITH APPEND BCC 10$ ; IF CC IT WAS SUCCESSFUL CMPB F.ERR(R0),#IE.NSF ; DID THE OPEN FAIL BECAUSE THE FILE ; DID NOT EXIST? BEQ 5$ ; IF EQ YES, TRY TO CREATE FILE DEC R2 ; FIVE OPEN FAILURES? BEQ 30$ ; IF EQ YES, SEND OPEN ERROR MRKT$S #1,#1,#2 ; MARK TIME FOR ONE SECOND BCS $RFOP1 ; JUST IN CASE WTSE$S #1 ; WAIT FOR TIME INTERVAL TO ELAPSE BR $RFOP1 ; AND TRY THE OPEN AGAIN 5$: MOV #177000,R1 ; SET PROTECTION MASK TO [RWED,RWED,R,] CALL .WDFFP ; WRITE IN $$FSR2 MOV #401,R1 ; SET FILE OWNER AS [1,1] CALL .WFOWN ; WRITE FILE OWNER WORD IN $$FSR2 OPEN$W #$RFFDB ; CREATE THE NEW FILE BCS 40$ ; IF CS, AN ERROR OCCURRED 10$: MOV #$RFREC,R0 ; SET UP DATA BUFFER ADDRESS CLR (R0)+ ; ZERO THE FUNCTION WORD GTIM$S R0 ; FILL IN THE DATE AND TIME ADD #<8.*2>,R0 ; STEP PAST THE DATE AND TIME MOV #</2>,R1 ; GET LENGTH OF REST OF RECORD 20$: CLR (R0)+ ; ZERO A WORD DEC R1 ; DONE YET? BNE 20$ ; IF NE NO, LOOP RETURN ; RETURN TO CALLER 30$: SEC ; SET CARRY BIT TO INDICATE BAD NEWS 40$: RETURN ; AND RETURN TO THE CALLER ;+ ; *** $RFCLS ; ; THIS ROUTINE IS CALLED TO CLOSE THE ACCOUNTING DATA FILE. ; ;- $RFCLS::CLOSE$ #$RFFDB ; CLOSE THE FILE RETURN ; AND RETURN TO THE CALLER ;+ ; *** $RFGET ; ; THIS ROUTINE IS CALLED TO READ A LINE OF DATA FROM THE ; ACCOUNTING RECORDS FILE. ; ; $RFLEN IS SET UP WITH THE LENGTH READ. ; ;- $RFGET::CLR $RFLEN ; ZERO DATA LENGTH COUNTER GET$ #$RFFDB,#$RFREC,#RECLEN ; READ IN THE DATA BCS 10$ ; IF CS AN ERROR OCCURRED MOV F.NRBD(R0),$RFLEN ; SAVE LENGTH OF LINE READ 10$: RETURN ; AND RETURN TO THE CALLER ;+ ; *** $RFPUT ; ; THIS ROUTINE IS CALLED TO WRITE THE CONTENTS OF THE DATA BUFFER ; TO THE RECORDS FILE. THE LENGTH TO WRITE IS SPECIFIED BY THE ; RECORD LENGTH FIELD $RFLEN. ; ;- $RFPUT::PUT$ #$RFFDB,#$RFREC,$RFLEN ; WRITE THE DATA RETURN ; AND RETURN TO THE CALLER .END