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;
}