Commit | Line | Data |
---|---|---|
36f1eed6 KB |
1 | /* SC A Table Calculator |
2 | * Common definitions | |
3 | * | |
4 | * original by James Gosling, September 1982 | |
5 | * modified by Mark Weiser and Bruce Israel, | |
6 | * University of Maryland | |
7 | * R. Bond 12/86 | |
8 | * More mods by Alan Silverstein, 3-4/88, see list of changes. | |
9 | * $Revision: 6.8 $ | |
10 | * | |
11 | */ | |
12 | ||
13 | #define ATBL(tbl, row, col) (*(tbl + row) + (col)) | |
14 | ||
15 | #define MINROWS 40 /* minimum size at startup */ | |
16 | #define MINCOLS 20 | |
17 | #define ABSMAXCOLS 702 /* absolute cols: ZZ (base 26) */ | |
18 | #define RESCOL 4 /* columns reserved for row numbers */ | |
19 | #define RESROW 3 /* rows reserved for prompt, error, and column numbers */ | |
20 | #define DEFWIDTH 10 /* Default column width and precision */ | |
21 | #define DEFPREC 2 | |
22 | #define HISTLEN 10 /* Number of history entries for vi emulation */ | |
23 | #define error (void)move(1,0), (void)clrtoeol(), (void) printw | |
24 | #define FBUFLEN 1024 /* buffer size for a single field */ | |
25 | #define PATHLEN 1024 /* maximum path length */ | |
26 | ||
27 | #ifndef A_CHARTEXT /* Should be defined in curses.h */ | |
28 | #ifdef INTERNATIONAL | |
29 | #define A_CHARTEXT 0xff | |
30 | #else | |
31 | #define A_CHARTEXT 0x7f | |
32 | #endif | |
33 | #endif | |
34 | ||
35 | #if (defined(BSD42) || defined(BSD43)) && !defined(strrchr) | |
36 | #define strrchr rindex | |
37 | #endif | |
38 | ||
39 | struct ent_ptr { | |
40 | int vf; | |
41 | struct ent *vp; | |
42 | }; | |
43 | ||
44 | struct range_s { | |
45 | struct ent_ptr left, right; | |
46 | }; | |
47 | ||
48 | /* | |
49 | * Some not too obvious things about the flags: | |
50 | * is_valid means there is a valid number in v. | |
51 | * label set means it points to a valid constant string. | |
52 | * is_strexpr set means expr yields a string expression. | |
53 | * If is_strexpr is not set, and expr points to an expression tree, the | |
54 | * expression yields a numeric expression. | |
55 | * So, either v or label can be set to a constant. | |
56 | * Either (but not both at the same time) can be set from an expression. | |
57 | */ | |
58 | ||
59 | #define VALID_CELL(p, r, c) ((p = *ATBL(tbl, r, c)) && \ | |
60 | ((p->flags & is_valid) || p->label)) | |
61 | ||
62 | struct ent { | |
63 | double v; | |
64 | char *label; | |
65 | struct enode *expr; | |
66 | short flags; | |
67 | short row, col; | |
68 | struct ent *next; /* next deleted ent */ | |
69 | struct ent *evnext; /* next ent w/ a object to eval */ | |
70 | struct ent *evprev; /* prev ent w/ a object to eval */ | |
71 | }; | |
72 | ||
73 | struct range { | |
74 | struct ent_ptr r_left, r_right; | |
75 | char *r_name; | |
76 | struct range *r_next, *r_prev; | |
77 | int r_is_range; | |
78 | }; | |
79 | ||
80 | #define FIX_ROW 1 | |
81 | #define FIX_COL 2 | |
82 | ||
83 | struct enode { | |
84 | int op; | |
85 | union { | |
86 | double k; | |
87 | struct ent_ptr v; | |
88 | struct range_s r; | |
89 | char *s; | |
90 | struct { | |
91 | struct enode *left, *right; | |
92 | } o; | |
93 | } e; | |
94 | }; | |
95 | ||
96 | /* op values */ | |
97 | #define O_VAR 'v' | |
98 | #define O_CONST 'k' | |
99 | #define O_SCONST '$' | |
100 | #define REDUCE 0200 /* Or'ed into OP if operand is a range */ | |
101 | ||
102 | #define OP_BASE 256 | |
103 | #define ACOS OP_BASE + 0 | |
104 | #define ASIN OP_BASE + 1 | |
105 | #define ATAN OP_BASE + 2 | |
106 | #define CEIL OP_BASE + 3 | |
107 | #define COS OP_BASE + 4 | |
108 | #define EXP OP_BASE + 5 | |
109 | #define FABS OP_BASE + 6 | |
110 | #define FLOOR OP_BASE + 7 | |
111 | #define HYPOT OP_BASE + 8 | |
112 | #define LOG OP_BASE + 9 | |
113 | #define LOG10 OP_BASE + 10 | |
114 | #define POW OP_BASE + 11 | |
115 | #define SIN OP_BASE + 12 | |
116 | #define SQRT OP_BASE + 13 | |
117 | #define TAN OP_BASE + 14 | |
118 | #define DTR OP_BASE + 15 | |
119 | #define RTD OP_BASE + 16 | |
120 | #define MIN OP_BASE + 17 | |
121 | #define MAX OP_BASE + 18 | |
122 | #define RND OP_BASE + 19 | |
123 | #define HOUR OP_BASE + 20 | |
124 | #define MINUTE OP_BASE + 21 | |
125 | #define SECOND OP_BASE + 22 | |
126 | #define MONTH OP_BASE + 23 | |
127 | #define DAY OP_BASE + 24 | |
128 | #define YEAR OP_BASE + 25 | |
129 | #define NOW OP_BASE + 26 | |
130 | #define DATE OP_BASE + 27 | |
131 | #define FMT OP_BASE + 28 | |
132 | #define SUBSTR OP_BASE + 29 | |
133 | #define STON OP_BASE + 30 | |
134 | #define EQS OP_BASE + 31 | |
135 | #define EXT OP_BASE + 32 | |
136 | #define ELIST OP_BASE + 33 /* List of expressions */ | |
137 | #define LMAX OP_BASE + 34 | |
138 | #define LMIN OP_BASE + 35 | |
139 | #define NVAL OP_BASE + 36 | |
140 | #define SVAL OP_BASE + 37 | |
141 | #define PV OP_BASE + 38 | |
142 | #define FV OP_BASE + 39 | |
143 | #define PMT OP_BASE + 40 | |
144 | #define STINDEX OP_BASE + 41 | |
145 | #define LOOKUP OP_BASE + 42 | |
146 | #define ATAN2 OP_BASE + 43 | |
147 | #define INDEX OP_BASE + 44 | |
148 | #define DTS OP_BASE + 45 | |
149 | #define TTS OP_BASE + 46 | |
150 | #define ABS OP_BASE + 47 | |
151 | #define HLOOKUP OP_BASE + 48 | |
152 | #define VLOOKUP OP_BASE + 49 | |
153 | #define ROUND OP_BASE + 50 | |
154 | #define IF OP_BASE + 51 | |
155 | ||
156 | /* flag values */ | |
157 | #define is_valid 0001 | |
158 | #define is_changed 0002 | |
159 | #define is_strexpr 0004 | |
160 | #define is_leftflush 0010 | |
161 | #define is_deleted 0020 | |
162 | ||
163 | #define ctl(c) ((c)&037) | |
164 | #define ESC 033 | |
165 | #define DEL 0177 | |
166 | ||
167 | #define BYCOLS 1 | |
168 | #define BYROWS 2 | |
169 | #define BYGRAPH 4 /* Future */ | |
170 | ||
171 | #define TBL 1 /* tblprint style output for 'tbl' */ | |
172 | #define LATEX 2 /* tblprint style output for 'LaTeX' */ | |
173 | #define TEX 3 /* tblprint style output for 'TeX' */ | |
174 | ||
175 | /* Types for etype() */ | |
176 | ||
177 | #define NUM 1 | |
178 | #define STR 2 | |
179 | ||
180 | #define GROWAMT 10 /* default minimum amount to grow */ | |
181 | ||
182 | #define GROWNEW 1 /* first time table */ | |
183 | #define GROWROW 2 /* add rows */ | |
184 | #define GROWCOL 3 | |
185 | #define GROWBOTH 4 | |
186 | extern struct ent ***tbl; | |
187 | ||
188 | extern char curfile[]; | |
189 | extern int strow, stcol; | |
190 | extern int currow, curcol; | |
191 | extern int savedrow, savedcol; | |
192 | extern int FullUpdate; | |
193 | extern int maxrow, maxcol; | |
194 | extern int maxrows, maxcols; /* # cells currently allocated */ | |
195 | extern int *fwidth; | |
196 | extern int *precision; | |
197 | extern char *col_hidden; | |
198 | extern char *row_hidden; | |
199 | extern char line[FBUFLEN]; | |
200 | extern int linelim; | |
201 | extern int changed; | |
202 | extern struct ent *to_fix; | |
203 | extern int showsc, showsr; | |
204 | ||
205 | extern FILE *openout(); | |
206 | extern char *coltoa(); | |
207 | extern char *findhome(); | |
208 | extern char *r_name(); | |
209 | extern char *seval(); | |
210 | extern char *strrchr(); | |
211 | extern char *v_name(); | |
212 | extern char *xmalloc(); | |
213 | extern double dolookup(); | |
214 | extern double eval(); | |
215 | extern int RealEvalAll(); | |
216 | extern int are_ranges(); | |
217 | extern int atocol(); | |
218 | extern int constant(); | |
219 | extern int etype(); | |
220 | extern int fork(); | |
221 | extern int get_rcqual(); | |
222 | extern int growtbl(); | |
223 | extern int nmgetch(); | |
224 | extern int writefile(); | |
225 | extern int xfree(); | |
226 | extern int yn_ask(); | |
227 | extern struct enode *copye(); | |
228 | extern struct enode *new(); | |
229 | extern struct enode *new_const(); | |
230 | extern struct enode *new_range(); | |
231 | extern struct enode *new_str(); | |
232 | extern struct enode *new_var(); | |
233 | extern struct ent *lookat(); | |
234 | extern struct range *find_range(); | |
235 | extern void EvalAll(); | |
236 | extern void Evalall(); | |
237 | extern void RealEvalOne(); | |
238 | extern void backcol(); | |
239 | extern void backrow(); | |
240 | extern void checkbounds(); | |
241 | extern void clearent(); | |
242 | extern void closecol(); | |
243 | extern void closeout(); | |
244 | extern void closerow(); | |
245 | extern void colshow_op(); | |
246 | extern void colvalueize(); | |
247 | extern void colvalueize(); | |
248 | extern void copy(); | |
249 | extern void copyent(); | |
250 | extern void copyrtv(); | |
251 | extern void decompile(); | |
252 | extern void deletecol(); | |
253 | extern void deleterow(); | |
254 | extern void deraw(); | |
255 | extern void doend(); | |
256 | extern void doformat(); | |
257 | extern void dupcol(); | |
258 | extern void duprow(); | |
259 | extern void editexp(); | |
260 | extern void edits(); | |
261 | extern void editv(); | |
262 | extern void efree(); | |
263 | extern void erase_area(); | |
264 | extern void erasedb(); | |
265 | extern void eraser(); | |
266 | extern void fill(); | |
267 | extern void flush_saved(); | |
268 | extern void forwcol(); | |
269 | extern void forwrow(); | |
270 | extern void free_ent(); | |
271 | extern void go_last(); | |
272 | extern void goraw(); | |
273 | extern void help(); | |
274 | extern void hide_col(); | |
275 | extern void hide_row(); | |
276 | extern void hidecol(); | |
277 | extern void hiderow(); | |
278 | extern void index_arg(); | |
279 | extern void ins_string(); | |
280 | extern void insert_mode(); | |
281 | extern void insertcol(); | |
282 | extern void insertrow(); | |
283 | extern void kbd_again(); | |
284 | extern void label(); | |
285 | extern void let(); | |
286 | extern void list_arg(); | |
287 | extern void list_range(); | |
288 | extern void moveto(); | |
289 | extern void num_search(); | |
290 | extern void one_arg(); | |
291 | extern void opencol(); | |
292 | extern void openrow(); | |
293 | extern void printfile(); | |
294 | extern void pullcells(); | |
295 | extern void range_arg(); | |
296 | extern void readfile(); | |
297 | extern void repaint(); | |
298 | extern void resetkbd(); | |
299 | extern void rowshow_op(); | |
300 | extern void rowvalueize(); | |
301 | extern void setauto(); | |
302 | extern void setiterations(); | |
303 | extern void setorder(); | |
304 | extern void showcol(); | |
305 | extern void showdr(); | |
306 | extern void showrow(); | |
307 | extern void showstring(); | |
308 | extern void signals(); | |
309 | extern void slet(); | |
310 | extern void startshow(); | |
311 | extern void str_search(); | |
312 | extern void sync_refs(); | |
313 | extern void syncref(); | |
314 | extern void tblprintfile(); | |
315 | extern void three_arg(); | |
316 | extern void two_arg(); | |
317 | extern void two_arg_index(); | |
318 | extern void update(); | |
319 | extern void valueize_area(); | |
320 | extern void write_fd(); | |
321 | extern void write_line(); | |
322 | extern void yyerror(); | |
323 | #ifdef DOBACKUPS | |
324 | extern int backup_file(); | |
325 | #endif | |
326 | ||
327 | extern int modflg; | |
328 | extern int Crypt; | |
329 | extern char *mdir; | |
330 | extern double prescale; | |
331 | extern int extfunc; | |
332 | extern int propagation; | |
333 | extern int calc_order; | |
334 | extern int autocalc; | |
335 | extern int numeric; | |
336 | extern int showcell; | |
337 | extern int showtop; | |
338 | extern int loading; | |
339 | extern int getrcqual; | |
340 | extern int tbl_style; | |
341 | extern char *progname; | |
342 | ||
343 | #if BSD42 || SYSIII | |
344 | ||
345 | #ifndef cbreak | |
346 | #define cbreak crmode | |
347 | #define nocbreak nocrmode | |
348 | #endif | |
349 | ||
350 | #endif |