eqn: more comments
[neateqn.git] / eqn.h
blobf5ad8884c265bb3c3324607605938897cd6a72a8
1 /*
2 * NEATEQN MAIN HEADER
4 * In Neateqn equations are recursively decomposed into boxes. eqn.c
5 * reads the input and makes eqn boxes by calling appropriate functions
6 * from box.c.
7 */
8 /* predefined array sizes */
9 #define FNLEN 32 /* font name length */
10 #define SZLEN 32 /* point size length */
11 #define LNLEN 1000 /* line length */
12 #define NMLEN 32 /* macro name length */
13 #define RLEN 8 /* register name length */
14 #define NPILES 32 /* number of piled items */
15 #define NSIZES 8 /* number of bracket sizes */
16 #define GNLEN 32 /* glyph name length */
17 #define BRLEN 64 /* bracket definition length */
19 /* registers used by neateqn */
20 #define EQNSZ ".eqnsz" /* register for surrounding point size */
21 #define EQNFN ".eqnfn" /* register for surrounding font */
22 #define EQNS "10" /* eqn-collected line register */
23 #define EQNMK ".eqnmk" /* eqn horizontal mark */
25 /* helpers */
26 #define MIN(a, b) ((a) < (b) ? (a) : (b))
27 #define MAX(a, b) ((a) < (b) ? (b) : (a))
28 #define LEN(a) (sizeof(a) / sizeof((a)[0]))
30 /* token and atom types */
31 #define T_TOK(t) ((t) & 0x00ff)
32 #define T_ATOM(t) ((t) & 0x00f0)
33 #define T_FONT(t) ((t) & T_ITALIC)
34 #define T_ATOMIDX(t) ((((t) >> 4) & 15) - 1)
36 #define T_EOF 0x0000 /* parser-specific */
37 #define T_SPACE 0x0001
38 #define T_TAB 0x0002
39 #define T_KEYWORD 0x0003
40 #define T_ORD 0x0010 /* ordinary */
41 #define T_LETTER 0x0011
42 #define T_NUMBER 0x0012
43 #define T_STRING 0x0013
44 #define T_GAP 0x0014
45 #define T_BIGOP 0x0020 /* big operators */
46 #define T_BINOP 0x0030 /* binary operators */
47 #define T_RELOP 0x0040 /* relational symbol */
48 #define T_LEFT 0x0050 /* opening token */
49 #define T_RIGHT 0x0060 /* closing token */
50 #define T_PUNC 0x0070 /* punctuation symbol */
51 #define T_INNER 0x0080 /* like fractions */
53 #define T_ITALIC 0x0100 /* atom with italic font */
55 /* spaces in hundredths of em */
56 #define S_S1 e_thinspace /* thin space */
57 #define S_S2 e_mediumspace /* medium space */
58 #define S_S3 e_thickspace /* thick space */
60 /* small helper functions */
61 void errdie(char *msg);
63 /* reading the source */
64 int src_next(void);
65 void src_back(int c);
66 void src_define(char *name, char *def);
67 int src_expand(char *name, char **args);
68 int src_macro(char *name);
69 int src_arg(int i);
70 int src_top(void);
71 int src_lineget(void);
72 void src_lineset(int n);
73 void src_done(void);
75 /* tokenizer */
76 int tok_eqn(void);
77 void tok_eqnout(char *s);
78 char *tok_get(void);
79 char *tok_pop(void);
80 char *tok_poptext(int sep);
81 int tok_jmp(char *kwd);
82 int tok_type(void);
83 int tok_chops(int soft);
84 void tok_delim(void);
85 void tok_macro(void);
86 int tok_inline(void);
88 /* default definitions and operators */
89 int def_type(char *s);
90 void def_typeput(char *s, int type);
91 int def_chopped(int c);
92 void def_choppedset(char *s);
93 void def_pieces(char *sign, char **top, char **mid, char **bot, char **cen);
94 void def_sizes(char *sign, char *sizes[]);
95 int def_brcost(int type);
96 void def_piecesput(char *sign, char *top, char *mid, char *bot, char *cen);
97 void def_sizesput(char *sign, char *sizes[]);
98 void def_brcostput(int type, int cost);
99 extern char *def_macros[][2];
101 /* variable length string buffer */
102 struct sbuf {
103 char *s; /* allocated buffer */
104 int sz; /* buffer size */
105 int n; /* length of the string stored in s */
108 void sbuf_init(struct sbuf *sbuf);
109 void sbuf_done(struct sbuf *sbuf);
110 char *sbuf_buf(struct sbuf *sbuf);
111 void sbuf_add(struct sbuf *sbuf, int c);
112 void sbuf_append(struct sbuf *sbuf, char *s);
113 void sbuf_printf(struct sbuf *sbuf, char *s, ...);
114 void sbuf_cut(struct sbuf *sbuf, int n);
115 int sbuf_len(struct sbuf *sbuf);
116 int sbuf_empty(struct sbuf *sbuf);
118 /* tex styles */
119 #define TS_D 0x00
120 #define TS_D0 0x01
121 #define TS_T 0x02
122 #define TS_T0 0x03
123 #define TS_S 0x10
124 #define TS_S0 0x11
125 #define TS_SS 0x20
126 #define TS_SS0 0x21
128 #define TS_MK(s, p) (((s) << 4) | (p))
129 #define TS_0(s) ((s) & 0x01) /* primed variant */
130 #define TS_MK0(s) ((s) | 0x01) /* make style primed */
131 #define TS_SZ(s) ((s) >> 4) /* character size */
132 #define TS_DX(s) ((s) == TS_D || (s) == TS_D0)
133 #define TS_TXT(s) ((s) & 0x02) /* text style */
135 int ts_sup(int style);
136 int ts_sub(int style);
137 int ts_denom(int style);
138 int ts_num(int style);
140 /* equations */
141 struct box {
142 struct sbuf raw; /* the contents */
143 int szreg, szown; /* number register holding box size */
144 int reg; /* register holding the contents */
145 int atoms; /* the number of atoms inserted */
146 int tbeg, tcur; /* type of the first and the last atoms */
147 int style; /* tex style (TS_*) */
148 char *tomark; /* register for saving box width */
151 struct box *box_alloc(int szreg, int at_pre, int style);
152 void box_free(struct box *box);
153 void box_puttext(struct box *box, int type, char *s, ...);
154 void box_putf(struct box *box, char *s, ...);
155 int box_size(struct box *box, char *val);
156 void box_merge(struct box *box, struct box *sub, int breakable);
157 void box_sub(struct box *box, struct box *sub, struct box *sup);
158 void box_from(struct box *box, struct box *lim, struct box *llim, struct box *ulim);
159 void box_over(struct box *box, struct box *num, struct box *denom);
160 void box_sqrt(struct box *box, struct box *sub);
161 void box_bar(struct box *box);
162 void box_under(struct box *box);
163 void box_accent(struct box *box, char *c);
164 void box_wrap(struct box *box, struct box *sub, char *left, char *right);
165 void box_move(struct box *box, int dy, int dx);
166 void box_gap(struct box *box, int n);
167 char *box_buf(struct box *box);
168 char *box_toreg(struct box *box);
169 void box_vertspace(struct box *box);
170 int box_empty(struct box *box);
171 void box_markpos(struct box *box, char *regname);
172 void box_vcenter(struct box *box, struct box *sub);
173 void box_pile(struct box *box, struct box **pile, int adj, int rowspace);
174 void box_matrix(struct box *box, int ncols, struct box *cols[][NPILES],
175 int *adj, int colspace, int rowspace);
177 /* managing registers */
178 char *escarg(char *arg);
179 int sregmk(void);
180 void sregrm(int id);
181 int nregmk(void);
182 void nregrm(int id);
183 char *nreg(int id);
184 char *sreg(int id);
185 char *nregname(int id);
186 char *sregname(int id);
187 void reg_reset(void);
189 /* eqn global variables */
190 extern int e_axisheight;
191 extern int e_minimumsize;
192 extern int e_overhang;
193 extern int e_nulldelim;
194 extern int e_scriptspace;
195 extern int e_thinspace;
196 extern int e_mediumspace;
197 extern int e_thickspace;
198 extern int e_num1;
199 extern int e_num2;
200 extern int e_denom1;
201 extern int e_denom2;
202 extern int e_sup1;
203 extern int e_sup2;
204 extern int e_sup3;
205 extern int e_sub1;
206 extern int e_sub2;
207 extern int e_supdrop;
208 extern int e_subdrop;
209 extern int e_xheight;
210 extern int e_rulethickness;
211 extern int e_bigopspacing1;
212 extern int e_bigopspacing2;
213 extern int e_bigopspacing3;
214 extern int e_bigopspacing4;
215 extern int e_bigopspacing5;
216 extern int e_columnsep;
217 extern int e_baselinesep;
218 extern int e_bodyheight;
219 extern int e_bodydepth;
220 void def_set(char *name, int val);