Module description

tis -- Text input stream
The tis module implements a text input stream. It extends the str module, so all words from the str module, can be used on the tis data structure. There are seven basic methods: fetch = fetch the data, the stream pointer is not updated; next = after a fetch, the stream pointer is updated; seek = move the stream pointer; match = try to match data, if there is a match, the stream pointer is updated, read = read data, if data is returned then the stream pointer is updated; scan = scan for data, if the data is found then the leading text is returned and the stream pointer is moved after the scanned data; skip = move the stream pointer after the skipped data.
                                                                     
  Stack usage reader word: x -- c-addr u | 0 = Return read data c-addr u or 0 for no more 

Input stream structure

tis% ( -- n )
Get the required space for a tis variable

Input stream creation, initialisation and destruction

tis-init ( tis -- )
Initialise the empty input stream
tis-create ( "<spaces>name" -- ; -- tis )
Create a named input stream in the dictionary
tis-new ( -- tis )
Create a new input stream on the heap
tis-(free) ( tis -- )
Free the internal, private variables from the heap
tis-free ( tis -- )
Free the input stream from the heap

Seek and tell words: position in the stream

tis-pntr@ ( tis -- u )
Get the stream pointer
tis-pntr! ( n tis -- flag )
Set the stream pointer from start {>=0} or from end {<0}
tis-pntr+! ( n tis -- flag )
Add the offset u to the stream pointer

Reader words

tis-set-reader ( x xt tis -- )
Initialise the stream for reading using the reader callback xt and its data x
tis-read-more ( tis -- flag )
Read more data from the reader

String words

tis-reset ( tis -- )
Reset the input stream for reading from string
tis-set ( c-addr u tis -- )
Initialise the stream for reading from a string
tis-get ( tis -- 0 | addr u )
Get the remaining characters from the stream, stream pointer is not changed

Stream words

tis-eof? ( tis -- flag )
Check if the end of the stream is reached
tis-reduce ( tis -- )
Reduce the stream size

Fetch and next words

tis-fetch-char ( tis -- false | char true )
Fetch the next character from the stream
tis-next-char ( tis -- )
Move the stream pointer one character after fetch-char
tis-fetch-chars ( n tis -- 0 | addr u )
Fetch maximum of n next characters from the stream
tis-next-chars ( n tis -- )
Move the stream pointer n characters after fetch-chars

Match words: check for starting data

tis-imatch-char ( char tis -- flag )
Match case-insensitive a character
tis-cmatch-char ( char tis -- flag )
Match case-sensitive a character
tis-cmatch-chars ( c-addr u tis -- false | char true )
Match one of the characters in the string case-sensitive
tis-cmatch-string ( c-addr u tis -- flag )
Match case-sensitive a string
tis-imatch-string ( c-addr u tis -- flag )
Match case-insensitive a string
tis-match-set ( chs tis - false | char true )
Match one of the characters in the set

Read data words

tis-read-char ( tis -- false | char true )
Read character from the stream
tis-read-all ( tis -- 0 | c-addr u )
Read all remaining characters from the stream
tis-read-string ( n tis -- 0 | c-addr u )
Read n characters from the stream
tis-read-line ( tis -- 0 | c-addr u )
Read characters till cr and/or lf
tis-read-number ( tis -- false | n true )
Read a cell number in the current base from the stream
tis-read-double ( tis -- false | d true )
Read a double value in the current base from the stream
tis-read-float ( jis -- false | r true )
Read a float from the stream

Scan words: look for data in the stream

tis-scan-char ( char tis -- false | c-addr u true )
Read characters till the char
tis-scan-chars ( c-addr1 n1 tis -- false | c-addr2 u2 char true )
Read characters till one of characters in c-addr1 u1
tis-scan-string ( c-addr1 n2 tis -- false | c-addr1 u2 true )
Read characters till the string c-addr1 n1
tis-iscan-string ( c-addr1 n1 tis -- false | c-addr2 u2 true )
Read characters till the string c-addr1 n1 [case insensitive]
tis-scan-set ( chs tis - false | c-addr u char true )
Read characters till one of the characters in the set chs

Skip words: skip data in the stream

tis-skip-spaces ( tis -- n )
Skip whitespace in the stream, return the number of skipped whitespace characters

Inspection

tis-dump ( tis -- )
Dump the text input stream

Examples

\ ==============================================================================
\
\          tis_expl - the text input stream example in the ffl
\
\               Copyright (C) 2007  Dick van Oudheusden
\  
\ This library is free software; you can redistribute it and/or
\ modify it under the terms of the GNU General Public
\ License as published by the Free Software Foundation; either
\ version 2 of the License, or (at your option) any later version.
\
\ This library is distributed in the hope that it will be useful,
\ but WITHOUT ANY WARRANTY; without even the implied warranty of
\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
\ General Public License for more details.
\
\ You should have received a copy of the GNU General Public
\ License along with this library; if not, write to the Free
\ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
\
\ ==============================================================================
\ 
\  $Date: 2008-03-11 18:33:47 $ $Revision: 1.4 $
\
\ ==============================================================================

include ffl/tis.fs


\ Example 1: Use the text input stream with a string of text


\ Create an text input stream in the dictionary

tis-create tis1


\ Fill the stream with a string

s" This is a special test string" tis1 tis-set


\ Match the start of the string

char t tis1 tis-imatch-char [IF]            \ Match the start of the string with a t (case insensitive)
  .( The string starts with a t or T.) cr
[THEN]
  
s" his i" tis1 tis-cmatch-string [IF]
  .( After that the string starts with his.)  cr \ After matching the t, the string 'his i' is matched
[THEN]


\ Read in the string

tis1 tis-read-char [IF]
  .( Next character: ) emit cr                \ The next character is read (e.g. s)
[THEN]

.( Next five characters: )
5 tis1 tis-read-string type cr                \ The next five characters are read (e.g. ' a sp')


\ Scan for string

s" test" tis1 tis-scan-string [IF]
  .( String till 'test': ) type cr            \ Return the skipped text (e.g. 'ecial ')
[THEN]


\ Skip spaces

.( Skipped spaces: )
tis1 tis-skip-spaces . cr                     \ Skip spaces and return the number of skipped spaces (e.g. 1)
  


\ Example 2: Use the text input stream with a reader

\ Create a text input stream on the heap

tis-new value tis2


\ Setup the reader callback word

: tis-reader ( fileid -- c-addr u | 0 )
  pad 64 rot read-file throw
  dup IF
    pad swap
  THEN
;

s" index.html" r/o open-file throw dup  ' tis-reader   tis2 tis-set-reader   \ Setup a reader with a file


\ Scan with the reader 
: show-links   ( -- = example: Type all links in html file )
  ." Links:" cr
  BEGIN
    true
    s" <a HREF=" tis2 tis-iscan-string IF        \ Look for '<a HREF=', case insensitive, save lookup result
      2drop                                      \ No interest in leading string
      0=
      [char] > tis2 tis-scan-char IF             \ Look for '>'
        type cr                                  \ Type leading string = link
      THEN
    THEN
  UNTIL
;

show-links

\ Done, close the file

close-file throw

\ Free the stream from the heap

tis2 tis-free


Generated by fsdocgen 0.1.0