## STRPUT.RAT ## THIS IS NOT THE SAME AS THE STRPUT THAT IS INCLUDED IN THE STRLIB, ## BUT THE CALLING SEQUENCE IS THE SAME SO IT IS INTERCHANGABLE. ## IN FACT, THIS IS AN OPTIONAL REPLACEMENT FOR THE ONE IN STRLIB. ## BECAUSE IT USES A2 WRITES INSTEAD OF A1 WRITES, IT IS ABOUT 30% ## FASTER (!!!) THAN THE STANDARD STRPUT, WHICH SPEEDS UP THE WHOLE PRE- ## PROCESSOR BY ABOUT 6%. ## THIS ROUTINE IS NOT USED BY ANY OF THE NORMAL BUILD FILES. IF YOU ## WANT TO USE IT, PREPROCESS AND COMPILE IT SEPERATELY (E.G., ## RAT STRPUT=DEFINS,STRPUT/GO) EITHER REPLACE THE STANDARD STRPUT IN ## STRLIB (AND ADD PUTIT) OR MODIFY THE ODL TO INCLUDE THIS AS A ## SEPERATE MODULE SO THE REAL STRPUT IS NOT PULLED FROM STRLIB. ## NOTE THAT SINCE STRPUT CALLS PUTIT WITH THE ARRAY IN THE ## ARGUMENT LIST TWICE AND SINCE PUTIT'S DUMMY ARGUMENTS ARE ONE ## BYTE ARRAY AND ONE WORD ARRAY, THE TWO ARRAYS ARE IMPLICITLY ## EQUIVALENCED, THUS GETTING AROUND THE FORTRAN RESTRICTIN THAT YOU ## CANNOT EQUIVALENCE DUMMY ARGUMENTS AND ALLOWING US TO ACCESS THE ## ORIGINAL BUFFER AS BOTH WORDS AND BYTES. # # NOTE THAT IF I IS ODD, WE WILL OUTPUT 1 EXTRA BYTE WHICH IS A BLANK. # NORMALLY, THIS IS NOT PROBLEM, BUT IF IT HAPPENS TO FALL IN THE # MIDDLE OF A HOLLERITH STRING WHICH EXTENDS OVER THE END OF A LINE # THE EXTRA CHARACTER WILL SCREW UP THE CHARACTER COUNT AND THUS # CAUSE AN ERROR. # ****** THEREFORE ***** USE THIS VERSION AT YOUR RISK # ## WE OWE THIS BIT OF CLEVERNESS TO TOM SCHULTS, ANN ARBOR MICH. # IFNOTDEF(ALPHA) INCLUDE/NL DEFINS ENDIFDEF # INTEGER FUNCTION STRPUT (LUN, STR, FMT) #SAME AS REGULAR STRPUT INTEGER LUN, PUTIT CHARACTER STR(DUMMYSIZE), FMT STRPUT=PUTIT (LUN, STR, STR, FMT) RETURN END INTEGER FUNCTION PUTIT (LUN, CSTR, ISTR, FMT) INTEGER LUN, SLEN, N, ISTR(DUMMYSIZE) CHARACTER CSTR(DUMMYSIZE), FMT I=SLEN(CSTR) I1=(I+1)/2 CSTR(I+1)=BLANK IF (I1 > 0) [ IF (FMT == NO) [ IF (I > 1) [ WRITE (LUN, 1, ERR=11, END=11) (ISTR(N),N=1,I1) 1 FORMAT (66A2) ] ELSE #THIS CASE IS NEEDED TO GET AROUND A FORTRAN BUG WRITE (LUN, 2, ERR=11, END=11) CSTR(1) ] ELSE [ WRITE (LUN, 2, END=11, ERR=11) FMT, (ISTR(N),N=1,I1) 2 FORMAT (A1, 66A2) ] ] ELSE WRITE (LUN, 1, ERR=11, END=11) #NULL LINE CSTR(I+1)=EOS RETURN (YES) 11 CSTR(I+1)=EOS RETURN (BAD) END