1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
|
/* SC A Table Calculator
* Common definitions
*
* original by James Gosling, September 1982
* modified by Mark Weiser and Bruce Israel,
* University of Maryland
* R. Bond 12/86
* More mods by Alan Silverstein, 3-4/88, see list of changes.
* $Revision: 6.21 $
*
*/
#if defined(MSDOS)
#include <stdio.h>
#endif
#define ATBL(tbl, row, col) (*(tbl + row) + (col))
#define MINROWS 100 /* minimum size at startup */
#define MINCOLS 30
#define ABSMAXCOLS 702 /* absolute cols: ZZ (base 26) */
#define CRROWS 1
#define CRCOLS 2
#define RESCOL 4 /* columns reserved for row numbers */
#define RESROW 3 /* rows reserved for prompt, error, and column numbers */
/* formats for engformat() */
#define REFMTFIX 0
#define REFMTFLT 1
#define REFMTENG 2
#define REFMTDATE 3
#define DEFWIDTH 10 /* Default column width and precision */
#define DEFPREC 2
#define DEFREFMT REFMTFIX /* Make default format fixed point THA 10/14/90 */
#define HISTLEN 10 /* Number of history entries for vi emulation */
#ifdef PSC
# define error(msg) fprintf(stderr, msg);
#else
# define error (void)move(1,0), (void)clrtoeol(), (void) printw
#endif
#define FBUFLEN 1024 /* buffer size for a single field */
#define PATHLEN 1024 /* maximum path length */
#ifndef A_CHARTEXT /* Should be defined in curses.h */
# ifdef INTERNATIONAL
# define A_CHARTEXT 0xff
# else
# define A_CHARTEXT 0x7f
# endif
#endif
#if (defined(BSD42) || defined(BSD43)) && !defined(strrchr)
#define strrchr rindex
#endif
#if (defined(BSD42) || defined(BSD43)) && !defined(strchr)
#define strchr index
#endif
#ifdef SYSV4
size_t strlen();
#endif
#ifndef FALSE
# define FALSE 0
# define TRUE 1
#endif /* !FALSE */
/*
* ent_ptr holds the row/col # and address type of a cell
*
* vf is the type of cell address, 0 non-fixed, or bitwise OR of FIX_ROW or
* FIX_COL
* vp : we just use vp->row or vp->col, vp may be a new cell just for holding
* row/col (say in gram.y) or a pointer to an existing cell
*/
struct ent_ptr {
int vf;
struct ent *vp;
};
/* holds the beginning/ending cells of a range */
struct range_s {
struct ent_ptr left, right;
};
/*
* Some not too obvious things about the flags:
* is_valid means there is a valid number in v.
* is_locked means that the cell cannot be edited.
* label set means it points to a valid constant string.
* is_strexpr set means expr yields a string expression.
* If is_strexpr is not set, and expr points to an expression tree, the
* expression yields a numeric expression.
* So, either v or label can be set to a constant.
* Either (but not both at the same time) can be set from an expression.
*/
#define VALID_CELL(p, r, c) ((p = *ATBL(tbl, r, c)) && \
((p->flags & is_valid) || p->label))
/* info for each cell, only alloc'd when something is stored in a cell */
struct ent {
double v; /* v && label are set in EvalAll() */
char *label;
struct enode *expr; /* cell's contents */
short flags;
short row, col;
struct ent *next; /* next deleted ent (pulled, deleted cells) */
char *format; /* printf format for this cell */
char cellerror; /* error in a cell? */
};
/* stores a range (left, right) */
struct range {
struct ent_ptr r_left, r_right;
char *r_name; /* possible name for this range */
struct range *r_next, *r_prev; /* chained ranges */
int r_is_range;
};
#define FIX_ROW 1
#define FIX_COL 2
/* stores type of operation this cell will preform */
struct enode {
int op;
union {
int gram_match; /* some compilers (hp9000ipc) need this */
double k; /* constant # */
struct ent_ptr v; /* ref. another cell */
struct range_s r; /* op is on a range */
char *s; /* string part of a cell */
struct { /* other cells use to eval()/seval() */
struct enode *left, *right;
} o;
} e;
};
/* op values */
#define O_VAR 'v'
#define O_CONST 'k'
#define O_ECONST 'E' /* constant cell w/ an error */
#define O_SCONST '$'
#define REDUCE 0200 /* Or'ed into OP if operand is a range */
#define OP_BASE 256
#define ACOS OP_BASE + 0
#define ASIN OP_BASE + 1
#define ATAN OP_BASE + 2
#define CEIL OP_BASE + 3
#define COS OP_BASE + 4
#define EXP OP_BASE + 5
#define FABS OP_BASE + 6
#define FLOOR OP_BASE + 7
#define HYPOT OP_BASE + 8
#define LOG OP_BASE + 9
#define LOG10 OP_BASE + 10
#define POW OP_BASE + 11
#define SIN OP_BASE + 12
#define SQRT OP_BASE + 13
#define TAN OP_BASE + 14
#define DTR OP_BASE + 15
#define RTD OP_BASE + 16
#define MIN OP_BASE + 17
#define MAX OP_BASE + 18
#define RND OP_BASE + 19
#define HOUR OP_BASE + 20
#define MINUTE OP_BASE + 21
#define SECOND OP_BASE + 22
#define MONTH OP_BASE + 23
#define DAY OP_BASE + 24
#define YEAR OP_BASE + 25
#define NOW OP_BASE + 26
#define DATE OP_BASE + 27
#define FMT OP_BASE + 28
#define SUBSTR OP_BASE + 29
#define STON OP_BASE + 30
#define EQS OP_BASE + 31
#define EXT OP_BASE + 32
#define ELIST OP_BASE + 33 /* List of expressions */
#define LMAX OP_BASE + 34
#define LMIN OP_BASE + 35
#define NVAL OP_BASE + 36
#define SVAL OP_BASE + 37
#define PV OP_BASE + 38
#define FV OP_BASE + 39
#define PMT OP_BASE + 40
#define STINDEX OP_BASE + 41
#define LOOKUP OP_BASE + 42
#define ATAN2 OP_BASE + 43
#define INDEX OP_BASE + 44
#define DTS OP_BASE + 45
#define TTS OP_BASE + 46
#define ABS OP_BASE + 47
#define HLOOKUP OP_BASE + 48
#define VLOOKUP OP_BASE + 49
#define ROUND OP_BASE + 50
#define IF OP_BASE + 51
#define MYROW OP_BASE + 52
#define MYCOL OP_BASE + 53
#define COLTOA OP_BASE + 54
#define UPPER OP_BASE + 55
#define LOWER OP_BASE + 56
#define CAPITAL OP_BASE + 57
#define NUMITER OP_BASE + 58
/* flag values */
#define is_valid 0001
#define is_changed 0002
#define is_strexpr 0004
#define is_leftflush 0010
#define is_deleted 0020
#define is_locked 0040
#define is_label 0100
/* cell error (1st generation (ERROR) or 2nd+ (INVALID)) */
#define CELLOK 0
#define CELLERROR 1
#define CELLINVALID 2
#define ctl(c) ((c)&037)
#define ESC 033
#define DEL 0177
/* calculation order */
#define BYCOLS 1
#define BYROWS 2
/* tblprint style output for: */
#define TBL 1 /* 'tbl' */
#define LATEX 2 /* 'LaTeX' */
#define TEX 3 /* 'TeX' */
#define SLATEX 4 /* 'SLaTeX' (Scandinavian LaTeX) */
#define FRAME 5 /* tblprint style output for FrameMaker */
/* Types for etype() */
#define NUM 1
#define STR 2
#define GROWAMT 30 /* default minimum amount to grow */
#define GROWNEW 1 /* first time table */
#define GROWROW 2 /* add rows */
#define GROWCOL 3 /* add columns */
#define GROWBOTH 4 /* grow both */
extern struct ent ***tbl; /* data table ref. in vmtbl.c and ATBL() */
extern char curfile[];
extern int strow, stcol;
extern int currow, curcol;
extern int savedrow, savedcol;
extern int FullUpdate;
extern int maxrow, maxcol;
extern int maxrows, maxcols; /* # cells currently allocated */
extern int *fwidth;
extern int *precision;
extern int *realfmt;
extern char *col_hidden;
extern char *row_hidden;
extern char line[FBUFLEN];
extern int linelim;
extern int changed;
extern struct ent *to_fix;
extern int showsc, showsr;
extern FILE *openout();
extern FILE *fdopen(), *fopen();
extern char *coltoa();
extern char *findhome();
extern char *r_name();
extern char *scxmalloc();
extern char *scxrealloc();
extern char *strrchr();
extern char *v_name();
extern int any_locked_cells();
extern int are_ranges();
extern int atocol();
extern int cwritefile();
extern int engformat();
extern int etype();
extern int fork();
extern int format();
extern int get_rcqual();
extern int growtbl();
extern int locked_cell();
extern int modcheck();
extern int nmgetch();
extern int writefile();
extern int yn_ask();
extern struct enode *copye();
extern struct enode *new();
extern struct enode *new_const();
extern struct enode *new_range();
extern struct enode *new_str();
extern struct enode *new_var();
extern struct ent *lookat();
extern struct range *find_range();
extern void EvalAll();
extern void add_range();
extern void backcol();
extern void backrow();
extern void checkbounds();
extern void clearent();
extern void clean_range();
extern void closecol();
extern void closeout();
extern void closerow();
extern void colshow_op();
extern void copy();
extern void copyent();
extern void creadfile();
extern void deleterow();
extern void del_range();
extern void deraw();
extern void diesave();
extern void doend();
extern void doformat();
extern void dupcol();
extern void duprow();
extern void editexp();
extern void editfmt();
extern void edit_mode();
extern void edits();
extern void editv();
extern void efree();
extern void erase_area();
extern void erasedb();
extern void eraser();
extern void fill();
extern void flush_saved();
extern void format_cell();
extern void forwcol();
extern void forwrow();
extern void free_ent();
extern void go_last();
extern void goraw();
extern void help();
extern void hide_col();
extern void hide_row();
extern void hidecol();
extern void hiderow();
extern void initkbd();
extern void ins_string();
extern void insert_mode();
extern void insertrow();
extern void kbd_again();
extern void label();
extern void let();
extern void list_range();
extern void lock_cells();
extern void moveto();
extern void num_search();
extern void opencol();
extern void printfile();
extern void pullcells();
extern void readfile();
extern void resetkbd();
extern void rowshow_op();
extern void scxfree();
extern void setauto();
extern void setiterations();
extern void setorder();
extern void showcol();
extern void showdr();
extern void showrow();
extern void showstring();
extern void signals();
extern void slet();
extern void startshow();
extern void str_search();
extern void sync_ranges();
extern void sync_refs();
extern void tblprintfile();
extern void unlock_cells();
extern void valueize_area();
extern void write_fd();
extern void write_line();
extern void write_range();
extern void yyerror();
#ifdef DOBACKUPS
extern int backup_file();
#endif
extern int modflg;
#if !defined(VMS) && !defined(MSDOS) && defined(CRYPT_PATH)
extern int Crypt;
#endif
extern char *mdir;
extern double prescale;
extern int extfunc;
extern int propagation;
extern int repct;
extern int calc_order;
extern int autocalc;
extern int autolabel;
extern int numeric;
extern int showcell;
extern int showtop;
extern int loading;
extern int getrcqual;
extern int tbl_style;
extern int rndinfinity;
extern char *progname;
extern int craction;
extern int rowlimit;
extern int collimit;
#if BSD42 || SYSIII
#ifndef cbreak
#define cbreak crmode
#define nocbreak nocrmode
#endif
#endif
#if defined(BSD42) || defined(BSD43) && !defined(ultrix)
#define memcpy(dest, source, len) bcopy(source, dest, (unsigned int)len);
#define memset(dest, zero, len) bzero((dest), (unsigned int)(len));
#else
#include <memory.h>
#endif
/* This looks like a hack for systems which have these calls defined
* internally. This is not true of Debian 2.*. Therefore, comment out.
* D. J. Raymond <raymond@kestrel.nmt.edu>, 31 December 1999
*
#define nmgetch getch
#define initkbd()
#define resetkbd()
#define kbd_again()
*/
|