factor/library/sbuf.factor

67 lines
1.8 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
2005-04-02 02:39:33 -05:00
IN: strings
USING: kernel lists math namespaces sequences strings ;
M: sbuf length sbuf-length ;
M: sbuf set-length set-sbuf-length ;
M: sbuf nth sbuf-nth ;
M: sbuf set-nth set-sbuf-nth ;
2004-07-16 02:26:21 -04:00
: fill ( count char -- string )
#! Push a string that consists of the same character
#! repeated.
[ swap [ dup , ] times drop ] make-string ;
2004-07-16 02:26:21 -04:00
2004-12-19 03:04:03 -05:00
: pad ( string count char -- string )
>r over string-length - dup 0 <= [
2004-12-19 03:04:03 -05:00
r> 2drop
] [
r> fill swap cat2
] ifte ;
: string-map ( str code -- str )
2004-07-27 20:23:08 -04:00
#! Apply a quotation to each character in the string, and
#! push a new string constructed from return values.
#! The quotation must have stack effect ( X -- X ).
2005-04-02 02:39:33 -05:00
>r >list r> map cat ; inline
2004-08-10 23:48:08 -04:00
: split-next ( index string split -- next )
3dup index-of* dup -1 = [
>r drop string-tail , r> ( end of string )
2004-08-10 23:48:08 -04:00
] [
swap string-length dupd + >r swap substring , r>
2004-08-10 23:48:08 -04:00
] ifte ;
: (split) ( index string split -- )
2dup >r >r split-next dup -1 = [
drop r> drop r> drop
] [
r> r> (split)
] ifte ;
: split ( string split -- list )
#! Split the string at each occurrence of split, and push a
#! list of the pieces.
[ 0 -rot (split) ] make-list ;
: split-n-advance substring , >r tuck + swap r> ;
: split-n-finish nip dup string-length swap substring , ;
: (split-n) ( start n str -- )
3dup >r dupd + r> 2dup string-length < [
split-n-advance (split-n)
] [
split-n-finish 3drop
] ifte ;
: split-n ( n str -- list )
#! Split a string into n-character chunks.
[ 0 -rot (split-n) ] make-list ;
2005-01-03 02:55:54 -05:00
: ch>string ( ch -- str )
1 <sbuf> [ sbuf-append ] keep sbuf>string ;
2005-04-02 02:39:33 -05:00
: string>sbuf ( str -- sbuf )
dup string-length <sbuf> [ sbuf-append ] keep ;