Exemple #1
0
/* Read using an internal buffer to avoid system calls */
static VALUE buffered_file_read(VALUE self, VALUE arg_length) {
  long length = FIX2INT(arg_length);
  VALUE buffer = rb_ivar_get(self, id_ivar_buffer);
  long buffer_length = RSTRING_LEN(buffer);
  long buffer_index = FIX2INT(rb_ivar_get(self, id_ivar_buffer_index));
  VALUE result = Qnil;
  VALUE super_arg = Qnil;

  if (length <= (buffer_length - buffer_index)) {
    /* Return part of the buffer without having to go to the OS */
    result = rb_str_substr(buffer, buffer_index, length);
    buffer_index += length;
    rb_ivar_set(self, id_ivar_buffer_index, INT2FIX(buffer_index));
    return result;
  } else if (length > BUFFER_SIZE) {
    /* Reading more than our buffer */
    if (buffer_length > 0) {
      if (buffer_index > 0) {
        rb_funcall(buffer, id_method_slice_bang, 1, rb_range_new(INT2FIX(0), INT2FIX(buffer_index - 1), Qfalse));
        buffer_length = RSTRING_LEN(buffer);
        buffer_index = 0;
        rb_ivar_set(self, id_ivar_buffer_index, INT2FIX(0));
      }
      super_arg = INT2FIX(length - buffer_length);
      rb_str_append(buffer, rb_funcall(rb_call_super(1, &super_arg), id_method_to_s, 0));
      return rb_funcall(buffer, id_method_slice_bang, 1, rb_const_get(cBufferedFile, id_const_ALL_RANGE));
    } else {
      return rb_call_super(1, &arg_length);
    }
  } else {
    /* Read into the buffer */
    if (buffer_index > 0) {
      rb_funcall(buffer, id_method_slice_bang, 1, rb_range_new(INT2FIX(0), INT2FIX(buffer_index - 1), Qfalse));
      buffer_length = RSTRING_LEN(buffer);
      buffer_index = 0;
      rb_ivar_set(self, id_ivar_buffer_index, INT2FIX(0));
    }
    super_arg = INT2FIX(BUFFER_SIZE - buffer_length);
    rb_str_append(buffer, rb_funcall(rb_call_super(1, &super_arg), id_method_to_s, 0));
    buffer_length = RSTRING_LEN(buffer);
    if (buffer_length <= 0) {
      return Qnil;
    }

    if (length <= buffer_length) {
      result = rb_str_substr(buffer, buffer_index, length);
      buffer_index += length;
      rb_ivar_set(self, id_ivar_buffer_index, INT2FIX(buffer_index));
      return result;
    } else {
      return rb_funcall(buffer, id_method_slice_bang, 1, rb_const_get(cBufferedFile, id_const_ALL_RANGE));
    }
  }
}
Exemple #2
0
static void hash_set_range(VALUE hash, const char *sym,
                           unsigned int start, unsigned int end) {
    VALUE r;

    r = rb_range_new(INT2NUM(start), INT2NUM(end), 0);
    hash_set(hash, sym, r);
}
Exemple #3
0
VALUE range_spec_rb_range_new(int argc, VALUE* argv, VALUE self) {
  int exclude_end = 0;
  if(argc == 3) {
    exclude_end = RTEST(argv[2]);
  }
  return rb_range_new(argv[0], argv[1], exclude_end);
}
Exemple #4
0
static VALUE // bug?
rb_csa_search_l(VALUE self, VALUE oc, VALUE range)
{
    CSA *sa = csa_ptr(self);
    i64 ll,rr;
    int c;
    i64 ret;

    c = FIX2INT(oc);
#if USE_RANGE
    ll = FIX2LONG(range_first(range));
    rr = FIX2LONG(range_last(range));  if (range_exclude_end_p(range) == Qtrue) rr--;
#else
    if (RALEN(range) != 2) {
      return Qnil;
    }
    ll = FIX2LONG(RAPTR(range)[0]);
    rr = FIX2LONG(RAPTR(range)[1]);
#endif
    ret = sa->searchsub(c, sa, &ll, &rr);
    if (ret == -1) return Qnil;

#if USE_RANGE
    return rb_range_new(LONG2FIX(ll), LONG2FIX(rr), Qnil);
#else
    return rb_ary_new3(2, LONG2FIX(ll), LONG2FIX(rr));
#endif
}
Exemple #5
0
static VALUE
range_relative_to(VALUE range, SEL sel, VALUE max)
{
    long beg, len, m = NUM2LONG(max);
    rb_range_beg_len(range, &beg, &len, m, 0);
    return rb_range_new(LONG2NUM(beg), LONG2NUM(beg + len - 1), 0);
}
Exemple #6
0
static VALUE
rb_csa_child_l(VALUE self, VALUE range)
{
    CSA *sa = csa_ptr(self);
    i64 l,r,ll,rr;
    int c,i;
    VALUE charset;
    i64 ret;

#if USE_RANGE
    ll = FIX2LONG(range_first(range));
    rr = FIX2LONG(range_last(range));  if (range_exclude_end_p(range) == Qtrue) rr--;
#else
    if (RALEN(range) != 2) {
      return Qnil;
    }
    ll = FIX2LONG(RAPTR(range)[0]);
    rr = FIX2LONG(RAPTR(range)[1]);
#endif
    l = r = -1;

    if (!rb_block_given_p()) charset = rb_ary_new();
    for (i=0; i<sa->m; i++) {
      c = sa->AtoC[i];
      l = ll;  r = rr;
      ret = sa->searchsub(c, sa, &l, &r);
      if (ret == 0) {
        if (rb_block_given_p()) {
            rb_yield(rb_ary_new3(2,INT2FIX(c),
#if USE_RANGE
                     rb_range_new(LONG2FIX(l), LONG2FIX(r), Qnil)));
#else
                     rb_ary_new3(2,LONG2FIX(l),LONG2FIX(r))));
#endif
        } else {
          rb_ary_push(charset,
            rb_ary_new3(2,INT2FIX(c),
#if USE_RANGE
            rb_range_new(LONG2FIX(l), LONG2FIX(r), Qnil)));
#else
            rb_ary_new3(2,LONG2FIX(l),LONG2FIX(r))));
