summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-08-06 03:05:23 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-08-06 03:05:23 +0000
commitf33a61c28dadf8ff2bb86d36d6428f487b671708 (patch)
tree6794731dfe7e2d526808376060893846f2ddc6c2 /string.c
parent439b453e3aa244e7b824a55aa11768dca3d4a6f4 (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.c71
1 files changed, 56 insertions, 15 deletions
diff --git a/string.c b/string.c
index 227f4f78bf..326b9626b1 100644
--- a/string.c
+++ b/string.c
@@ -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);