static int NameTokIter(XMLCH **next, int isNmToken) { int i; XMLCH *p = *next; UTF8LEN(p, i); if (isNmToken) { if (!XMLIsNameChar(p, i)) return -1; } else if (!XMLIsNameStartChar(p, i)) return -1; for (p+=i; *p && *p!=' '; p+=i) { UTF8LEN(p, i); if (!XMLIsNameChar(p, i)) return -1; } i = p - *next; (*next) += (*p) ? i+1 : i; return i; }
int str_utf8_len(const char* p_str) { char* str = (char*) p_str; int clen = strlen(p_str); int len = 0; for(char *ptr = str; *ptr != 0 && len < clen; len++, ptr += UTF8LEN(((unsigned char)*ptr)) ); return len; }
size_t UTF8BufToLatin1(XMLCH *buf, XMLCH *end) { int c, len; XMLCH *o, *l; o = l = buf; for (len=0; *buf && buf!=end; buf+=len, o++) { len = UTF8LEN(*buf); if (len==1) *o = *buf; else if (len==2) { c = (*buf & 0x1F) << 6; c |= buf[1] & 0x3F; *o = (c>0xFF) ? NONLAT : (XMLCH)c; } else *o = NONLAT; } return o-l; }
int str_utf8_char_len(unsigned char ch) { return (int)(UTF8LEN((ch))); }