diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-08-06 03:05:23 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-08-06 03:05:23 +0000 |
commit | f33a61c28dadf8ff2bb86d36d6428f487b671708 (patch) | |
tree | 6794731dfe7e2d526808376060893846f2ddc6c2 /string.c | |
parent | 439b453e3aa244e7b824a55aa11768dca3d4a6f4 (diff) |
* string.c (rb_str_lstrip_bang): new method.
* string.c (rb_str_rstrip_bang): new method.
* string.c (rb_str_associate): should consider STR_ASSOC too.
* eval.c (rb_undefined): do not recurse if method_missing is
undefined.
* process.c (proc_waitpid): now all arguments are optional.
* process.c (Init_process): waitpid is now alias to wait.
* process.c (Init_process): waitpid2 is now alias to wait2.
* process.c (rb_waitpid): made public.
* ext/pty/pty.c (pty_getpty): avoid disturbing SIGCHLD using
thread and rb_waitpid.
* process.c (proc_getpgrp): now takes no argument on all
platforms.
* process.c (proc_setpgrp): ditto.
* ext/socket/socket.c (sock_s_pack_sockaddr_in): added
Socket::pack_sockaddr_in(). [new]
* ext/socket/socket.c (sock_s_pack_sockaddr_un): added
Socket::pack_sockaddr_un(). [new]
* ext/socket/socket.c (sock_s_pack_sockaddr_in): added
Socket::unpack_sockaddr_in(). [new]
* ext/socket/socket.c (sock_s_pack_sockaddr_un): added
Socket::unpack_sockaddr_un(). [new]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1666 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 71 |
1 files changed, 56 insertions, 15 deletions
@@ -202,7 +202,7 @@ void rb_str_associate(str, add) VALUE str, add; { - if (!FL_TEST(str, STR_NO_ORIG)) { + if (FL_TEST(str, STR_NO_ORIG|STR_ASSOC) != (STR_NO_ORIG|STR_ASSOC)) { if (RSTRING(str)->orig) { rb_str_modify(str); } @@ -216,7 +216,7 @@ VALUE rb_str_associated(str) VALUE str; { - if (!FL_TEST(str, STR_NO_ORIG|STR_ASSOC)) { + if (FL_TEST(str, STR_NO_ORIG|STR_ASSOC) != (STR_NO_ORIG|STR_ASSOC)) { return Qfalse; } return RSTRING(str)->orig; @@ -2648,7 +2648,7 @@ rb_f_chomp(argc, argv) } static VALUE -rb_str_strip_bang(str) +rb_str_lstrip_bang(str) VALUE str; { char *s, *t, *e; @@ -2659,27 +2659,63 @@ rb_str_strip_bang(str) /* remove spaces at head */ while (s < t && ISSPACE(*s)) s++; + RSTRING(str)->len = t-s; + if (s > RSTRING(str)->ptr) { + memmove(RSTRING(str)->ptr, s, RSTRING(str)->len); + RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; + } +} + +static VALUE +rb_str_lstrip(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_lstrip_bang(str); + return str; +} + +static VALUE +rb_str_rstrip_bang(str) + VALUE str; +{ + char *s, *t, *e; + + rb_str_modify(str); + s = RSTRING(str)->ptr; + e = t = s + RSTRING(str)->len; + /* remove trailing spaces */ t--; while (s <= t && ISSPACE(*t)) t--; t++; RSTRING(str)->len = t-s; - if (s > RSTRING(str)->ptr) { - char *p = RSTRING(str)->ptr; - - RSTRING(str)->ptr = ALLOC_N(char, RSTRING(str)->len+1); - memcpy(RSTRING(str)->ptr, s, RSTRING(str)->len); - RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; - free(p); - } - else if (t < e) { + if (t < e) { RSTRING(str)->ptr[RSTRING(str)->len] = '\0'; + return str; } - else { - return Qnil; - } + return Qnil; +} +static VALUE +rb_str_rstrip(str) + VALUE str; +{ + str = rb_str_dup(str); + rb_str_rstrip_bang(str); + return str; +} + +static VALUE +rb_str_strip_bang(str) + VALUE str; +{ + VALUE l = rb_str_lstrip_bang(str); + VALUE r = rb_str_rstrip_bang(str); + + if (NIL_P(l) && NIL_P(r)) return Qnil; return str; } @@ -3015,12 +3051,17 @@ Init_String() rb_define_method(rb_cString, "chop", rb_str_chop, 0); rb_define_method(rb_cString, "chomp", rb_str_chomp, -1); rb_define_method(rb_cString, "strip", rb_str_strip, 0); + rb_define_method(rb_cString, "lstrip", rb_str_lstrip, 0); + rb_define_method(rb_cString, "rstrip", rb_str_rstrip, 0); rb_define_method(rb_cString, "sub!", rb_str_sub_bang, -1); rb_define_method(rb_cString, "gsub!", rb_str_gsub_bang, -1); rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0); rb_define_method(rb_cString, "chop!", rb_str_chop_bang, 0); rb_define_method(rb_cString, "chomp!", rb_str_chomp_bang, -1); + rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0); + rb_define_method(rb_cString, "lstrip!", rb_str_lstrip_bang, 0); + rb_define_method(rb_cString, "rstrip!", rb_str_rstrip_bang, 0); rb_define_method(rb_cString, "tr", rb_str_tr, 2); rb_define_method(rb_cString, "tr_s", rb_str_tr_s, 2); |