/*
* Euler - a numerical lab
*
* platform : neutral
*
* file : stack.h -- numerical stack management
*/
#ifndef _STACK_H_
#define _STACK_H_
#include "sysdep.h"
extern int error;
extern char *ramstart,*ramend,*startlocal,*endlocal,*newram,*udfend,*varstart,*udframend,*startglobal,*endglobal;
#define freeram(n) (((unsigned long)(newram)+(unsigned long)(n))<=(unsigned long)ramend)
#define freeramfrom(r,n) (((unsigned long)(r)+(unsigned long)(n))<=(unsigned long)ramend)
typedef enum {
s_real,
s_complex,
s_matrix,
s_cmatrix,
s_reference,
s_command,
s_submatrix,
s_csubmatrix,
s_string,
s_udf,
s_interval,
s_imatrix,
s_isubmatrix
} stacktyp;
typedef struct {
long size;
char name[16];
int xor;
stacktyp type;
int flags;
} headertest;
typedef struct{
long size;
char name[16];
int xor;
stacktyp type;
int flags;
#ifdef HEADER_ALIGNMENT
char dummy[((sizeof(headertest)-1)/HEADER_ALIGNMENT+1)*HEADER_ALIGNMENT-sizeof(headertest)];
#endif
} header;
typedef struct {
int c,r;
} dimstest;
typedef struct {
int c,r;
#ifdef DIMS_ALIGNMENT
char dummy[((sizeof(dimstest)-1)/DIMS_ALIGNMENT+1)*DIMS_ALIGNMENT-sizeof(dimstest)];
#endif
} dims;
typedef struct { unsigned long s; } inttyp;
typedef struct { header hd; double val; } realtyp;
/*
* new stack objects
*/
header *new_matrix (int c, int r, char *name);
header *new_cmatrix (int c, int r, char *name);
header *new_imatrix (int c, int r, char *name);
header *new_real (double x, char *name);
header *new_complex (double x, double y, char *name);
header *new_reference (header *hd, char *name);
header *new_submatrix (header *hd, header *cols, header *rows, char *name);
header *new_csubmatrix (header *hd, header *cols, header *rows, char *name);
header *new_isubmatrix (header *hd, header *cols, header *rows, char *name);
header *new_command (int no);
header *new_string (char *s, unsigned long size, char *name);
header *new_udf (char *name);
header *new_subm (header *var, long l, char *name);
header *new_csubm (header *var, long l, char *name);
header *new_isubm (header *var, long l, char *name);
header *new_interval (double x, double y, char *name);
/*
* macros for object handling
*/
#define realof(hd) ((double *)((hd)+1))
#define matrixof(hd) ((double *)((char *)((hd)+1)+sizeof(dims)))
#define dimsof(hd) ((dims *)((hd)+1))
#define commandof(hd) ((int *)((hd)+1))
#define referenceof(hd) (*((header **)((hd)+1)))
#define imagof(hd) ((double *)((hd)+1)+1)
#define rowsof(hd) ((int *)((dims *)((header **)((hd)+1)+1)+1))
#define colsof(hd) ((int *)((dims *)((header **)((hd)+1)+1)+1)+submdimsof((hd))->r)
#define submrefof(hd) (*((header **)((hd)+1)))
#define submdimsof(hd) ((dims *)((header **)((hd)+1)+1))
#define stringof(hd) ((char *)((hd)+1))
#define udfof(hd) ((char *)(hd)+(*((unsigned long *)((hd)+1))))
#define udfstartof(hd) ((unsigned long *)((hd)+1))
#define helpof(hd) ((char *)(hd)+sizeof(header)+sizeof(unsigned long))
#define nextof(hd) ((header *)((char *)(hd)+(hd)->size))
#define mat(m,c,i,j) (m+(((long)(c))*(i)+(j)))
#define cmat(m,c,i,j) (m+(2*(((long)(c))*(i)+(j))))
#define imat(m,c,i,j) (m+(2*(((long)(c))*(i)+(j))))
#define matrixsize(c,r) (sizeof(header)+sizeof(dims)+(c)*(long)(r)*sizeof(double))
#define cmatrixsize(c,r) (sizeof(header)+sizeof(dims)+2l*(c)*(long)(r)*sizeof(double))
#define imatrixsize(c,r) (sizeof(header)+sizeof(dims)+2l*(c)*(long)(r)*sizeof(double))
#define aof(hd) ((double *)((hd)+1))
#define bof(hd) ((double *)((hd)+1)+1)
#define isreal(hd) (((hd)->type==s_real || (hd)->type==s_matrix))
#define isinterval(hd) (((hd)->type==s_interval || (hd)->type==s_imatrix))
#define iscomplex(hd) (((hd)->type==s_complex || (hd)->type==s_cmatrix))
int xor (char *n);
void make_complex (header *hd);
void getmatrix (header *hd, int *r, int *c, double **x);
void get_element (int nargs, header *var, header *hd);
void get_element1 (char *name, header *hd);
header *searchvar (char *name);
header *searchudf (char *name);
header *getvalue (header *);
header *getvariable (header *);
header *getvariablesub (header *);
header *next_param (header *hd);
void equal_params_3 (header **hd1, header **hd2, header **hd3);
void equal_params_2 (header **hd1, header **hd2);
void moveresult (header *stack, header *result);
void moveresult1 (header *stack, header *result);
header *assign (header *var, header *value);
void kill_local (char *name);
void kill_udf (char *name);
/*
* strore /restore the whole stack to / from a file
*/
#ifndef SPLIT_MEM
void mstore (header *hd);
void mrestore (header *hd);
#endif
#endif
syntax highlighted by Code2HTML, v. 0.9.1