Method: TextSentencer#segment

Defined in:
ext/text_sentencer_c/text_sentencer.c

#segment(rb_text) ⇒ Object



416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
# File 'ext/text_sentencer_c/text_sentencer.c', line 416

VALUE text_sentencer_segment(VALUE self, VALUE rb_text) {
  TextSentencer *ts;
  TypedData_Get_Struct(self, TextSentencer, &text_sentencer_type, ts);

  Check_Type(rb_text, T_STRING);
  const char *text = StringValueCStr(rb_text);

  long *segment_starts = NULL;
  long *segment_ends = NULL;
  long num_segments = 0;

  struct segment_args args = {ts, text, segment_starts, segment_ends, num_segments};
  rb_thread_call_without_gvl(segment_without_gvl, &args, RUBY_UBF_IO, NULL);

  VALUE segments = rb_ary_new();
  for (long i = 0; i < args.num_segments; ++i) {
    VALUE segment = rb_ary_new();
    rb_ary_push(segment, LONG2NUM(args.segment_starts[i]));
    rb_ary_push(segment, LONG2NUM(args.segment_ends[i]));
    rb_ary_push(segments, segment);
  }

  free(args.segment_starts);
  free(args.segment_ends);

  return segments;
}