; ;**************************************************************** ; LAST MODIFIED BY JACK MARTINELLI MARCH 6 1979 ; OPTIONAL NO SPACE FILLING IF A SIXTH ARGUMENT IS INCLUDED ; ANY VALUE FOR THE 6TH ARGUMENT TURNS OFF SPACE-FILLING. ; ; THIS IS A FORTRAN CALABLE INTEGER FUNCTION. THE RETURNED VALUE ; OF THE FUNCTION IS THE INDEX TO THE NEXT CHARACTER OF THE INPUT STRING ; FOLLOWING A TERMINATION CHARACTER, OR TERMINATION STRING. ; ; THE FORM OF THE CALL IS; ; =INPL(INBUF,MAXLEN,OUTBUF,TERM,AND) ; ; INBUF -- AN ARRAY GIVEN BY FORTRAN TO BE LEFT JUSTIFIED. ; MAXLEN -- THE MAXIMUM LENGTH OF THE ARRAY ; OUTBUF -- THE LEFT JUSTIFIED ARRAY RETURNED TO FORTRAN. ; TERM -- A STRING OF CHARACTERS TO END THE INPUT STRING. ; WITH AND=1 TERMINATION CHARATERS ARE NOT INCLUDED IN ; THE OUTBUF STRING, AND THE PROCESS IS TERMINATED ON ; ANY OF THE GIVEN TERMINATION CHARATERS. ; WHEN AND=0 THE TERMINATION CHARACTERS ARE INCLUDED AND ; TERMINATION OF THE PROCESS ENDS WHEN THE SET OF ; TERMINATION CHARACTERS IS ENCOUNTERED. ;*********************************************************************** .TITLE INPL OUTBUF=6 MAXLEN=4 INBUF=2 TERM=10 AND=12 OUT=R2 INP=R0 MAX=R3 TEMTER:.WORD 0 OR: .BYTE 0 FLAG: .BYTE 0 FLAG2: .BYTE 0 DUM: .BYTE 0 INPL:: MOV OUTBUF(R5),OUT ;GET POINTER TO 1ST. OUT BYTE. CMP MAXLEN(R5),#177777;CHECK FOR NULL ARGUMENT. BEQ CHLEN ;YAH - THEN SET THE DEFAULT TO 80 BYTES. MOV @MAXLEN(R5),MAX ;IT'S NOT SO WE DO IT HIS WAY. LABEL: MOV #1,OR ;JUST IN CASE WE HAVE ANOTHER DEFAULT. CMPB (R5),#5 ;DO WE HAVE A DEFAULT CONDITION? BNE SKIP ;YEH - OK THEN FORGET THE 5TH ARGUMENT. MOV @AND(R5),OR ;WELL WE DON'T HAVE ANY DEFAULTS SKIP: MOV MAX,R1 CMP #6,(R5) ;IF THERE IS A 6TH ARGUMENT DON'T SPACE FILL BEQ SKIP2 MOV OUT,R4 ;COPY OUTPUT POINTER. INIT: MOVB #40,(R4)+ ;INITIALIZ OUTPUT STRING WITH BLANKS. SOB R1,INIT ;DONE? YES-CONTINUE. NO-GTO INIT. SKIP2: CLR INP ;BEGIN LOOKING AT BYTES OF INPUT STRG. MOV INBUF(R5),R4 ;GET POINTER TO INPUT STRING. LOOP: INC INP ;LOOK AT NEXT BYTE. CMPB #40,(R4)+ ;IS BYTE A BLANK? BNE END CMP INP,MAX BLT LOOP BR RETURN ;ENTIRE FIELD WAS BLANK END: DEC R4 MOV TERM(R5),R1 ;PUT THE POINTER TO THE 1ST TERM AWAY. CMP R1,#177777 ;IS THERE NO TERMINATORS? BEQ MOUTH ;THEN A NULL IS THE ONLY TERMINATOR. CMPB (R5),#3 ;ARE THERE ONLY 3 ARGS? BEQ MOUTH ;THEN SET TERMINATOR TO A NULL ALSO. BACK: CLRB FLAG MOV R1,TEMTER ;AND MAKE A COPY FOR LATER USEAGE ETC. ;**************************************************************** ;R4 NOW POINTS TO THE 1ST. NON-BLANK CHARACTER. ;******************************************************************* MOVIT: TSTB (R4) ;DO WE HAVE A NULL IN THE INPUT STRING? BEQ NULRET ;YES THEN TAKE IT AWAY FORTRAN! TSTB (R1) ;TEST FOR END OF TERMINATOR STRING BEQ HMMMM ;THAT'S IT!!! CMPB (R4),(R1)+ ;INPUT BYTE=ANY TERMINATION BYTE? BEQ AAHH ;YES - THEN SEE WHAT'S NEXT. TSTB FLAG BNE SPECEL TSTB OR BNE MOVIT HMMMM: MOV TEMTER,R1 ;NO - RESET POINTER TO 1ST TERMINATION BYTE. ;***************************************************************************** ; ; PUT THE STRING TO BE LEFT JUSTIFIED IN OUTBUF BEGINING AT BYTE 1 OF OUTBUF. ; ;****************************************************************************** HERE: MOVB (R4)+,(OUT)+ ;HERE'S THE LEFT JUSTIFICATION. AGAIN: INC INP ;MAKE SURE FORTRAN GETS THE RIGHT INDEX. CMP INP,MAX ;ARE WE DONE ANYWAY? BLE MOVIT ;NOPE THERE'S STILL WORK TO DO. BR RETURN ;AND BACK TO FORTRAN. AAHH: TSTB OR ;IS THE OR OPTION ON? BNE FIXIT ;YEH - THEN WE ARE ALMOST DONE. TSTB (R1) ;DO WE HAVE A NULL IN THE TERMINATION STRING? BEQ TEST ;YAH - OH BOY! SET: MOVB #1,FLAG ;NAW - *%$#! WELL THEN SET THE FLAG ANYWAY. BR HERE ;AND GO BACK AND DO SOME MORE WORK. FIXIT: MOV INP,MAX ;FOOL THE THING INTO THINKING WE CAN GO NO MORE. TSTB OR ;OR=1 THEN DON'T XFER THE LAST BYTE. BNE RETURN BR HERE ;HERE WE GO. TEST: TSTB FLAG ;IF FLAG IS ZERO THEN WE FOOL IT AND... BNE FIXIT ;FIXIT, XFER THE LAST BYTE AND RETURN TO FORTRAN. BR SET ;WELL IT'S NOT SO WE SET THE FLAG. SPECEL: MOV TEMTER,R1 CLRB FLAG BR MOVIT CHLEN: MOV #16,MAX ;DEFAULT OF MAXIMUM ;LENGTH IS 80(120 OCTAL) BR LABEL ;AND BACK TO IT. MOUTH: MOV #DUM,R1 ;MAKE R1 POINT TO A NULL -DUM- BR BACK ;AND BACK TO THE THING. NULRET: DEC R0 ;POINT AT A NULL ON A RETURN RETURN: CMP #6,(R5) ;IF 6 ARGS THEN TAG A NULL ON TAIL OF OUTPUT STRING BNE ATLAST MOVB #0,(OUT) ATLAST: RTS PC .END