factor/core/io/buffers.factor

102 lines
2.8 KiB
Factor
Raw Normal View History

2005-02-12 02:23:38 -05:00
! Copyright (C) 2004, 2005 Mackenzie Straight.
! Copyright (C) 2006, 2007 Slava Pestov.
2006-01-17 03:13:57 -05:00
! See http://factorcode.org/license.txt for BSD license.
IN: buffers
2006-03-08 16:06:13 -05:00
USING: alien errors kernel kernel-internals libc 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
2006-08-16 21:55:53 -04:00
C: buffer ( n -- buffer )
2005-02-12 02:23:38 -05:00
2dup set-buffer-size
[ >r malloc check-ptr r> set-buffer-ptr ] keep
2005-06-10 16:08:00 -04:00
0 over set-buffer-fill
0 over set-buffer-pos ;
2004-12-23 06:51:42 -05:00
: buffer-free ( buffer -- )
dup buffer-ptr free f swap set-buffer-ptr ;
2004-12-23 06:51:42 -05:00
2006-08-16 21:55:53 -04:00
: buffer-reset ( n 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
2006-08-16 21:55:53 -04:00
: buffer-consume ( n buffer -- )
[ 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
: buffer-addr ( buffer -- n )
buffer-ptr alien-address ;
: buffer@ ( buffer -- alien )
dup buffer-pos swap buffer-ptr <displaced-alien> ;
: buffer-end ( buffer -- alien )
dup buffer-fill swap buffer-ptr <displaced-alien> ;
2005-04-03 16:55:56 -04:00
: buffer-peek ( buffer -- ch )
buffer@ 0 alien-unsigned-1 ;
: buffer-pop ( buffer -- ch )
dup buffer-peek 1 rot buffer-consume ;
: (buffer>) ( n buffer -- string )
2005-04-03 16:55:56 -04:00
[ dup buffer-fill swap buffer-pos - min ] keep
buffer@ swap memory>string ;
2006-08-16 21:55:53 -04:00
: buffer> ( n buffer -- string )
[ (buffer>) ] 2keep buffer-consume ;
: (buffer>>) ( buffer -- string )
dup buffer-pos over buffer-ptr <displaced-alien>
over buffer-fill rot buffer-pos - memory>string ;
: buffer>> ( buffer -- string )
dup (buffer>>) 0 rot buffer-reset ;
FUNCTION: long memcspn ( void* s, void* end, char* charset ) ;
: (buffer-until) ( separators buffer -- n )
dup buffer@ swap buffer-end rot memcspn ;
: buffer-until ( separators buffer -- string separator )
[ (buffer-until) ] keep over -1 number=
[ nip buffer>> f ] [ [ buffer> ] keep buffer-pop ] if ;
2006-08-16 21:55:53 -04:00
: buffer-length ( buffer -- n )
dup buffer-fill swap buffer-pos - ;
2004-12-25 05:49:30 -05:00
2006-08-16 21:55:53 -04:00
: buffer-capacity ( buffer -- n )
2005-02-12 02:23:38 -05:00
dup buffer-size swap buffer-fill - ;
2004-12-23 06:51:42 -05:00
: buffer-empty? ( buffer -- ? )
buffer-fill zero? ;
2005-05-04 01:14:45 -04:00
2006-08-16 21:55:53 -04:00
: extend-buffer ( n buffer -- )
2dup buffer-ptr swap realloc check-ptr
2005-05-04 01:14:45 -04:00
over set-buffer-ptr set-buffer-size ;
2006-08-16 21:55:53 -04:00
: check-overflow ( n buffer -- )
2006-02-24 22:40:36 -05:00
2dup buffer-capacity > [ extend-buffer ] [ 2drop ] if ;
2004-12-23 06:51:42 -05:00
: >buffer ( string buffer -- )
over length over check-overflow
[ buffer-end string>memory ] 2keep
[ buffer-fill swap length + ] keep set-buffer-fill ;
2004-12-25 05:49:30 -05:00
2006-08-16 21:55:53 -04:00
: ch>buffer ( ch buffer -- )
1 over check-overflow
[ buffer-end 0 set-alien-unsigned-1 ] keep
2005-09-16 22:47:28 -04:00
[ buffer-fill 1+ ] keep set-buffer-fill ;
2006-01-16 02:48:15 -05:00
: buffer-bound ( buffer -- n )
dup buffer-addr swap buffer-size + ;
2006-01-16 02:48:15 -05:00
2006-08-16 21:55:53 -04:00
: n>buffer ( n buffer -- )
2006-01-16 02:48:15 -05:00
[ buffer-fill + ] keep
2006-02-24 22:40:36 -05:00
[ buffer-bound > [ "Buffer overflow" throw ] when ] 2keep
2006-01-16 02:48:15 -05:00
set-buffer-fill ;