VALUE read_large_bignum(unsigned char **pData) { if(read_1(pData) != ERL_LARGE_BIGNUM) { rb_raise(rb_eStandardError, "Invalid Type, not a small bignum"); } unsigned int size = read_4(pData); unsigned int sign = read_1(pData); VALUE num = INT2NUM(0); VALUE tmp; unsigned char buf[size + 1]; read_string_raw(buf, pData, size); int i; for(i = 0; i < size; ++i) { tmp = INT2FIX(*(buf + i)); tmp = rb_funcall(tmp, rb_intern("<<"), 1, INT2NUM(i * 8)); num = rb_funcall(num, rb_intern("+"), 1, tmp); } if(sign) { num = rb_funcall(num, rb_intern("*"), 1, INT2NUM(-1)); } return num; }
VALUE read_float(unsigned char **pData) { if(read_1(pData) != ERL_FLOAT) { rb_raise(rb_eStandardError, "Invalid Type, not a float"); } unsigned char buf[32]; read_string_raw(buf, pData, 31); VALUE rString = rb_str_new2((char *) buf); return rb_funcall(rString, rb_intern("to_f"), 0); }
VALUE read_bin(unsigned char **pData) { if(read_1(pData) != ERL_BIN) { rb_raise(rb_eStandardError, "Invalid Type, not an erlang binary"); } int length = read_4(pData); unsigned char buf[length + 1]; read_string_raw(buf, pData, length); return rb_str_new2((char *) buf); }
VALUE read_atom(unsigned char **pData) { if(read_1(pData) != ERL_ATOM) { rb_raise(rb_eStandardError, "Invalid Type, not an atom"); } int length = read_2(pData); unsigned char buf[length + 1]; read_string_raw(buf, pData, length); return ID2SYM(rb_intern((char *) buf)); }
VALUE read_string(unsigned char **pData) { if(read_1(pData) != ERL_STRING) { rb_raise(rb_eStandardError, "Invalid Type, not an erlang string"); } int length = read_2(pData); unsigned char buf[length + 1]; read_string_raw(buf, pData, length); VALUE array = rb_ary_new2(length); int i = 0; for(i; i < length; ++i) { rb_ary_store(array, i, INT2NUM(*(buf + i))); } return array; }
VALUE read_atom(unsigned char **pData) { if(read_1(pData) != ERL_ATOM) { rb_raise(rb_eStandardError, "Invalid Type, not an atom"); } int length = read_2(pData); unsigned char buf[length + 1]; read_string_raw(buf, pData, length); // Erlang true and false are actually atoms if(length == 4 && strncmp((char *) buf, "true", length) == 0) { return Qtrue; } else if(length == 5 && strncmp((char *) buf, "false", length) == 0) { return Qfalse; } else { return ID2SYM(rb_intern((char *) buf)); } }