[gnumeric] Stf: minor speed-ups.



commit fc94290058e8b53591a28b5ba7432576728dddd7
Author: Morten Welinder <terra gnome org>
Date:   Fri Oct 26 16:50:12 2012 -0400

    Stf: minor speed-ups.

 ChangeLog           |    8 ++++++++
 samples/formats.xls |  Bin 283136 -> 394752 bytes
 src/gutils.c        |   20 +++++++++++++++++++-
 src/stf-parse.c     |   13 +++++++++----
 4 files changed, 36 insertions(+), 5 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 3ee4032..3abf9cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-10-26  Morten Welinder  <terra gnome org>
+
+	* src/gutils.c (gnm_utf8_strto): Handle all-ascii case without
+	copying the string.
+
+	* src/stf-parse.c (my_utf8_strchr): New function wrapping
+	g_utf8_strchr and handling ascii character faster.
+
 2012-10-20  Jean Brefort  <jean brefort normalesup org>
 
 	* src/sheet-object-image.c (gnm_soi_get_target_list): fix trivial crasher,
diff --git a/samples/formats.xls b/samples/formats.xls
index 13767dd..f51b0fc 100755
Binary files a/samples/formats.xls and b/samples/formats.xls differ
diff --git a/src/gutils.c b/src/gutils.c
index b07d901..ad6ce77 100644
--- a/src/gutils.c
+++ b/src/gutils.c
@@ -175,6 +175,19 @@ gnm_usr_dir (gboolean versioned)
 	return versioned ? gnumeric_usr_dir : gnumeric_usr_dir_unversioned;
 }
 
+
+static gboolean
+all_ascii (const char *s)
+{
+	while ((guchar)*s < 0x7f) {
+		if (*s)
+			s++;
+		else
+			return TRUE;
+	}
+	return FALSE;
+}
+
 /*
  * Like strto[ld], but...
  * 1. handles non-ascii characters
@@ -187,7 +200,7 @@ gnm_utf8_strto (const char *s, char **end)
 	const char *p;
 	int sign;
 	char *dummy_end;
-	GString *ascii = g_string_sized_new (100);
+	GString *ascii;
 	GString const *decimal = go_locale_get_decimal ();
 	gboolean seen_decimal = FALSE;
 	gboolean seen_digit = FALSE;
@@ -195,6 +208,11 @@ gnm_utf8_strto (const char *s, char **end)
 	gnm_float res;
 	int save_errno;
 
+	if (all_ascii (s))
+		return gnm_strto (s, end);
+
+	ascii = g_string_sized_new (100);
+
 	if (!end)
 		end = &dummy_end;
 
diff --git a/src/stf-parse.c b/src/stf-parse.c
index d141f1b..c9358be 100644
--- a/src/stf-parse.c
+++ b/src/stf-parse.c
@@ -86,6 +86,12 @@ my_garray_len (GArray const *a)
 	return (int)a->len;
 }
 
+static char *
+my_utf8_strchr (const char *p, gunichar uc)
+{
+	return uc < 0x7f ? strchr (p, uc) : g_utf8_strchr (p, -1, uc);
+}
+
 static int
 compare_terminator (char const *s, StfParseOptions_t *parseoptions)
 {
@@ -538,8 +544,7 @@ stf_parse_csv_is_separator (char const *character, char const *chr, GSList const
 		}
 	}
 
-	if (chr && g_utf8_strchr (chr, -1,
-				  g_utf8_get_char (character)))
+	if (chr && my_utf8_strchr (chr, g_utf8_get_char (character)))
 		return g_utf8_next_char(character);
 
 	return NULL;
@@ -1661,7 +1666,7 @@ stf_parse_options_guess_csv (char const *data)
 					quoteline = line;
 				break;
 			case 2:
-				if (g_utf8_strchr (line, -1, stringind))
+				if (my_utf8_strchr (line, stringind))
 					quoteline = line;
 				break;
 			}
@@ -1669,7 +1674,7 @@ stf_parse_options_guess_csv (char const *data)
 	}
 
 	if (quoteline) {
-		const char *p0 = g_utf8_strchr (quoteline, -1, stringind);
+		const char *p0 = my_utf8_strchr (quoteline, stringind);
 		const char *p = p0;
 
 		do {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]