X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FEncode%2Fencengine.c;h=255e4d789b482153d0af62057d2dc02ef0dadd6a;hb=4ac71550d23cca4632a2bcdfcb1d83a6bf705e45;hp=f31725094d7ba8949112e58884bf8e20d397a1ac;hpb=2f2b4ff2c154a8e461857f2e82cb815c238d0d94;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/Encode/encengine.c b/ext/Encode/encengine.c index f317250..255e4d7 100644 --- a/ext/Encode/encengine.c +++ b/ext/Encode/encengine.c @@ -92,69 +92,67 @@ we add a flag to re-add the removed byte to the source we could handle #include "encode.h" int -do_encode(encpage_t *enc, const U8 *src, STRLEN *slen, U8 *dst, STRLEN dlen, STRLEN *dout) +do_encode(const encpage_t * enc, const U8 * src, STRLEN * slen, U8 * dst, + STRLEN dlen, STRLEN * dout, int approx, const U8 *term, STRLEN tlen) { - const U8 *s = src; - const U8 *send = s+*slen; - const U8 *last = s; - U8 *d = dst; - U8 *dend = d+dlen; - int code = 0; - while (s < send) - { - encpage_t *e = enc; - U8 byte = *s; - while (byte > e->max) - e++; - if (byte >= e->min && e->slen) - { - const U8 *cend = s + e->slen; - if (cend <= send) - { - STRLEN n; - if ((n = e->dlen)) - { - const U8 *out = e->seq+n*(byte - e->min); - U8 *oend = d+n; - if (dst) - { - if (oend <= dend) - { - while (d < oend) - *d++ = *out++; + const U8 *s = src; + const U8 *send = s + *slen; + const U8 *last = s; + U8 *d = dst; + U8 *dend = d + dlen, *dlast = d; + int code = 0; + while (s < send) { + const encpage_t *e = enc; + U8 byte = *s; + while (byte > e->max) + e++; + if (byte >= e->min && e->slen && (approx || !(e->slen & 0x80))) { + const U8 *cend = s + (e->slen & 0x7f); + if (cend <= send) { + STRLEN n; + if ((n = e->dlen)) { + const U8 *out = e->seq + n * (byte - e->min); + U8 *oend = d + n; + if (dst) { + if (oend <= dend) { + while (d < oend) + *d++ = *out++; } - else - { - /* Out of space */ - code = ENCODE_NOSPACE; - break; + else { + /* Out of space */ + code = ENCODE_NOSPACE; + break; } - } - else - d = oend; + } + else + d = oend; + } + enc = e->next; + s++; + if (s == cend) { + if (approx && (e->slen & 0x80)) + code = ENCODE_FALLBACK; + last = s; + if (term && (STRLEN)(d-dlast) == tlen && memEQ(dlast, term, tlen)) { + code = ENCODE_FOUND_TERM; + break; + } + dlast = d; + } } - enc = e->next; - s++; - if (s == cend) - last = s; - } - else - { - /* partial source character */ - code = ENCODE_PARTIAL; - break; - } + else { + /* partial source character */ + code = ENCODE_PARTIAL; + break; + } + } + else { + /* Cannot represent */ + code = ENCODE_NOREP; + break; } - else - { - /* Cannot represent */ - code = ENCODE_NOREP; - break; } - } - *slen = last - src; - *dout = d - dst; - return code; + *slen = last - src; + *dout = d - dst; + return code; } - -