4.4BSD/usr/src/contrib/calc-1.26.4/calc.h

/*
 * Copyright (c) 1993 David I. Bell
 * Permission is granted to use, distribute, or modify this source,
 * provided that this copyright notice remains intact.
 *
 * Definitions for calculator program.
 */

#include <stdio.h>
#include <setjmp.h>
#include "math.h"


/*
 * Configuration definitions
 */
#define	CALCPATH	"CALCPATH"	/* environment variable for files */
#define	CALCRC		"CALCRC"	/* environment variable for startup */
#define	CALCBINDINGS	"CALCBINDINGS"	/* environment variable for hist bindings */
#define	HOME		"HOME"		/* environment variable for home dir */
#define	PAGER		"PAGER"		/* environment variable for help */
#define	SHELL		"SHELL"		/* environment variable for shell */
#define DEFAULTCALCHELP	"help"		/* help file that -h prints */
#define DEFAULTSHELL	"sh"		/* default shell to use */
#define	CALCEXT		".cal"	/* extension for files read in */
#define	PATHSIZE	1024	/* maximum length of path name */
#define	HOMECHAR	'~'	/* char which indicates home directory */
#define DOTCHAR		'.'	/* char which indicates current directory */
#define	PATHCHAR	'/'	/* char which separates path components */
#define	LISTCHAR	':'	/* char which separates paths in a list */
#define	MAXCMD		1024	/* maximum length of command invocation */
#define	MAXERROR	512	/* maximum length of error message string */

#define	SYMBOLSIZE	256	/* maximum symbol name size */
#define	MAXINDICES	20	/* maximum number of indices for objects */
#define	MAXLABELS	100	/* maximum number of user labels in function */
#define	MAXOBJECTS	10	/* maximum number of object types */
#define MAXDIM		4	/* maximum number of dimensions in matrices */
#define	MAXSTRING	1024	/* maximum size of string constant */
#define	MAXSTACK	1000	/* maximum depth of evaluation stack */
#define	MAXFILES	20	/* maximum number of opened files */
#define PROMPT1		"> "	/* normal prompt */
#define PROMPT2		">> "	/* prompt when inside multi-line input */


#define	TRACE_NORMAL	0x00	/* normal trace flags */
#define	TRACE_OPCODES	0x01	/* trace every opcode */
#define	TRACE_NODEBUG	0x02	/* suppress debugging opcodes */
#define	TRACE_MAX	0x03	/* maximum value for trace flag */

#define DISPLAY_DEFAULT 20	/* default digits for float display */
#define EPSILON_DEFAULT "1e-20"	/* allowed error for float calculations */
#define MAXPRINT_DEFAULT 16	/* default number of elements printed */
#define USUAL_ELEMENTS	4	/* usual number of elements for object */

#define ABORT_NONE	0	/* abort not needed yet */
#define ABORT_STATEMENT	1	/* abort on statement boundary */
#define ABORT_OPCODE	2	/* abort on any opcode boundary */
#define ABORT_MATH	3	/* abort on any math operation */
#define ABORT_NOW	4	/* abort right away */

#define CONFIG_MODE	1	/* types of configuration parameters */
#define CONFIG_DISPLAY	2
#define CONFIG_EPSILON	3
#define CONFIG_TRACE	4
#define CONFIG_MAXPRINT	5
#define	CONFIG_MUL2	6
#define	CONFIG_SQ2	7
#define	CONFIG_POW2	8
#define	CONFIG_REDC2	9


/*
 * Flags to modify results from the printvalue routine.
 * These flags are OR'd together.
 */
#define	PRINT_NORMAL	0x00	/* print in normal manner */
#define	PRINT_SHORT	0x01	/* print in short format (no elements) */
#define	PRINT_UNAMBIG	0x02	/* print in non-ambiguous manner */


/*
 * Definition of values of various types.
 */
typedef struct value VALUE;
typedef struct object OBJECT;
typedef struct matrix MATRIX;
typedef struct list LIST;
typedef	long FILEID;


struct value {
	short v_type;			/* type of value */
	short v_subtype;		/* other data related to some types */
	union {
		long vv_int;		/* small integer value */
		FILEID vv_file;		/* id of opened file */
		NUMBER *vv_num;		/* arbitrary sized numeric value */
		COMPLEX *vv_com;	/* complex number */
		VALUE *vv_addr;		/* address of variable value */
		MATRIX *vv_mat;		/* address of matrix */
		LIST *vv_list;		/* address of list */
		OBJECT *vv_obj;		/* address of object */
		char *vv_str;		/* string value */
	} v_union;
};


