[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52021] trunk/blender/source/blender: fix [#33121] crashing when srolling down in text editor !

Campbell Barton ideasman42 at gmail.com
Fri Nov 9 04:36:41 CET 2012


Revision: 52021
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52021
Author:   campbellbarton
Date:     2012-11-09 03:36:38 +0000 (Fri, 09 Nov 2012)
Log Message:
-----------
fix [#33121] crashing when srolling down in text editor !

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_string_utf8.h
    trunk/blender/source/blender/blenlib/intern/string_utf8.c
    trunk/blender/source/blender/editors/interface/interface_widgets.c
    trunk/blender/source/blender/editors/space_text/text_draw.c
    trunk/blender/source/blender/editors/space_text/text_ops.c

Modified: trunk/blender/source/blender/blenlib/BLI_string_utf8.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_string_utf8.h	2012-11-09 03:10:29 UTC (rev 52020)
+++ trunk/blender/source/blender/blenlib/BLI_string_utf8.h	2012-11-09 03:36:38 UTC (rev 52021)
@@ -37,6 +37,7 @@
 int          BLI_utf8_invalid_strip(char *str, int length);
 
 int          BLI_str_utf8_size(const char *p); /* warning, can return -1 on bad chars */
+int          BLI_str_utf8_size_safe(const char *p);
 /* copied from glib */
 unsigned int BLI_str_utf8_as_unicode(const char *p);
 unsigned int BLI_str_utf8_as_unicode_and_size(const char *__restrict p, size_t *__restrict index);

Modified: trunk/blender/source/blender/blenlib/intern/string_utf8.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/string_utf8.c	2012-11-09 03:10:29 UTC (rev 52020)
+++ trunk/blender/source/blender/blenlib/intern/string_utf8.c	2012-11-09 03:36:38 UTC (rev 52021)
@@ -317,12 +317,12 @@
 /* end wchar_t / utf8 functions  */
 /* --------------------------------------------------------------------------*/
 
-/* copied from glib's gutf8.c */
+/* copied from glib's gutf8.c, added 'Err' arg */
 
 /* note, glib uses unsigned int for unicode, best we do the same,
  * though we don't typedef it - campbell */
 
-#define UTF8_COMPUTE(Char, Mask, Len)                                         \
+#define UTF8_COMPUTE(Char, Mask, Len, Err)                                    \
 	if (Char < 128) {                                                         \
 		Len = 1;                                                              \
 		Mask = 0x7f;                                                          \
@@ -348,7 +348,7 @@
 		Mask = 0x01;                                                          \
 	}                                                                         \
 	else {                                                                    \
-		Len = -1;                                                             \
+		Len = Err;  /* -1 is the typical error value or 1 to skip */          \
 	} (void)0
 
 /* same as glib define but added an 'Err' arg */
@@ -371,13 +371,26 @@
 	int mask = 0, len;
 	unsigned char c = (unsigned char) *p;
 
-	UTF8_COMPUTE (c, mask, len);
+	UTF8_COMPUTE (c, mask, len, -1);
 
 	(void)mask; /* quiet warning */
 
 	return len;
 }
 
+/* use when we want to skip errors */
+int BLI_str_utf8_size_safe(const char *p)
+{
+	int mask = 0, len;
+	unsigned char c = (unsigned char) *p;
+
+	UTF8_COMPUTE (c, mask, len, 1);
+
+	(void)mask; /* quiet warning */
+
+	return len;
+}
+
 /* was g_utf8_get_char */
 /**
  * BLI_str_utf8_as_unicode:
@@ -397,7 +410,7 @@
 	unsigned int result;
 	unsigned char c = (unsigned char) *p;
 
-	UTF8_COMPUTE (c, mask, len);
+	UTF8_COMPUTE (c, mask, len, -1);
 	if (len == -1)
 		return BLI_UTF8_ERR;
 	UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR);
@@ -412,7 +425,7 @@
 	unsigned int result;
 	unsigned char c = (unsigned char) *p;
 
-	UTF8_COMPUTE (c, mask, len);
+	UTF8_COMPUTE (c, mask, len, -1);
 	if (len == -1)
 		return BLI_UTF8_ERR;
 	UTF8_GET (result, p, i, mask, len, BLI_UTF8_ERR);
@@ -431,7 +444,7 @@
 	p += *index;
 	c = (unsigned char) *p;
 
-	UTF8_COMPUTE (c, mask, len);
+	UTF8_COMPUTE (c, mask, len, -1);
 	if (len == -1) {
 		/* when called with NULL end, result will never be NULL,
 		 * checks for a NULL character */

Modified: trunk/blender/source/blender/editors/interface/interface_widgets.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_widgets.c	2012-11-09 03:10:29 UTC (rev 52020)
+++ trunk/blender/source/blender/editors/interface/interface_widgets.c	2012-11-09 03:36:38 UTC (rev 52021)
@@ -1044,6 +1044,8 @@
 				ui_text_clip_give_prev_off(but);
 			len = strlen(but->drawstr);
 			bytes = BLI_str_utf8_size(BLI_str_find_prev_char_utf8(but->drawstr, but->drawstr + len));
+			if (bytes < 0)
+				bytes = 1;
 			but->drawstr[len - bytes] = 0;
 		}
 

