Fix assertion for proper Huffman merge pattern: 0 == 1 modulo 1.
[pspp] / src / som.h
1 /* PSPP - computes sample statistics.
2    Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
3    Written by Ben Pfaff <blp@gnu.org>.
4
5    This program is free software; you can redistribute it and/or
6    modify it under the terms of the GNU General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18    02111-1307, USA. */
19
20 #if !som_h
21 #define som_h 1
22
23 /* Structured Output Manager.
24
25    som considers the output stream to be a series of tables.  Each
26    table is made up of a rectangular grid of cells.  Cells can be
27    joined to form larger cells.  Rows and columns can be separated by
28    rules of various types.  Tables too large to fit on a single page
29    will be divided into sections.  Rows and columns can be designated
30    as headers, which causes them to be repeated in each section.
31
32    Every table is an instance of a particular table class.  A table
33    class is responsible for keeping track of cell data, for handling
34    requests from the som, and finally for rendering cell data to the
35    output drivers.  Tables may implement these operations in any way
36    desired, and in fact almost every operation performed by som may be
37    overridden in a table class.  */
38
39 /* Table. */
40 struct som_table
41   {
42     struct som_table_class *class;      /* Table class. */
43     void *ext;                          /* Owned by table class. */
44   };
45
46 /* Group styles. */
47 enum
48   {
49     SOM_COL_NONE,                       /* No columns. */
50     SOM_COL_DOWN                        /* Columns down first. */
51   };
52
53 /* Cumulation types. */
54 enum
55   {
56     SOM_ROWS, SOM_ROW = SOM_ROWS,       /* Rows. */
57     SOM_COLUMNS, SOM_COLUMN = SOM_COLUMNS       /* Columns. */
58   };
59
60 /* Flags. */
61 enum
62   {
63     SOMF_NONE = 0,
64     SOMF_NO_SPACING = 01,       /* No spacing before the table. */
65     SOMF_NO_TITLE = 02          /* No title. */
66   };
67
68 /* Table class. */
69 struct outp_driver;
70 struct som_table_class
71   {
72     /* Set table, driver. */
73     void (*table) (struct som_table *);
74     void (*driver) (struct outp_driver *);
75
76     /* Query columns and rows. */
77     void (*count) (int *n_columns, int *n_rows);
78     void (*area) (int *horiz, int *vert);
79     void (*width) (int *columns);
80     void (*height) (int *rows);
81     void (*columns) (int *style);
82     int (*breakable) (int row);                         /* ? */
83     void (*headers) (int *l, int *r, int *t, int *b);
84     void (*join) (int *(column[2]), int *(row[2]));     /* ? */
85     void (*cumulate) (int cumtype, int start, int *end, int max, int *actual);
86     void (*flags) (unsigned *);
87
88     /* Set columns and rows. */
89     void (*set_width) (int column, int width);          /* ? */
90     void (*set_height) (int row, int height);           /* ? */
91
92     /* Rendering. */
93     void (*title) (int x, int y);
94     void (*render) (int x1, int y1, int x2, int y2);
95   };
96
97 /* Table indexes. */
98 extern int table_num;
99 extern int subtable_num;
100
101 /* Submission. */
102 void som_new_series (void);
103 void som_submit (struct som_table *t);
104
105 /* Miscellaneous. */
106 void som_eject_page (void);
107 void som_blank_line (void);
108
109 #endif /* som_h */