Until now, when including headers in the table it returns,
table_select_slice() has always either returned the entire original table
or a set of chunks: left header, selected body, right header. However, it
is possible to do better when the selected body includes all the cells
up to, say, the right header: then you only need a single chunk to include
the body and the right header. Besides saving memory, this also has the
advantage that, if a joined cell crosses between the body and the header,
it is not cut into two pieces by chunking. It doesn't make too much sense
to join a cell across body and header, but this still makes it easier to
render better if someone does that.
The testsuite includes a few tables that do join a cell across body and
header. This commit improves the output for one and changes some ugly
output to different ugly output for another. Additional changes in an
upcoming commit fix the latter and some other tables too.
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010, 2011, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
{
struct table *table;
int rect[TABLE_N_AXES][2];
{
struct table *table;
int rect[TABLE_N_AXES][2];
+ h0 = add_headers && subtable->h[axis][0] > 0;
+ if (h0 && z0 == subtable->h[axis][0])
- if (z0 == subtable->h[axis][0]
- && z1 == subtable->n[axis] - subtable->h[axis][1])
- return subtable;
-
- if (subtable->h[axis][0])
- table_ref (subtable);
- if (subtable->h[axis][1])
- table_ref (subtable);
+
+ h1 = add_headers && subtable->h[axis][1] > 0;
+ if (h1 && z1 == subtable->n[axis] - subtable->h[axis][1])
- if (z0 == 0 && z1 == subtable->n[axis])
- return subtable;
+ z1 = subtable->n[axis];
+ h1 = false;
+ if (z0 == 0 && z1 == subtable->n[axis])
+ return subtable;
+
+ if (h0)
+ table_ref (subtable);
+ if (h1)
+ table_ref (subtable);
+
rect[TABLE_HORZ][0] = 0;
rect[TABLE_VERT][0] = 0;
rect[TABLE_HORZ][1] = subtable->n[TABLE_HORZ];
rect[TABLE_HORZ][0] = 0;
rect[TABLE_VERT][0] = 0;
rect[TABLE_HORZ][1] = subtable->n[TABLE_HORZ];
rect[axis][1] = z1;
table = table_select (subtable, rect);
rect[axis][1] = z1;
table = table_select (subtable, rect);
- if (add_headers)
- {
- if (subtable->h[axis][0])
- table = table_paste (
- table_select_slice (subtable, axis, 0, subtable->h[axis][0],
- false),
- table, axis);
-
- if (subtable->h[axis][1])
- table = table_paste (
- table,
- table_select_slice (subtable, axis,
- subtable->n[axis] - subtable->h[axis][1],
- subtable->n[axis], false),
- axis);
- }
+ if (h0)
+ table = table_paste (
+ table_select_slice (subtable, axis, 0, subtable->h[axis][0], false),
+ table, axis);
+
+ if (h1)
+ table = table_paste (
+ table,
+ table_select_slice (subtable, axis,
+ subtable->n[axis] - subtable->h[axis][1],
+ subtable->n[axis], false),
+ axis);
+-+u+-+-+
|A|v|B|E|
+-+-+C+-+
+-+u+-+-+
|A|v|B|E|
+-+-+C+-+
+-+-+-+M|
|Q|RST|N|
+-+---+-+
+-+-+-+M|
|Q|RST|N|
+-+---+-+