Document revision date: 30 March 2001

## DEC Text Processing Utility Reference Manual

Previous | Contents | Index

The following example identifies parenthesized text within a single line. It moves the editing point to the beginning of the parenthesized text, if it is found.

#2

    PROCEDURE user_find_parens

       paren_text    := ANY("(') + SCAN (')");
       found_range   := SEARCH (paren_text, FORWARD, NO_EXACT);

       IF found_range = 0   ! No parentheses.
       THEN
           MESSAGE  ("No parentheses found.");
       ELSE
           POSITION (found_range);
       ENDIF;
    ENDPROCEDURE;

> The following example goes through the current file, deleting all characters that are not numbers, letters, or spaces:

#3
    PROCEDURE user_remove_odd_characters
       LOCAL pat1,
             odd_text;

       pat1 := SCAN ("abcdefghijklmnopqrstuvwxyz 0123456789");
       POSITION (BEGINNING_OF (CURRENT_BUFFER));
       LOOP
          odd_text := SEARCH_QUIETLY (pat1, FORWARD);
          EXITIF odd_text = 0;
          ERASE (odd_text);
          POSITION (odd_text);
       ENDLOOP;
       POSITION (END_OF (CURRENT_BUFFER));
    ENDPROCEDURE;

## SCANL

### Format

> pattern := SCANL ( {buffer |range |string} [[, {FORWARD |REVERSE} ]])

### Parameters

> #### buffer

> An expression that evaluates to a buffer. SCANL does not match any of the characters that appear in the buffer.

> #### range

> An expression that evaluates to a range. SCANL does not match any of the characters that appear in the range.

> #### string

> An expression that evaluates to a string. SCANL does not match any of the characters that appear in the string.

> #### FORWARD

> A keyword that directs DECTPU to match characters in the forward direction. This is the default.

> #### REVERSE

> A keyword that directs DECTPU to match characters as follows: first, match characters in the forward direction until DECTPU finds a character that is a member of the set of characters. Next, return to the first character matched and start matching characters in the reverse direction until DECTPU finds a character that is in the set.

> You can specify REVERSE only if you are using SCANL in the first element of a pattern being used in a reverse search. In all other contexts, specifying REVERSE has no effect.

> The behavior enabled by REVERSE allows an alternate form of reverse search. By default, a reverse search stops as soon as a successful match occurs, even if there might have been a longer successful match in the reverse direction. By specifying REVERSE, you direct DECTPU not to stop matching in either direction until it has matched as many characters as possible.

### Return Value

A pattern that may contain line breaks and that matches only characters that do not appear in the buffer, range, or string used as the parameter.

### Description

> The SCANL procedure returns a pattern that matches a string of characters, including line breaks, none of which appear in the buffer, range, or string used as its parameter. The returned pattern contains as many characters and line breaks as possible.

> SCANL is similar to SCAN in that it matches one or more characters that do not appear in the string, buffer, or range used as its parameter. Unlike SCAN, however, SCANL does not stop matching when it reaches the end of a line. Rather, it successfully matches the line end and continues trying to match characters on the next line.

> If SCANL is part of a larger pattern, it does not match a character or line boundary if doing so prevents the rest of the pattern from matching.

> SCANL must match at least one character.

#### Signaled Errors

TPU$_NEEDTOASSIGN | ERROR | SCANL must appear on the right-hand side of an assignment statement.
TPU$_TOOFEW | ERROR | SCANL requires at least one argument.
TPU$_TOOMANY | ERROR | SCANL requires no more than one argument.
TPU$_ARGMISMATCH | ERROR | Argument to SCANL has the wrong type.
TPU$_CONTROLC | ERROR | You pressed Ctrl/C during the execution of SCANL.

### Examples

> The following example creates a pattern that matches a sentence. It assumes that a sentence ends in one of the following characters: a period (.), an exclamation point (!), or a question mark (?). The matched text does not include the punctuation mark ending the sentence.

#1
    sentence_pattern := any ("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + scanl (".!?);

> The following example goes through the current buffer, erasing anything that is not a number. The only line breaks it leaves in the file are those between a line ending with a number and one beginning with a number.

