/* * call-seq: * sarray.all_starts(character) -> Array * * Returns an array containing all the indexes into the source that start * with the given character. This is a very fast operation since the * SuffixArray already knows where each character starts and ends in the * suffix array structure internally. All it does is copy the range of * the suffix array for that region. */ static VALUE SuffixArray_all_starts(VALUE self, VALUE character) { SuffixArray *sa = NULL; Data_Get_Struct(self, SuffixArray, sa); VALUE result = rb_ary_new(); VALUE char_str = StringValue(character); // must be at least one length if(RSTRING(char_str)->len > 0) { char ch = RSTRING(char_str)->ptr[0]; // go through all the suffix array indices as indicated by sa->starts and sa->ends size_t start = 0; for(start = sa->starts[ch]; start <= sa->ends[ch]; start++) { rb_ary_push(result, INT2FIX(sa->suffix_index[start])); } } return result; }