/* Takes one or more code points. If only one code point is passed, it is * returned as the grapheme. Otherwise, resolves it to a synthetic - either an * already existing one if we saw it before, or a new one if not. Assumes * that the code points are already in NFC, and as such canonical ordering has * been applied. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { if (num_codes == 1) return codes[0]; else if (num_codes < MVM_GRAPHEME_MAX_CODEPOINTS) return lookup_or_add_synthetic(tc, codes, num_codes, 0); else MVM_exception_throw_adhoc(tc, "Too many codepoints (%d) in grapheme", num_codes); }
/* Initialize NFG subsystem. */ static void cache_crlf(MVMThreadContext *tc) { MVMCodepoint codes[2] = { '\r', '\n' }; tc->instance->nfg->crlf_grapheme = lookup_or_add_synthetic(tc, codes, 2, 0); }
/* Does the same as MVM_nfg_codes_to_grapheme, but flags the added grapheme as * being an UTF8-C8 synthetic. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme_utf8_c8(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { if (num_codes == 1) return codes[0]; else return lookup_or_add_synthetic(tc, codes, num_codes, 1); }
/* Gets the \r\n synthetic. */ MVMGrapheme32 MVM_nfg_crlf_grapheme(MVMThreadContext *tc) { MVMCodepoint codes[2] = { '\r', '\n' }; return lookup_or_add_synthetic(tc, codes, 2, 0); }