#endif
        }
      }
    }
Exemple #7
0
VALUE
rb_range_new2(VALUE beg, VALUE end, int exclude_end, int retain)
{
    VALUE range = rb_range_new(beg, end, exclude_end);
    if (retain) {
	GC_RETAIN(range);
    }
    return range;
}
static VALUE
cr_image_surface_ca (VALUE self)
{
  volatile VALUE obj;
  int32_t  dim[3];
  int      format, width, height, width0;
  unsigned char *data;
  cairo_surface_t *surface;

  Data_Get_Struct (self, cairo_surface_t, surface);

  format = cairo_image_surface_get_format(surface);
  width  = cairo_image_surface_get_width(surface);
  height = cairo_image_surface_get_height(surface);
  data   = cairo_image_surface_get_data(surface);

  switch ( format ) {
  case CAIRO_FORMAT_ARGB32:
  case CAIRO_FORMAT_RGB24:
    dim[0] = height;
    dim[1] = width;
    dim[2] = 4;
    obj = rb_carray_wrap_ptr(CA_UINT8, 3, dim, 0, NULL, (char *)data, self);
    if ( ca_endian == CA_LITTLE_ENDIAN ) {
      obj = rb_funcall(obj, rb_intern("[]"), 2, 
                                 Qfalse, 
                                 rb_range_new(INT2FIX(-1),INT2FIX(0),0));
    }
    break;
  case CAIRO_FORMAT_A8:
    width0 = width + (CA_ALIGN_VOIDP - width % CA_ALIGN_VOIDP);
    dim[0] = height;
    dim[1] = width0;
    obj = rb_carray_wrap_ptr(CA_UINT8, 2, dim, 0, NULL, (char *)data, self);
    obj = rb_funcall(obj, rb_intern("[]"), 2, 
                                 Qnil, 
                                 rb_range_new(INT2FIX(0),INT2NUM(width), 1));
    break;
  case CAIRO_FORMAT_A1:
    rb_raise(rb_eRuntimeError, "can't wrap CAIRO_FORMAT_A1 data by CArray");
  }
  return obj;
}
Exemple #9
0
static VALUE
rb_csa_search(VALUE self, VALUE okey)
{
    CSA *sa = csa_ptr(self);
    i64 n, l, keylen;
    i64 i[2];
    uchar *key;

    key = StringValueCStr(okey);
    keylen = RSLEN(okey);

    if (sa->search(key, keylen, sa, &i[0], &i[1]) < keylen) return Qnil;

#if USE_RANGE
    return rb_range_new(LONG2FIX(i[0]), LONG2FIX(i[1]), Qnil);
#else
    return rb_ary_new3(2, LONG2FIX(i[0]), LONG2FIX(i[1]));
#endif
}
Exemple #10
0
/*
 * Initialize methods for BufferedFile
 */