/*
 * For ease in referencing
 */
#define v_int	v_union.vv_int
#define	v_file	v_union.vv_file
#define v_num	v_union.vv_num
#define v_com	v_union.vv_com
#define v_addr	v_union.vv_addr
#define v_str	v_union.vv_str
#define v_mat	v_union.vv_mat
#define	v_list	v_union.vv_list
#define v_obj	v_union.vv_obj
#define	v_valid	v_union.vv_int


/*
 * Value types.
 */
#define V_NULL	0	/* null value */
#define V_INT	1	/* normal integer */
#define V_NUM	2	/* number */
#define V_COM	3	/* complex number */
#define V_ADDR	4	/* address of variable value */
#define V_STR	5	/* address of string */
#define V_MAT	6	/* address of matrix structure */
#define	V_LIST	7	/* address of list structure */
#define V_OBJ	8	/* address of object structure */
#define	V_FILE	9	/* opened file id */
#define V_MAX	9	/* highest legal value */

#define V_STRLITERAL	0	/* string subtype for literal str */
#define V_STRALLOC	1	/* string subtype for allocated str */

#define TWOVAL(a,b) ((a) * (V_MAX+1) + (b))	/* for switch of two values */


/*
 * Structure of a matrix.
 */
struct matrix {
	long m_dim;		/* dimension of matrix */
	long m_size;		/* total number of elements */
	long m_min[MAXDIM];	/* minimum bound for indices */
	long m_max[MAXDIM];	/* maximum bound for indices */
	VALUE m_table[1];	/* actually varying length table */
};

#define matsize(n) (sizeof(MATRIX) - sizeof(VALUE) + ((n) * sizeof(VALUE)))


/*
 * List definitions.
 * An individual list element.
 */
typedef struct listelem LISTELEM;
struct listelem {
	LISTELEM *e_next;	/* next element in list (or NULL) */
	LISTELEM *e_prev;	/* previous element in list (or NULL) */
	VALUE e_value;		/* value of this element */
};


/*
 * Structure for a list of elements.
 */
struct list {
	LISTELEM *l_first;	/* first list element (or NULL) */
	LISTELEM *l_last;	/* last list element (or NULL) */
	LISTELEM *l_cache;	/* cached list element (or NULL) */
	long l_cacheindex;	/* index of cached element (or undefined) */
	long l_count;		/* total number of elements in the list */
};

extern void insertlistfirst(), insertlistlast(), insertlistmiddle();
extern void removelistfirst(), removelistlast(), removelistmiddle();
extern void listfree(), listprint();
extern long listsearch(), listrsearch();
extern BOOL listcmp();
extern VALUE *listindex();
extern LIST *listalloc(), *listcopy();


/*
 * Object actions.
 */
#define OBJ_PRINT	0	/* print the value */
#define OBJ_ONE		1	/* create the multiplicative identity */
#define OBJ_TEST	2	/* test a value for "zero" */
#define OBJ_ADD		3	/* add two values */
#define OBJ_SUB		4	/* subtrace one value from another */
#define OBJ_NEG		5	/* negate a value */
#define OBJ_MUL		6	/* multiply two values */
#define OBJ_DIV		7	/* divide one value by another */
#define OBJ_INV		8	/* invert a value */
#define OBJ_ABS		9	/* take absolute value of value */
#define OBJ_NORM	10	/* take the norm of a value */
#define OBJ_CONJ	11	/* take the conjugate of a value */
#define OBJ_POW		12	/* take the power function */
#define OBJ_SGN		13	/* return the sign of a value */
#define OBJ_CMP		14	/* compare two values for equality */
#define OBJ_REL		15	/* compare two values for inequality */
#define OBJ_QUO		16	/* integer quotient of values */
#define OBJ_MOD		17	/* remainder of division of values */
#define OBJ_INT		18	/* integer part of */
#define OBJ_FRAC	19	/* fractional part of */
#define OBJ_INC		20	/* increment by one */
#define OBJ_DEC		21	/* decrement by one */
#define OBJ_SQUARE	22	/* square value */
#define OBJ_SCALE	23	/* scale by power of two */
#define OBJ_SHIFT	24	/* shift left (or right) by number of bits */
#define OBJ_ROUND	25	/* round to specified decimal places */
#define OBJ_BROUND	26	/* round to specified binary places */
#define OBJ_ROOT	27	/* take nth root of value */
#define OBJ_SQRT	28	/* take square root of value */
#define OBJ_MAXFUNC	28	/* highest function */