Modified: trunk/blender/source/blender/editors/space_text/text_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_text/text_draw.c	2012-11-09 03:10:29 UTC (rev 52020)
+++ trunk/blender/source/blender/editors/space_text/text_draw.c	2012-11-09 03:36:38 UTC (rev 52021)
@@ -95,7 +95,7 @@
 static int text_font_draw_character_utf8(SpaceText *st, int x, int y, const char *c)
 {
 	char str[BLI_UTF8_MAX + 1];
-	size_t len = BLI_str_utf8_size(c);
+	size_t len = BLI_str_utf8_size_safe(c);
 	memcpy(str, c, len);
 	str[len] = '\0';
 
@@ -158,7 +158,7 @@
 			in++;
 		}
 		else {
-			size_t len = BLI_str_utf8_size(in);
+			size_t len = BLI_str_utf8_size_safe(in);
 			flatten_string_append(fs, in, r, len);
 			in += len;
 			total++;
@@ -342,7 +342,7 @@
 		if (*str == '\\') {
 			*fmt = prev; fmt++; str++;
 			if (*str == '\0') break;
-			*fmt = prev; fmt++; str += BLI_str_utf8_size(str);
+			*fmt = prev; fmt++; str += BLI_str_utf8_size_safe(str);
 			continue;
 		}
 		/* Handle continuations */
@@ -363,14 +363,14 @@
 			}
 
 			*fmt = 'l';
-			str += BLI_str_utf8_size(str) - 1;
+			str += BLI_str_utf8_size_safe(str) - 1;
 		}
 		/* Not in a string... */
 		else {
 			/* Deal with comments first */
 			if (prev == '#' || *str == '#') {
 				*fmt = '#';
-				str += BLI_str_utf8_size(str) - 1;
+				str += BLI_str_utf8_size_safe(str) - 1;
 			}
 			else if (*str == '"' || *str == '\'') {
 				/* Strings */
@@ -399,7 +399,7 @@
 					*fmt = 'n';
 				}
 				else {
-					str += BLI_str_utf8_size(str) - 1;
+					str += BLI_str_utf8_size_safe(str) - 1;
 					*fmt = 'q';
 				}
 			/* Punctuation */
@@ -407,7 +407,7 @@
 				*fmt = '!';
 			/* Identifiers and other text (no previous ws. or delims. so text continues) */
 			else if (prev == 'q') {
-				str += BLI_str_utf8_size(str) - 1;
+				str += BLI_str_utf8_size_safe(str) - 1;
 				*fmt = 'q';
 			}
 			/* Not ws, a digit, punct, or continuing text. Must be new, check for special words */
@@ -427,7 +427,7 @@
 					*fmt = prev;
 				}
 				else {
-					str += BLI_str_utf8_size(str) - 1;
+					str += BLI_str_utf8_size_safe(str) - 1;
 					*fmt = 'q';
 				}
 			}
@@ -575,7 +575,7 @@
 		end = max;
 		chop = 1;
 		*offc = 0;
