HP OpenVMS Systems Documentation |
HP COBOL
|
Previous | Contents | Index |
Regardless of the type of inspection (TALLYING or REPLACING), the INSPECT statement has only one method for inspecting the characters in the item. This section analyzes the INSPECT statement and describes this inspection method.
Figure 5-3 shows an example of the INSPECT statement. The item to be inspected must be named (FIELD1 in our example), and the item name must be followed by a TALLYING phrase (TALLYING TLY). The TALLY phrase must be followed by one or more identifiers or literals (B). These identifiers or literals comprise the arguments. More than one argument makes up the argument list.
Figure 5-3 Sample INSPECT Statement
Each argument in an argument list can have other items associated with it. Thus, each argument that is used in a TALLYING operation must have a tally counter (such as TLY in the example) associated with it. The tally counter is incremented each time it matches the argument with a character or group of characters in the item being inspected.
Each argument in an argument list used in a REPLACING operation must have a replacement item associated with it. The compiler generates code that uses the replacement item to replace each string of characters in the item that matches the argument. Figure 5-4 shows a typical REPLACING phrase (with $ as the replacement item).
Figure 5-4 Typical REPLACING Phrase
Each argument in an argument list used with either a TALLYING or
REPLACING operation can have a delimiter item (BEFORE/AFTER phrase)
associated with it. If the delimiter item is not present, the argument
is applied to the entire item. If the delimiter item is present, the
argument is applied only to that portion of the item specified by the
BEFORE/AFTER phrase.
5.3.4.1 Setting the Scanner
The INSPECT operation begins by setting the scanner to the leftmost
character position of the item being inspected. It remains on this
character until an argument has been matched with a character (or
characters) or until all arguments have failed to find a match at that
position.
5.3.4.2 Active/Inactive Arguments
When an argument has a BEFORE/AFTER phrase associated with it, that argument has a delimiter and may not be eligible to participate in a comparison at every position of the scanner. Thus, each argument in the argument list has an active/inactive status at any given setting of the scanner.
For example, an argument that has an AFTER phrase associated with it starts the INSPECT operation in an inactive state. The delimiter of the AFTER phrase must find a match before the argument can participate in the comparison. When the delimiter finds a match, the compiler generates code that retains the character position beyond the matched character string; then, when the scanner reaches or passes this position, the argument becomes active. This is shown in the following example:
INSPECT FIELD1 TALLYING TLY FOR ALL "B" AFTER "X". |
If FIELD1 has a value of ABABXZBA, the argument B remains inactive until the scanner finds a match for delimiter X. Thus, argument B remains inactive while the compiler generates code that scans character positions 1 to 5. At character position 5, delimiter X finds a match, and because the character position beyond the matched delimiter character is the point at which the argument becomes active, argument B is compared for the first time at character position 6. It finds a successful match at character position 7, causing TLY to be incremented by 1.
Table 5-11 shows an INSPECT...TALLYING statement that is scanning FIELD1, tallying in TLY, and looking for the arguments and delimiters listed in the left column. Assume that TLY is initialized to 0.
Argument and Delimiter |
FIELD1 Value |
Argument Active at Position |
Contents of TLY After Scan |
---|---|---|---|
ALL | BXBXXXXBB | 6 | 2 |
"B" AFTER "XX" | XXXXXXXX | 3 | 0 |
BXBXBBBBXX | never | 0 | |
BXBXXBXXB | 6 | 2 | |
"X" AFTER "XX" | XXXXXXXX | 3 | 6 |
BBBBBBXX | never | 0 | |
BXYBXBXX | 7 | 0 | |
"B" AFTER "XB" | XBXBXBXB | 3 | 3 |
BBBBBBXB | never | 0 | |
XXXXBXXXX | 6 | 0 | |
"BX" AFTER "XB" | XXXXBBXXX | 6 | 1 |
XXBXXXXBX | 4 | 1 |
When an argument has an associated BEFORE delimiter, the inactive/active states reverse roles: the argument is in an active state when the scanning begins and becomes inactive at the character position that matches the delimiter. Regardless of the presence of the BEFORE delimiter, an argument becomes inactive when the scanner approaches the rightmost position of the item and the remaining characters are fewer in number than the characters in the argument. In such a case, the argument cannot possibly find a match in the item, so it becomes inactive.
Because the BEFORE/AFTER delimiters are found on a separate scan of the
item, the compiler generates code that recognizes and sets up the
delimiter boundaries before it scans for an argument match; therefore,
the same characters can be used as arguments and delimiters in the same
phrase.
5.3.4.3 Finding an Argument Match
The compiler generates code that selects arguments from the argument list in the order in which they appear in the list. If the first one it selects is an active argument, and the conditions stated in the INSPECT statement allow a comparison, the compiler generates code that compares it to the character at the scanner's position. If the active argument does not find a match, the compiler generates code that takes the next active argument from the list and compares that to the same character. If none of the active arguments finds a match, the scanner moves one position to the right and begins the inspection operation again with the first active argument in the list. The inspection operation terminates at the rightmost position of the item.
When an active argument finds a match, the compiler ignores any remaining arguments in the list and conducts the TALLYING or REPLACING operation on the character. The scanner moves to a new position and the next inspection operation begins with the first argument in the list. The INSPECT statement can contain additional conditions, which are described later in this section; without them, however, the argument match is allowed to take place, and inspection continues following the match.
The compiler updates the scanner by adding the size of the matching argument to it. This moves the scanner to the next character beyond the string of characters that matched the argument. Thus, once an active argument matches a string of characters, the statement does not inspect those character positions again unless program control executes the entire statement again.
Previous | Next | Contents | Index |