summaryrefslogtreecommitdiff
path: root/pack.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-01-18 08:43:14 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-01-18 08:43:14 +0000
commit0b3092922d0ff12923852e64e9146f99d6191287 (patch)
tree83fdd95738b0470346716b47dcb3ffdac299764a /pack.c
parent24a286efe1049d140869bb5ecd9acdc81ec833a0 (diff)
* io.c (rb_io_s_read): new method to call IO#read from
pathname. In addition, it accepts third optional argument to specify starting point. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1137 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'pack.c')
-rw-r--r--pack.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/pack.c b/pack.c
index 87d64e3bef..7aeded5cbd 100644
--- a/pack.c
+++ b/pack.c
@@ -1625,8 +1625,12 @@ pack_unpack(str, fmt)
p = RARRAY(a)->ptr;
pend = p + RARRAY(a)->len;
while (p < pend) {
- if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t)
+ if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) {
+ if (len > RSTRING(*p)->len) {
+ len = RSTRING(*p)->len;
+ }
break;
+ }
p++;
}
if (p == pend) {
@@ -1649,13 +1653,31 @@ pack_unpack(str, fmt)
break;
else {
char *t;
- VALUE str = rb_str_new(0, 0);
+ VALUE a, tmp;
+ VALUE *p, *pend;
+
+
+ if (!(a = rb_str_associated(str))) {
+ rb_raise(rb_eArgError, "no associated pointer");
+ }
memcpy(&t, s, sizeof(char *));
s += sizeof(char *);
+
if (t) {
- rb_str_cat2(str, t);
+ p = RARRAY(a)->ptr;
+ pend = p + RARRAY(a)->len;
+ while (p < pend) {
+ if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) {
+ break;
+ }
+ p++;
+ }
+ if (p == pend) {
+ rb_raise(rb_eArgError, "non associated pointer");
+ }
+ tmp = rb_str_new2(t);
}
- rb_ary_push(ary, str);
+ rb_ary_push(ary, tmp);
}
}
break;