[gnumeric] xlsx: fix parsing of Sheet1#REF! as used by Excel.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] xlsx: fix parsing of Sheet1#REF! as used by Excel.
- Date: Thu, 11 Apr 2013 19:56:21 +0000 (UTC)
commit 465706b8e492c5d242b3deb30b46843b87d0fcf2
Author: Morten Welinder <terra gnome org>
Date: Thu Apr 11 15:55:41 2013 -0400
xlsx: fix parsing of Sheet1#REF! as used by Excel.
We just end up generating #REF!, but that's good enough.
ChangeLog | 3 +++
NEWS | 1 +
src/parse-util.c | 14 +++++++++++++-
3 files changed, 17 insertions(+), 1 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 77a227f..1330392 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2013-04-11 Morten Welinder <terra gnome org>
+ * src/parse-util.c (rangeref_parse): Parse Sheet!#REF and return a
+ reference with invalid_sheet. Fixes #683494.
+
* src/complex.c (complex_to_string): Drop format arguments. All
callers changed. Make up a format with enough precision for round
tripping. Fixes #697634.
diff --git a/NEWS b/NEWS
index 3d6e22a..7826a0d 100644
--- a/NEWS
+++ b/NEWS
@@ -33,6 +33,7 @@ Morten:
* Fix problem with xls saving of externnames.
* Fix saving of certain XL2007 functions like IFERROR.
* Ensure full precision for complex numbers. [#697634]
+ * Fix parsing of 'Sheet1!#REF!' as used by XL. [#683494]
--------------------------------------------------------------------------
Gnumeric 1.12.1
diff --git a/src/parse-util.c b/src/parse-util.c
index 188dc32..0237d0c 100644
--- a/src/parse-util.c
+++ b/src/parse-util.c
@@ -1128,6 +1128,8 @@ rangeref_parse (GnmRangeRef *res, char const *start, GnmParsePos const *pp,
if (ptr == NULL)
return start; /* TODO error unknown sheet */
if (ptr != start_sheet) {
+ const char *ref;
+
if (*ptr == ':') { /* 3d ref */
ptr = sheetref_parse (convs, ptr+1, &res->b.sheet, wb, FALSE);
if (ptr == NULL)
@@ -1137,6 +1139,16 @@ rangeref_parse (GnmRangeRef *res, char const *start, GnmParsePos const *pp,
if (*ptr++ != '!')
return start; /* TODO syntax error */
+
+ ref = value_error_name (GNM_ERROR_REF, FALSE);
+ if (strncmp (ptr, ref, strlen (ref)) == 0) {
+ res->a.sheet = invalid_sheet;
+ res->a.col = res->a.row = 0;
+ res->a.col_relative = res->a.row_relative = FALSE;
+ res->b.sheet = res->a.sheet;
+ ptr += strlen (ref);
+ return ptr;
+ }
} else {
if (start_sheet != start_wb)
return start; /* Workbook, but no sheet. */
@@ -1144,7 +1156,7 @@ rangeref_parse (GnmRangeRef *res, char const *start, GnmParsePos const *pp,
}
if (convs->r1c1_addresses) { /* R1C1 handler */
- tmp1 = r1c1_rangeref_parse (res, ptr, pp);
+ const char *tmp1 = r1c1_rangeref_parse (res, ptr, pp);
return (tmp1 != NULL) ? tmp1 : start;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]