2005-02-12 02:23:38 -05:00
|
|
|
! Copyright (C) 2004, 2005 Mackenzie Straight.
|
2006-01-17 03:13:57 -05:00
|
|
|
! Copyright (C) 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2005-03-29 19:48:17 -05:00
|
|
|
IN: io-internals
|
2005-04-29 02:37:12 -04:00
|
|
|
USING: alien errors kernel kernel-internals math sequences
|
|
|
|
strings ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
2005-02-12 02:23:38 -05:00
|
|
|
TUPLE: buffer size ptr fill pos ;
|
2004-12-25 05:49:30 -05:00
|
|
|
|
2005-02-12 02:23:38 -05:00
|
|
|
C: buffer ( size -- buffer )
|
|
|
|
2dup set-buffer-size
|
2005-06-10 16:08:00 -04:00
|
|
|
[ >r malloc check-ptr r> set-buffer-ptr ] keep
|
|
|
|
0 over set-buffer-fill
|
|
|
|
0 over set-buffer-pos ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
|
|
|
: buffer-free ( buffer -- )
|
2005-05-04 01:14:45 -04:00
|
|
|
dup buffer-ptr free 0 swap set-buffer-ptr ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
|
|
|
: buffer-contents ( buffer -- string )
|
2005-02-12 02:23:38 -05:00
|
|
|
dup buffer-ptr over buffer-pos +
|
2005-03-29 19:48:17 -05:00
|
|
|
over buffer-fill rot buffer-pos - memory>string ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
|
|
|
: buffer-reset ( count buffer -- )
|
2005-02-12 02:23:38 -05:00
|
|
|
[ set-buffer-fill ] keep 0 swap set-buffer-pos ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
|
|
|
: buffer-consume ( count buffer -- )
|
2005-03-29 19:48:17 -05:00
|
|
|
[ buffer-pos + ] keep
|
|
|
|
[ buffer-fill min ] keep
|
|
|
|
[ set-buffer-pos ] keep
|
2006-01-16 02:48:15 -05:00
|
|
|
dup buffer-pos over buffer-fill >= [
|
2005-06-10 16:08:00 -04:00
|
|
|
0 over set-buffer-pos
|
|
|
|
0 over set-buffer-fill
|
2005-02-12 02:23:38 -05:00
|
|
|
] when drop ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
2005-04-03 16:55:56 -04:00
|
|
|
: buffer@ ( buffer -- int ) dup buffer-ptr swap buffer-pos + ;
|
|
|
|
|
2005-07-17 15:22:06 -04:00
|
|
|
: buffer-end ( buffer -- int ) dup buffer-ptr swap buffer-fill + ;
|
|
|
|
|
2005-04-03 16:55:56 -04:00
|
|
|
: buffer-first-n ( count buffer -- string )
|
|
|
|
[ dup buffer-fill swap buffer-pos - min ] keep
|
|
|
|
buffer@ swap memory>string ;
|
|
|
|
|
2005-04-02 00:56:00 -05:00
|
|
|
: buffer> ( count buffer -- string )
|
|
|
|
[ buffer-first-n ] 2keep buffer-consume ;
|
|
|
|
|
|
|
|
: buffer>> ( buffer -- string )
|
|
|
|
[ buffer-contents ] keep 0 swap buffer-reset ;
|
|
|
|
|
2004-12-23 06:51:42 -05:00
|
|
|
: buffer-length ( buffer -- length )
|
2005-04-07 20:02:59 -04:00
|
|
|
dup buffer-fill swap buffer-pos - ;
|
2004-12-25 05:49:30 -05:00
|
|
|
|
|
|
|
: buffer-capacity ( buffer -- int )
|
2005-02-12 02:23:38 -05:00
|
|
|
dup buffer-size swap buffer-fill - ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
2006-01-28 15:49:31 -05:00
|
|
|
: buffer-empty? ( buffer -- ? ) buffer-fill zero? ;
|
2005-05-04 01:14:45 -04:00
|
|
|
|
|
|
|
: buffer-extend ( length buffer -- )
|
|
|
|
2dup buffer-ptr swap realloc check-ptr
|
|
|
|
over set-buffer-ptr set-buffer-size ;
|
|
|
|
|
2006-01-16 02:48:15 -05:00
|
|
|
: buffer-overflow ( ? quot -- )
|
|
|
|
[ "Buffer overflow" throw ] if ; inline
|
|
|
|
|
2005-07-17 15:22:06 -04:00
|
|
|
: check-overflow ( length buffer -- )
|
|
|
|
2dup buffer-capacity > [
|
2006-01-16 02:48:15 -05:00
|
|
|
dup buffer-empty? [ buffer-extend ] buffer-overflow
|
2005-05-04 01:14:45 -04:00
|
|
|
] [
|
|
|
|
2drop
|
2005-09-24 15:21:17 -04:00
|
|
|
] if ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
2005-04-02 00:56:00 -05:00
|
|
|
: >buffer ( string buffer -- )
|
2005-07-17 15:22:06 -04:00
|
|
|
over length over check-overflow
|
|
|
|
[ buffer-end string>memory ] 2keep
|
2005-04-29 02:37:12 -04:00
|
|
|
[ buffer-fill swap length + ] keep set-buffer-fill ;
|
2004-12-25 05:49:30 -05:00
|
|
|
|
2005-07-17 15:22:06 -04:00
|
|
|
: ch>buffer ( char buffer -- )
|
|
|
|
1 over check-overflow
|
2005-09-05 03:06:47 -04:00
|
|
|
[ buffer-end f swap set-alien-unsigned-1 ] keep
|
2005-09-16 22:47:28 -04:00
|
|
|
[ buffer-fill 1+ ] keep set-buffer-fill ;
|
2005-07-17 15:22:06 -04:00
|
|
|
|
2006-01-16 02:48:15 -05:00
|
|
|
: buffer-bound ( buffer -- n )
|
|
|
|
dup buffer-ptr swap buffer-size + ;
|
|
|
|
|
2005-04-02 00:56:00 -05:00
|
|
|
: n>buffer ( count buffer -- )
|
2006-01-16 02:48:15 -05:00
|
|
|
[ buffer-fill + ] keep
|
2006-01-17 03:13:57 -05:00
|
|
|
[ buffer-bound <= [ ] buffer-overflow ] 2keep
|
2006-01-16 02:48:15 -05:00
|
|
|
set-buffer-fill ;
|
2004-12-23 06:51:42 -05:00
|
|
|
|
2005-04-27 01:40:09 -04:00
|
|
|
: buffer-peek ( buffer -- char )
|
2005-09-05 03:06:47 -04:00
|
|
|
buffer@ f swap alien-unsigned-1 ;
|
2005-04-27 01:40:09 -04:00
|
|
|
|
2005-04-05 22:18:36 -04:00
|
|
|
: buffer-pop ( buffer -- char )
|
2005-04-27 01:40:09 -04:00
|
|
|
[ buffer-peek 1 ] keep buffer-consume ;
|