-		for (i = 0, j = 0; linep->line[j]; j += BLI_str_utf8_size(linep->line + j)) {
+		for (i = 0, j = 0; linep->line[j]; j += BLI_str_utf8_size_safe(linep->line + j)) {
 			int chars;
 
 			/* Mimic replacement of tabs */
@@ -640,7 +640,7 @@
 	*offc = 0;
 	cursin = txt_utf8_offset_to_index(linein->line, cursin);
 
-	for (i = 0, j = 0; linein->line[j]; j += BLI_str_utf8_size(linein->line + j)) {
+	for (i = 0, j = 0; linein->line[j]; j += BLI_str_utf8_size_safe(linein->line + j)) {
 
 		/* Mimic replacement of tabs */
 		ch = linein->line[j];
@@ -685,7 +685,7 @@
 {
 	int a = 0, i;
 	
-	for (i = 0; i < cur && line[i]; i += BLI_str_utf8_size(line + i)) {
+	for (i = 0; i < cur && line[i]; i += BLI_str_utf8_size_safe(line + i)) {
 		if (line[i] == '\t')
 			a += st->tabnumber - a % st->tabnumber;
 		else
@@ -698,7 +698,7 @@
 {
 	int pos = 0;
 	while (str[pos] && n--) {
-		pos += BLI_str_utf8_size(str + pos);
+		pos += BLI_str_utf8_size_safe(str + pos);
 	}
 	return str + pos;
 }
@@ -719,7 +719,7 @@
 	start = 0; mstart = 0;
 	end = max; mend = txt_utf8_get_nth(str, max) - str;
 	
-	for (i = 0, mi = 0; str[mi]; i++, mi += BLI_str_utf8_size(str + mi)) {
+	for (i = 0, mi = 0; str[mi]; i++, mi += BLI_str_utf8_size_safe(str + mi)) {
 		if (i - start >= max) {
 			/* skip hidden part of line */
 			if (skip) {
@@ -730,7 +730,7 @@
 			}
 
 			/* Draw the visible portion of text on the overshot line */
-			for (a = start, ma = mstart; a < end; a++, ma += BLI_str_utf8_size(str + ma)) {
+			for (a = start, ma = mstart; a < end; a++, ma += BLI_str_utf8_size_safe(str + ma)) {
 				if (st->showsyntax && format) format_draw_color(format[a]);
 				x += text_font_draw_character_utf8(st, x, y, str + ma);
 			}
@@ -748,7 +748,7 @@
 	}
 
 	/* Draw the remaining text */
-	for (a = start, ma = mstart; str[ma] && y > 0; a++, ma += BLI_str_utf8_size(str + ma)) {
+	for (a = start, ma = mstart; str[ma] && y > 0; a++, ma += BLI_str_utf8_size_safe(str + ma)) {
 		if (st->showsyntax && format)
 			format_draw_color(format[a]);
 
@@ -786,7 +786,7 @@
 			for (a = 0; a < amount; a++) {
 				format_draw_color(format[a]);
 				x += text_font_draw_character_utf8(st, x, y, in + str_shift);
-				str_shift += BLI_str_utf8_size(in + str_shift);
+				str_shift += BLI_str_utf8_size_safe(in + str_shift);
 			}
 		}
 		else text_font_draw(st, x, y, in);
@@ -1016,7 +1016,7 @@
 	lines = 1;
 	start = 0;
 	end = max;
-	for (i = 0, j = 0; str[j]; j += BLI_str_utf8_size(str + j)) {
+	for (i = 0, j = 0; str[j]; j += BLI_str_utf8_size_safe(str + j)) {
 		/* Mimic replacement of tabs */
 		ch = str[j];
 		if (ch == '\t') {
@@ -1639,7 +1639,7 @@
 	if (b > 0) {
 		/* opening bracket, search forward for close */
 		fc++;
-		c += BLI_str_utf8_size(linep->line + c);
+		c += BLI_str_utf8_size_safe(linep->line + c);
 		while (linep) {
 			while (c < linep->len) {
 				if (linep->format && linep->format[fc] != 'l' && linep->format[fc] != '#') {
@@ -1657,7 +1657,7 @@
 					}
 				}
 				fc++;
-				c += BLI_str_utf8_size(linep->line + c);
+				c += BLI_str_utf8_size_safe(linep->line + c);
 			}
 			if (endl) break;
 			linep = linep->next;

Modified: trunk/blender/source/blender/editors/space_text/text_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_text/text_ops.c	2012-11-09 03:10:29 UTC (rev 52020)
+++ trunk/blender/source/blender/editors/space_text/text_ops.c	2012-11-09 03:36:38 UTC (rev 52021)
@@ -1503,7 +1503,7 @@
 	end = max;
 	chop = loop = 1;
 
-	for (i = 0, j = 0; loop; j += BLI_str_utf8_size(linein->line + j)) {
+	for (i = 0, j = 0; loop; j += BLI_str_utf8_size_safe(linein->line + j)) {
 		int chars;
 		/* Mimic replacement of tabs */
 		ch = linein->line[j];
@@ -1682,7 +1682,7 @@
 	chop = loop = 1;
 	*charp = 0;
 
-	for (i = 0, j = 0; loop; j += BLI_str_utf8_size((*linep)->line + j)) {
+	for (i = 0, j = 0; loop; j += BLI_str_utf8_size_safe((*linep)->line + j)) {
 		int chars;
 		/* Mimic replacement of tabs */
 		ch = (*linep)->line[j];
@@ -1750,7 +1750,7 @@
 	chop = loop = 1;
 	*charp = 0;
 
-	for (i = 0, j = 0; loop; j += BLI_str_utf8_size((*linep)->line + j)) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list