128
eval_pos_init_sheet (GnmEvalPos *ep, Sheet *sheet)
130
eval_pos_init_sheet (GnmEvalPos *ep, Sheet const *sheet)
130
132
g_return_val_if_fail (ep != NULL, NULL);
131
133
g_return_val_if_fail (IS_SHEET (sheet), NULL);
133
135
ep->eval.col = ep->eval.row = 0;
136
ep->sheet = (Sheet *)sheet;
136
138
ep->array = NULL;
251
254
gnm_cellref_hash (GnmCellRef const *cr)
253
guint h = ((cr->row << 8) ^ cr->col) * 4;
254
if (cr->col_relative) h |= 1;
255
if (cr->row_relative) h |= 2;
257
h = (h << 16) | (h >> 16);
259
if (cr->col_relative) h ^= 1;
260
if (cr->row_relative) h ^= 2;
263
268
g_return_val_if_fail (ep != NULL, 0);
265
270
if (ref->col_relative) {
266
int res = (ep->eval.col + ref->col) % gnm_sheet_get_max_cols (ref->sheet);
271
Sheet const *sheet = eval_sheet (ref->sheet, ep->sheet);
272
int res = (ep->eval.col + ref->col) % gnm_sheet_get_max_cols (sheet);
268
return res + gnm_sheet_get_max_cols (ref->sheet);
274
return res + gnm_sheet_get_max_cols (sheet);
278
284
g_return_val_if_fail (ep != NULL, 0);
280
286
if (ref->row_relative) {
281
int res = (ep->eval.row + ref->row) % gnm_sheet_get_max_rows (ref->sheet);
287
Sheet const *sheet = eval_sheet (ref->sheet, ep->sheet);
288
int res = (ep->eval.row + ref->row) % gnm_sheet_get_max_rows (sheet);
283
return res + gnm_sheet_get_max_rows (ref->sheet);
290
return res + gnm_sheet_get_max_rows (sheet);
290
gnm_cellpos_init_cellref (GnmCellPos *res,
291
GnmCellRef const *cell_ref, GnmCellPos const *pos)
297
gnm_cellpos_init_cellref_ss (GnmCellPos *res, GnmCellRef const *cell_ref,
298
GnmCellPos const *pos, GnmSheetSize const *ss)
293
300
g_return_if_fail (cell_ref != NULL);
294
301
g_return_if_fail (res != NULL);
296
303
if (cell_ref->col_relative) {
297
res->col = (cell_ref->col + pos->col) % gnm_sheet_get_max_cols (cell_ref->sheet);
299
res->col += gnm_sheet_get_max_cols (cell_ref->sheet);
304
int col = cell_ref->col + pos->col;
305
int max = ss->max_cols;
301
312
res->col = cell_ref->col;
303
314
if (cell_ref->row_relative) {
304
res->row = (cell_ref->row + pos->row) % gnm_sheet_get_max_rows (cell_ref->sheet);
306
res->row += gnm_sheet_get_max_rows (cell_ref->sheet);
315
int row = cell_ref->row + pos->row;
316
int max = ss->max_rows;
308
323
res->row = cell_ref->row;
327
gnm_cellpos_init_cellref (GnmCellPos *res, GnmCellRef const *cell_ref,
328
GnmCellPos const *pos, Sheet const *base_sheet)
330
Sheet const *sheet = eval_sheet (cell_ref->sheet, base_sheet);
331
gnm_cellpos_init_cellref_ss (res, cell_ref, pos,
332
gnm_sheet_get_size (sheet));
312
336
gnm_cellref_make_abs (GnmCellRef *dest, GnmCellRef const *src, GnmEvalPos const *ep)
314
340
g_return_if_fail (dest != NULL);
315
341
g_return_if_fail (src != NULL);
316
342
g_return_if_fail (ep != NULL);
319
if (src->col_relative) {
320
dest->col = (dest->col + ep->eval.col) % gnm_sheet_get_max_cols (dest->sheet);
322
dest->col += gnm_sheet_get_max_cols (dest->sheet);
325
if (src->row_relative) {
326
dest->row = (dest->row + ep->eval.row) % gnm_sheet_get_max_rows (dest->sheet);
328
dest->row += gnm_sheet_get_max_rows (dest->sheet);
331
dest->row_relative = dest->col_relative = FALSE;
344
gnm_cellpos_init_cellref (&pos, src, &ep->eval, ep->sheet);
346
dest->sheet = src->sheet;
349
dest->col_relative = FALSE;
350
dest->row_relative = FALSE;
385
407
* by converting to absolute coords and handling inversions.
410
gnm_rangeref_normalize_pp (GnmRangeRef const *ref, GnmParsePos const *pp,
411
Sheet **start_sheet, Sheet **end_sheet,
414
GnmSheetSize const *ss;
416
g_return_if_fail (ref != NULL);
417
g_return_if_fail (pp != NULL);
419
*start_sheet = eval_sheet (ref->a.sheet, pp->sheet);
420
*end_sheet = eval_sheet (ref->b.sheet, *start_sheet);
422
ss = gnm_sheet_get_size2 (*start_sheet, pp->wb);
423
gnm_cellpos_init_cellref_ss (&dest->start, &ref->a, &pp->eval, ss);
426
? gnm_sheet_get_size (*end_sheet)
428
gnm_cellpos_init_cellref_ss (&dest->end, &ref->b, &pp->eval, ss);
430
range_normalize (dest);
388
434
gnm_rangeref_normalize (GnmRangeRef const *ref, GnmEvalPos const *ep,
389
435
Sheet **start_sheet, Sheet **end_sheet, GnmRange *dest)
391
g_return_if_fail (ref != NULL);
392
g_return_if_fail (ep != NULL);
394
gnm_cellpos_init_cellref (&dest->start, &ref->a, &ep->eval);
395
gnm_cellpos_init_cellref (&dest->end, &ref->b, &ep->eval);
396
range_normalize (dest);
398
*start_sheet = eval_sheet (ref->a.sheet, ep->sheet);
399
*end_sheet = eval_sheet (ref->b.sheet, *start_sheet);
439
parse_pos_init_evalpos (&pp, ep);
440
gnm_rangeref_normalize_pp (ref, &pp, start_sheet, end_sheet, dest);
403
444
gnm_cellpos_hash (GnmCellPos const *key)
405
return (key->row << 8) | key->col;
447
h = (h << 16) | (h >> 16);