| Scanning Routines in SPICELIB |
Table of ContentsScanning Routines in SPICELIB Abstract Note on FORTRAN and C Versions Introduction Substring searches Character searches Searching in reverse Notes Summary Scanning Routines in SPICELIB
Abstract
Note on FORTRAN and C Versions
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 DO
and 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 DO
Note 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.
|