commit 24c205e7ad78c776b1a89cb0582f4f2c2ab473ab
parent c4f76652a26ea6eb23825eb46d9f55d86d436d38
Author: Colin Leroy <colin@colino.net>
Date: Thu, 25 Oct 2012 07:43:36 +0000
2012-10-25 [colin] 3.8.1cvs105
* src/textview.c
Do not allow search cost to explode in case of bad message
parsing in textview_make_clickable_parts_later(); reduces
cost of textview_make_clickable_parts_later() from 99% to
17% for big bad-case message. Patch by Igor Mammedov
Diffstat:
4 files changed, 36 insertions(+), 53 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,11 @@
+2012-10-25 [colin] 3.8.1cvs105
+
+ * src/textview.c
+ Do not allow search cost to explode in case of bad message
+ parsing in textview_make_clickable_parts_later(); reduces
+ cost of textview_make_clickable_parts_later() from 99% to
+ 17% for big bad-case message. Patch by Igor Mammedov
+
2012-10-25 [colin] 3.8.1cvs104
* src/textview.c
diff --git a/PATCHSETS b/PATCHSETS
@@ -4479,3 +4479,4 @@
( cvs diff -u -r 1.100.2.84 -r 1.100.2.85 AUTHORS; cvs diff -u -r 1.23.2.39 -r 1.23.2.40 src/crash.c; cvs diff -u -r 1.1.2.80 -r 1.1.2.81 src/gtk/authors.h; ) > 3.8.1cvs102.patchset
( cvs diff -u -r 1.1.2.6 -r 1.1.2.7 src/advsearch.c; ) > 3.8.1cvs103.patchset
( cvs diff -u -r 1.100.2.85 -r 1.100.2.86 AUTHORS; cvs diff -u -r 1.96.2.249 -r 1.96.2.250 src/textview.c; cvs diff -u -r 1.12.2.35 -r 1.12.2.36 src/textview.h; cvs diff -u -r 1.1.2.81 -r 1.1.2.82 src/gtk/authors.h; ) > 3.8.1cvs104.patchset
+( cvs diff -u -r 1.96.2.250 -r 1.96.2.251 src/textview.c; ) > 3.8.1cvs105.patchset
diff --git a/configure.ac b/configure.ac
@@ -12,7 +12,7 @@ MINOR_VERSION=8
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=104
+EXTRA_VERSION=105
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
diff --git a/src/textview.c b/src/textview.c
@@ -1361,34 +1361,21 @@ static void textview_make_clickable_parts(TextView *textview,
gtk_text_buffer_get_end_iter(buffer, &iter);
/* parse for clickable parts, and build a list of begin and end positions */
- for (walk = mybuf;;) {
- gint last_index = PARSE_ELEMS;
- gchar *scanpos = NULL;
-
- /* FIXME: this looks phony. scanning for anything in the parse table */
- for (n = 0; n < PARSE_ELEMS; n++) {
- gchar *tmp;
-
- tmp = parser[n].search(walk, parser[n].needle);
- if (tmp) {
- if (scanpos == NULL || tmp < scanpos) {
- scanpos = tmp;
- last_index = n;
- }
- }
- }
-
- if (scanpos) {
- /* check if URI can be parsed */
- if (parser[last_index].parse(walk, scanpos, &bp, &ep, hdr)
- && (size_t) (ep - bp - 1) > strlen(parser[last_index].needle)) {
- ADD_TXT_POS(bp, ep, last_index);
+ for (n = 0; n < PARSE_ELEMS; n++) {
+ for (walk = mybuf;;) {
+ gchar *scanpos = parser[n].search(walk, parser[n].needle);
+ if (scanpos) {
+ /* check if URI can be parsed */
+ if (parser[n].parse(walk, scanpos, &bp, &ep, hdr)
+ && (size_t) (ep - bp - 1) > strlen(parser[n].needle)) {
+ ADD_TXT_POS(bp, ep, n);
walk = ep;
+ } else
+ walk = scanpos +
+ strlen(parser[n].needle);
} else
- walk = scanpos +
- strlen(parser[last_index].needle);
- } else
- break;
+ break;
+ }
}
/* colorize this line */
@@ -1481,34 +1468,21 @@ static void textview_make_clickable_parts_later(TextView *textview,
offset = gtk_text_iter_get_offset(&start_iter);
/* parse for clickable parts, and build a list of begin and end positions */
- for (walk = mybuf;;) {
- gint last_index = PARSE_ELEMS;
- gchar *scanpos = NULL;
-
- /* FIXME: this looks phony. scanning for anything in the parse table */
- for (n = 0; n < PARSE_ELEMS; n++) {
- gchar *tmp;
-
- tmp = parser[n].search(walk, parser[n].needle);
- if (tmp) {
- if (scanpos == NULL || tmp < scanpos) {
- scanpos = tmp;
- last_index = n;
- }
- }
- }
-
- if (scanpos) {
- /* check if URI can be parsed */
- if (parser[last_index].parse(walk, scanpos, &bp, &ep, FALSE)
- && (size_t) (ep - bp - 1) > strlen(parser[last_index].needle)) {
- ADD_TXT_POS_LATER(bp, ep, last_index);
+ for (n = 0; n < PARSE_ELEMS; n++) {
+ for (walk = mybuf;;) {
+ gchar *scanpos = parser[n].search(walk, parser[n].needle);
+ if (scanpos) {
+ /* check if URI can be parsed */
+ if (parser[n].parse(walk, scanpos, &bp, &ep, FALSE)
+ && (size_t) (ep - bp - 1) > strlen(parser[n].needle)) {
+ ADD_TXT_POS_LATER(bp, ep, n);
walk = ep;
+ } else
+ walk = scanpos +
+ strlen(parser[n].needle);
} else
- walk = scanpos +
- strlen(parser[last_index].needle);
- } else
- break;
+ break;
+ }
}
/* colorize this line */