int natint; /* native integer */
int unatint; /* unsigned native integer */
#endif
+ bool do_utf8 = DO_UTF8(right);
if (gimme != G_ARRAY) { /* arrange to do first one only */
/*SUPPRESS 530*/
DIE(aTHX_ "'!' allowed only after types %s", natstr);
}
star = 0;
- if (pat >= patend)
+ if (pat > patend)
len = 1;
else if (*pat == '*') {
len = strend - strbeg; /* long enough */
}
break;
case 'C':
+ unpack_C: /* unpack U will jump here if not UTF-8 */
+ if (len == 0) {
+ do_utf8 = FALSE;
+ break;
+ }
if (len > strend - s)
len = strend - s;
if (checksum) {
}
break;
case 'U':
+ if (len == 0) {
+ do_utf8 = TRUE;
+ break;
+ }
+ if (!do_utf8)
+ goto unpack_C;
if (len > strend - s)
len = strend - s;
if (checksum) {
*--in = (unsigned char)(adouble - (next * 128)) | 0x80;
if (in <= buf) /* this cannot happen ;-) */
DIE(aTHX_ "Cannot compress integer");
- in--;
adouble = next;
} while (adouble > 0);
buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */