Annotation of gforth/kernel/input.fs, revision 1.1

1.1     ! pazsan      1: \ Input handling (object oriented)                      22oct00py
        !             2: 
        !             3: \ Copyright (C) 2000 Free Software Foundation, Inc.
        !             4: 
        !             5: \ This file is part of Gforth.
        !             6: 
        !             7: \ Gforth is free software; you can redistribute it and/or
        !             8: \ modify it under the terms of the GNU General Public License
        !             9: \ as published by the Free Software Foundation; either version 2
        !            10: \ of the License, or (at your option) any later version.
        !            11: 
        !            12: \ This program is distributed in the hope that it will be useful,
        !            13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: \ GNU General Public License for more details.
        !            16: 
        !            17: \ You should have received a copy of the GNU General Public License
        !            18: \ along with this program; if not, write to the Free Software
        !            19: \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
        !            20: 
        !            21: \ input handling structure:
        !            22: 
        !            23: | : input-method ( m "name" -- m' )  Create dup , cell+
        !            24: DOES> ( ... -- ... ) @ current-input @ @ + perform ;
        !            25: | : input-var ( v size "name" -- v' )  Create  over , +
        !            26: DOES> ( -- addr ) @ current-input @ + ;
        !            27: 
        !            28: 0
        !            29: input-method source ( -- 0 | -1 | fileid ) \ core-ext,file source-i-d
        !            30:     \G Return 0 (the input source is the user input device), -1 (the
        !            31:     \G input source is a string being processed by @code{evaluate}) or
        !            32:     \G a @i{fileid} (the input source is the file specified by
        !            33:     \G @i{fileid}).
        !            34: input-method refill ( -- flag ) \ core-ext,block-ext,file-ext
        !            35:     \G Attempt to fill the input buffer from the input source.  When
        !            36:     \G the input source is the user input device, attempt to receive
        !            37:     \G input into the terminal input device. If successful, make the
        !            38:     \G result the input buffer, set @code{>IN} to 0 and return true;
        !            39:     \G otherwise return false. When the input source is a block, add 1
        !            40:     \G to the value of @code{BLK} to make the next block the input
        !            41:     \G source and current input buffer, and set @code{>IN} to 0;
        !            42:     \G return true if the new value of @code{BLK} is a valid block
        !            43:     \G number, false otherwise. When the input source is a text file,
        !            44:     \G attempt to read the next line from the file. If successful,
        !            45:     \G make the result the current input buffer, set @code{>IN} to 0
        !            46:     \G and return true; otherwise, return false.  A successful result
        !            47:     \G includes receipt of a line containing 0 characters.
        !            48: input-method source-id ( -- 0 | -1 | fileid ) \ core-ext,file source-i-d
        !            49:     \G Return 0 (the input source is the user input device), -1 (the
        !            50:     \G input source is a string being processed by @code{evaluate}) or
        !            51:     \G a @i{fileid} (the input source is the file specified by
        !            52:     \G @i{fileid}).
        !            53: | input-method (save-input) ( -- x1 .. xn n ) \ gforth
        !            54: | input-method (restore-input) ( x1 .. xn n -- ) \ gforth
        !            55: drop
        !            56: 
        !            57: cell \ the first cell points to the method table
        !            58: cell input-var >in \ core to-in
        !            59:     \G @code{input-var} variable -- @i{a-addr} is the address of a
        !            60:     \G cell containing the char offset from the start of the input
        !            61:     \G buffer to the start of the parse area.
        !            62: cell input-var #tib \ core-ext number-t-i-b
        !            63:     \G @code{input-var} variable -- @i{a-addr} is the address of a
        !            64:     \G cell containing the number of characters in the terminal input
        !            65:     \G buffer. OBSOLESCENT: @code{source} superceeds the function of
        !            66:     \G this word.
        !            67: cell input-var max#tib \ gforth max-number-t-i-b
        !            68:     \G @code{input-var} variable -- This cell contains the maximum
        !            69:     \G size of the current tib.
        !            70: cell input-var old-input \ gforth
        !            71:     \G @code{input-var} variable -- This cell contains the pointer to
        !            72:     \G the previous input buffer
        !            73: cell input-var loadline \ gforth
        !            74:     \G @code{input-var} variable -- This cell contains the line that's
        !            75:     \G currently loaded from
        !            76: has? file [IF]
        !            77: cell input-var loadfile \ gforth
        !            78:     \G @code{input-var} variable -- This cell contains the file the
        !            79:     \G input buffer is associated with (0 if none)
        !            80: cell input-var blk \ block
        !            81:     \G @code{input-var} variable -- This cell contains the current
        !            82:     \G block number
        !            83: cell input-var #fill-bytes \ gforth
        !            84:     \G @code{input-var} variable -- number of bytes read via
        !            85:     \G (read-line) by the last refill
        !            86: cell input-var loadfilename# \ gforth
        !            87:     \G @code{input-var} variable -- This cell contains the index into
        !            88:     \G the file name array and allows to identify the loaded file.
        !            89: [THEN]
        !            90: 0 input-var tib
        !            91: 
        !            92: Constant tib+
        !            93: 
        !            94: \ terminal input implementation
        !            95: 
        !            96: :noname  1 <> -12 and throw >in ! ;
        !            97:                        \ restore-input
        !            98: :noname  >in @ 1 ;     \ save-input
        !            99: :noname  0 ;           \ source-id
        !           100: :noname  tib max#tib @ accept #tib !
        !           101:     >in off true 1 loadline +! ;     \ refill
        !           102: :noname  tib #tib @ ;  \ source
        !           103: 
        !           104: | Create terminal-input   A, A, A, A, A,
        !           105: | Create evaluate-input
        !           106:     terminal-input @ A,
        !           107:     ' false A,
        !           108:     terminal-input 2 cells + @ A,
        !           109:     terminal-input 3 cells + @ A,
        !           110:     terminal-input 4 cells + @ A,
        !           111: 
        !           112: \ file input implementation
        !           113: 
        !           114: has? file [IF]
        !           115: :noname  4 <> -12 and throw
        !           116:     loadfile @ reposition-file throw
        !           117:     refill 0= -36 and throw \ should never throw
        !           118:     loadline ! >in ! ; \ restore-input
        !           119: :noname  >in @ sourceline#
        !           120:     loadfile @ file-position throw #fill-bytes @ 0 d-
        !           121:     4 ;                \ save-input
        !           122: :noname  loadfile @ ;  \ source-id
        !           123: :noname  tib max#tib @ loadfile @ (read-line) throw #fill-bytes !
        !           124:     swap #tib ! >in off 1 loadline +! ;
        !           125:                        \ refill
        !           126: terminal-input @       \ source -> terminal-input::source
        !           127: 
        !           128: | Create file-input  A, A, A, A, A,
        !           129: [THEN]
        !           130: 
        !           131: \ push-file, pop-file
        !           132: 
        !           133: : new-tib ( method n -- ) \ gforth
        !           134:     \G Create a new entry of the tib stack, size @i{n}, method table
        !           135:     \G @i{method}.
        !           136:     dup >r tib+ + dup allocate throw tuck swap 0 fill
        !           137:     current-input @ swap current-input ! old-input ! r> max#tib !
        !           138:     current-input @ ! ;
        !           139: has? file [IF]
        !           140: : push-file  ( -- ) \ gforth
        !           141:     \G Create a new file input buffer
        !           142:     file-input def#tib new-tib ;
        !           143: [THEN]
        !           144: : pop-file ( throw-code -- throw-code ) \ gforth
        !           145:     \G pop and free the current top input buffer
        !           146:     dup IF
        !           147:        source >in @ sourceline#
        !           148:        [ has? file [IF] ] sourcefilename [ [THEN] ]
        !           149:        >error
        !           150:     THEN
        !           151:     current-input @ old-input @ current-input ! free throw ;
        !           152: 
        !           153: \ save-input, restore-input
        !           154: 
        !           155: : save-input ( -- x1 .. xn n ) \ core-ext
        !           156:     \G The @i{n} entries @i{xn - x1} describe the current state of the
        !           157:     \G input source specification, in some platform-dependent way that can
        !           158:     \G be used by @code{restore-input}.
        !           159:     (save-input) current-input @ swap 1+ ;
        !           160: : restore-input ( x1 .. xn n -- flag ) \ core-ext
        !           161:     \G Attempt to restore the input source specification to the state
        !           162:     \G described by the @i{n} entries @i{xn - x1}. @i{flag} is true if
        !           163:     \G the restore fails.  In Gforth with the new input code, it fails
        !           164:     \G only with a flag that can be used to throw again; it is also
        !           165:     \G possible to save and restore between different active input
        !           166:     \G streams. Note that closing the input streams must happen in the
        !           167:     \G reverse order as they have been opened, but in between
        !           168:     \G everything is allowed.
        !           169:     current-input @ >r swap current-input ! 1- dup >r
        !           170:     ['] (restore-input) catch
        !           171:     dup IF  r> 0 ?DO  nip  LOOP  r> current-input !  EXIT  THEN
        !           172:     rdrop rdrop ;
        !           173: 
        !           174: \ create terminal input block
        !           175: 
        !           176: : create-input ( -- )
        !           177:     \G create a new terminal input
        !           178:     terminal-input def#tib new-tib ;
        !           179:     ( loadfilename# off ) \ "*the terminal*"
        !           180: 
        !           181: : evaluate ( addr u -- ) \ core,block
        !           182:     \G Save the current input source specification. Store @code{-1} in
        !           183:     \G @code{source-id} and @code{0} in @code{blk}. Set @code{>IN} to
        !           184:     \G @code{0} and make the string @i{c-addr u} the input source
        !           185:     \G and input buffer. Interpret. When the parse area is empty,
        !           186:     \G restore the input source specification.
        !           187:     evaluate-input over new-tib
        !           188: [ has? file [IF] ]
        !           189:     1 loadfilename# ! \ "*evaluated string*"
        !           190: [ [THEN] ]
        !           191:     -1 loadline ! dup #tib ! tib swap move
        !           192:     ['] interpret catch pop-file throw ;
        !           193: 
        !           194: \ clear tibstack
        !           195: 
        !           196: : clear-tibstack ( -- ) \ gforth
        !           197:     \G clears the tibstack; if there is none, create the bottom entry:
        !           198:     \G the terminal input buffer.
        !           199:     current-input @ 0= IF  create-input  THEN
        !           200:     BEGIN  old-input @  WHILE  0 pop-file drop  REPEAT ;
        !           201: 
        !           202: : query ( -- ) \ core-ext
        !           203:     \G Make the user input device the input source. Receive input into
        !           204:     \G the Terminal Input Buffer. Set @code{>IN} to zero. OBSOLESCENT:
        !           205:     \G superceeded by @code{accept}.
        !           206:     clear-tibstack  refill drop ;
        !           207: 
        !           208: \ load a file
        !           209: 
        !           210: has? file [IF]
        !           211: : read-loop ( i*x -- j*x ) \ gforth
        !           212:     \G refill and interpret a file until EOF
        !           213:     BEGIN  refill  WHILE  interpret  REPEAT ;
        !           214: 
        !           215: : include-file2 ( i*x wfileid loadfilename# -- j*x )
        !           216:     push-file \ dup 2* cells included-files 2@ drop + 2@ type
        !           217:     loadfilename# !  loadfile !
        !           218:     ['] read-loop catch
        !           219:     loadfile @ close-file swap 2dup or
        !           220:     pop-file  drop throw throw ;
        !           221: 
        !           222: : include-file ( i*x wfileid -- j*x )
        !           223:     \G Interpret (process using the text interpreter) the contents of
        !           224:     \G the file @var{wfileid}.
        !           225:     3 include-file2 ;
        !           226: [THEN]

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>