/* 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: 7.16 $ * */ #ifdef MSDOS #include #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 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 REFMTLDATE 4 #define DEFWIDTH 10 /* Default column width and precision */ #define DEFPREC 2 #define DEFREFMT REFMTFIX /* Make default format fixed point THA 10/14/90 */ #define FKEYS 24 /* Number of function keys available */ #define HISTLEN 100 /* Number of history entries for vi emulation */ #define CPAIRS 8 /* Number of color pairs available */ #define COLFORMATS 10 /* Number of custom column formats */ #define DELBUFSIZE 40 /* Number of named buffers + 4 */ #ifdef PSC # define error(msg) fprintf(stderr, msg); #else # define error isatty(fileno(stdout)) && !move(1,0) && !clrtoeol() && printw #endif #define FBUFLEN 1024 /* buffer size for a single field */ #define PATHLEN 1024 /* maximum path length */ #ifndef DFLT_PAGER #define DFLT_PAGER "more" /* more is probably more widespread than less */ #endif /* DFLT_PAGER */ #define MAXCMD 160 /* for ! command and commands that use the pager */ #ifndef A_CHARTEXT /* Should be defined in curses.h */ #define A_CHARTEXT 0xff #endif #ifndef color_set #define color_set(c, o) attron(COLOR_PAIR(c)) #endif #if !defined(attr_get) || defined(NCURSES_VERSION) && NCURSES_VERSION_MAJOR < 5 #undef attr_get #define attr_get(a, p, o) ((void)((a) != 0 && (*(a) = stdscr->_attrs)), \ (void)((p) != 0 && \ (*(p) = PAIR_NUMBER(stdscr->_attrs))), OK) #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. * is_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; short nrow, ncol; /* link to note */ short nlastrow, nlastcol; struct ent *next; /* next deleted ent (pulled, deleted cells) */ char *format; /* printf format for this cell */ char cellerror; /* error in a cell? */ }; #define FIX_ROW 1 #define FIX_COL 2 /* stores type of operation this cell will perform */ 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; char *s; /* previous value of @ext function in case */ } o; /* external functions are turned off */ } e; }; /* 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; }; /* stores a framed range (left, right) */ struct frange { struct ent *or_left, *or_right; /* outer range */ struct ent *ir_left, *ir_right; /* inner range */ struct frange *r_next, *r_prev; /* chained ranges */ }; /* stores a color range (left, right) */ struct crange { struct ent *r_left, *r_right; int r_color; struct crange *r_next, *r_prev; /* chained ranges */ }; struct colorpair { int fg; int bg; struct enode *expr; }; /* stores an abbreviation and its expansion */ struct abbrev { char *abbr; char *exp; struct abbrev *a_next, *a_prev; }; struct impexfilt { char ext[PATHLEN]; char plugin[PATHLEN]; char type; struct impexfilt *next; }; /* Use this structure to save the last 'g' command */ struct go_save { int g_type; double g_n; char *g_s; int g_row; int g_col; int g_lastrow; int g_lastcol; int strow; int stcol; int stflag; int errsearch; }; /* 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 SUM (OP_BASE + 17) #define PROD (OP_BASE + 18) #define AVG (OP_BASE + 19) #define COUNT (OP_BASE + 20) #define STDDEV (OP_BASE + 21) #define MAX (OP_BASE + 22) #define MIN (OP_BASE + 23) #define RND (OP_BASE + 24) #define HOUR (OP_BASE + 25) #define MINUTE (OP_BASE + 26) #define SECOND (OP_BASE + 27) #define MONTH (OP_BASE + 28) #define DAY (OP_BASE + 29) #define YEAR (OP_BASE + 30) #define NOW (OP_BASE + 31) #define DATE (OP_BASE + 32) #define FMT (OP_BASE + 33) #define SUBSTR (OP_BASE + 34) #define STON (OP_BASE + 35) #define EQS (OP_BASE + 36) #define EXT (OP_BASE + 37) #define ELIST (OP_BASE + 38) /* List of expressions */ #define LMAX (OP_BASE + 39) #define LMIN (OP_BASE + 40) #define NVAL (OP_BASE + 41) #define SVAL (OP_BASE + 42) #define PV (OP_BASE + 43) #define FV (OP_BASE + 44) #define PMT (OP_BASE + 45) #define STINDEX (OP_BASE + 46) #define LOOKUP (OP_BASE + 47) #define ATAN2 (OP_BASE + 48) #define INDEX (OP_BASE + 49) #define DTS (OP_BASE + 50) #define TTS (OP_BASE + 51) #define ABS (OP_BASE + 52) #define HLOOKUP (OP_BASE + 53) #define VLOOKUP (OP_BASE + 54) #define ROUND (OP_BASE + 55) #define IF (OP_BASE + 56) #define FILENAME (OP_BASE + 57) #define MYROW (OP_BASE + 58) #define MYCOL (OP_BASE + 59) #define LASTROW (OP_BASE + 60) #define LASTCOL (OP_BASE + 61) #define COLTOA (OP_BASE + 62) #define UPPER (OP_BASE + 63) #define LOWER (OP_BASE + 64) #define CAPITAL (OP_BASE + 65) #define NUMITER (OP_BASE + 66) #define ERR_ (OP_BASE + 67) #define PI_ (OP_BASE + 68) #define BLACK (OP_BASE + 69) #define RED (OP_BASE + 70) #define GREEN (OP_BASE + 71) #define YELLOW (OP_BASE + 72) #define BLUE (OP_BASE + 73) #define MAGENTA (OP_BASE + 74) #define CYAN (OP_BASE + 75) #define WHITE (OP_BASE + 76) /* 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 #define is_cleared 0200 #define may_sync 0400 /* 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 /* values for showrange for ranges of rows or columns */ #define SHOWROWS 2 #define SHOWCOLS 3 /* 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 arg; extern int strow, stcol; extern int currow, curcol; extern int gmyrow, gmycol; /* globals used for @myrow, @mycol cmds */ extern int rescol; /* columns reserved for row numbers */ extern int savedrow[37], savedcol[37]; extern int savedstrow[37], savedstcol[37]; extern int FullUpdate; extern int maxrow, maxcol; extern int maxrows, maxcols; /* # cells currently allocated */ extern int rowsinrange; /* Number of rows in target range of a goto */ extern int colsinrange; /* Number of cols in target range of a goto */ extern int *fwidth; extern int *precision; extern int *realfmt; extern char *colformat[10]; extern char *col_hidden; extern char *row_hidden; extern char line[FBUFLEN]; extern int linelim; extern int changed; extern struct ent *delbuf[DELBUFSIZE]; extern char *delbuffmt[DELBUFSIZE]; extern int dbidx; extern int qbuf; /* buffer no. specified by `"' command */ extern int showsc, showsr; extern int showrange; /* Causes ranges to be highlighted */ extern int cellassign; extern int macrofd; extern int cslop; extern int usecurses; extern int brokenpipe; /* Set to true if SIGPIPE is received */ extern char dpoint; /* country-dependent decimal point from locale */ extern char thsep; /* country-dependent thousands separator from locale */ extern FILE *openfile(char *fname, int *rpid, int *rfd); extern char *coltoa(int col); extern char *findplugin(char *ext, char type); extern char *findhome(char *path); extern char *r_name(int r1, int c1, int r2, int c2); extern char *scxmalloc(unsigned n); extern char *scxrealloc(char *ptr, unsigned n); extern char *seval(register struct enode *se); extern char *v_name(int row, int col); extern double eval(register struct enode *e); extern int any_locked_cells(int r1, int c1, int r2, int c2); extern int are_colors(); extern int are_frames(); extern int are_ranges(); extern int atocol(char *string, int len); extern int creadfile(char *save, int eraseflg); extern int cwritefile(char *fname, int r0, int c0, int rn, int cn); extern int engformat(int fmt, int width, int lprecision, double val, char *buf, int buflen); extern int etype(register struct enode *e); extern int find_range(char *name, int len, struct ent *lmatch, struct ent *rmatch, struct range **rng); extern int format(char *fmt, int lprecision, double val, char *buf, int buflen); extern int get_rcqual(int ch); extern int growtbl(int rowcol, int toprow, int topcol); extern int locked_cell(int r, int c); extern int modcheck(char *endstr); extern int nmgetch(); extern int plugin_exists(char *name, int len, char *path); extern int readfile(char *fname, int eraseflg); extern int writefile(char *fname, int r0, int c0, int rn, int cn); extern int yn_ask(char *msg); extern struct abbrev *find_abbr(char *abbrev, int len, struct abbrev **prev); extern struct colorpair *cpairs[8]; extern struct enode *copye(register struct enode *e, int Rdelta, int Cdelta, int r1, int c1, int r2, int c2, int transpose); extern struct enode *new(int op, struct enode *a1, struct enode *a2); extern struct enode *new_const(int op, double a1); extern struct enode *new_range(int op, struct range_s a1); extern struct enode *new_str(char *s); extern struct enode *new_var(int op, struct ent_ptr a1); extern struct ent *lookat(int row, int col); extern struct crange *find_crange(int row, int col); extern struct frange *find_frange(int row, int col); extern void EvalAll(); extern void add_crange(struct ent *r_left, struct ent *r_right, int pair); extern void add_frange(struct ent *or_left, struct ent *or_right, struct ent *ir_left, struct ent *ir_right, int toprows, int bottomrows, int leftcols, int rightcols); extern void add_range(char *name, struct ent_ptr left, struct ent_ptr right, int is_range); extern void addplugin(char *ext, char *plugin, char type); extern void backcol(int arg); extern void backrow(int arg); extern void change_color(int pair, struct enode *e); extern void checkbounds(int *rowp, int *colp); extern void clearent(struct ent *v); extern void clean_crange(); extern void clean_frange(); extern void clean_range(); extern void closecol(int arg); extern void closefile(FILE *f, int pid, int rfd); extern void closerow(int r, int numrow); extern void colshow_op(); extern void copy(struct ent *dv1, struct ent *dv2, struct ent *v1, struct ent *v2); extern void copyent(register struct ent *n, register struct ent *p, int dr, int dc, int r1, int c1, int r2, int c2, int transpose); extern void decompile(register struct enode *e, int priority); extern void deleterow(register int arg); extern void del_range(struct ent *left, struct ent *right); extern void del_abbr(char *abbrev); extern void deraw(int ClearLastLine); extern void diesave(); extern void doend(int rowinc, int colinc); extern void doformat(int c1, int c2, int w, int p, int r); extern void dupcol(); extern void duprow(); extern void doquery(char *s, char *data, int fd); extern void dostat(int fd); extern void dotick(int tick); extern void editexp(int row, int col); extern void editfmt(int row, int col); extern void edit_mode(); extern void edits(int row, int col); extern void editv(int row, int col); extern void efree(struct enode *e); extern void erase_area(int sr, int sc, int er, int ec, int ignorelock); extern void erasedb(); extern void eraser(struct ent *v1, struct ent *v2); extern void fgetnum(int r0, int c0, int rn, int cn, int fd); extern void fill(struct ent *v1, struct ent *v2, double start, double inc); extern void fix_colors(int row1, int col1, int row2, int col2, int delta1, int delta2); extern void fix_frames(int row1, int col1, int row2, int col2, int delta1, int delta2); extern void fix_ranges(int row1, int col1, int row2, int col2, int delta1, int delta2); extern void flush_saved(); extern void formatcol(int arg); extern void format_cell(struct ent *v1, struct ent *v2, char *s); extern void forwcol(int arg); extern void forwrow(int arg); extern void free_ent(register struct ent *p, int unlock); extern void getexp(int r0, int c0, int rn, int cn, int fd); extern void getfmt(int r0, int c0, int rn, int cn, int fd); extern void getformat(int col, int fd); extern void getnum(int r0, int c0, int rn, int cn, int fd); extern void getstring(int r0, int c0, int rn, int cn, int fd); extern void go_last(); extern void goraw(); extern void help(); extern void hide_col(int arg); extern void hide_row(int arg); extern void hidecol(int arg); extern void hiderow(int arg); extern void initcolor(int colornum); extern void initkbd(); extern void ins_in_line(int c); extern void ins_string(char *s); extern void insert_mode(); extern void insertcol(int arg, int delta); extern void insertrow(int arg, int delta); extern void kbd_again(); extern void label(register struct ent *v, register char *s, int flushdir); extern void let(struct ent *v, struct enode *e); extern void list_colors(FILE *f); extern void list_ranges(FILE *f); extern void lock_cells(struct ent *v1, struct ent *v2); extern void markcell(); extern void move_area(int dr, int dc, int sr, int sc, int er, int ec); extern void mover(struct ent *d, struct ent *v1, struct ent *v2); extern void moveto(int row, int col, int lastrow, int lastcol, int cornrow, int corncol); extern void toggle_navigate_mode(); extern void num_search(double n, int firstrow, int firstcol, int lastrow, int lastcol, int errsearch); extern void printfile(char *fname, int r0, int c0, int rn, int cn); extern void pullcells(int to_insert); extern void query(char *s, char *data); extern void read_hist(); extern void remember(int save); extern void resetkbd(); extern void rowshow_op(); extern void scxfree(char *p); extern void setauto(int i); extern void setiterations(int i); extern void setorder(int i); extern void showcol(int c1, int c2); extern void showdr(); extern void showrow(int r1, int r2); extern void showstring(char *string, int dirflush, int hasvalue, int row, int col, int *nextcolp, int mxcol, int *fieldlenp, int r, int c, struct frange *fr, int frightcols, int flcols, int frcols); extern void signals(); extern void slet(struct ent *v, struct enode *se, int flushdir); extern void sortrange(struct ent *left, struct ent *right, char *criteria); extern void startshow(); extern void startdisp(); extern void stopdisp(); extern void str_search(char *s, int firstrow, int firstcol, int lastrow, int lastcol, int num); extern void sync_cranges(); extern void sync_franges(); extern void sync_ranges(); extern void sync_refs(); extern void tblprintfile(char *fname, int r0, int c0, int rn, int cn); extern void unlock_cells(struct ent *v1, struct ent *v2); extern void update(int anychanged); extern void valueize_area(int sr, int sc, int er, int ec); extern void write_cells(register FILE *f, int r0, int c0, int rn, int cn, int dr, int dc); extern void write_colors(FILE *f, int indent); extern void write_cranges(FILE *f); extern void write_fd(register FILE *f, int r0, int c0, int rn, int cn); extern void write_franges(FILE *f); extern void write_hist(); extern void write_line(int c); extern void write_ranges(FILE *f); extern void yank_area(int sr, int sc, int er, int ec); extern void yyerror(char *err); extern int yylex(); extern int yyparse(); #ifdef DOBACKUPS extern int backup_file(char *path); #endif extern int modflg; #if !defined(VMS) && !defined(MSDOS) && defined(CRYPT_PATH) extern int Crypt; #endif extern char *mdir; extern char *autorun; extern int skipautorun; extern char *fkey[FKEYS]; extern char *scext; extern char *ascext; extern char *tbl0ext; extern char *tblext; extern char *latexext; extern char *slatexext; extern char *texext; extern int scrc; extern double prescale; extern int extfunc; extern int propagation; extern int repct; extern int calc_order; extern int autocalc; extern int autolabel; extern int autoinsert; extern int autowrap; extern int optimize; extern int numeric; extern int showcell; extern int showtop; extern int color; extern int colorneg; extern int colorerr; extern int braille; extern int braillealt; extern int loading; extern int getrcqual; extern int tbl_style; extern int rndtoeven; extern char *progname; extern int numeric_field; extern int craction; extern int pagesize; /* If nonzero, use instead of 1/2 screen height */ 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 #endif