#2
    PROCEDURE user_remove_non_numbers
       LOCAL pat1,
             non_number_region;

       pat1 := SCANL ("0123456789");

       POSITION (BEGINNING_OF (CURRENT_BUFFER));

       LOOP
          non_number_region := SEARCH_QUIETLY (pat1, FORWARD);
          EXITIF non_number_region = 0;

          ERASE (non_number_region);
          POSITION (non_number_region);
       ENDLOOP;

       POSITION (BEGINNING_OF (CURRENT_BUFFER));
    ENDPROCEDURE;

## SCROLL

### Format

> [[integer2 := ]]SCROLL (window [[,integer1]] )

### Parameters

> #### window

> The window associated with the buffer whose text you want to scroll.

> #### integer1

> The signed integer value that indicates how many lines you want the text to scroll. If you supply a negative value for the second parameter, the lines of text scroll off the top of the screen, leaving the cursor closer to the beginning of the buffer. If you supply a positive value for the second parameter, the lines of text scroll off the bottom of the screen, leaving the cursor closer to the end of the buffer. If you specify 0 as the integer value, no scrolling occurs.

> This parameter is optional. If you omit the second parameter, the text scrolls continuously until it reaches a buffer boundary or until you press a key. If the current direction of the buffer is forward, the text scrolls to the end of the buffer. If the current direction of the buffer is reverse, the text scrolls to the beginning of the buffer. If you press a key that has commands bound to it, the scrolling stops and DECTPU executes the commands bound to the key.

### Return Value

An integer that indicates the number and direction of lines actually scrolled as a result of using SCROLL.

### Description

> The SCROLL procedure moves the lines of text in the buffer up or down on the screen by the number of lines you specify. You can scroll text only in a visible window. If the window is not currently visible on the screen, DECTPU issues an error message.

> During scrolling, the cursor does not move but stays positioned at the same relative screen location. The current editing point is different from the editing point that was current before you issued the SCROLL built-in procedure.

> SCROLL optionally returns an integer that indicates the number and direction of lines actually scrolled. If you supply a negative value for the second parameter, the lines of text scroll off the bottom of the screen, leaving the cursor closer to the beginning of the buffer. If you supply a positive value for the second parameter, the lines of text scroll off the top of the screen, leaving the cursor closer to the end of the buffer. The value of integer2 may differ from what was specified in integer1.

> SCROLL causes the screen to scroll immediately. Unlike screen updates, SCROLL does not wait to take effect until after the completion of a procedure.

> If the buffer has been modified or the window display has altered since the last update, the window is updated before the scrolling operation begins.

> SCROLL does not work in the following cases:

> - If you have turned off the screen update flag with SET (SCREEN_UPDATE, OFF)
> - If you used the /NODISPLAY qualifier when invoking DECTPU on an unsupported device
> - If the window that you specify is not visible on the screen

> When the scrolling is complete, the editing point (record and offset) is set to match the cursor position (screen line and column position).

> After the scrolling stops, the cursor may be located to the right of the last character in the new current record, to the left of the left margin, or in the middle of a tab. In this instance, any DECTPU built-in procedure that requires a record offset (for example, CURRENT_OFFSET, MOVE_HORIZONTAL, MOVE_VERTICAL, MARK, and so on) causes the record to be padded with blanks to the cursor location.

> If the screen you are using does not have hardware scrolling regions, the window being scrolled is repainted for each scroll that would have occurred. For instance, the statement SCROLL (my_window,3) repaints the window three times.

> If you use SCROLL while positioned after the end of the buffer, SCROLL completes successfully and returns 0 as the amount scrolled.

#### Signaled Errors

TPU$_CONTROLC | ERROR | You pressed Ctrl/C to stop scrolling.
TPU$_WINDNOTMAPPED | WARNING | You are trying to scroll an unmapped window.
TPU$_TOOFEW | ERROR | SCROLL requires at least one parameter.
TPU$_TOOMANY | ERROR | You specified more than two parameters.
TPU$_INVPARAM | ERROR | One or more of the specified parameters have the wrong type.

### Examples

> The following example causes the text of the buffer that is mapped to the main window to scroll forward 10 lines:

#1

    SCROLL (main_window,+10)