void Init_buffered_file(void)
{
  id_ivar_buffer = rb_intern("@buffer");
  id_ivar_buffer_index = rb_intern("@buffer_index");
  id_method_clear = rb_intern("clear");
  id_method_slice_bang = rb_intern("slice!");
  id_method_to_s = rb_intern("to_s");
  id_method_pos = rb_intern("pos");
  id_const_BUFFER_SIZE = rb_intern("BUFFER_SIZE");
  id_const_ALL_RANGE = rb_intern("ALL_RANGE");
  BUFFERED_FILE_SEEK_SET = rb_const_get(rb_cIO, rb_intern("SEEK_SET"));
  BUFFERED_FILE_SEEK_CUR = rb_const_get(rb_cIO, rb_intern("SEEK_CUR"));

  mCosmos = rb_define_module("Cosmos");
  cBufferedFile = rb_define_class_under(mCosmos, "BufferedFile", rb_cFile);
  rb_const_set(cBufferedFile, id_const_BUFFER_SIZE, INT2FIX(BUFFER_SIZE));
  rb_const_set(cBufferedFile, id_const_ALL_RANGE, rb_range_new(INT2FIX(0), INT2FIX(-1), Qfalse));

  rb_define_method(cBufferedFile, "initialize", buffered_file_initialize, -1);
  rb_define_method(cBufferedFile, "read", buffered_file_read, 1);
  rb_define_method(cBufferedFile, "seek", buffered_file_seek, -1);
  rb_define_method(cBufferedFile, "pos", buffered_file_pos, 0);
}
VALUE _getSelection(VALUE self)
{
	return rb_range_new(UINT2NUM(_self->getSelectionStartIndex()),UINT2NUM(_self->getSelectionEndIndex()),0);
}
Exemple #12
0
static VALUE
tre_traverse(VALUE pattern, VALUE string, long char_offset, VALUE params,
		VALUE ignore_case, VALUE multi_line, int num_captures, VALUE repeat) {

	// Compile once
	regex_t preg;
	tre_compile_regex(&preg, pattern, ignore_case, multi_line);

	// Build regaparams
	regaparams_t aparams;
	tre_build_aparams(&aparams, params);

	// Match data
	regamatch_t match;
	regmatch_t pmatch[num_captures + 1];
	// memset(&match, 0, sizeof(match));
	match.nmatch = num_captures + 1;
	match.pmatch = pmatch;

	// Scan
	VALUE arr = rb_ary_new();
	long char_offset_acc = char_offset;
	// rb_global_variable(&arr);

	while (1) {
		// Get substring to start with
		long char_len = CHAR_LENGTH(string) - char_offset;
		if (char_len <= 0) break;
		string = rb_str_substr(string, char_offset, char_len);

		int result = tre_reganexec(&preg, StringValuePtr(string), 
											RSTRING_LEN(string), &match, aparams, 0);

		if (result == REG_NOMATCH) break;

		// Fill in array with ranges
		VALUE subarr;
		if (match.nmatch == 1) 
			subarr = arr;	// Faking.. kind of.
		else {
			subarr = rb_ary_new();
			// rb_global_variable(&subarr);
		}

		unsigned int i;
		for (i = 0; i < match.nmatch; ++i)
			// No match
			if (match.pmatch[i].rm_so == -1)
				rb_ary_push(subarr, Qnil);
			// Match => Range
			else {
				VALUE range = rb_range_new(
						LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_so) ),
						LONG2NUM( char_offset_acc + BYTE_TO_CHAR(string, match.pmatch[i].rm_eo) ),
						1);
				// rb_global_variable(&range);

				rb_ary_push(subarr, range);
			}
		if (match.nmatch > 1) rb_ary_push(arr, subarr);

		// Stop or proceed
		if (repeat == Qfalse)
			break;
		else {
			char_offset = BYTE_TO_CHAR(string, match.pmatch[0].rm_eo);
			if (char_offset == 0) char_offset = 1; // Weird case
			char_offset_acc += char_offset;
		}
	}

	// Free once
	tre_regfree(&preg);

	return arr;
}