X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftab.c;h=47fd0b92419ad47ae724ed556212d460cce22b3e;hb=8fa7f3f6640c0eec450149cf5ccfab15d5391f55;hp=dd901493db8765896b379cdf1d3b2e3a8a7e7fa4;hpb=0a2cdacebb16d9a13c1b382c5ffa29e32cf858ea;p=pspp diff --git a/src/tab.c b/src/tab.c index dd901493db..47fd0b9241 100644 --- a/src/tab.c +++ b/src/tab.c @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include #include "tab.h" @@ -34,6 +34,9 @@ #include "som.h" #include "var.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + #include "debug-print.h" struct som_table_class tab_table_class; @@ -156,7 +159,7 @@ tab_realloc (struct tab_table *t, int nc, int nr) int mr1 = min (nr, t->nr); int mc1 = min (nc, t->nc); - struct len_string *new_cc; + struct fixed_string *new_cc; unsigned char *new_ct; int r; @@ -410,7 +413,7 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v, the resultant string into S in TABLE's pool. */ static void text_format (struct tab_table *table, int opt, const char *text, va_list args, - struct len_string *s) + struct fixed_string *s) { int len; @@ -607,9 +610,7 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, assert (r >= 0); assert (r < table->nr); - f.type = FMT_F; - f.w = w; - f.d = d; + f = make_output_format (FMT_F, w, d); #if GLOBAL_DEBUGGING if (c + table->col_ofs < 0 || r + table->row_ofs < 0 @@ -726,7 +727,7 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, opt |= TAB_JOIN; { - struct len_string *cc = &table->cc[x1 + y1 * table->cf]; + struct fixed_string *cc = &table->cc[x1 + y1 * table->cf]; unsigned char *ct = &table->ct[x1 + y1 * table->cf]; const int ofs = table->cf - (x2 - x1); @@ -751,7 +752,7 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2, /* Sets cell (C,R) in TABLE, with options OPT, to contents STRING. */ void tab_raw (struct tab_table *table, int c, int r, unsigned opt, - struct len_string *string) + struct fixed_string *string) { assert (table != NULL && string != NULL); @@ -868,11 +869,12 @@ tab_flags (struct tab_table *t, unsigned flags) void tab_submit (struct tab_table *t) { - struct som_table s; + struct som_entity s; assert (t != NULL); s.class = &tab_table_class; s.ext = t; + s.type = SOM_TABLE; som_submit (&s); tab_destroy (t); } @@ -927,9 +929,11 @@ int tab_hit; /* Set the current table to TABLE. */ static void -tabi_table (struct som_table *table) +tabi_table (struct som_entity *table) { assert (table != NULL); + assert (table->type == SOM_TABLE); + t = table->ext; tab_offset (t, 0, 0); @@ -1134,6 +1138,45 @@ tabi_flags (unsigned *flags) *flags = t->flags; } +/* Returns true if the table will fit in the given page WIDTH, + false otherwise. */ +static bool +tabi_fits_width (int width) +{ + int i; + + for (i = t->l; i < t->nc - t->r; i++) + if (t->wl + t->wr + t->w[i] > width) + return false; + + return true; +} + +/* Returns true if the table will fit in the given page LENGTH, + false otherwise. */ +static bool +tabi_fits_length (int length) +{ + int i; + + for (i = t->t; i < t->nr - t->b; i++) + if (t->ht + t->hb + t->h[i] > length) + return false; + + return true; +} + +/* Sets the number of header rows/columns on the left, right, top, + and bottom sides to HL, HR, HT, and HB, respectively. */ +static void +tabi_set_headers (int hl, int hr, int ht, int hb) +{ + t->l = hl; + t->r = hr; + t->t = ht; + t->b = hb; +} + /* Render title for current table, with major index X and minor index Y. Y may be zero, or X and Y may be zero, but X should be nonzero if Y is nonzero. */ @@ -1234,9 +1277,12 @@ struct som_table_class tab_table_class = NULL, tabi_cumulate, tabi_flags, + tabi_fits_width, + tabi_fits_length, NULL, NULL, + tabi_set_headers, tabi_title, tabi_render,