/* 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)); } } }
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); }
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); }
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 }
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); }
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 } } }
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; }
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 }
/* * 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); }
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; }