示例#1
0
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;
}
示例#2
0
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);
}
示例#3
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);
}
示例#4
0
文件: decode.c 项目: kenpratt/bert
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));
}
示例#5
0
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;
}
示例#6
0
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));
  }
}