📄 value.h
字号:
/* * Copyright (c) 1994 David I. Bell * Permission is granted to use, distribute, or modify this source, * provided that this copyright notice remains intact. * * Definitions of general values and related routines used by the calculator. */#ifndef VALUE_H#define VALUE_H#include "cmath.h"#define MAXDIM 4 /* maximum number of dimensions in matrices */#define USUAL_ELEMENTS 4 /* usual number of elements for objects *//* * 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 struct assoc ASSOC;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 */ ASSOC *vv_assoc; /* address of association */ 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_assoc v_union.vv_assoc#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_ASSOC 8 /* address of association structure */#define V_OBJ 9 /* address of object structure */#define V_FILE 10 /* opened file id */#define V_MAX 10 /* highest legal value */#define V_NOSUBTYPE 0 /* subtype has no meaning */#define V_STRLITERAL 1 /* string subtype for literal str */#define V_STRALLOC 2 /* string subtype for allocated str */#define TWOVAL(a,b) ((a) * (V_MAX+1) + (b)) /* for switch of two values */#define NULL_VALUE ((VALUE *) 0)extern void freevalue MATH_PROTO((VALUE *vp));extern void copyvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void negvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void addvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void subvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void mulvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void squarevalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void invertvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void roundvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void broundvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void intvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void fracvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void incvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void decvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void conjvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void sqrtvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void rootvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *v3, VALUE *vres));extern void absvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void normvalue MATH_PROTO((VALUE *vp, VALUE *vres));extern void shiftvalue MATH_PROTO((VALUE *v1, VALUE *v2, BOOL rightshift, VALUE *vres));extern void scalevalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void powivalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void powervalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *v3, VALUE *vres));extern void divvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void quovalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern void modvalue MATH_PROTO((VALUE *v1, VALUE *v2, VALUE *vres));extern BOOL testvalue MATH_PROTO((VALUE *vp));extern BOOL comparevalue MATH_PROTO((VALUE *v1, VALUE *v2));extern FLAG relvalue MATH_PROTO((VALUE *v1, VALUE *v2));extern HASH hashvalue MATH_PROTO((VALUE *vp));extern void printvalue MATH_PROTO((VALUE *vp, int flags));/* * 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)))extern MATRIX *matadd MATH_PROTO((MATRIX *m1, MATRIX *m2));extern MATRIX *matsub MATH_PROTO((MATRIX *m1, MATRIX *m2));extern MATRIX *matmul MATH_PROTO((MATRIX *m1, MATRIX *m2));extern MATRIX *matneg MATH_PROTO((MATRIX *m));extern MATRIX *matalloc MATH_PROTO((long size));extern MATRIX *matcopy MATH_PROTO((MATRIX *m));extern MATRIX *matsquare MATH_PROTO((MATRIX *m));extern MATRIX *matinv MATH_PROTO((MATRIX *m));extern MATRIX *matscale MATH_PROTO((MATRIX *m, long n));extern MATRIX *matshift MATH_PROTO((MATRIX *m, long n));extern MATRIX *matmulval MATH_PROTO((MATRIX *m, VALUE *vp));extern MATRIX *matpowi MATH_PROTO((MATRIX *m, NUMBER *q));extern MATRIX *matconj MATH_PROTO((MATRIX *m));extern MATRIX *matquoval MATH_PROTO((MATRIX *m, VALUE *vp));extern MATRIX *matmodval MATH_PROTO((MATRIX *m, VALUE *vp));extern MATRIX *matint MATH_PROTO((MATRIX *m));extern MATRIX *matfrac MATH_PROTO((MATRIX *m));extern MATRIX *matround MATH_PROTO((MATRIX *m, long places));extern MATRIX *matbround MATH_PROTO((MATRIX *m, long places));extern MATRIX *mattrans MATH_PROTO((MATRIX *m));extern MATRIX *matcross MATH_PROTO((MATRIX *m1, MATRIX *m2));extern BOOL mattest MATH_PROTO((MATRIX *m));extern BOOL matcmp MATH_PROTO((MATRIX *m1, MATRIX *m2));extern long matsearch MATH_PROTO((MATRIX *m, VALUE *vp, long index));extern long matrsearch MATH_PROTO((MATRIX *m, VALUE *vp, long index));extern HASH mathash MATH_PROTO((MATRIX *m));extern VALUE matdet MATH_PROTO((MATRIX *m));extern VALUE matdot MATH_PROTO((MATRIX *m1, MATRIX *m2));extern void matfill MATH_PROTO((MATRIX *m, VALUE *v1, VALUE *v2));extern void matfree MATH_PROTO((MATRIX *m));extern void matprint MATH_PROTO((MATRIX *m, long max_print));extern VALUE *matindex MATH_PROTO((MATRIX *mp, BOOL create, long dim, VALUE *indices));#if 0extern BOOL matisident MATH_PROTO((MATRIX *m));#endif/* * 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 MATH_PROTO((LIST *lp, VALUE *vp));extern void insertlistlast MATH_PROTO((LIST *lp, VALUE *vp));extern void insertlistmiddle MATH_PROTO((LIST *lp, long index, VALUE *vp));extern void removelistfirst MATH_PROTO((LIST *lp, VALUE *vp));extern void removelistlast MATH_PROTO((LIST *lp, VALUE *vp));extern void removelistmiddle MATH_PROTO((LIST *lp, long index, VALUE *vp));extern void listfree MATH_PROTO((LIST *lp));extern void listprint MATH_PROTO((LIST *lp, long max_print));extern long listsearch MATH_PROTO((LIST *lp, VALUE *vp, long index));extern long listrsearch MATH_PROTO((LIST *lp, VALUE *vp, long index));extern HASH listhash MATH_PROTO((LIST *lp));extern BOOL listcmp MATH_PROTO((LIST *lp1, LIST *lp2));extern VALUE *listfindex MATH_PROTO((LIST *lp, long index));extern LIST *listalloc MATH_PROTO((void));extern LIST *listcopy MATH_PROTO((LIST *lp));/* * Structures for associations. * Associations are "indexed" by one or more arbitrary values, and are * stored in a hash table with their hash values for quick indexing. */typedef struct assocelem ASSOCELEM;struct assocelem { ASSOCELEM *e_next; /* next element in list (or NULL) */ long e_dim; /* dimension of indexing for this element */ HASH e_hash; /* hash value for this element */ VALUE e_value; /* value of association */ VALUE e_indices[1]; /* index values (variable length) */};struct assoc { long a_count; /* number of elements in the association */ long a_size; /* current size of association hash table */ ASSOCELEM **a_table; /* current hash table for elements */};extern ASSOC *assocalloc MATH_PROTO((long initsize));extern ASSOC *assoccopy MATH_PROTO((ASSOC *ap));extern void assocfree MATH_PROTO((ASSOC *ap));extern void assocprint MATH_PROTO((ASSOC *ap, long max_print));extern long assocsearch MATH_PROTO((ASSOC *ap, VALUE *vp, long index));extern long assocrsearch MATH_PROTO((ASSOC *ap, VALUE *vp, long index));extern HASH assochash MATH_PROTO((ASSOC *ap));extern BOOL assoccmp MATH_PROTO((ASSOC *ap1, ASSOC *ap2));extern VALUE *assocfindex MATH_PROTO((ASSOC *ap, long index));extern VALUE *associndex MATH_PROTO((ASSOC *ap, BOOL create, long dim, VALUE *indices));/* * 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))extern OBJECT *objcopy MATH_PROTO((OBJECT *op));extern OBJECT *objalloc MATH_PROTO((long index));extern VALUE objcall MATH_PROTO((int action, VALUE *v1, VALUE *v2, VALUE *v3));extern void objfree MATH_PROTO((OBJECT *op));extern void objuncache MATH_PROTO((void));extern int addelement MATH_PROTO((char *name));extern void defineobject MATH_PROTO((char *name, int indices[], int count));extern int checkobject MATH_PROTO((char *name));extern void showobjfuncs MATH_PROTO((void));extern int findelement MATH_PROTO((char *name));extern int objoffset MATH_PROTO((OBJECT *op, long index));extern HASH objhash MATH_PROTO((OBJECT *op));#endif/* END CODE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -