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 351