atari email archive

a collection of messages sent at Atari from 1983 to 1992.

A new TPU function

(1 / 1)


Occasionally I've been asked how to make TPU search for \n's in a file. TPU
can do it, but it is a bit messy. I've needed to do it from time to time too,
so I figured out a way to make it less messy and built it into the section
file. This new procedure allows you to use all the features of TPU's pattern
matching expressions, so I'll briefly point out the functions:

	ANY(string)	!matches any character in the string
	ARB(int)	!matches an arbitray string of int characters
	LINE_BEGIN	!matches beginning of line
	LINE_END	!matches end of line
	MATCH(string)	!matches all chars up to and including string
	NOTANY(string)	!matches any character NOT in the string
	REMAIN		!matches all characters to end of line
	SCAN(string)	!Matches the longest string of chars that does
				not contain any of the chars in string
	SCANL(string)	!same as SCAN but will cross record boundaries
	SPAN(string)	!matches the longest string of chars that only
				contains the chars in string
	ANCHOR		!search without moving off current position
				(advanced uses)

The pattern operators (which have equal precedence) are:

	| 		!alternation (logical or)
	&		!concatenation (logical and)

Strings must be enclosed in either single quotes ('string') or double
quotes ("string"). Parentheses may be used around subexpressions.
No other operators are allowed. Some examples:

	"abc"		!find string 'abc'
	'a' & 'b' & 'c'	!find string where a before b before c ("abc")
	LINE_BEGIN & 'fred' !find string where "FRED" is first thing on line
	LINE_BEGIN & "	"   !find line beginning with a tab
		      ^ there's a tab character here
	')};' & LINE_END    !find line where ")};" is the last thing on it
	LINE_BEGIN & ANY("0123456789") !find line beginning with any number
	SPAN('0123456789') & '$'  !find a local symbol

"Oh goody, how do I use this spiffy thing", you ask? You have two choices. You
may type GOLD/PF3, enter the search pattern and terminate it with another PF3 or
you may open a buffer (GOLD/B to some empty buffer), enter your search pattern
in that buffer, go back to the buffer you want to search through, type GOLD/PF3
=buffer_name terminating with another PF3. If TPU liked your expression, it'll
search the buffer as always with PF3 finding the next occurance just as before.
If TPU didn't like your expression, you'll get various nasty messages. If you
use the buffer method then, of course, you can edit the buffer to fix your
problem (or change what you want to seach on). Typing GOLD/PF3/PF3 will prompt
for a "Search string (RE): " to which you can type a search expression or
the =buffer_name and terminate it with a carriage return, KP4 or KP5. You may
also notice that some extra stuff was inserted in your search string buffer
the first time you use it, please don't change the extra stuff or you'll find
your search string will always fail. 

If you're really intrested, here's a big example of a complex search sequence
(stolen from a TPU procedure to find the next word, the variable edt$x_word has
been defined as a string of the characters that may delimt a word): 

! Redefine the forward word skipper:
!
! don't move off current character position
	      (
	      anchor 
		& 
! if on eol,then match that
              (
	      (line_end)
	      |
!leading spaces,on a word delimiter
             (span('	 ') & (any(edt$x_word) | edt$x_empty) ) )
	      |
!no leading spaces, if on a word delimiter, move to second grp non-delimiter char
   	     (    span(edt$x_word)	!skip all the leading delimiters
   		& scan(edt$x_word)	!skip all the non-delimiters
   		& span(edt$x_word) )	!and skip all the next delimiters
	      |
!no leading spaces, on a real word, go to next word
	     (scan(edt$x_word) & span(edt$x_word))
	      |
!no leading spaces,on a last real word of line, match rest of line
	      REMAIN
             )
	     &
! after matching, skip over trailing spaces if any
! except if match occurred at the eol. In this case,don't skip over blanks

	     (line_begin|span(' ') | edt$x_empty)
;
! End of forward word skipper
Message 1 of 1

Oct 26, 1987