Trailing-Edge
-
PDP-10 Archives
-
tops10and20_integ_tools_v9_3-aug-86
-
tools/crc/browse/crlbrd.mac
There are no other files named crlbrd.mac in the archive.
title crlbrd - Routine to read a LBR module from fortran
;
; This routine can be called from a FORTRAN program to read
; a LBR module from a LBR library. There are 2 routines -
; CRLBOP - open a module in a library
; CRLBRD - read a record from a module in the library
;
; NOTE: This routine only reads text files.
;
search vtmac,crcsym
regdef ;define registers, search system universals
search lbr ;get LBR definitions.
external gtbypt ;get a fortran 77 string
external gtbufa,ptbufa ;use fortran 77 scratch string space
;
; CALL CRLBOP('LIBRARY','MODULE',JFN,SIZE,ERR)
;
; Opens MODULE in LIBRARY.LBR, returns useful JFN, size and pointer.
;
; Errors: 1 - Cannot find library
; 2 - Cannot open library
; 3 - File is not a library, or format incorrect
; 4 - Cannot locate module
; 5 - general JSYS error
;
entry crlbop,crlbrd
;
; Define error macro
;
DEFINE ERR(N),<
movei t1,n
movem t1,@error(cx)
ret>
;
; Define argument offsets
;
forarg<lib,mod,jfn,size,error>
crlbop: move t1,cx ;copy argument pointer
movei t2,5 ;unidentified error
movem t2,@error(cx) ;start with that
trvar <<hdrrec,wih>,<modnam,8>>;reserve space for header words
move cx,t1 ;get arg pointer back
call getlib ;find the library
ret ;failed, return
movei t3,$hnent ;address of number of modules
rin% ;now get number of modules in lib
jumpe t2,notfnd ;if zero, module not found
movem t2,q1 ;save for looping
movei t3,$hbysz ;address of lib byte size
rin% ;read it
movem t2,q2 ;save for later
movei t3,<$hdir-1> ;address of directory start
move t1,@jfn(cx) ;get jfn of lib
rin% ;better than SFPTR because of byte
;size problems
domod: movei t2,hdrrec ;get address of record buffer
hll t2,[point ^d36,] ;make a byte pointer
move t1,@jfn(cx) ;jfn of library
movni t3,wpde ;words in directory entry
sin% ;read an entry
movei t1,hdrrec ;get address of record
skipn $dmupdt(t1) ;deleted module ?
jrst nxtmod ;yes, so step to next
hrroi t1,hdrrec ;point to module name
hrroi t2,modnam ;and one desired by user
stcmp% ;compare names
jumpe t1,found ;if 0, they are equal
nxtmod: sojn q1,domod ;loop for all modules
notfnd: move t1,@jfn(cx) ;get jfn
closf% ;close library because...
trn
err 4 ;...module was not found, return error
;
; Module is found, reset library to start
;
found: movei t1,hdrrec ;get address of directory entry
move t2,$dmlen(t1) ;get modules length in bytes
movem t2,@size(cx) ;return to user
move q1,$dmstrt(t1) ;get address of module start
move t2,q2 ;get lib byte size
move t1,@jfn(cx) ;and library jfn
sfbsz% ;reset byte size for this opening
trn ;tuff on error
move t3,q1 ;now get module start address
soj t3, ;subtract one for pointers
rin% ;set up for next read
trn
setzm @error(cx) ;indicate no error
ret ;return to caller
;
; Locate and open library
;
getlib: movei t1,lib ;want pointer to lib name
call gtbypt ;may be fortran v7
move t2,t1 ;gtjfn% wants it in t2
movei t1,[gj%old ;get arg block - old file
.nulio,,.nulio ;no I/O for name
0 ;no def device
0 ;no def dir
0 ;no def name
-1,,[asciz/LBR/] ;default type
0 ;no prot
0 ;or account
0] ;or jfn
gtjfn% ;grab a jfn
erjmp [err 1] ;lose
movem t1,@jfn(cx) ;store jfn for FORTRAN user
movx t2,of%rd!fld(^d36,of%bsz) ;set up to read directory
openf% ;open library
erjmp [err 2] ;lose
bin% ;read first byte
caie t2,hdrmrk ;look like a library ?
jrst [err 3] ;no, return
movei t1,mod ;want pointer to mod. name
call gtbypt ;may be fortran v7
movn t3,t2 ;make the length -ve in t3
movei t2,modnam ;point to our local storage for it
hrli t2,(point 7,) ;make into byte pointer
getli1: jumpl t3,[ sin% ;if fortran v7 read in the module name
jrst getli2 ];terminate with a null
ildb t3,t1 ;if not get a byte from user's name
cain t3," " ;space ?
jrst getli2 ;yes, so end of name
skipn t3 ;null ?
jrst getli2 ;yes, so end of name
idpb t3,t2 ;no, copy it across
jrst getli1 ;and continue
getli2: setz t3, ;get a null
idpb t3,t2 ;terminate name with it
move t1,@jfn(cx) ;return jfn of library
retskp ;return success
subttl CRLBRD - read a record from a library
;
; This routine reads a text record from the library.
; CALL CRLBRD(ARRAY,RECLEN,JFN,START,ERROR)
;
; ARRAY - receives returned record
; RECLEN - record length in characters
; JFN - supply that returned by CRLBOP
; SIZE - supply value returned by CRLBOP to read first record,
; thereafter use value returned by this routine for next call.
; ERROR - 0 is OK
; 1 - end of file
; 2 - some error reading file
;
forarg <array,reclen,jfn,size,error>
crlbrd: skipn @size(cx) ;any file left ?
jrst eoferr ;no, give eof error
movei t1,array ;yes, want pointer to user's array
call gtbufa ;may be fortran v7
;** skipe t2 ;is it ?
;** call $spfil ;yes, space fill the character variable
movei t4,12 ;end read on linefeed
move t3,t2 ;sin wants length in t3
skipn t3 ;not v7, so think BIG
movei t3,1000 ;max record length
push p,t3 ;save length
move t2,t1 ;and o/p pointer in t2
move t1,@jfn(cx) ;get jfn
sin% ;read a record
erjmp [err 2]
pop p,t1 ;restore length
sub t1,t3 ;subtract amount remaining
setz t4, ;get a null
;** skipe t1 ;any left ?
idpb t4,t2 ;terminate with a null
move t3,@size(cx) ;how much was left before ?
sub t3,t1 ;and how much have we removed ?
movem t3,@size(cx) ;remember for next call
subi t1,2 ;drop off cr/lf
movem t1,@reclen(cx) ;store for user
setzm @error(cx) ;no error
movei t1,array ;yes, want pointer to user's array
call ptbufa ;copy fortran 77 characters
ret ;return to caller
eoferr: move t1,@jfn(cx) ;get library jfn
closf% ;close it
erjmp .+1
err 1
end