Document revision date: 30 March 2001
[Compaq] [Go to the documentation home page] [How to order documentation] [Help on this site] [How to contact us]
[OpenVMS documentation]

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:

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:

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:

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

  [Go to the documentation home page] [How to order documentation] [Help on this site] [How to contact us]  
  privacy and legal statement  
6020PRO_023.HTML