2005-01-29 14:18:28 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
|
|
|
IN: strings USING: kernel lists math namespaces strings ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
|
|
|
: fill ( count char -- string )
|
|
|
|
#! Push a string that consists of the same character
|
|
|
|
#! repeated.
|
2004-11-11 15:15:43 -05:00
|
|
|
[ 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 str-length - dup 0 <= [
|
|
|
|
r> 2drop
|
|
|
|
] [
|
|
|
|
r> fill swap cat2
|
|
|
|
] ifte ;
|
|
|
|
|
2004-07-16 02:26:21 -04:00
|
|
|
: str-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 ).
|
2004-10-06 23:34:22 -04:00
|
|
|
over str-length <sbuf> rot [
|
2005-02-24 20:52:17 -05:00
|
|
|
swap >r apply swap r> tuck sbuf-append
|
2004-11-27 00:33:17 -05:00
|
|
|
] str-each nip sbuf>str ; inline
|
2004-08-10 23:48:08 -04:00
|
|
|
|
|
|
|
: split-next ( index string split -- next )
|
|
|
|
3dup index-of* dup -1 = [
|
2004-11-15 12:33:21 -05:00
|
|
|
>r drop str-tail , r> ( end of string )
|
2004-08-10 23:48:08 -04:00
|
|
|
] [
|
|
|
|
swap str-length dupd + >r swap substring , r>
|
|
|
|
] 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.
|
2004-11-11 15:15:43 -05:00
|
|
|
[ 0 -rot (split) ] make-list ;
|
2004-09-04 01:05:50 -04:00
|
|
|
|
|
|
|
: split-n-advance substring , >r tuck + swap r> ;
|
|
|
|
: split-n-finish nip dup str-length swap substring , ;
|
|
|
|
|
|
|
|
: (split-n) ( start n str -- )
|
|
|
|
3dup >r dupd + r> 2dup str-length < [
|
|
|
|
split-n-advance (split-n)
|
|
|
|
] [
|
|
|
|
split-n-finish 3drop
|
|
|
|
] ifte ;
|
|
|
|
|
|
|
|
: split-n ( n str -- list )
|
|
|
|
#! Split a string into n-character chunks.
|
2004-11-11 15:15:43 -05:00
|
|
|
[ 0 -rot (split-n) ] make-list ;
|
2005-01-03 02:55:54 -05:00
|
|
|
|
|
|
|
: ch>str ( ch -- str )
|
|
|
|
1 <sbuf> [ sbuf-append ] keep sbuf>str ;
|