/*
 * Definition of an object type.
 * This is actually a varying sized structure.
 */
typedef struct {
	char *name;			/* name of object */
	int count;			/* number of elements defined */
	int actions[OBJ_MAXFUNC+1];	/* function indices for actions */
	int elements[1];		/* element indexes (MUST BE LAST) */
} OBJECTACTIONS;

#define objectactionsize(elements) \
	(sizeof(OBJECTACTIONS) + ((elements) - 1) * sizeof(int))


/*
 * Structure of an object.
 * This is actually a varying sized structure.
 * However, there are always at least USUAL_ELEMENTS values in the object.
 */
struct object {
	OBJECTACTIONS *o_actions;	/* action table for this object */
	VALUE o_table[USUAL_ELEMENTS];	/* object values (MUST BE LAST) */
};

#define objectsize(elements) \
	(sizeof(OBJECT) + ((elements) - USUAL_ELEMENTS) * sizeof(VALUE))


/*
 * File ids corresponding to standard in, out, error, and when not in use.
 */
#define	FILEID_STDIN	((FILEID)0)
#define	FILEID_STDOUT	((FILEID)1)
#define	FILEID_STDERR	((FILEID)2)
#define	FILEID_NONE	((FILEID)-1)


/*
 * Common definitions
 */
extern long maxprint;		/* number of elements to print */
extern int abortlevel;		/* current level of aborts */
extern BOOL inputwait;		/* TRUE if in a terminal input wait */
extern FLAG traceflags;		/* tracing flags */
extern VALUE *stack;		/* execution stack */
extern jmp_buf jmpbuf;		/* for errors */

extern char *calcpath;		/* $CALCPATH or default */
extern char *calcrc;		/* $CALCRC or default */
extern char *calcbindings;	/* $CALCBINDINGS or default */
extern char *home;		/* $HOME or default */
extern char *shell;		/* $SHELL or default */


/*
 * Functions.
 */
extern MATRIX *matadd(), *matsub(), *matmul(), *matneg();
extern MATRIX *matalloc(), *matcopy(), *matsquare(), *matinv();
extern MATRIX *matscale(), *matmulval(), *matpowi(), *matconj(), *matquoval();
extern MATRIX *matmodval(), *matint(), *matfrac(), *matround(), *matbround();
extern MATRIX *mattrans(), *matcross(), *matshift();
extern BOOL mattest(), matcmp();
extern long matsearch(), matrsearch();
extern VALUE matdet(), matdot();
extern void matfill(), matfree(), matprint();

#if 0
extern BOOL matisident();
#endif

extern OBJECT *objcopy(), *objalloc();
extern VALUE objcall();
extern void objfree();
extern void objuncache();
extern int addelement();
extern int defineobject();
extern int checkobject();
extern void showobjfuncs();
extern int findelement();
extern int objoffset();

extern void freevalue(), copyvalue(), negvalue(), addvalue(), subvalue();
extern void mulvalue(), squarevalue(), invertvalue(), roundvalue();
extern void broundvalue(), intvalue(), fracvalue(), incvalue(), decvalue();
extern void conjvalue(), sqrtvalue(), rootvalue(), absvalue(), normvalue();
extern void shiftvalue(), scalevalue(), powivalue(), powervalue();
extern void divvalue(), quovalue(), modvalue(), printvalue();
extern BOOL testvalue(), comparevalue();
extern FLAG relvalue();

extern FILEID openid(), indexid();
extern BOOL validid(), errorid(), eofid(), closeid();
extern int getcharid();
extern void idprintf(), printid(), flushid(), readid();

extern FILE *f_open();
extern int openstring();
extern int openterminal();
extern int opensearchfile();
extern int nextchar();
extern void reread();

extern VALUE builtinfunc();
extern NUMBER *constvalue();
extern long addnumber(), addqconstant();
extern long linenumber();
extern char *builtinname();
extern char *inputname();
extern BOOL inputisterminal();
extern void resetinput();
extern char *nextline();
extern void calculate();
extern void initstack();
extern int dumpop();
extern void version();		/* print version string */
extern void runrcfiles();
extern void getcommands();
extern void givehelp();
extern void setprompt();

extern void getconfig();
extern void setconfig();
extern int configtype();

#ifdef VARARGS
void error();
#else
# ifdef __STDC__
void error(char *, ...);
# else
void error();
# endif
#endif


/* END CODE */