> The following example scrolls the buffer MAIN until you press a key. The procedure returns the number of lines scrolled.

#2
    PROCEDURE user_scroll_buffer

       LOCAL scrolled_lines;

       MESSAGE ("Press any key to stop scrolling...");
       scrolled_lines := SCROLL (main_window);
       dummy_key := READ_KEY;
       RETURN scrolled_lines;
    ENDPROCEDURE;

## SEARCH

### Format

> [[range2 := ]]SEARCH ( {ANCHOR |BUFFER_BEGIN |BUFFER_END |LINE_BEGIN |LINE_END |PAGE_BREAK |pattern |REMAIN |string |UNANCHOR}

> , {FORWARD |REVERSE} [[, {EXACT |NO_EXACT |integer} [[, { buffer |range1} ]] ]])

### Parameters

> #### ANCHOR

> A keyword that directs SEARCH to start a search at the current character position. Use this keyword as part of a complex pattern.

> #### BUFFER_BEGIN

> A keyword used to match the beginning of a buffer.

> #### BUFFER_END

> A keyword used to match the end of a buffer.

> #### LINE_BEGIN

> A keyword used to match the beginning of a line.

> #### LINE_END

> A keyword used to match the end of a line.

> #### PAGE_BREAK

> A keyword used to match a form-feed character.

> #### pattern

> The pattern that you want to match.

> #### REMAIN

> A keyword that specifies a match starting at the current character and continuing to the end of the current line.

> #### string

> The string that you want to match.

> #### UNANCHOR

> A keyword that specifies that the next pattern element can match anywhere after the previous pattern element. Use this keyword as part of a complex pattern.

> For more information on these keywords, refer to the individual descriptions of them in this chapter.

> #### FORWARD

> Indicates a search in the forward direction.

> #### REVERSE

> Indicates a search in the reverse direction.

> #### EXACT

> Indicates that the characters SEARCH is trying to match must be the same case and have the same diacritical markings as those in the string or pattern used as the first parameter to SEARCH.

> #### NO_EXACT

> Indicates that the characters SEARCH is trying to match need not be the same case nor have the same diacritical markings as those in the string or pattern used as the first parameter to SEARCH. NO_EXACT is the default value for the optional third parameter.

> #### integer

> Specifies how SEARCH should handle case and diacritical information if you want to match one attribute and ignore the other. Compaq recommends that you use the defined constants available for specifying this integer. The defined constants are as follows:
> - TPU$K_SEARCH_CASE---Equivalent to the integer 1. This specifies that the search should match the case of the first parameter but be insensitive to the diacritical markings of the first parameter.
> - TPU$K_SEARCH_DIACRITICAL---Equivalent to the integer 2. This specifies that the search should match the diacritical markings of the first parameter but be insensitive to the case of the first parameter.

> #### buffer

> The buffer in which to search. SEARCH starts at the beginning of the buffer when doing a forward search and at the end of the buffer when doing a reverse search.

> #### range1

> The range in which to search. SEARCH starts at the beginning of the range when doing a forward search and at the end of the range when doing a reverse search.

> To search a range for all occurrences of a pattern, you must define the range dynamically after each successful match; otherwise, SEARCH positions to the beginning of the range and finds the same occurrence over and over. See the example section for a procedure that searches for all occurrences of a pattern in a range.

### Return Value

The range that contains characters that match the pattern or string specified as a parameter.

### Description

> The SEARCH procedure looks for a particular arrangement of characters in a buffer or range and returns a range that contains those characters. SEARCH looks for text that matches the string, pattern, or keyword specified as its first parameter. If it finds such text, it creates a range that contains this text and returns it. If SEARCH does not find a match, SEARCH returns 0 and signals the error TPU$_STRNOTFOUND. To perform a search that does not signal an error when there is no match, use the SEARCH_QUIETLY built-in procedure.

> The starting position for the search depends on the optional fourth parameter and the search direction. If you do not specify the fourth parameter, the search starts at the editing point.

> If you specify a range for the fourth parameter, the search starts at the beginning of the range for a forward search or the end of the range for a reverse search. When searching a range, SEARCH matches only text inside the range. It does not look at text outside the range.

