home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Product / Product.zip / sc621_3.zip / src / sc.h < prev    next >
C/C++ Source or Header  |  1994-03-21  |  12KB  |  458 lines

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