class Buffer

Constants

VERSION

Attributes

data[R]

Public Class Methods

from(p1) click to toggle source
VALUE method_buffer_from(VALUE klass, VALUE val) {
  if (TYPE(val) == T_STRING) {
    char* ptr = StringValueCStr(val);
    VALUE obj = rb_funcall(kBuffer, rb_intern("new"), 1, SIZET2NUM(strlen(ptr) + 1));
    VALUE data = rb_iv_get(obj, "@data");
    char* buf_ptr = internal_buffer_data_get(data)->buffer;
    memcpy(buf_ptr, ptr, strlen(ptr) + 1);
    return obj;
  }

  if (TYPE(val) == T_ARRAY) {
    long len = RARRAY_LEN(val);
    VALUE obj = rb_funcall(kBuffer, rb_intern("new"), 1, LONG2NUM(len));
    VALUE data = rb_iv_get(obj, "@data");
    char* buf_ptr = internal_buffer_data_get(data)->buffer;
    for (long i = 0; i < len; i++) {
      VALUE num = rb_ary_entry(val, i);
      buf_ptr[i] = NUM2CHR(num);
    }
    return obj;
  }

  return Qnil;
}
new(p1) click to toggle source
VALUE method_buffer_init(VALUE self, VALUE size) {
  VALUE data = internal_buffer_data_malloc(NUM2SIZET(size));
  rb_iv_set(self, "@data", data);
  return self;
}

Public Instance Methods

bytes() click to toggle source
VALUE method_buffer_bytes(VALUE self) {
  VALUE data = rb_iv_get(self, "@data");
  struct buffer_data* buffer = internal_buffer_data_get(data);
  VALUE result = rb_ary_new2(buffer->buffer_size);
  for (size_t i = 0; i < buffer->buffer_size; i++) {
    rb_ary_store(result, i, CHR2FIX(buffer->buffer[i])); // # TODO: Why there is no CHR2NUM?
  }
  return result;
}
clear() click to toggle source
VALUE method_buffer_clear(VALUE self) {
  VALUE payload = rb_iv_get(self, "@data");
  struct buffer_data* data = internal_buffer_data_get(payload);
  memset(data->buffer, 0, data->buffer_size);
  return self;
}
resize(p1) click to toggle source
VALUE method_buffer_resize(VALUE self, VALUE size) {
  VALUE data = rb_iv_get(self, "@data");
  internal_buffer_data_realloc(data, NUM2SIZET(size));
  return self;
}
size() click to toggle source
VALUE method_buffer_buffer_size(VALUE self) {
  VALUE data = rb_iv_get(self, "@data");

  return SIZET2NUM(internal_buffer_data_get(data)->buffer_size);
}
to_s() click to toggle source
VALUE method_buffer_to_s(VALUE self) {
  // FIXME: What if a buffer doesn't have a NUL terminator?
  VALUE data = rb_iv_get(self, "@data");

  return rb_str_buf_new2(internal_buffer_data_get(data)->buffer);
}