> If you specify a buffer for the fourth parameter, the search starts at the beginning of the buffer for a forward search or the end of the buffer for a reverse search.

> To determine whether the searched text contains a match, SEARCH examines the character at the starting position and attempts to match the character against the pattern, text, or keyword specified. By default, the search is unanchored. This allows SEARCH to move one character in the direction of the search if the character at the start position does not match. SEARCH continues in this manner until it finds a match or reaches the bounds of the buffer or range.

> To prevent SEARCH from moving the starting position in the direction of the search, use the ANCHOR keyword when you define the pattern to be matched.

> SEARCH does not change the current buffer or the editing point in that buffer.

> For more information about searching, see the Guide to the DEC Text Processing Utility.

#### Signaled Errors

TPU$_STRNOTFOUND | WARNING | Search for a string or pattern was unsuccessful.
TPU$_TOOFEW | ERROR | SEARCH requires at least two arguments.
TPU$_TOOMANY | ERROR | SEARCH accepts no more than four arguments.
TPU$_ARGMISMATCH | ERROR | One of the parameters to SEARCH is of the wrong type.
TPU$_INVPARAM | ERROR | One of the parameters to SEARCH is of the wrong type.
TPU$_BADKEY | WARNING | You specified an incorrect keyword to SEARCH.
TPU$_MINVALUE | WARNING | The integer parameter to SEARCH must be greater than or equal to --1.
TPU$_MAXVALUE | WARNING | The integer parameter to SEARCH must be less than or equal to 3.
TPU$_NOCURRENTBUF | ERROR | If you do not specify a buffer or range to search, you must position to a buffer before searching.
TPU$_CONTROLC | ERROR | You pressed Ctrl/C while SEARCH was executing.
TPU$_ILLPATAS | ERROR | The pattern to SEARCH contained a partial pattern assignment to a variable not defined in the current context.

### Examples

> In the following example, if you search a buffer in which the string "Reflections of Monet" appears, this assignment statement stores the characters "Reflections of Monet" in the range user_range. The search finds a successful match even though the characters in the word "Monet" do not match in case because you specified NO_EXACT.

#1
    user_range := SEARCH ("Reflections of MONET", FORWARD, NO_EXACT)

> The following example searches the range the_range for all occurrences of the pattern "blue skies". If SEARCH finds the pattern, the procedure redefines the_range to begin after the end of the pattern just found. If the procedure did not redefine the range, SEARCH would keep finding the first occurrence over and over. The procedure reports the number of occurrences of the pattern.

#2
    PROCEDURE user_search_range

       LOCAL found_count;

       ON_ERROR
           [TPU$_STRNOTFOUND, TPU$_CONTROLC]:
           MESSAGE ( FAO ("Found !SL occurrences.", found_count));
           RETURN;
          [OTHERWISE]:ABORT;
       ENDON_ERROR;

       found_count := 0;
       the_pattern := "blue skies";
       the_range := CREATE_RANGE (BEGINNING_OF (CURRENT_BUFFER),
                                  END_OF (CURRENT_BUFFER),
                                  NONE);
       found_range := CREATE_RANGE (BEGINNING_OF (CURRENT_BUFFER),
                                    BEGINNING_OF (CURRENT_BUFFER),
                                    NONE);
        LOOP
           the_range := CREATE_RANGE (END_OF (found_range),
                                      END_OF (the_range), NONE);
           found_range := SEARCH (the_pattern, FORWARD, NO_EXACT,
                                  the_range);

           found_count := found_count + 1;
        ENDLOOP;
    ENDPROCEDURE;

## SEARCH_QUIETLY

### Format

> [[ range2 := ]] SEARCH_QUIETLY ( {ANCHOR |BUFFER_BEGIN |BUFFER_END |LINE_BEGIN |LINE_END |PAGE_BREAK |pattern |REMAIN |string |UNANCHOR }

> , {FORWARD |REVERSE} [[, {EXACT |NO_EXACT |integer} [[, {buffer |range1} ]] ]])

### Parameters

> #### ANCHOR

> A keyword that directs SEARCH_QUIETLY to start a search at the current character position.

> #### BUFFER_BEGIN

