C***************************************************************************** C C Test of Character String Syslib Routines. C Importable Functions C C----------------------------------------------------------------------------- C C Program : TestString/ String.For C Author : John Malcolmson C Date : June 1986 C Language : Fortran 77 C Note : Uses subroutines imported from both syslib and RTNS C libraries. C C***************************************************************************** C***************************************************************************** C C List of functions: C Concat, Getstr, Index!, Insert, Len, Putstr, Repeat, Scomp! C Scopy, Strpad, Substr, Transl, Trim, Verify, Iverif C C***************************************************************************** C---------------------------------- Sets ------------------------------------- Subroutine Sets( a, lngth, b ) Integer*2 i Integer*2 lngth Byte a(*) Character b(*) i = 1 10 IF (( b(i) .ne. '\' ) .and. ( i .lt. lngth )) THEN a(i) = ICHAR( b( i ) ) i = i + 1 Goto 10 END IF a(i) = 0 END C----------------------------------------------------------------------------- C---------------------------------- CONCAT ----------------------------------- Function TstConcat Integer*4 TstConcat Character*10 a, b, c Character*20 d, e, f Integer*2 ln, Ofend Logical*1 err, Fail1, Fail2 Call CenterString( '--- Testing CONCAT ---\' ) Call WriteLn Call CenterString( 'String concatination routine with result codes\') Call WriteLn TstConcat = 0 Fail1 = .FALSE. Call Sets( a, 10, '##########\' ) Call Sets( b, 10, '!!!!!!!!!\' ) Call Sets( e, 20, '#########!!!!!!!!!\' ) Call Concat( a, b, d ) DO 10 i = 1, 19 IF ((d(i:i) .ne. e(i:i)).and.(.Not. Fail1)) THEN Fail1 = .TRUE. Ofend = i END IF 10 Continue IF (Fail1) THEN Call MtFail( 'concat', 1 ) Call WriteString( d(Ofend:) , 0, 10 ) Call WriteString( e(Ofend:) , 0, 10 ) Call WriteLn TstConcat = TstConcat + 2**1 END IF err = .FALSE. Call Sets( a, Len(a), '12345\' ) Call Sets( b, Len(b), '12345\' ) Call Concat( a, b, f, 20, err ) IF (err .eq. .TRUE.) THEN Call MtFail( 'trunc ', 2 ) Call WriteBool( .FALSE., 10 ) Call WriteBool( err, 10 ) Call WriteLn TstConcat = TstConcat + 2**2 END IF err = .FALSE. Call Sets( d, Len(d), '1234567890123456789\' ) Call Sets( e, Len(e), '1234567890123456789\' ) Call Concat( d, e, f, 20, err ) IF (err .ne. .TRUE.) THEN Call MtFail( 'trunc ', 3 ) Call WriteBool( .True., 10 ) Call WriteBool( err, 10 ) Call WriteLn TstConcat = TstConcat + 2**3 END IF Call Sets( a, Len(a), '11\' ) Call Sets( b, Len(b), ' 11\' ) Call Sets( c, Len(c), '11 11' ) Fail2 = .FALSE. Call Concat( a, b, f, 20, err ) DO 50 i = 1, 5 IF ((c(i:i) .ne. f(i:i)).and.(.Not. Fail1)) THEN Fail2 = .TRUE. Ofend = i END IF 50 Continue IF (Fail2) THEN Call MtFail( 'Concat', 4 ) Call WriteString( c(Ofend:) , 0, 10 ) Call WriteString( f(Ofend:) , 0, 10 ) Call WriteLn TstConcat = TstConcat + 2**4 END IF Call sets( a, 3, 'ZZ\' ) Call sets( b, 3, 'XX\' ) c = 'AAAAAAAAAA' Call Concat( a,b,c ) IF (c(8:8) .ne. 'A') THEN Call MtFail( 'wovrun', 5 ) Call Write1Int( 'A', 10 ) Call Write1Int( C(8:8), 10 ) Call WriteLn TstConcat = TstConcat + 2**5 END IF Call TestFail( TstConcat ) Call CenterString( '--- Testing CONCAT completed ---\' ) Call WriteLn Call WriteLn END C----------------------------------------------------------------------------- C--------------------------------- GETSTR ------------------------------------ Function TGetstr Integer*4 TGetstr Integer*2 k Integer*2 res Character*41 in, out Logical*1 err Call CenterString( '--- Testing GETSTR ---\' ) Call WriteLn Call CenterString( 'Gets a string from a logical unit\') Call WriteLn TGetstr = 0 Call Sets(Out,40,'This is a mess to the file, be it writ\') Open(unit=2,File='dat:testgt.tst',Status='NEW',Form='Formatted') DO 10 k = 1, 3 Call Putstr( 2, out, 0, err ) res = err IF (res .ne. 0) THEN Call MtFail( 'putstr', k ) Call Write2Int( 0, 10 ) Call Write2Int( res, 10 ) Call WriteLn TGetstr = TGetstr + 2**k END IF 10 Continue Close( unit=2 ) Call Getstr( 2, in, 40, err ) res = err IF (res .ne. -2) THEN Call MtFail( 'chnopn', 4 ) Call Write2Int( -2, 10 ) Call Write2Int( res, 10 ) Call WriteLn TGetstr = TGetStr + 2**4 END IF Open(unit=2,File='dat:testgt.tst',Status='OLD',form='formatted') DO 20 k = 5, 10, 2 Call Getstr( 2, in, 40, err ) res = err IF (res .lt. 0) THEN Call MtFail( 'getstr', k ) Call Write2Int( 0, 10 ) Call Write2Int( res, 10 ) Call WriteLn TGetstr = TGetstr + 2**k END IF res = ISCOMP( in, out ) IF ( res .ne. 0) THEN Call MtFail( 'vcompr', k+1 ) Call WriteString( out(1:10), 0, 10 ) Call WriteString( in(1:10), 0, 10 ) Call WriteLn TGetStr = TGetstr + 2**(k+1) END IF 20 Continue Close( unit=2 ) Open(unit=2,File='dat:testgt.tst',Status='OLD',form='formatted') Call Getstr( 2, in, 2, err ) res = err IF (res .ne. -3) THEN Call MtFail( 'blksiz', 11 ) Call Write2Int( -3, 10 ) Call Write2Int( res, 10 ) Call WriteLn TGetstr = TgetStr + 2**11 END IF Close( unit=2, disp='delete' ) Call TestFail( TGetStr ) Call CenterString( '--- Testing GETSTR completed ---\' ) Call WriteLn Call WriteLn END C----------------------------------------------------------------------------- C--------------------------------- INDEX ------------------------------------- Function TstIndex External INDEX Integer*4 TstIndex,pass Integer*2 INDEX, Res, i BYTE STRING(8) BYTE PATTRN(3,6) INTEGER TBL1(3,4,6) DATA PATTRN/0,0,0, 1 'A',0,0, 2 'B',0,0, 3 'B','C',0, 4 'X',0,0, 5 'B','X',0/ c pass changes per position c pass = 10 TBL1(1,1,1) = 0 TBL1(1,1,2) = 1 TBL1(1,1,3) = 2 TBL1(1,1,4) = 2 TBL1(1,1,5) = 0 TBL1(1,1,6) = 0 c pass changes per position c pass = 11 TBL1(1,2,1) = 0 TBL1(1,2,2) = 0 TBL1(1,2,3) = 2 TBL1(1,2,4) = 2 TBL1(1,2,5) = 0 TBL1(1,2,6) = 0 c pass changes per position c pass = 12 TBL1(1,3,1) = 0 TBL1(1,3,2) = 0 TBL1(1,3,3) = 0 TBL1(1,3,4) = 0 TBL1(1,3,5) = 0 TBL1(1,3,6) = 0 c pass changes per position c pass = 13 TBL1(1,4,1) = 0 TBL1(1,4,2) = 0 TBL1(1,4,3) = 0 TBL1(1,4,4) = 0 TBL1(1,4,5) = 0 TBL1(1,4,6) = 0 c pass changes per position c pass = 14 TBL1(2,1,1) = 0 TBL1(2,1,2) = 1 TBL1(2,1,3) = 2 TBL1(2,1,4) = 3 TBL1(2,1,5) = 0 TBL1(2,1,6) = 0 c pass changes per position c pass = 15 TBL1(2,2,1) = 0 TBL1(2,2,2) = 0 TBL1(2,2,3) = 2 TBL1(2,2,4) = 3 TBL1(2,2,5) = 0 TBL1(2,2,6) = 0 c pass changes per position c pass = 16 TBL1(2,3,1) = 0 TBL1(2,3,2) = 0 TBL1(2,3,3) = 3 TBL1(2,3,4) = 3 TBL1(2,3,5) = 0 TBL1(2,3,6) = 0 c pass changes per position c pass = 17 TBL1(2,4,1) = 0 TBL1(2,4,2) = 0 TBL1(2,4,3) = 0 TBL1(2,4,4) = 0 TBL1(2,4,5) = 0 TBL1(2,4,6) = 0 c pass changes per position c pass = 18 TBL1(3,1,1) = 0 TBL1(3,1,2) = 1 TBL1(3,1,3) = 2 TBL1(3,1,4) = 2 TBL1(3,1,5) = 0 TBL1(3,1,6) = 0 c pass changes per position c pass = 19 TBL1(3,2,1) = 0 TBL1(3,2,2) = 4 TBL1(3,2,3) = 2 TBL1(3,2,4) = 2 TBL1(3,2,5) = 0 TBL1(3,2,6) = 0 c pass changes per position c pass = 20 TBL1(3,3,1) = 0 TBL1(3,3,2) = 4 TBL1(3,3,3) = 5 TBL1(3,3,4) = 5 TBL1(3,3,5) = 0 TBL1(3,3,6) = 0 c pass changes per position c pass = 21 TBL1(3,4,1) = 0 TBL1(3,4,2) = 4 TBL1(3,4,3) = 5 TBL1(3,4,4) = 5 TBL1(3,4,5) = 0 TBL1(3,4,6) = 0 Call CenterString( '--- Testing INDEX ---\' ) Call WriteLn Call CenterString( 'String Search routine w/o result codes\') Call WriteLn TstIndex = 0 c test call as a function c Call Sets(Srting,8,'ABC/') call scopy('ABC',string) CALL INDEX( String,Pattrn(1,2), 1, Res ) IF (res .ne. 1) THEN Call RsltFail(1) Call WriteInt(1,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**1 END IF c test call with two parameters only c character position is omitted, search beginns at first character Res = INDEX(STRING,PATTRN(1,2)) IF (Res .NE. 1) THEN Call RsltFail(2) Call WriteInt(1,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**2 END IF c test call with two parameters,third is omitted,separated by "," c character position is omitted, search beginns at first character Res = INDEX(STRING,PATTRN(1,2), ) IF (Res .NE. 1) THEN Call RsltFail(3) Call WriteInt(1,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**3 END IF c test call with five parameters, last three separeted by comma Res = INDEX(STRING,PATTRN(1,2), , , ) IF (Res .NE. 1) THEN Call RsltFail(4) Call WriteInt(1,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**4 END IF c test position = 0 c the Result should be = 0 Res = INDEX(STRING,PATTRN(1,2),0) IF (Res .NE.0) THEN Call RsltFail(5) Call WriteInt(0,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**5 END IF c test position < 0 c the Result should be = 0 Res = INDEX(STRING,PATTRN(1,2),-1) IF (Res .NE. 0) THEN Call RsltFail(6) Call WriteInt(0,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**6 END IF c test position = 1 c the Result should be = 1 Res = INDEX(STRING,PATTRN(1,2),1) IF (Res .NE. 1) THEN Call RsltFail(7) Call WriteInt(1,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**7 END IF c test position > 0, character is not pResented c the Result should be = 0 Res = INDEX(STRING,PATTRN(1,2),5) IF (Res .NE. 0) THEN Call RsltFail(8) Call WriteInt(0,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**8 END IF c test first byte null c the Result should be = 0 Res = INDEX(STRING,PATTRN(1,1),1) IF (Res .NE. 0) THEN Call RsltFail(9) Call WriteInt(0,10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**9 END IF PASS = 9 DO 60 L = 1,3 IF (L .EQ. 2) CALL SCOPY('ABBCD',STRING) IF (L .EQ. 3) CALL SCOPY('ABCABC',STRING) DO 55 J = 1,4 PASS = PASS + 1 DO 50 M = 2,6 Res = INDEX(STRING,PATTRN(1,M),J) IF (Res .NE. TBL1(L,J,M)) THEN Call RsltFail(PASS) Call WriteInt(TBL1(L,J,M),10) Call Write2INt(Res, 10) Call WriteLn TstIndex = TstIndex + 2**PASS END IF 50 CONTINUE 55 CONTINUE 60 CONTINUE Call TestFail( TstIndex) Call CenterString( '--- Testing INDEX completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C--------------------------------- INSERT ------------------------------------ Function TstInsert External INSERT Integer*4 TstInsert Logical Fail Integer*2 Res, i, Ofend Character*40 a, b, pattrn Call CenterString( '--- Testing INSERT ---\' ) Call WriteLn Call CenterString( 'String replacement routine w/o Result codes\') Call WriteLn TstInsert = 0 Call Sets( a, 40, 'This is a source XXXXXXXto be inserted.\' ) Call Sets( pattrn, 40, 'String \' ) Call Sets( b, 40, 'This is a source String to be inserted.\') CALL INSERT( pattrn, a, 18, 7 ) Fail = .FALSE. DO 10 i = 1, 39 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 10 Continue IF (fail) THEN Call MtFail( 'insert', 1 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstInsert = TstInsert + 2**1 END IF Call Sets( a,40,'This is a source to be inserted.\') Call Sets( pattrn, 40, 'String \' ) Call Sets( b, 40, 'This is a source String \' ) CALL INSERT( pattrn, a, 18 ) Fail = .FALSE. DO 20 i = 1, 24 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 20 Continue IF (fail) THEN Call MtFail( 'insert', 2 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstInsert = TstInsert + 2**2 END IF Call Sets( a, 40, 'This is a source to be inserted.\' ) Call Sets( b, 40, 'This is a source This is a source\' ) CALL INSERT( a, a, 18, 16 ) Fail = .FALSE. DO 30 i = 1, 30 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 30 Continue IF (fail) THEN Call MtFail( 'insert', 3 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstInsert = TstInsert + 2**3 END IF Call TestFail( TstInsert ) Call CenterString( '--- Testing INSERT completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C---------------------------------- LEN -------------------------------------- Function TstLen External LEN Integer*4 TstLen Logical Fail Integer*2 Res, LEN, i, Ofend Character*40 a, b Call CenterString( '--- Testing LEN ---\' ) Call WriteLn Call CenterString( 'String lenght routine w/o Result codes\') Call WriteLn TstLen = 0 Call Sets( a, 40, '1234567890\' ) Call Sets( b, 40, '12345678912345678910\' ) Res = LEN( a ) IF (Res .ne. 10) THEN Call MtFail( 'length', 1 ) Call Write2Int( 10, 10 ) Call Write2Int( Res, 10 ) Call WriteLn TstLen = TstLen + 2**1 END IF Res = LEN( b ) IF (Res .ne. 20) THEN Call MtFail( 'length', 2 ) Call Write2Int( 20, 10 ) Call Write2Int( Res, 10 ) Call WriteLn TstLen = TstLen + 2**2 END IF Res = LEN( ' ' ) IF (Res .ne. 1) THEN Call MtFail( 'length', 3 ) Call Write2Int( 01, 10 ) Call Write2Int( Res, 10 ) Call WriteLn TstLen = TstLen + 2**3 END IF Res = LEN( 'this is a sentence.' ) IF (Res .ne. 19) THEN Call MtFail( 'length', 4 ) Call Write2Int( 19, 10 ) Call Write2Int( Res, 10 ) Call WriteLn TstLen = TstLen + 2**4 END IF Call TestFail( TstLen ) Call CenterString( '--- Testing LEN completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C--------------------------------- PUTSTR ------------------------------------ Function TstPutstr Integer*4 TstPutstr Integer*2 k Integer*2 res Character*41 in, out Logical*1 err Call CenterString( '--- Testing PUTSTR ---\' ) Call WriteLn Call CenterString( 'Puts a string to a logical unit\') Call WriteLn Tstputstr = 0 Call Sets(Out,40,'This is a mess to the file, be it writ\') Open(unit=2,File='dat:testgt.tst',Status='NEW',form='formatted') DO 10 k = 1, 3 Call Putstr( 2, out, 0, err ) res = err IF (res .ne. 0) THEN Call MtFail( 'putstr', k ) Call Write2Int( 0, 10 ) Call Write2Int( res, 10 ) Call WriteLn TstPutstr = TstPutstr + 2**k END IF 10 Continue Close( unit=2 ) Open(unit=2,File='dat:testgt.tst',Status='OLD',form='formatted') DO 20 k = 4, 9, 2 Call Getstr( 2, in, 40, err ) res = err IF (res .ne. 0) THEN Call MtFail( 'getstr', k ) Call Write2Int( 0, 10 ) Call Write2Int( res, 10 ) Call WriteLn TstPutstr = TstPutstr + 2**k END IF res = ISCOMP( in, out ) IF (res .ne. 0) THEN Call MtFail( 'vcompr', k+1 ) Call WriteString( out, 0, 10 ) Call WriteString( in, 0, 10 ) Call WriteLn TstPutStr = TstPutstr + 2**(k+1) END IF 20 Continue Close( unit=2, disp='delete' ) Call TestFail( TstPutStr ) Call CenterString( '--- Testing PUTSTR completed ---\' ) Call WriteLn Call WriteLn END C----------------------------------------------------------------------------- C--------------------------------- REPEAT ------------------------------------ Function TstRepeat External REPEAT Integer*4 TstRepeat Integer*2 i, Ofend Logical*1 Fail Character*40 a, b, pattrn Character*41 a1 Call CenterString( '--- Testing Repeat ---\' ) Call WriteLn Call CenterString( 'String replication routine with result codes\') Call WriteLn Tstrepeat = 0 Call Sets( pattrn, Len(pattrn), '*\' ) Call Sets( a, Len(a), '**********\' ) CALL REPEAT( pattrn, b, 10 ) Fail = .FALSE. DO 10 i = 1, 10 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 10 Continue IF (fail) THEN Call MtFail( 'repeat', 1 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn Tstrepeat = Tstrepeat + 2**1 END IF Call Sets( pattrn, Len(pattrn), '##' ) Call Sets( a, len(a), '####################' ) CALL REPEAT( pattrn, b, 10 ) Fail = .FALSE. DO 20 i = 1, 20 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 20 Continue IF (fail) THEN Call MtFail( 'repeat', 2 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstRepeat = TstRepeat + 2**2 END IF Call Sets( pattrn, Len( pattrn ), 'This\' ) Call Sets( b, Len(b), 'ThisThisThis\' ) CALL REPEAT( pattrn, a, 3 ) Fail = .FALSE. DO 30 i = 1, 12 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 30 Continue IF (fail) THEN Call MtFail( 'repeat', 3 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstRepeat = TstRepeat + 2**3 END IF Call Sets( pattrn, Len(pattrn), 'This\' ) fail = .FALSE. CALL REPEAT( pattrn, a, 20, 40, fail ) IF (fail .eq. .FALSE.) THEN Call RsltFail( 4 ) Call WriteBool( .TRUE., 10 ) Call WriteBool( .FALSE., 10 ) Call WriteLn TstRepeat = TstRepeat + 2**4 END IF fail = .FALSE. CALL REPEAT( pattrn, a, 2, 40, fail ) IF (fail) THEN Call RsltFail( 5 ) Call WriteBool( .FALSE., 10 ) Call WriteBool( .TRUE., 10 ) Call WriteLn TstRepeat = TstRepeat + 2**5 END IF a1 = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' fail = .TRUE. CALL REPEAT( pattrn, a1, 2, 40, fail ) IF (.Not. fail) THEN Call RsltFail( 6 ) Call WriteBool( .TRUE., 10 ) Call WriteBool( .FALSE., 10 ) Call WriteLn TstRepeat = TstRepeat + 2**6 END IF IF (a1(10:10) .ne. 'A') THEN Call MtFail( 'wovrun', 7 ) Call Write1Int( 'A', 10 ) Call Write1Int( a1(10:10), 10 ) Call WriteLn TstRepeat = TstRepeat + 2**7 END IF Call TestFail( TstRepeat ) Call CenterString( '--- Testing REPEAT completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C--------------------------------- (I)SCOMP ---------------------------------- Function TstScomp External SCOMP Integer*4 Tstscomp Integer*2 i, Ofend Logical*1 Fail Integer*2 SCOMP, res Character*40 a, b Call CenterString( '--- Testing (I)SCOMP ---\' ) Call WriteLn Call CenterString( 'String comparison routine w/o result codes\') Call WriteLn TstScomp = 0 Call Sets( a, 40, 'a\' ) CAll Sets( b, 40, 'b\' ) res = SCOMP( a, b ) IF ( res .ge. 0 ) THEN CALL RsltFail( 1 ) CALL WriteString( '-n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstScomp = TstScomp + 2**1 END IF res = SCOMP( b, a ) IF ( res .le. 0 ) THEN CALL RsltFail( 2 ) CALL WriteString( '+n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstScomp = TstScomp + 2**2 END IF Call Sets( a, 40, 'a\' ) Call Sets( b, 40, 'a\' ) res = SCOMP( a, b ) IF ( res .ne. 0 ) THEN CALL RsltFail( 3 ) CALL WriteString( ' 0\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstScomp = TstScomp + 2**3 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house\' ) res = SCOMP( a, b ) IF ( res .ne. 0 ) THEN CALL RsltFail( 4 ) CALL WriteString( ' 0\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstScomp = TstScomp + 2**4 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house.\' ) res = SCOMP( a, b ) IF ( res .ge. 0 ) THEN CALL RsltFail( 5 ) CALL WriteString( '-n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstScomp = TstScomp + 2**5 END IF Call Sets( a, 40, 'a\' ) Call Sets( b, 40, 'b\' ) res = ISCOMP( a, b ) IF ( res .ge. 0 ) THEN CALL RsltFail( 6 ) CALL WriteString( '-n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstSCOMP = TstSCOMP + 2**6 END IF res = ISCOMP( b, a ) IF ( res .le. 0 ) THEN CALL RsltFail( 7 ) CALL WriteString( '+n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstSCOMP = TstSCOMP + 2**7 END IF Call Sets( a, 40, 'a\' ) Call Sets( b, 40, 'a\' ) res = ISCOMP( a, b ) IF ( res .ne. 0 ) THEN CALL RsltFail( 8 ) CALL WriteString( ' 0\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstSCOMP = TstSCOMP + 2**8 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house\' ) res = ISCOMP( a, b ) IF ( res .ne. 0 ) THEN CALL RsltFail( 9 ) CALL WriteString( ' 0\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstSCOMP = TstSCOMP + 2**9 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house.\' ) res = ISCOMP( a, b ) IF ( res .ge. 0 ) THEN CALL RsltFail( 10 ) CALL WriteString( '-n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstSCOMP = TstSCOMP + 2**10 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house.\' ) CALL SCOMP( a, b, res ) IF ( res .ge. 0 ) THEN CALL RsltFail( 11 ) CALL WriteString( '-n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstSCOMP = TstSCOMP + 2**11 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house.\' ) CALL ISCOMP( a, b, res ) IF ( res .ge. 0 ) THEN CALL RsltFail( 12 ) CALL WriteString( '-n\', 8, 02 ) CALL Write2Int( res, 10 ) CALL WriteLn TstSCOMP = TstSCOMP + 2**12 END IF Call TestFail( TstScomp ) Call CenterString( '--- Testing (I)SCOMP completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C---------------------------------- SCOPY ------------------------------------ Function Tstcopy Integer*4 Tstcopy Integer*2 Slen, i, Ofend Logical*1 Fail Character*40 a, b Call CenterString( '--- Testing SCOPY ---\' ) Call WriteLn Call CenterString( 'String copy routine with result codes\') Call WriteLn TstCopy = 0 Call Sets( a, 40, 'This is a source string to be copied.\' ) CALL SCOPY( a, b ) Fail = .FALSE. DO 10 i = 1, Slen( b ) IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 10 Continue IF (fail) THEN Call MtFail( 'copy&v', 1 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn Tstcopy = Tstcopy + 2**1 END IF CALL SCOPY( 'This is a string', a, 18 ) Call Sets( b, 40, 'This is a string\' ) Fail = .FALSE. DO 20 i = 1, Slen( b ) IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 20 Continue IF (fail) THEN Call MtFail( 'copy&v', 2 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn Tstcopy = Tstcopy + 2**2 END IF Call Sets( b, 40, '#####################################\' ) Call Sets( b, 40, 'zz\' ) Call Sets( a, 40, 'This is a source.\' ) CALL SCOPY( a, b, 16 ) Fail = .FALSE. Ofend = 0 DO 30 i = 1, 20 IF ((Ichar(b(i:i)) .eq. 0) .and. (.NOT. fail)) THEN fail = .TRUE. Ofend = i END IF 30 Continue IF (Ofend .eq. 0) THEN Call MtFail( 'trmchk', 3 ) Call WriteInt( 18, 10 ) Call Write2Int( Ofend, 10 ) Call WriteLn Tstcopy = Tstcopy + 2**3 END IF Fail = .FALSE. Call SCOPY( 'This is a long string', b, 5, fail ) IF (fail .eq. .FALSE.) THEN Call RsltFail( 4 ) Call WriteBool( .TRUE., 10 ) Call WriteBool( .FALSE., 10 ) Call WriteLn Tstcopy = Tstcopy + 2**4 END IF Fail = .FALSE. Call SCOPY( 'This is a long string', b, 39, fail ) IF (fail) THEN Call RsltFail( 5 ) Call WriteBool( .FALSE., 10 ) Call WriteBool( fail, 10 ) Call WriteLn Tstcopy = Tstcopy + 2**5 END IF Fail = .TRUE. Call SCOPY( 'This is a long string', b, 39, fail ) IF (.Not. fail) THEN Call RsltFail( 6 ) Call WriteBool( .TRUE., 10 ) Call WriteBool( fail, 10 ) Call WriteLn Tstcopy = Tstcopy + 2**6 END IF Call Sets( b, 39, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\') Call Scopy( 'This is a line of text', b ) IF (b(24:24) .ne. 'A') THEN Call MtFail( 'wovrun', 7 ) Call Write1Int( 'A', 10 ) Call Write1Int( b(24:24), 10 ) Call WriteLn Tstcopy = Tstcopy + 2**7 END IF Call TestFail( Tstcopy ) Call CenterString( '--- Testing SCOPY completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C---------------------------------- STRPAD ----------------------------------- Function TstStrpad Integer*4 TstStrpad Integer*2 i, Ofend Logical*1 Fail Character*40 a, b Integer*2 J J = ISPY("300) c c Test if FP11 Floating point hardware exists. If not, DON'T c perform the STRPAD test. The processor does some c floating point operation. c IF (( J .AND. "100) .EQ. 0 ) THEN Call CenterString( '?STRPAD-I-STRPAD test NOT performed --- 1FP11 Floating-point hardware does not exist. \') Call WriteLn Call CenterString( 'Processor does Floating-point 1arithmetic operation \') Call WriteLn Call WriteLn Goto 999 END IF Call CenterString( '--- Testing STRPAD ---\' ) Call WriteLn Call CenterString('String padding routine with result codes\') Call WriteLn TstStrpad = 0 Call Sets( a,40,'This is a source string to be padded.\') Call Sets( b,40,'This is a source string to be padded. \') CALL STRPAD( a, 39 ) Fail = .FALSE. DO 10 i = 1, 39 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 10 Continue IF (fail) THEN Call MtFail( 'pad&vr', 1 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstStrpad = TstStrpad + 2**1 END IF Call Sets( a, 40, 'This is bigger than 5.\' ) b = a CALL STRPAD( a, 5 ) Fail = .FALSE. DO 20 i = 1, Slen( b ) IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 20 Continue IF (fail) THEN Call MtFail( 'pad&vr', 2 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstStrpad = TstStrpad + 2**2 END IF Call Sets( b, 40, '########## \' ) Call Sets( a, 40, '##########\' ) Call Strpad( a, 20 ) Fail = .FALSE. DO 30 i = 1, Slen( b ) IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 30 Continue IF (fail) THEN Call MtFail( 'pad&vr', 3 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstStrpad = TstStrpad + 2**3 END IF Fail = .FALSE. Call Scopy( 'This is a long string', a, 21 ) Call STRPAD( a, 5, Fail ) IF (fail .eq. .FALSE.) THEN Call RsltFail( 4 ) Call WriteBool( .TRUE., 10 ) Call WriteBool( .FALSE., 10 ) Call WriteLn TstStrpad = TstStrpad + 2**4 END IF Fail = .FALSE. Call Scopy( 'This is a long string', a ) Call STRPAD( a, 23, fail ) IF (fail) THEN Call RsltFail( 5 ) Call WriteBool( .FALSE., 10 ) Call WriteBool( fail, 10 ) Call WriteLn TstStrpad = TstStrpad + 2**5 END IF Fail = .TRUE. Call Scopy( 'This is a long string', a ) Call STRPAD( a, 23, fail ) IF (.Not. fail) THEN Call RsltFail( 6 ) Call WriteBool( .TRUE., 10 ) Call WriteBool( fail, 10 ) Call WriteLn TstStrpad = TstStrpad + 2**6 END IF 999 Call TestFail( TstStrpad ) Call CenterString( '--- Testing STRPAD completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C---------------------------------- SUBSTR ----------------------------------- Function TstSubstr Integer*4 TstSubstr Integer*2 i, Ofend Logical Fail Character*40 a, b, c Call CenterString( '--- Testing SUBSTR ---\' ) Call WriteLn Call CenterString( 'String extraction routine w/o result codes\') Call WriteLn TstSubstr = 0 Call Sets( a, 40, 'This is a source string to be padded.\' ) Call Sets( b, 40, 'source\' ) CALL SUBSTR( a, c, 11, 6 ) Fail = .FALSE. DO 10 i = 1, 6 IF ((b(i:i) .ne. c(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 10 Continue IF (fail) THEN Call MtFail( 'extrct', 1 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstSubstr = TstSubstr + 2**1 END IF Call Sets( a, 40, 'This is another test.\' ) Call Sets( b, 40, 'another test.\' ) CALL SUBSTR( a, c, 9 ) Fail = .FALSE. DO 20 i = 1, 13 IF ((c(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 20 Continue IF (fail) THEN Call MtFail( 'extrct', 2 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstSubstr = TstSubstr + 2**2 END IF IF (Ichar(c(14:14)) .ne. 0) THEN Call Mtfail( 'trmchk', 3 ) Call WriteInt( 0, 10 ) Call Write2Int( Ichar(c(14:14)), 10 ) Call WriteLn TstSubstr = TstSubstr + 2**3 END IF Call Sets( a, 40, 'Backwards sdrawkcaB\' ) Call Sets( b, 40, 'sdrawkcaB\' ) Call SUBSTR( a, a, 11, 9 ) Fail = .FALSE. DO 30 i = 1, 10 IF ((a(i:i) .ne. b(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 30 Continue IF (fail) THEN Call MtFail( 'extrct', 4 ) Call WriteString( a(Ofend:), 0, 10 ) Call WriteString( b(Ofend:), 0, 10 ) Call WriteLn TstSubStr = TstSubstr + 2**4 END IF Call TestFail( TstSubstr ) Call CenterString( '--- Testing SUBSTR completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C---------------------------------- TRANSL ----------------------------------- Function TstTransl Integer*4 TstTransl Integer*2 i, Ofend Logical Fail Character*40 in, out, r, p, cmp Call CenterString( '--- Testing TRANSL ---\' ) Call WriteLn Call CenterString( 'String translation routine w/o result codes\') Call WriteLn TstTransl = 0 Call Sets( in, 40, '!!!!!@@@@@#####\' ) Call Sets( r, 40, 'ABC\' ) Call Sets( p, 40, '!@#\' ) Call Sets( cmp,40, 'AAAAABBBBBCCCCC\' ) CALL TRANSL( in, out, r, p ) Fail = .FALSE. DO 10 i = 1, 15 IF ((out(i:i) .ne. cmp(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 10 Continue IF (fail) THEN Call MtFail( 'transl', 1 ) Call WriteString( cmp(Ofend:), 0, 10 ) Call WriteString( out(Ofend:), 0, 10 ) Call WriteLn TstTransl = TstTransl + 2**1 END IF Call Sets( in, 40, 'THIS IS ANOTHER TEST.\' ) Call Sets( r, 40, 'ZYXWVUTSRQPONMLKJIHGFEDCBA\' ) Call Sets( p, 40, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ\' ) Call Sets( cmp,40, 'GSRH RH ZMLGSVI GVHG.\' ) CALL TRANSL( in, out, r, p ) Fail = .FALSE. DO 20 i = 1, 20 IF ((out(i:i) .ne. cmp(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 20 Continue IF (fail) THEN Call MtFail( 'transl', 2 ) Call WriteString( cmp(Ofend:), 0, 10 ) Call WriteString( out(Ofend:), 0, 10 ) Call WriteLn TstTransl = TstTransl + 2**2 END IF IF (Ichar(out(22:22)) .ne. 0) THEN Call Mtfail( 'trmchk', 3 ) Call WriteInt( 0, 10 ) Call Write2Int( Ichar(out(22:22)), 10 ) Call WriteLn TstTransl = TstTransl + 2**3 END IF Call TestFail( TstTransl ) Call CenterString( '--- Testing TRANSL completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C---------------------------------- TRIM ------------------------------------- Function TstTrim Integer*4 TstTrim Integer*2 i, Ofend Logical Fail Character*40 in, cmp Call CenterString( '--- Testing TRIM ---\' ) Call WriteLn Call CenterString('String blank suprsn routine w/o result codes\') Call WriteLn TstTrim = 0 Call Sets( in, 40, 'This is a text \') Call Sets( cmp,40, 'This is a text\' ) CALL TRIM( in ) Fail = .FALSE. DO 10 i = 1, 15 IF ((in(i:i) .ne. cmp(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 10 Continue IF (fail) THEN Call MtFail( 'trim s', 1 ) Call WriteString( cmp(Ofend:), 0, 10 ) Call WriteString( in(Ofend:), 0, 10 ) Call WriteLn TstTrim = TstTrim + 2**1 END IF Call Sets( in, 40, 'This is another test.\' ) Call Sets( cmp, 40, 'This is another test.\' ) CALL TRIM( in ) Fail = .FALSE. DO 20 i = 1, 20 IF ((in(i:i) .ne. cmp(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 20 Continue IF (fail) THEN Call MtFail( 'trim s', 2 ) Call WriteString( cmp(Ofend:), 0, 10 ) Call WriteString( in(Ofend:), 0, 10 ) Call WriteLn TstTrim = TstTrim + 2**2 END IF IF (Ichar(in(22:22)) .ne. 0) THEN Call Mtfail( 'trmchk', 3 ) Call WriteInt( 0, 10 ) Call Write2Int( Ichar(in(22:22)), 10 ) Call WriteLn TstTrim = TstTrim + 2**3 END IF Call Sets( in, 40, ' This is a text To Test \') Call Sets( cmp,40, ' This is a text To Test\' ) CALL TRIM( in ) Fail = .FALSE. DO 30 i = 1, 15 IF ((in(i:i) .ne. cmp(i:i)).and.(.not. fail)) THEN fail = .TRUE. Ofend = i END IF 30 Continue IF (fail) THEN Call MtFail( 'trim s', 4 ) Call WriteString( cmp(Ofend:), 0, 10 ) Call WriteString( in(Ofend:), 0, 10 ) Call WriteLn TstTrim = TstTrim + 2**4 END IF Call TestFail( TstTrim ) Call CenterString( '--- Testing TRIM completed ---\' ) Call WriteLn Call WriteLn RETURN END C----------------------------------------------------------------------------- C-------------------------------- (I)VERIFY ---------------------------------- Function TstVerify External VERIFY, IVERIF Integer*4 TstVerfiy Logical Fail Integer*2 IVERIF, res, i, Ofend Character*40 a, b Call CenterString( '--- Testing (I)VERIF(Y) ---\' ) Call WriteLn Call CenterString('String contnt verfctn routine w/o result codes\') Call WriteLn TstVerfiy = 0 Call Sets( a, 40, 'AGBFCEDDECFBGA\' ) CAll Sets( b, 40, 'ABCDEFG\' ) res = IVERIF( a, b ) IF ( res .gt. 0 ) THEN CALL RsltFail( 1 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**1 END IF res = IVERIF( b, a ) IF ( res .gt. 0 ) THEN CALL RsltFail( 2 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**2 END IF Call Sets( a, 40, 'This is a test\' ) Call Sets( b, 40, 'Thisae\' ) res = IVERIF( a, b ) IF ( res .ne. 5 ) THEN CALL RsltFail( 3 ) CALL Write2Int( 5, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**3 END IF Call Sets( a, 40, '\' ) Call Sets( b, 40, 'ABCDEF\' ) res = IVERIF( a, b ) IF ( res .ne. 0 ) THEN CALL RsltFail( 4 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**4 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house.\' ) res = IVERIF( a, b ) IF ( res .ne. 0 ) THEN CALL RsltFail( 5 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**5 END IF Call Sets( a, 40, 'AGBFCEDDECFBGA\' ) CAll Sets( b, 40, 'ABCDEFG\' ) Call VERIFY( a, b, res ) IF ( res .gt. 0 ) THEN CALL RsltFail( 6 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**6 END IF Call VERIFY( b, a, res ) IF ( res .gt. 0 ) THEN CALL RsltFail( 7 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**7 END IF Call Sets( a, 40, 'This is a test\' ) Call Sets( b, 40, 'Thisae\' ) Call VERIFY( a, b, res ) IF ( res .ne. 5 ) THEN CALL RsltFail( 8 ) CALL Write2Int( 5, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**8 END IF Call Sets( a, 40, '\' ) Call Sets( b, 40, 'ABCDEF\' ) Call VERIFY( a, b, res ) IF ( res .ne. 0 ) THEN CALL RsltFail( 9 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**9 END IF Call Sets( a, 40, 'The little house\' ) Call Sets( b, 40, 'The little house.\' ) Call VERIFY( a, b, res ) IF ( res .ne. 0 ) THEN CALL RsltFail( 10 ) CALL Write2Int( 0, 10 ) CALL Write2Int( res, 10 ) CALL WriteLn TstVerify = TstVerify + 2**10 END IF Call TestFail( TstVerify ) Call CenterString( '--- Testing (I)VERIF(Y) completed ---\' ) Call WriteLn Call WriteLn RETURN END C-----------------------------------------------------------------------------