static MVMint32 find_separator(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 *sep_length) { MVMint32 sep_loc = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; while (cur_chars) { MVMint32 start = cur_chars == ds->chars_head ? ds->chars_head_pos : 0; MVMint32 i, j; for (i = start; i < cur_chars->length; i++) { MVMint32 sep_graph_pos = 0; MVMGrapheme32 cur_char = cur_chars->chars[i]; sep_loc++; for (j = 0; j < sep_spec->num_seps; j++) { if (sep_spec->sep_graphemes[sep_graph_pos] == cur_char) { if (sep_spec->sep_lengths[j] == 1) { *sep_length = 1; return sep_loc; } else if (have_separator(tc, cur_chars, i + 1, sep_spec, j, sep_graph_pos + 1)) { *sep_length = sep_spec->sep_lengths[j]; sep_loc += sep_spec->sep_lengths[j] - 1; return sep_loc; } } sep_graph_pos += sep_spec->sep_lengths[j]; } } cur_chars = cur_chars->next; } return 0; }
static MVMint32 find_separator(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 *sep_length, int eof) { MVMint32 sep_loc = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; /* First, skip over any buffers we need not consider. */ MVMint32 max_sep_length = sep_spec->max_sep_length; while (cur_chars && cur_chars->next) { if (cur_chars->next->length < max_sep_length) break; sep_loc += cur_chars->length; cur_chars = cur_chars->next; } /* Now scan for the separator. */ while (cur_chars) { MVMint32 i, j; MVMint32 start; if (eof) { start = cur_chars == ds->chars_head ? ds->chars_head_pos : 0; } else { start = cur_chars->length - max_sep_length; if (cur_chars == ds->chars_head) { if (start >= ds->chars_head_pos) sep_loc += start - ds->chars_head_pos; else start = ds->chars_head_pos; } else { if (start >= 0) sep_loc += start; else start = 0; } } for (i = start; i < cur_chars->length; i++) { MVMint32 sep_graph_pos = 0; MVMGrapheme32 cur_char = cur_chars->chars[i]; sep_loc++; for (j = 0; j < sep_spec->num_seps; j++) { if (sep_spec->sep_graphemes[sep_graph_pos] == cur_char) { if (sep_spec->sep_lengths[j] == 1) { *sep_length = 1; return sep_loc; } else if (have_separator(tc, cur_chars, i + 1, sep_spec, j, sep_graph_pos + 1)) { *sep_length = sep_spec->sep_lengths[j]; sep_loc += sep_spec->sep_lengths[j] - 1; return sep_loc; } } sep_graph_pos += sep_spec->sep_lengths[j]; } } cur_chars = cur_chars->next; } return 0; }