> A keyword used to match the beginning of a buffer.

> #### BUFFER_END

> A keyword used to match the end of a buffer.

> #### LINE_BEGIN

> A keyword used to match the beginning of a line.

> #### LINE_END

> A keyword used to match the end of a line.

> #### PAGE_BREAK

> A keyword used to match a form-feed character.

> #### pattern

> The pattern that you want to match.

> #### REMAIN

> A keyword that specifies a match starting at the current character and continuing to the end of the current line.

> #### string

> The string that you want to match.

> #### UNANCHOR

> A keyword that specifies that the next pattern element can match anywhere after the previous pattern element. Use this keyword as part of a complex pattern.

> For more information on these keywords, refer to the individual descriptions of them in this chapter.

> #### FORWARD

> Indicates a search in the forward direction.

> #### REVERSE

> Indicates a search in the reverse direction.

> #### EXACT

> Indicates that the characters SEARCH_QUIETLY is trying to match must be the same case and have the same diacritical markings as those in the string or pattern used as the first parameter to SEARCH_QUIETLY.

> #### NO_EXACT

> Indicates that the characters SEARCH_QUIETLY is trying to match need not be the same case nor have the same diacritical markings as those in the string or pattern used as the first parameter to SEARCH_QUIETLY. NO_EXACT is the default value for the optional third parameter.

> #### integer

> Specifies how SEARCH_QUIETLY should handle case and diacritical information if you want to match one attribute and ignore the other. Compaq recommends that you use the defined constants available for specifying this integer. The defined constants are as follows:
> - TPU$K_SEARCH_CASE---Equivalent to the integer 1. This specifies that the search should match the case of the first parameter but be insensitive to the diacritical markings of the first parameter.
> - TPU$K_SEARCH_DIACRITICAL---Equivalent to the integer 2. This specifies that the search should match the diacritical markings of the first parameter but be insensitive to the case of the first parameter.

> #### buffer

> The buffer in which to search. SEARCH_QUIETLY starts at the beginning of the buffer when doing a forward search and at the end of the buffer when doing a reverse search.

> #### range1

> The range in which to search. SEARCH_QUIETLY starts at the beginning of the range when doing a forward search and at the end of the range when doing a reverse search.

> To search a range for all occurrences of a pattern, you must define the range dynamically after each successful match; otherwise, SEARCH_QUIETLY positions to the beginning of the range and finds the same occurrence over and over. See the example section for a procedure that searches for all occurrences of a pattern in a range.

### Return Value

The range that contains characters that match the pattern or string specified as a parameter.

### Description

> The SEARCH_QUIETLY procedure looks for a particular arrangement of characters in a buffer or range and returns a range that contains those characters. Unlike the SEARCH built-in procedure, SEARCH_QUIETLY does not signal TPU$_STRNOTFOUND when it fails to find a string.

> SEARCH_QUIETLY looks for text that matches the string, pattern, or keyword specified as its first parameter. If it finds such text, it creates a range that contains this text and returns it. If SEARCH_QUIETLY does not find a match, the built-in returns 0 without signaling TPU$_STRNOTFOUND.

> The starting position for the search depends on the optional fourth parameter and the search direction. If you do not specify the fourth parameter, the search starts at the editing point.

> If you specify a range for the fourth parameter, the search starts at the beginning of the range for a forward search or the end of the range for a reverse search. When searching a range, SEARCH_QUIETLY matches only text inside the range. It does not look at text outside the range.

> If you specify a buffer for the fourth parameter, the search starts at the beginning of the buffer for a forward search or the end of the buffer for a reverse search.

> To determine whether the searched text contains a match, SEARCH_QUIETLY examines the character at the starting position and attempts to match the character against the pattern, text, or keyword specified. By default, the search is unanchored. This allows SEARCH_QUIETLY to move one character in the direction of the search if the character at the start position does not match. SEARCH_QUIETLY continues in this manner until it finds a match or reaches the bounds of the buffer or range.

> To prevent SEARCH_QUIETLY from moving the starting position in the direction of the search, use the ANCHOR keyword when you define the pattern to be matched.

> Previous | Next | Contents | Index

> | privacy and legal statement |
> 6020PRO_023.HTML