--- a/src/utils/utf8iter.h
+++ b/src/utils/utf8iter.h
@@ -16,7 +16,7 @@
*/
#ifndef _UTF8ITER_H_INCLUDED_
#define _UTF8ITER_H_INCLUDED_
-/* @(#$Id: utf8iter.h,v 1.6 2006-01-30 11:15:28 dockes Exp $ (C) 2004 J.F.Dockes */
+/* @(#$Id: utf8iter.h,v 1.7 2006-11-17 12:31:34 dockes Exp $ (C) 2004 J.F.Dockes */
/**
* A small helper class to iterate over utf8 strings. This is not an
@@ -27,7 +27,6 @@
unsigned int cl; // Char length at current position if known
const string &s; // String we're working with
string::size_type pos; // Current position in string
- bool bad; // Status
unsigned int m_charpos; // Current character posiiton
// Get character byte length at specified position
@@ -55,11 +54,8 @@
// Update current char length in object state. Assumes pos is inside string
inline int compute_cl() {
cl = 0;
- if (bad)
- return -1;
cl = get_cl(pos);
if (!poslok(pos, cl)) {
- bad = true;
pos = s.length();
cl = 0;
return -1;
@@ -96,10 +92,14 @@
}
public:
Utf8Iter(const string &in)
- : cl(0), s(in), pos(0), bad(false), m_charpos(0) {}
+ : cl(0), s(in), pos(0), m_charpos(0)
+ {
+ // Ensure state is ok if appendchartostring is called at once
+ compute_cl();
+ }
void rewind() {
- cl=0; pos=0; bad=false; m_charpos=0;
+ cl=0; pos=0; m_charpos=0;
}
/** operator* returns the ucs4 value as a machine integer*/
unsigned int operator*() {
@@ -107,7 +107,6 @@
return (unsigned int)-1;
unsigned int val = getvalueat(pos, cl);
if (val == (unsigned int)-1) {
- bad = true;
pos = s.length();
cl = 0;
}
@@ -137,7 +136,7 @@
/** Set current position before next utf-8 character */
string::size_type operator++(int) {
- if (bad || (!cl && compute_cl() < 0)) {
+ if (!cl && compute_cl() < 0) {
return pos = string::npos;
}
pos += cl;
@@ -145,16 +144,12 @@
cl = 0;
return pos;
}
-
- bool appendchartostring(string &out) {
- if (bad || (!cl && compute_cl() < 0)) {
- return false;
- }
- out += s.substr(pos, cl);
- return true;
+ /** This needs to be fast. No error checking. */
+ void appendchartostring(string &out) {
+ out.append(&s[pos], cl);
}
operator string() {
- if (bad || (!cl && compute_cl() < 0)) {
+ if (!cl && compute_cl() < 0) {
return std::string("");
}
return s.substr(pos, cl);
@@ -165,7 +160,7 @@
return pos == s.length();
}
bool error() {
- return bad;
+ return compute_cl() < 0;
}
string::size_type getBpos() const {
return pos;