{ 0, NULL, 0, 0 }
};
+#define MB_RETURN { \
+ *newpos = pos; \
+ mbseq[mbpos] = '\0'; \
+ *mbseqlen = mbpos; \
+ return this_char; }
+
+#define MB_WRITE(mbchar) { \
+ mbspace--; \
+ if (mbspace == 0) { \
+ MB_RETURN; \
+ } \
+ mbseq[mbpos++] = (mbchar); }
/* {{{ get_next_char
*/
inline static unsigned short get_next_char(enum entity_charset charset,
- unsigned char *str,
- int *newpos,
- unsigned char *mbseq,
- int *mbseqlen
-)
+ unsigned char * str,
+ int * newpos,
+ unsigned char * mbseq,
+ int * mbseqlen)
{
int pos = *newpos;
int mbpos = 0;
+ int mbspace = *mbseqlen;
unsigned short this_char = str[pos++];
- mbseq[mbpos++] = (unsigned char)this_char;
+ if (mbspace <= 0) {
+ *mbseqlen = 0;
+ return this_char;
+ }
+
+ MB_WRITE((unsigned char)this_char);
switch(charset) {
case cs_utf_8:
if (more)
{
this_char = str[pos++];
- mbseq[mbpos++] = (unsigned char)this_char;
+ MB_WRITE((unsigned char)this_char);
}
} while(more);
}
{
/* yes, this a wide char */
this_char <<= 8;
- mbseq[mbpos++] = next_char;
+ MB_WRITE(next_char);
this_char |= next_char;
pos++;
}
{
/* yes, this a wide char */
this_char <<= 8;
- mbseq[mbpos++] = next_char;
+ MB_WRITE(next_char);
this_char |= next_char;
pos++;
}
{
/* yes, this a jis kanji char */
this_char <<= 8;
- mbseq[mbpos++] = next_char;
+ MB_WRITE(next_char);
this_char |= next_char;
pos++;
}
{
/* JIS X 0201 kana */
this_char <<= 8;
- mbseq[mbpos++] = next_char;
+ MB_WRITE(next_char);
this_char |= next_char;
pos++;
}
{
/* JIS X 0212 hojo-kanji */
this_char <<= 8;
- mbseq[mbpos++] = next_char;
+ MB_WRITE(next_char);
this_char |= next_char;
+ pos++;
this_char <<= 8;
- mbseq[mbpos++] = next2_char;
+ MB_WRITE(next2_char);
this_char |= next2_char;
- pos+=2;
+ pos++;
}
}
break;
}
}
- *newpos = pos;
- mbseq[mbpos] = '\0';
- *mbseqlen = mbpos;
- return this_char;
+ MB_RETURN;
}
/* }}} */
i = 0;
while (i < oldlen) {
- int mbseqlen;
unsigned char mbsequence[16]; /* allow up to 15 characters in a multibyte sequence */
+ int mbseqlen = sizeof(mbsequence);
unsigned short this_char = get_next_char(charset, old, &i, mbsequence, &mbseqlen);
matches_map = 0;