UChar buf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
enc = reg->enc;
-
- offset = 1;
- if (ONIGENC_MBC_MINLEN(enc) > 1) {
+ offset = ENC_GET_SKIP_OFFSET(enc);
+ if (offset == ENC_SKIP_OFFSET_1_OR_0) {
UChar* p = s;
while (1) {
len = enclen(enc, p);
if (p + len >= end) {
- UChar* q = p + (ONIGENC_MBC_MINLEN(enc) - 1);
- while (q > p) {
- if (*q != '\0') {
- offset = (int )(q - p + 1);
- break;
- }
- q--;
- }
+ if (len == 1) offset = 1;
+ else offset = 0;
break;
}
p += len;
}
for (p = s; p < end; ) {
+ int z;
+
clen = enclen(enc, p);
if (p + clen > end) clen = (int )(end - p);
len = (int )(end - p);
for (j = 0; j < clen; j++) {
- skip[p[j]] = len - j + (offset - 1);
+ z = len - j + (offset - 1);
+ if (z <= 0) break;
+ skip[p[j]] = z;
}
if (case_expand != 0) {
for (k = 0; k < n; k++) {
ONIGENC_CODE_TO_MBC(enc, items[k].code[0], buf);
for (j = 0; j < clen; j++) {
- int z = len - j + (offset - 1);
+ z = len - j + (offset - 1);
+ if (z <= 0) break;
if (skip[buf[j]] > z)
skip[buf[j]] = z;
}
#define ONIG_ENCODING_INIT_DEFAULT ONIG_ENCODING_ASCII
+#define ENC_SKIP_OFFSET_1_OR_0 7
+
#define ENC_FLAG_ASCII_COMPATIBLE (1<<0)
#define ENC_FLAG_UNICODE (1<<1)
#define ENC_FLAG_SKIP_OFFSET_MASK (7<<2)
#define ENC_FLAG_SKIP_OFFSET_2 (2<<2)
#define ENC_FLAG_SKIP_OFFSET_3 (3<<2)
#define ENC_FLAG_SKIP_OFFSET_4 (4<<2)
-#define ENC_FLAG_SKIP_OFFSET_1_OR_0 (7<<2)
+#define ENC_FLAG_SKIP_OFFSET_1_OR_0 (ENC_SKIP_OFFSET_1_OR_0<<2)
-#define ENC_GET_SKIP_OFFSET(flag) ((flag)>>2)
+#define ENC_GET_SKIP_OFFSET(enc) \
+ (((enc)->flag & ENC_FLAG_SKIP_OFFSET_MASK)>>2)
/* for encoding system implementation (internal) */