changeset 6214:0716cb7258dd draft

(svn r9011) -Codechange (r9003): Rework Utf8PrevChar so that it returns a pointer to the previous UTF8 character's first byte instead of a byte-length offset
author Darkvater <Darkvater@openttd.org>
date Mon, 05 Mar 2007 00:34:48 +0000
parents 1625f839e124
children 8e906f3312ec
files src/misc_gui.cpp src/string.h
diffstat 2 files changed, 20 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc_gui.cpp
+++ b/src/misc_gui.cpp
@@ -804,17 +804,21 @@
 	WChar c;
 	uint width;
 	size_t len;
+	char *s = tb->buf + tb->caretpos;
 
-	if (backspace) tb->caretpos -= Utf8PrevCharLen(tb->buf + tb->caretpos);
+	if (backspace) s = Utf8PrevChar(s);
 
-	len = Utf8Decode(&c, tb->buf + tb->caretpos);
+	len = Utf8Decode(&c, s);
 	width = GetCharacterWidth(FS_NORMAL, c);
 
 	tb->width  -= width;
-	if (backspace) tb->caretxoffs -= width;
+	if (backspace) {
+		tb->caretpos   -= len;
+		tb->caretxoffs -= width;
+	}
 
 	/* Move the remaining characters over the marker */
-	memmove(tb->buf + tb->caretpos, tb->buf + tb->caretpos + len, tb->length - tb->caretpos - len + 1);
+	memmove(s, s + len, tb->length - (s - tb->buf) - len + 1);
 	tb->length -= len;
 }
 
@@ -887,9 +891,9 @@
 	case WKC_LEFT:
 		if (tb->caretpos != 0) {
 			WChar c;
-
-			tb->caretpos -= Utf8PrevCharLen(tb->buf + tb->caretpos);
-			Utf8Decode(&c, tb->buf + tb->caretpos);
+			const char *s = Utf8PrevChar(tb->buf + tb->caretpos);
+			Utf8Decode(&c, s);
+			tb->caretpos    = s - tb->buf; // -= (tb->buf + tb->caretpos - s)
 			tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c);
 
 			return true;
--- a/src/string.h
+++ b/src/string.h
@@ -107,25 +107,17 @@
 }
 
 /**
- * Retrieve the (partial) length of the previous UNICODE character
- * in an UTF-8 encoded string.
- * @param s char pointer pointing to the first char of the next character
- * @returns the decoded length in bytes (size) of the UNICODE character
- * that was just before the one where 's' is pointing to
- * @note If 's' is not pointing to the first byte of the next UNICODE character
- * only a partial length of the sequence will be returned.
- * For example given this sequence: 0xE3 0x85 0x80, 0xE3 0x81 0x9E
- * 1. 's' is pointing to the second 0xE3, return value is 3
- * 2. 's' is pointing to 0x80, return value is 2.
- * So take care with the return values of this function. To get the real length
- * for an (invalid) sequence, pass the string offset of this function's return
- * value to Utf8EncodedCharLen() or Utf8Decode()
+ * Retrieve the previous UNICODE character in an UTF-8 encoded string.
+ * @param s char pointer pointing to (the first char of) the next character
+ * @returns a pointer in 's' to the previous UNICODE character's first byte
+ * @note The function should not be used to determine the length of the previous
+ * encoded char because it might be an invalid/corrupt start-sequence
  */
-static inline size_t Utf8PrevCharLen(const char *s)
+static inline char *Utf8PrevChar(const char *s)
 {
-	size_t len = 1;
-	while (IsUtf8Part(*--s)) len++;
-	return len;
+	const char *ret = s;
+	while (IsUtf8Part(*--ret));
+	return (char*)ret;
 }