Beispiel #1
0
VALUE rb_thrift_memory_buffer_read_into_buffer(VALUE self, VALUE buffer_value, VALUE size_value) {
  int i = 0;
  int size = FIX2INT(size_value);
  int index;
  VALUE buf = GET_BUF(self);

  while (i < size) {
    index = FIX2INT(rb_ivar_get(self, index_ivar_id));
    if (index >= RSTRING_LEN(buf)) {
      rb_raise(rb_eEOFError, "Not enough bytes remain in memory buffer");
    }
    char byte = RSTRING_PTR(buf)[index++];
    rb_ivar_set(self, index_ivar_id, INT2FIX(index));

    if (index >= GARBAGE_BUFFER_SIZE) {
      rb_ivar_set(self, buf_ivar_id, rb_funcall(buf, slice_method_id, 2, INT2FIX(index), INT2FIX(RSTRING_LEN(buf) - 1)));
      index = 0;
    }

    if (i >= RSTRING_LEN(buffer_value)) {
      rb_raise(rb_eIndexError, "index %d out of string", i);
    }
    ((char*)RSTRING_PTR(buffer_value))[i] = byte;
    i++;
  }
  return INT2FIX(i);
}
Beispiel #2
0
VALUE rb_thrift_memory_buffer_read(VALUE self, VALUE length_value) {
  int length = FIX2INT(length_value);
  
  VALUE index_value = rb_ivar_get(self, index_ivar_id);
  int index = FIX2INT(index_value);
  
  VALUE buf = GET_BUF(self);
  VALUE data = rb_funcall(buf, slice_method_id, 2, index_value, length_value);
  
  index += length;
  if (index > RSTRING_LEN(buf)) {
    index = RSTRING_LEN(buf);
  }
  if (index >= GARBAGE_BUFFER_SIZE) {
    rb_ivar_set(self, buf_ivar_id, rb_funcall(buf, slice_method_id, 2, INT2FIX(index), INT2FIX(RSTRING_LEN(buf) - 1)));
    index = 0;
  }

  if (RSTRING_LEN(data) < length) {
    rb_raise(rb_eEOFError, "Not enough bytes remain in memory buffer");
  }

  rb_ivar_set(self, index_ivar_id, INT2FIX(index));
  return data;
}
Beispiel #3
0
VALUE rb_thrift_memory_buffer_read_byte(VALUE self) {
  VALUE index_value = rb_ivar_get(self, index_ivar_id);
  int index = FIX2INT(index_value);

  VALUE buf = GET_BUF(self);
  if (index >= RSTRING_LEN(buf)) {
    rb_raise(rb_eEOFError, "Not enough bytes remain in memory buffer");
  }
  char byte = RSTRING_PTR(buf)[index++];
  rb_ivar_set(self, index_ivar_id, INT2FIX(index));

  if (index >= GARBAGE_BUFFER_SIZE) {
    rb_ivar_set(self, buf_ivar_id, rb_funcall(buf, slice_method_id, 2, INT2FIX(index), INT2FIX(RSTRING_LEN(buf) - 1)));
    index = 0;
  }
  int result = (int) byte;
  return INT2FIX(result);
}
Beispiel #4
0
VALUE rb_thrift_memory_buffer_write(VALUE self, VALUE str) {
  VALUE buf = GET_BUF(self);
  rb_str_buf_cat(buf, RSTRING_PTR(str), RSTRING_LEN(str));
  return Qnil;
}