Scanning Routines in SPICELIB |
Table of ContentsScanning Routines in SPICELIB Abstract Introduction Substring searches Character searches Searching in reverse Notes Summary Scanning Routines in SPICELIB
Abstract
Introduction
LOC = INDEX ( STRING, TARGET )returns the smallest value such that the condition
( STRING(LOC : LOC+LEN(TARGET)-1) .EQ. TARGET )is true. For example, the value returned by
INDEX ( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'GHI' )is seven. If the target string is contained nowhere in the original string, INDEX returns zero. Note that INDEX is not case sensitive, nor does it ignore leading or trailing blanks. Thus, all of the following references return zero.
INDEX ( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '123' ) INDEX ( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'ghi' ) INDEX ( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'GHI ' ) INDEX ( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', ' GHI' )In contrast, the True BASIC language (a dialect of BASIC) offers several similar, but more powerful, functions. Unlike the Fortran INDEX function, these extended functions allow you to
POS ( STR, SUBSTR, START ) CPOS ( STR, CHARS, START ) NCPOS ( STR, CHARS, START ) POSR ( STR, SUBSTR, START ) CPOSR ( STR, CHARS, START ) NCPOSR ( STR, CHARS, START ) Substring searches
Compare the following code fragments, which locate successive occurrences of the substring `//' within a string, first using INDEX:
LOC = INDEX ( STRING, '//' ) DO WHILE ( LOC .NE. 0 ) . . IF ( LEN ( STRING ) .LE. LOC + 2 ) THEN LOC = 0 ELSE LOC = LOC + 2 + INDEX ( STRING(LOC+2: ), '//' ) END IF END DOand then using POS:
LOC = POS ( STRING, '//', 1 ) DO WHILE ( LOC .NE. 0 ) . . LOC = POS ( STRING, '//', LOC + 2 ) END DO Character searches
POS ( '(a (b c) (d e) () (f (g (h))))', '()', 1 ) ^returns location 16 (as indicated by the caret), because it is the first occurrence of the complete substring `()' within the string. However,
CPOS ( '(a (b c) (d e) () (f (g (h))))', '()', 1 ) ^returns location 1, since it is the first location at which either of the characters ( `(' or `)' ) appear. Thus, POS treats the target string as an ordered sequence of characters, while CPOS treats the target string as an unordered collection of individual characters. A third function, NCPOS, looks for characters that are NOT included in the collection. Thus,
NCPOS ( '(a (b c) (d e) () (f (g (h))))', '()', 1 ) ^returns location 2, since it is the first location at which something other than one of the characters in the target string appears. This is useful for finding unwanted characters. For example, suppose you wish to replace each character in a string that is not part of the Fortran standard character set,
CHARACTER*(*) LET PARAMETER ( LET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ) CHARACTER*(*) DIG PARAMETER ( DIG = '0123456789' ) CHARACTER*(*) SPEC PARAMETER ( SPEC = ' =+-*/(),.$'':' )with a space character, to prevent compilation problems. The following code fragment does the job.
LOC = NCPOS ( STRING, LET // DIG // SPEC, 1 ) DO WHILE ( LOC .GT. 0 ) STRING(LOC:LOC) = ' ' LOC = NCPOS ( STRING, LET // DIG // SPEC, LOC ) END DONote that characters do not need to be in any special order, so all of the following are equivalent.
NCPOS ( STR, 'ABC', BEGIN ) NCPOS ( STR, 'ACB', BEGIN ) NCPOS ( STR, 'BAC', BEGIN ) NCPOS ( STR, 'BCA', BEGIN ) NCPOS ( STR, 'CAB', BEGIN ) NCPOS ( STR, 'CBA', BEGIN ) Searching in reverse
POS ( 'do re mi fa so la ti do', 'do', 10 ) ^finds the second occurrence of the target string (at location 22),
POSR ( 'do re mi fa so la ti do', 'do', 10 ) ^finds the first occurrence (at location 1). Notes
Summary
POS Forward Substring.
|