1 ! Copyright (C) 2004, 2005 Mackenzie Straight.
2 ! Copyright (C) 2006 Slava Pestov.
3 ! See http://factorcode.org/license.txt for BSD license.
5 USING: alien errors kernel kernel-internals libc math sequences
8 TUPLE: buffer size ptr fill pos ;
10 C: buffer ( n -- buffer )
12 [ >r malloc check-ptr alien-address r> set-buffer-ptr ] keep
13 0 over set-buffer-fill
14 0 over set-buffer-pos ;
16 : buffer-free ( buffer -- )
17 dup buffer-ptr <alien> free 0 swap set-buffer-ptr ;
19 : buffer-contents ( buffer -- string )
20 dup buffer-ptr over buffer-pos +
21 over buffer-fill rot buffer-pos - memory>string ;
23 : buffer-reset ( n buffer -- )
24 [ set-buffer-fill ] keep 0 swap set-buffer-pos ;
26 : buffer-consume ( n buffer -- )
28 [ buffer-fill min ] keep
29 [ set-buffer-pos ] keep
30 dup buffer-pos over buffer-fill >= [
32 0 over set-buffer-fill
35 : buffer@ ( buffer -- n ) dup buffer-ptr swap buffer-pos + ;
37 : buffer-end ( buffer -- n ) dup buffer-ptr swap buffer-fill + ;
39 : buffer-first-n ( n buffer -- string )
40 [ dup buffer-fill swap buffer-pos - min ] keep
41 buffer@ swap memory>string ;
43 : buffer> ( n buffer -- string )
44 [ buffer-first-n ] 2keep buffer-consume ;
46 : buffer>> ( buffer -- string )
47 [ buffer-contents ] keep 0 swap buffer-reset ;
49 : buffer-length ( buffer -- n )
50 dup buffer-fill swap buffer-pos - ;
52 : buffer-capacity ( buffer -- n )
53 dup buffer-size swap buffer-fill - ;
55 : buffer-empty? ( buffer -- ? ) buffer-fill zero? ;
57 : extend-buffer ( n buffer -- )
58 2dup buffer-ptr <alien> swap realloc check-ptr alien-address
59 over set-buffer-ptr set-buffer-size ;
61 : check-overflow ( n buffer -- )
62 2dup buffer-capacity > [ extend-buffer ] [ 2drop ] if ;
64 : >buffer ( string buffer -- )
65 over length over check-overflow
66 [ buffer-end string>memory ] 2keep
67 [ buffer-fill swap length + ] keep set-buffer-fill ;
69 : ch>buffer ( ch buffer -- )
71 [ buffer-end f swap set-alien-unsigned-1 ] keep
72 [ buffer-fill 1+ ] keep set-buffer-fill ;
74 : buffer-bound ( buffer -- n )
75 dup buffer-ptr swap buffer-size + ;
77 : n>buffer ( n buffer -- )
78 [ buffer-fill + ] keep
79 [ buffer-bound > [ "Buffer overflow" throw ] when ] 2keep
82 : buffer-peek ( buffer -- ch )
83 buffer@ f swap alien-unsigned-1 ;
85 : buffer-pop ( buffer -- ch )
86 [ buffer-peek 1 ] keep buffer-consume ;