X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Foutput%2Ftable.h;h=7f128814bb369814e27925edd5af65636f0aafb0;hb=9bc7fd4e5d03e4960960d9b16339a680d6f9ae06;hp=829410edfd3db644930a18233f9a3a939a8413c9;hpb=7fbfc32fc3c636959b0a25b3e76609f86519e84a;p=pspp-builds.git diff --git a/src/output/table.h b/src/output/table.h index 829410ed..7f128814 100644 --- a/src/output/table.h +++ b/src/output/table.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2009 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 @@ -67,12 +67,16 @@ struct tab_joined_cell struct outp_driver; struct tab_table; -typedef void tab_dim_func (struct tab_table *, struct outp_driver *); +struct tab_rendering; + +typedef void tab_dim_func (struct tab_rendering *, void *aux); +typedef void tab_dim_free_func (void *aux); /* A table. */ struct tab_table { struct pool *container; + int ref_cnt; /* Reference count. */ /* Contents. */ int col_style; /* Columns: One of TAB_COL_*. */ @@ -86,40 +90,47 @@ struct tab_table unsigned char *ct; /* Cell types; unsigned char[nr][nc]. */ unsigned char *rh; /* Horiz rules; unsigned char[nr+1][nc]. */ unsigned char *rv; /* Vert rules; unsigned char[nr][nc+1]. */ - tab_dim_func *dim; /* Calculates cell widths and heights. */ - /* Calculated during output. */ - int *w; /* Column widths; [nc]. */ - int *h; /* Row heights; [nr]. */ - int *hrh; /* Heights of horizontal rules; [nr+1]. */ - int *wrv; /* Widths of vertical rules; [nc+1]. */ - int wl, wr, ht, hb; /* Width/height of header rows/columns. */ + /* Calculating row and column dimensions. */ + tab_dim_func *dim; /* Calculates cell widths and heights. */ + tab_dim_free_func *dim_free; /* Frees space allocated for dim function. */ + void *dim_aux; /* Auxiliary data for dim function. */ /* Editing info. */ int col_ofs, row_ofs; /* X and Y offsets. */ }; -/* Number of rows in TABLE. */ -#define tab_nr(TABLE) ((TABLE)->nr) - -/* Number of columns in TABLE. */ -#define tab_nc(TABLE) ((TABLE)->nc) +/* Number of rows or columns in TABLE. */ +static inline int tab_nr (const struct tab_table *table) { return table->nr; } +static inline int tab_nc (const struct tab_table *table) { return table->nc; } -/* Number of left header columns in TABLE. */ -#define tab_l(TABLE) ((TABLE)->l) +/* Number of left/right/top/bottom header columns/rows in TABLE. */ +static inline int tab_l (const struct tab_table *table) { return table->l; } +static inline int tab_r (const struct tab_table *table) { return table->r; } +static inline int tab_t (const struct tab_table *table) { return table->t; } +static inline int tab_b (const struct tab_table *table) { return table->b; } -/* Number of right header columns in TABLE. */ -#define tab_r(TABLE) ((TABLE)->r) +struct tab_rendering + { + const struct tab_table *table; + struct outp_driver *driver; -/* Number of top header rows in TABLE. */ -#define tab_t(TABLE) ((TABLE)->t) + int *w; /* Column widths; [nc]. */ + int *h; /* Row heights; [nr]. */ + int *hrh; /* Heights of horizontal rules; [nr+1]. */ + int *wrv; /* Widths of vertical rules; [nc+1]. */ -/* Number of bottom header rows in TABLE. */ -#define tab_b(TABLE) ((TABLE)->b) + /* These fields would be redundant with those in struct tab_table, except + that a table will be rendered with fewer header rows or columns than + requested when we are pressed for space. */ + int l, r, t, b; /* Number of header rows/columns. */ + int wl, wr, ht, hb; /* Width/height of header rows/columns. */ + }; /* Tables. */ struct tab_table *tab_create (int nc, int nr, int reallocable); void tab_destroy (struct tab_table *); +void tab_ref (struct tab_table *); void tab_resize (struct tab_table *, int nc, int nr); void tab_realloc (struct tab_table *, int nc, int nr); void tab_headers (struct tab_table *, int l, int r, int t, int b); @@ -131,9 +142,10 @@ void tab_submit (struct tab_table *); /* Dimensioning. */ tab_dim_func tab_natural_dimensions; -int tab_natural_width (struct tab_table *t, struct outp_driver *d, int c); -int tab_natural_height (struct tab_table *t, struct outp_driver *d, int r); -void tab_dim (struct tab_table *, tab_dim_func *); +int tab_natural_width (const struct tab_rendering *, int c); +int tab_natural_height (const struct tab_rendering *, int r); +void tab_dim (struct tab_table *, + tab_dim_func *, tab_dim_free_func *, void *aux); /* Rules. */ void tab_hline (struct tab_table *, int style, int x1, int x2, int y); @@ -186,8 +198,5 @@ void tab_next_row (struct tab_table *); void tab_output_text (int options, const char *string, ...) PRINTF_FORMAT (2, 3); -/* Embedding the command name in the output. */ -void tab_set_command_name (const char *); - #endif /* tab_h */