From 65a5162550f58047974793cdc8067a970b2435c0 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 13 Aug 1999 05:45:20 +0000 Subject: 1.4.0 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@520 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- marshal.c | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) (limited to 'marshal.c') diff --git a/marshal.c b/marshal.c index 6a68b04352..9d4808b8ab 100644 --- a/marshal.c +++ b/marshal.c @@ -12,8 +12,12 @@ #include "rubyio.h" #include "st.h" +#ifndef atof +double strtod(); +#endif + #define MARSHAL_MAJOR 4 -#define MARSHAL_MINOR 0 +#define MARSHAL_MINOR 1 #define TYPE_NIL '0' #define TYPE_TRUE 'T' @@ -37,8 +41,6 @@ #define TYPE_LINK '@' -VALUE rb_path2class _((char*)); - static ID s_dump, s_load; struct dump_arg { @@ -164,7 +166,7 @@ w_unique(s, arg) static void w_object _((VALUE,struct dump_arg*,int)); static int -rb_hash_each(key, value, arg) +hash_each(key, value, arg) VALUE key, value; struct dump_call_arg *arg; { @@ -174,7 +176,7 @@ rb_hash_each(key, value, arg) } static int -rb_obj_each(id, value, arg) +obj_each(id, value, arg) ID id; VALUE value; struct dump_call_arg *arg; @@ -249,9 +251,9 @@ w_object(obj, arg, limit) w_byte(TYPE_USERDEF, arg); w_unique(rb_class2name(CLASS_OF(obj)), arg); - v = rb_funcall(obj, s_dump, 1, limit); + v = rb_funcall(obj, s_dump, 1, INT2NUM(limit)); if (TYPE(v) != T_STRING) { - rb_raise(rb_eTypeError, "_dump_to must return String"); + rb_raise(rb_eTypeError, "_dump() must return String"); } w_bytes(RSTRING(v)->ptr, RSTRING(v)->len, arg); return; @@ -320,7 +322,7 @@ w_object(obj, arg, limit) w_uclass(obj, rb_cHash, arg); w_byte(TYPE_HASH, arg); w_long(RHASH(obj)->tbl->num_entries, arg); - st_foreach(RHASH(obj)->tbl, rb_hash_each, &c_arg); + st_foreach(RHASH(obj)->tbl, hash_each, &c_arg); break; case T_STRUCT: @@ -357,7 +359,7 @@ w_object(obj, arg, limit) w_unique(path, arg); if (ROBJECT(obj)->iv_tbl) { w_long(ROBJECT(obj)->iv_tbl->num_entries, arg); - st_foreach(ROBJECT(obj)->iv_tbl, rb_obj_each, &c_arg); + st_foreach(ROBJECT(obj)->iv_tbl, obj_each, &c_arg); } else { w_long(0, arg); @@ -455,9 +457,19 @@ static int r_byte(arg) struct load_arg *arg; { - if (arg->fp) return getc(arg->fp); - if (arg->ptr < arg->end) return *(unsigned char*)arg->ptr++; - return EOF; + int c; + + if (arg->fp) { + c = rb_getc(arg->fp); + if (c == EOF) rb_eof_error(); + } + else if (arg->ptr < arg->end) { + c = *(unsigned char*)arg->ptr++; + } + else { + rb_raise(rb_eArgError, "marshal data too short"); + } + return c; } static unsigned short @@ -602,10 +614,6 @@ r_object(arg) int type = r_byte(arg); switch (type) { - case EOF: - rb_eof_error(); - return Qnil; - case TYPE_LINK: if (st_lookup(arg->data, r_long(arg), &v)) { return v; @@ -641,13 +649,10 @@ r_object(arg) case TYPE_FLOAT: { -#ifndef atof - double atof(); -#endif char *buf; r_bytes(buf, arg); - v = rb_float_new(atof(buf)); + v = rb_float_new(strtod(buf, 0)); return r_regist(v, arg); } @@ -754,7 +759,7 @@ r_object(arg) v = rb_funcall(klass, s_load, 1, r_string(arg)); return r_regist(v, arg); } - rb_raise(rb_eTypeError, "class %s needs to have method `_load_from'", + rb_raise(rb_eTypeError, "class %s needs to have method `_load'", rb_class2name(klass)); } break; @@ -850,7 +855,7 @@ marshal_load(argc, argv) v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg); } else { - rb_raise(rb_eTypeError, "Old marshal file format (can't read)"); + rb_raise(rb_eTypeError, "old marshal file format (can't read)"); } return v; -- cgit v1.2.3