[gnumeric] R1C1 parsing: fix sheet size handling.



commit 1ff0790df2f0d3099d2f4bf5588b33408128de4a
Author: Morten Welinder <terra gnome org>
Date:   Fri May 1 19:21:28 2009 -0400

    R1C1 parsing: fix sheet size handling.
---
 ChangeLog        |    2 ++
 src/parse-util.c |   28 +++++++++++++++++++---------
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index bd19a19..7ddb6f8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2009-05-01  Morten Welinder  <terra gnome org>
 
+	* src/parse-util.c (r1c1_rangeref_parse): Fix sheet size handling.
+
 	* src/sheet-style.c (sheet_style_sanity_check): New function.
 	(sheet_style_init): Call sheet_style_sanity_check.
 	(tile_widths, tile_heights): Add extra element.
diff --git a/src/parse-util.c b/src/parse-util.c
index ef0d7ff..fb254f7 100644
--- a/src/parse-util.c
+++ b/src/parse-util.c
@@ -953,9 +953,19 @@ static char const *
 r1c1_rangeref_parse (GnmRangeRef *res, char const *ptr, GnmParsePos const *pp)
 {
 	char const *tmp;
+	GnmSheetSize const *a_ss, *b_ss;
+	Sheet const *a_sheet, *b_sheet;
+
+	a_sheet = eval_sheet (res->a.sheet, pp->sheet);
+	b_sheet = eval_sheet (res->b.sheet, a_sheet);
+
+	a_ss = a_sheet
+		? gnm_sheet_get_size (a_sheet)
+		: workbook_get_sheet_size (pp->wb);
+	b_ss = b_sheet ? gnm_sheet_get_size (b_sheet) : a_ss;
 
 	if (*ptr == 'R' || *ptr == 'r') {
-		ptr = r1c1_get_index (ptr, gnm_sheet_get_size (pp->sheet),
+		ptr = r1c1_get_index (ptr, a_ss,
 				      &res->a.row, &res->a.row_relative,
 				      FALSE);
 		if (!ptr)
@@ -967,17 +977,17 @@ r1c1_rangeref_parse (GnmRangeRef *res, char const *ptr, GnmParsePos const *pp)
 			res->a.col_relative = FALSE;
 			res->a.col = 0;
 			res->b = res->a;
-			res->b.col = gnm_sheet_get_last_col (res->b.sheet);
+			res->b.col = a_ss->max_cols - 1;
 			if (ptr[0] != ':' || (ptr[1] != 'R' && ptr[1] != 'r'))
 				return ptr;
-			tmp = r1c1_get_index (ptr+1, gnm_sheet_get_size (res->b.sheet),
+			tmp = r1c1_get_index (ptr+1, a_ss,
 					      &res->b.row, &res->b.row_relative,
 					      FALSE);
 			if (!tmp)
 				return ptr; /* fallback to just the initial R */
 			return tmp;
 		} else {
-			ptr = r1c1_get_index (ptr, gnm_sheet_get_size (pp->sheet),
+			ptr = r1c1_get_index (ptr, a_ss,
 					      &res->a.col, &res->a.col_relative,
 					      TRUE);
 			if (!ptr)
@@ -986,15 +996,15 @@ r1c1_rangeref_parse (GnmRangeRef *res, char const *ptr, GnmParsePos const *pp)
 
 		res->b = res->a;
 		if (ptr[0] != ':' || (ptr[1] != 'R' && ptr[1] != 'r') ||
-		    NULL == (tmp = r1c1_get_index (ptr+1, gnm_sheet_get_size (res->b.sheet),
+		    NULL == (tmp = r1c1_get_index (ptr+1, b_ss,
 						   &res->b.row, &res->b.row_relative, FALSE)) ||
 		    (*tmp != 'C' && *tmp != 'c') ||
-		    NULL == (tmp = r1c1_get_index (tmp, gnm_sheet_get_size (res->b.sheet),
+		    NULL == (tmp = r1c1_get_index (tmp, b_ss,
 						   &res->b.col, &res->b.col_relative, FALSE)))
 			return ptr;
 		return tmp;
 	} else if (*ptr == 'C' || *ptr == 'c') {
-		if (NULL == (ptr = r1c1_get_index (ptr, gnm_sheet_get_size (pp->sheet),
+		if (NULL == (ptr = r1c1_get_index (ptr, a_ss,
 						   &res->a.col, &res->a.col_relative, TRUE)))
 			return NULL;
 		if (g_ascii_isalpha (*ptr))
@@ -1003,10 +1013,10 @@ r1c1_rangeref_parse (GnmRangeRef *res, char const *ptr, GnmParsePos const *pp)
 		res->a.row_relative = FALSE;
 		res->a.row = 0;
 		res->b = res->a;
-		res->b.row = gnm_sheet_get_last_row (res->b.sheet);
+		res->b.row = b_ss->max_rows - 1;
 		if (ptr[0] != ':' || (ptr[1] != 'C' && ptr[1] != 'c'))
 			return ptr;
-		tmp = r1c1_get_index (ptr, gnm_sheet_get_size (res->b.sheet),
+		tmp = r1c1_get_index (ptr, b_ss,
 				      &res->b.col, &res->b.col_relative,
 				      TRUE);
 		if (!tmp)



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