iphreeqc/phreeqcpp/PBasic.h
Darth Vader 0e2456f051 Squashed 'src/' changes from 1a84cced..0da302ae
0da302ae Merge commit '2abb0b0bcd4bcae42f84ff001aba7f2ab6df2af7'
2abb0b0b Squashed 'phreeqcpp/' changes from 798f8f9..e4c4cf3

git-subtree-dir: src
git-subtree-split: 0da302aedfffccd97d50d919d1c3e696859de899
2024-06-20 21:53:21 +00:00

573 lines
12 KiB
C++

#ifndef _INC_PBasic_H
#define _INC_PBasic_H
#if defined(PHREEQCI_GUI)
#include <windows.h>
#endif
#include <map>
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
#include <cmath>
#include <setjmp.h>
#include "phrqtype.h"
#include "PHRQ_base.h"
#include "global_structures.h"
class Phreeqc;
class PBasicStop : public std::exception
{
};
#define forloop 0
#define whileloop 1
#define gosubloop 2
#define checking true
#define varnamelen 20
#define maxdims 4
#define MAX_LINE 4096
#define FileNotFound 10
#define FileNotOpen 13
#define FileWriteError 38
#define BadInputFormat 14
#define EndOfFile 30
#define SETBITS 32
#define Const
typedef char varnamestring[varnamelen + 1];
/* Header file for code generated by "p2c", the Pascal-to-C translator */
/* "p2c" Copyright (C) 1989, 1990, 1991 Free Software Foundation.
* By Dave Gillespie, daveg@csvax.cs.caltech.edu. Version 1.20.
* This file may be copied, modified, etc. in any way. It is not restricted
* by the licence agreement accompanying p2c itself.
*/
typedef struct varrec
{
varnamestring name;
struct varrec *next;
long dims[maxdims];
char numdims;
bool stringvar;
union
{
struct
{
LDBLE *arr;
LDBLE *val, rv;
} U0;
struct
{
char **sarr;
char **sval, *sv;
} U1;
} UU;
} varrec;
typedef struct tokenrec
{
struct tokenrec *next;
int kind;
union
{
struct varrec *vp;
LDBLE num;
char *sp;
char snch;
} UU;
//#ifdef PHREEQCI_GUI
size_t n_sz;
char *sz_num;
size_t sp_sz;
//#endif
} tokenrec;
typedef struct linerec
{
long num, num2;
tokenrec *txt;
char inbuf[MAX_LINE];
struct linerec *next;
} linerec;
class valrec
{
public:
valrec()
{
stringval = false;
UU.val = 0;
}
~valrec() {}
bool stringval;
union
{
LDBLE val;
char *sval;
} UU;
};
typedef struct looprec
{
struct looprec *next;
linerec *homeline;
tokenrec *hometok;
int kind;
union
{
struct
{
varrec *vp;
LDBLE max, step;
} U0;
} UU;
} looprec;
/* variables for exec: */
struct LOC_exec
{
bool gotoflag, elseflag;
tokenrec *t;
};
class PBasic: public PHRQ_base
{
public:
PBasic(Phreeqc *ptr, PHRQ_io *phrq_io=NULL);
virtual ~PBasic();
enum BASIC_TOKEN
{
tokvar,
toknum,
tokstr,
toksnerr,
tokplus,
tokminus,
toktimes,
tokdiv,
tokup,
toklp,
tokrp,
tokcomma,
toksemi,
tokcolon,
tokeq,
toklt,
tokgt,
tokle,
tokge,
tokne,
tokand,
tokor,
tokxor,
tokmod,
toknot,
toksqr,
toksqrt,
toksin,
tokcos,
toktan,
tokarctan,
toklog,
toklog10,
tokexp,
tokabs,
toksgn,
tokstr_,
tokval,
tokchr_,
tokasc,
toklen,
tokmid_,
tokpeek,
tokrem,
toklet,
tokinput,
tokgoto,
tokif,
tokend,
tokstop,
tokfor,
toknext,
tokwhile,
tokwend,
tokgosub,
tokreturn,
tokread,
tokdata,
tokrestore,
tokgotoxy,
tokon,
tokdim,
tokpoke,
toklist,
tokrun,
toknew,
tokload,
tokmerge,
tokbye,
tokdel,
tokrenum,
tokthen,
tokelse,
tokto,
tokstep,
/* start phreeqc */
tokact,
tokadd_heading,
tokalk,
tokaphi,
tokcalc_value,
tokceil,
tokcell_no,
tokchange_por,
tokchange_surf,
tokcharge_balance,
tokcurrent_a,
tokdebye_length,
tokdelta_h_phase,
tokdelta_h_species,
tokdescription,
tokdh_a,
tokdh_a0,
tokdh_av,
tokdh_b,
tokdh_bdot,
tokdiff_c,
tokdist,
tokedl,
tokedl_species,
tokeol_,
tokeol_notab_,
tokeps_r,
tokeq_frac,
tokequiv_frac,
tokequi,
tokequi_delta,
tokerase,
tokexists,
tokfloor,
tokgamma,
tokgas,
tokgas_p,
tokgas_vm,
tokget,
tokget_,
tokget_por,
tokgfw,
tokgraph_x,
tokgraph_y,
tokgraph_sy,
tokinstr,
tokiso,
tokiso_unit,
tokiterations,
tokkappa,
tokkin,
tokkin_delta,
tokkin_time,
tokkinetics_formula,
tokkinetics_formula_,
tokla,
toklg,
toklist_s_s,
toklk_named,
toklk_phase,
toklk_species,
toklm,
tokltrim,
tokm,
tokm0,
tokmcd_jtot,
tokmcd_jconc,
tokmisc1,
tokmisc2,
tokmol,
tokmu,
tokno_newline_,
tokosmotic,
tokpad_,
tokpad,
tokparm,
tokrate_pk,
tokrate_svd,
tokrate_hermanska,
tokmeang,
tokpercent_error,
tokphase_formula,
tokphase_formula_,
tokphase_vm,
tokplot_xy,
tokpot_v,
tokpr_p,
tokpr_phi,
tokpressure,
tokprint,
tokpunch,
tokput,
tokput_,
tokqbrn,
tokrho,
tokrho_0,
tokrtrim,
tokrxn,
toks_s,
toksave,
toksc,
toksetdiff_c,
toksi,
toksim_no,
toksim_time,
toksoln_vol,
tokspecies_formula,
tokspecies_formula_,
tokphase_equation,
tokphase_equation_,
tokspecies_equation,
tokspecies_equation_,
toksr,
tokstep_no,
tokstr_e_,
tokstr_f_,
toksum_gas,
toksum_s_s,
toksum_species,
toksurf,
toksys,
tokt_sc,
toktc,
toktime,
toktitle,
toktk,
toktot,
toktotal_time,
toktotmole,
toktotmol,
toktotmoles,
toktrim,
tokf_visc,
tokviscos,
tokviscos_0,
tokvm,
/* end phreeqc */
toksa_declercq, // Undocumented function
tokcallback, // PHAST function
tokcell_pore_volume, // PHAST function
tokporevolume, // PHAST function
tokcell_porosity, // PHAST function
tokcell_saturation, // PHAST function
tokcell_volume, // PHAST function
toktransport_cell_no, // PHAST function
tokvelocity_x, // PHAST function
tokvelocity_y, // PHAST function
tokvelocity_z // PHAST function
};
#if !defined(PHREEQCI_GUI)
enum IDErr
{
IDS_ERR_ARRAY_ALREADY,
IDS_ERR_BAD_SUBSCRIPT,
IDS_ERR_EXTRA,
IDS_ERR_FOR_WO_NEXT,
IDS_ERR_ILLEGAL,
IDS_ERR_INFINITE_LOOP,
IDS_ERR_INPUT_NOTLEGAL,
IDS_ERR_MISMATCH,
IDS_ERR_MISSING_Q,
IDS_ERR_MISSING_RP,
IDS_ERR_NEXT_WO_FOR,
IDS_ERR_OUT_OF_DATA,
IDS_ERR_RETURN_WO_GOSUB,
IDS_ERR_SYNTAX,
IDS_ERR_UNDEF_LINE,
IDS_ERR_WEND_WO_WHILE,
IDS_ERR_WHILE_WO_WEND
};
#endif
// Methods
bool Get_phreeqci_gui(void) const {return phreeqci_gui;};
void Set_phreeqci_gui(bool tf) {phreeqci_gui = tf;};
bool Get_parse_all(void) const {return parse_all;};
void Set_parse_all(bool tf) {parse_all = tf;};
bool Get_parse_whole_program(void) const {return parse_whole_program;};
void Set_parse_whole_program(bool tf) {parse_whole_program = tf;};
int Get_nErrLineNumber(void) const {return nErrLineNumber;};
void Set_nErrLineNumber(int i) {nErrLineNumber = i;};
#if defined(PHREEQCI_GUI)
UINT Get_nIDErrPrompt(void)const {return nIDErrPrompt;};
void Set_nIDErrPrompt(UINT u) {nIDErrPrompt = u;};
int Get_P_escapecode(void)const {return P_escapecode;};
void Set_P_escapecode(int code) {P_escapecode = code;};
HANDLE Get_hInfiniteLoop(void) const {return hInfiniteLoop;};
void Set_hInfiniteLoop(HANDLE h) {hInfiniteLoop = h;};
#endif
int free_dim_stringvar(varrec *varbase);
void exec(void);
int basic_renumber(char *commands, void **lnbase, void **vbase, void **lpbase);
void restoredata(void);
void clearloops(void);
void clearvar(varrec * v);
void clearvars(void);
char * numtostr(char * Result, LDBLE n);
void parse(char * inbuf, tokenrec ** buf);
void listtokens(FILE * f, tokenrec * buf);
void disposetokens(tokenrec ** tok);
void parseinput(tokenrec ** buf);
void errormsg(const char * s);
void snerr(const char * s);
void tmerr(const char * s);
void badsubscr(void);
LDBLE realfactor(struct LOC_exec *LINK);
char * strfactor(struct LOC_exec * LINK);
char *stringfactor(char * Result, struct LOC_exec *LINK);
const char *stringfactor(std::string & Result, struct LOC_exec * LINK);
long intfactor(struct LOC_exec *LINK);
LDBLE realexpr(struct LOC_exec *LINK);
char * strexpr(struct LOC_exec * LINK);
char * stringexpr(char * Result, struct LOC_exec * LINK);
long intexpr(struct LOC_exec *LINK);
void require(int k, struct LOC_exec *LINK);
void skipparen(struct LOC_exec *LINK);
varrec * findvar(struct LOC_exec *LINK);
valrec factor(struct LOC_exec *LINK);
valrec upexpr(struct LOC_exec * LINK);
valrec term(struct LOC_exec * LINK);
valrec sexpr(struct LOC_exec * LINK);
valrec relexpr(struct LOC_exec * LINK);
valrec andexpr(struct LOC_exec * LINK);
valrec expr(struct LOC_exec *LINK);
void checkextra(struct LOC_exec *LINK);
bool iseos(struct LOC_exec *LINK);
void skiptoeos(struct LOC_exec *LINK);
linerec * findline(long n);
linerec * mustfindline(long n);
void cmdend(struct LOC_exec *LINK);
void cmdnew(struct LOC_exec *LINK);
void cmdlist(struct LOC_exec *LINK);
void cmdload(bool merging, char * name, struct LOC_exec *LINK);
void cmdrun(struct LOC_exec *LINK);
void cmdsave(struct LOC_exec *LINK);
void cmdput(struct LOC_exec *LINK);
void cmdput_(struct LOC_exec* LINK);
void cmdchange_por(struct LOC_exec *LINK);
void cmdchange_surf(struct LOC_exec *LINK);
void cmdbye(void);
void cmddel(struct LOC_exec *LINK);
void cmdrenum(struct LOC_exec *LINK);
void cmdprint(struct LOC_exec *LINK);
void cmdpunch(struct LOC_exec *LINK);
#if defined PHREEQ98 || defined MULTICHART
void cmdgraph_x(struct LOC_exec *LINK);
void cmdgraph_y(struct LOC_exec *LINK);
void cmdgraph_sy(struct LOC_exec *LINK);
#endif
#if defined MULTICHART
void cmdplot_xy(struct LOC_exec *LINK);
#endif
void cmdlet(bool implied, struct LOC_exec *LINK);
void cmdgoto(struct LOC_exec *LINK);
void cmdif(struct LOC_exec *LINK);
void cmdelse(struct LOC_exec *LINK);
bool skiploop(int up, int dn, struct LOC_exec *LINK);
void cmdfor(struct LOC_exec *LINK);
void cmdnext(struct LOC_exec *LINK);
void cmdwhile(struct LOC_exec *LINK);
void cmdwend(struct LOC_exec *LINK);
void cmdgosub(struct LOC_exec *LINK);
void cmdreturn(struct LOC_exec *LINK);
void cmdread(struct LOC_exec *LINK);
void cmddata(struct LOC_exec *LINK);
void cmdrestore(struct LOC_exec *LINK);
void cmdgotoxy(struct LOC_exec *LINK);
void cmdon(struct LOC_exec *LINK);
void cmddim(struct LOC_exec *LINK);
void cmderase(struct LOC_exec *LINK);
void cmdpoke(struct LOC_exec *LINK);
int basic_main(const char *commands);
int basic_compile(const char *commands, void **lnbase, void **vbase, void **lpbase);
int basic_run(char *commands, void *lnbase, void *vbase, void *lpbase);
int basic_init(void);
int sget_logical_line(const char **ptr, int *l, char *return_line);
long my_labs(long x);
void * my_memmove(void * d, Const void * s, size_t n);
void * my_memcpy(void * d, Const void * s, size_t n);
int my_memcmp(Const void * s1, Const void * s2, size_t n);
void * my_memset(void * d, int c, size_t n);
int my_toupper(int c);
int my_tolower(int c);
long ipow(long a, long b);
char * strsub(char *ret, char *s, int pos,
int len);
int strpos2(char *s, char *pat, int pos);
int strcicmp(char *s1, char *s2);
char * strltrim(char *s);
char * strrtrim(char *s);
void strmove(int len, char *s, int spos,
char *d, int dpos);
void strinsert(char *src, char *dst, int pos);
int P_peek(FILE * f);
int P_eof(void);
int P_eoln(FILE * f);
void P_readpaoc(FILE * f, char *s, int len);
void P_readlnpaoc(FILE * f, char *s, int len);
long P_maxpos(FILE * f);
char * P_trimname(char * fn, int len);
long memavail(void);
long maxavail(void);
long * P_setunion(long *d, long *s1, long *s2);
long * P_setint(long *d, long *s1, long *s2);
long * P_setdiff(long *d, long *s1, long *s2);
long * P_setxor(long *d, long *s1, long *s2);
long * P_addset(long *s, unsigned val);
// long * P_addsetr(long *s, unsigned v1, unsigned v2);
long * P_remset(long *s, unsigned val);
int P_setequal(long *s1, long *s2);
int P_subset(long *s1, long *s2);
long * P_setcpy(long *d, long *s);
long * P_expset(long *d, long s);
long P_packset(long *s);
int _OutMem(void);
int _CaseCheck(void);
int _NilCheck(void);
static char * _ShowEscape(char *buf, int code, int ior, char *prefix);
int _Escape(int code);
int _EscIO(int code);
// data members
protected:
Phreeqc * PhreeqcPtr;
char *inbuf;
linerec *linebase;
varrec *varbase;
looprec *loopbase;
long curline;
linerec *stmtline, *dataline;
tokenrec *stmttok, *datatok, *buf;
bool exitflag;
long EXCP_LINE;
static std::map<const std::string, BASIC_TOKEN> command_tokens;
int P_escapecode;
int P_ioresult;
bool phreeqci_gui;
bool parse_all; /* true, most function values set to 1 for testing compilation */
bool parse_whole_program;
char fnbuf[256];
#if defined(PHREEQCI_GUI)
HANDLE hInfiniteLoop;
UINT nIDErrPrompt;
#else
IDErr nIDErrPrompt;
#endif
int nErrLineNumber;
bool punch_tab;
bool skip_punch;
};
#endif /* _INC_PBasic_H */