int rb_enc_precise_mbclen(const char *p, const char *e, rb_encoding *enc) { int n; if (e <= p) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(1); n = ONIGENC_PRECISE_MBC_ENC_LEN(enc, (UChar*)p, (UChar*)e); if (e-p < n) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(n-(int)(e-p)); return n; }
int Encoding::precise_mbclen(const uint8_t* p, const uint8_t* e, OnigEncodingType* enc) { int n; if (e <= p) { return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(1); } n = ONIGENC_PRECISE_MBC_ENC_LEN(enc, (UChar*)p, (UChar*)e); if (e-p < n) { return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(n-(int)(e-p)); } return n; }
static int mbc_enc_len(const UChar* p, const UChar* e, OnigEncoding enc ARG_UNUSED) { int firstbyte = *p++; state_t s; s = trans[0][firstbyte]; if (s < 0) return s == ACCEPT ? ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(1) : ONIGENC_CONSTRUCT_MBCLEN_INVALID(); if (p == e) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(EncLen_EUCJP[firstbyte]-1); s = trans[s][*p++]; if (s < 0) return s == ACCEPT ? ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(2) : ONIGENC_CONSTRUCT_MBCLEN_INVALID(); if (p == e) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(EncLen_EUCJP[firstbyte]-2); s = trans[s][*p++]; return s == ACCEPT ? ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(3) : ONIGENC_CONSTRUCT_MBCLEN_INVALID(); }
static int utf16le_mbc_enc_len(const UChar* p, const OnigUChar* e, OnigEncoding enc ARG_UNUSED) { int len = e-p, byte; if (len < 2) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(1); byte = p[1]; if (!UTF16_IS_SURROGATE(byte)) { return ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(2); } if (UTF16_IS_SURROGATE_FIRST(byte)) { if (len < 4) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(4-len); if (UTF16_IS_SURROGATE_SECOND(p[3])) return ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(4); } return ONIGENC_CONSTRUCT_MBCLEN_INVALID(); }
static int euctw_mbc_enc_len(const UChar* p, const UChar* e, OnigEncoding enc ARG_UNUSED) { int firstbyte = *p++; state_t s = trans[0][firstbyte]; #define RETURN(n) \ return s == ACCEPT ? ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(n) : \ ONIGENC_CONSTRUCT_MBCLEN_INVALID() if (s < 0) RETURN(1); if (p == e) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(EncLen_EUCTW[firstbyte]-1); s = trans[s][*p++]; if (s < 0) RETURN(2); if (p == e) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(4-2); s = trans[s][*p++]; if (s < 0) RETURN(3); if (p == e) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(4-3); s = trans[s][*p++]; RETURN(4); #undef RETURN }
static int big5_mbc_enc_len0(const UChar* p, const UChar* e, int tridx, const int tbl[]) { int firstbyte = *p++; state_t s = trans[tridx][firstbyte]; #define RETURN(n) \ return s == ACCEPT ? ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(n) : \ ONIGENC_CONSTRUCT_MBCLEN_INVALID() if (s < 0) RETURN(1); if (p == e) return ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(tbl[firstbyte]-1); s = trans[s][*p++]; RETURN(2); #undef RETURN }