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, VALUE forceToEncoding) { if(read_1(pData) != ERL_STRING) { rb_raise(rb_eStandardError, "Invalid Type, not an erlang string"); } int length = read_2(pData); VALUE array = rb_ary_new2(length); int i = 0; for(i; i < length; ++i) { rb_ary_store(array, i, INT2NUM(**pData)); *pData += 1; } return force_encoding(array, forceToEncoding); }
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); VALUE newref_class = rb_const_get(mErlectricity, rb_intern("List")); VALUE array = rb_funcall(newref_class, rb_intern("new"), 1, INT2NUM(length)); int i = 0; for(i; i < length; ++i) { rb_ary_store(array, i, INT2NUM(**pData)); *pData += 1; } return array; }
VALUE read_new_reference(unsigned char **pData) { if(read_1(pData) != ERL_NEW_REF) { rb_raise(rb_eStandardError, "Invalid Type, not a new-style reference"); } int size = read_2(pData); VALUE node = read_atom(pData); VALUE creation = INT2FIX(read_1(pData)); VALUE id = rb_ary_new2(size); int i; for(i = 0; i < size; ++i) { rb_ary_store(id, i, INT2NUM(read_4(pData))); } VALUE newref_class = rb_const_get(mErlectricity, rb_intern("NewReference")); return rb_funcall(newref_class, rb_intern("new"), 3, node, creation, id); }
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)); } }