aboutsummaryrefslogtreecommitdiffstats
path: root/runnerline_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'runnerline_impl.h')
-rw-r--r--runnerline_impl.h531
1 files changed, 531 insertions, 0 deletions
diff --git a/runnerline_impl.h b/runnerline_impl.h
new file mode 100644
index 0000000..ab9e9e5
--- /dev/null
+++ b/runnerline_impl.h
@@ -0,0 +1,531 @@
+#ifndef INCLUDE_BLASSIC_RUNNERLINE_IMPL_H
+#define INCLUDE_BLASSIC_RUNNERLINE_IMPL_H
+
+// runnerline_impl.h
+// Revision 23-jan-2005
+
+#include "runnerline.h"
+
+#include "blassic.h"
+#include "error.h"
+#include "result.h"
+#include "codeline.h"
+#include "file.h"
+#include "function.h"
+#include "var.h"
+
+#include <list>
+#include <algorithm>
+
+class Runner;
+class Program;
+class LocalLevel;
+class Directory;
+
+//#define INSTRUCTION_SWITCH
+//#define OPERATION_SWITCH
+
+#define BRUTAL_MODE
+#define ONE_TABLE
+
+class RunnerLineImpl : public RunnerLine {
+public:
+ typedef blassic::result::BlResult BlResult;
+
+ RunnerLineImpl (Runner & runner);
+ RunnerLineImpl (Runner & runner, const CodeLine & newcodeline);
+ ~RunnerLineImpl ();
+
+ void setcodeline (const CodeLine & newcodeline)
+ {
+ codeline= newcodeline;
+ }
+ CodeLine & getcodeline () { return codeline; }
+
+ bool execute_instruction ();
+ void execute ();
+
+ BlLineNumber number () const { return codeline.number (); }
+
+ ProgramPos getposactual () const
+ {
+ //return ProgramPos (pline->number (), actualchunk);
+ return ProgramPos (codeline.number (), actualchunk);
+ }
+private:
+ Program & program;
+ CodeLine::Token token;
+ BlCode codprev;
+
+ BlChunk actualchunk;
+ Directory * pdirectory;
+
+ // Instrucion execution.
+
+ bool fInElse;
+
+ // ************ Dispatch functions ****************
+
+ #ifndef INSTRUCTION_SWITCH
+ typedef bool (RunnerLineImpl::* do_func) ();
+ #endif
+
+ #ifndef OPERATION_SWITCH
+ typedef void (RunnerLineImpl::* do_valfunction) (BlResult &);
+ #endif
+
+ #ifdef ONE_TABLE
+
+ #ifdef INSTRUCTION_SWITCH
+ #error Incompatible options
+ #endif
+
+ struct functions_t {
+ do_func inst_func;
+ do_valfunction val_func;
+ };
+ struct tfunctions_t {
+ BlCode code;
+ functions_t f;
+ bool operator < (const tfunctions_t & t) const
+ {
+ return code < t.code;
+ }
+ };
+ static const tfunctions_t tfunctions [];
+ static const tfunctions_t * tfunctionsend;
+
+ #ifdef BRUTAL_MODE
+
+ static functions_t array_functions [];
+
+ #endif
+
+ #else
+ // No ONE_TABLE
+
+ // ************ Instruction functions *************
+
+ #ifndef INSTRUCTION_SWITCH
+
+ struct tfunc_t {
+ BlCode code;
+ do_func f;
+ bool operator < (const tfunc_t & t) const
+ {
+ return code < t.code;
+ }
+ };
+
+ static const tfunc_t tfunc [];
+ static const tfunc_t * tfuncend;
+
+ #endif
+
+ // ************ Val functions *****************
+
+ #ifndef OPERATION_SWITCH
+
+ struct valfunction_t {
+ BlCode code;
+ do_valfunction f;
+ bool operator < (const valfunction_t & t) const
+ {
+ return code < t.code;
+ }
+ };
+
+ static const valfunction_t valfunction [];
+ static const valfunction_t * valfunctionend;
+
+ #endif
+
+ #ifdef BRUTAL_MODE
+
+ static do_valfunction array_valfunction [];
+
+ static do_func array_func [];
+
+ #endif
+
+ #endif
+ // ONE_TABLE
+
+ #ifdef BRUTAL_MODE
+
+ static bool init_array_func ();
+ static bool array_func_inited;
+
+ #endif
+
+ #ifndef NDEBUG
+ static bool checktfunc ();
+ static const bool tfuncchecked;
+ #endif
+
+ #ifndef INSTRUCTION_SWITCH
+ do_func findfunc (BlCode code);
+ #endif
+
+ #ifndef OPERATION_SWITCH
+ do_valfunction findvalfunc (BlCode code);
+ #endif
+
+
+ //*****************************************************
+
+
+ bool syntax_error ();
+ void valsyntax_error (BlResult &);
+
+ void getnextchunk ();
+
+ blassic::file::BlFile & getfile (BlChannel channel) const;
+ blassic::file::BlFile & getfile0 () const;
+
+ void gettoken () { codeline.gettoken (token); }
+
+ bool endsentence () { return token.isendsentence (); }
+ void require_endsentence () const // throw (BlErrNo)
+ {
+ if (! token.isendsentence () )
+ throw ErrSyntax;
+ }
+
+ #if 0
+ // Use macros instead to avoid strange errors on hp-ux.
+ void requiretoken (BlCode code) const throw (BlErrNo);
+ void expecttoken (BlCode code) throw (BlErrNo);
+ #endif
+
+ BlNumber evalnum ();
+ BlNumber expectnum ();
+ BlInteger evalinteger ();
+ BlInteger expectinteger ();
+ std::string evalstring ();
+ std::string expectstring ();
+
+ BlChannel evalchannel ();
+ BlChannel expectchannel ();
+ BlChannel evaloptionalchannel (BlChannel defchan= DefaultChannel);
+ BlChannel expectoptionalchannel (BlChannel defchan= DefaultChannel);
+ BlChannel evalrequiredchannel ();
+ BlChannel expectrequiredchannel ();
+
+ void parenarg (BlResult & result);
+ void getparenarg (BlResult & result);
+ void getparenarg (BlResult & result, BlResult & result2);
+ blassic::file::BlFile & getparenfile ();
+
+ void valnumericfunc (double (* f) (double), BlResult & result);
+ void valnumericfunc2 (double (* f) (double, double),
+ BlResult & result);
+ void valtrigonometricfunc
+ (double (* f) (double), BlResult & result);
+ void valtrigonometricinvfunc
+ (double (* f) (double), BlResult & result);
+
+ void val_ASC (BlResult & result);
+ void val_LEN (BlResult & result);
+ void val_PEEK (BlResult & result);
+ void val_PEEK16 (BlResult & result);
+ void val_PEEK32 (BlResult & result);
+ void val_PROGRAMPTR (BlResult & result);
+ void val_SYSVARPTR (BlResult & result);
+ void val_RND (BlResult & result);
+ void val_INT (BlResult & result);
+ void val_SIN (BlResult & result);
+ void val_COS (BlResult & result);
+ void val_PI (BlResult & result);
+ void val_TAN (BlResult & result);
+ void val_SQR (BlResult & result);
+ void val_ASIN (BlResult & result);
+ void val_ACOS (BlResult & result);
+ void val_ATAN (BlResult & result);
+ void val_ABS (BlResult & result);
+ void val_LOG (BlResult & result);
+ void val_LOG10 (BlResult & result);
+ void val_EXP (BlResult & result);
+ void val_TIME (BlResult & result);
+ void val_ERR (BlResult & result);
+ void val_ERL (BlResult & result);
+ void val_FIX (BlResult & result);
+ void val_XMOUSE (BlResult & result);
+ void val_YMOUSE (BlResult & result);
+ void val_XPOS (BlResult & result);
+ void val_YPOS (BlResult & result);
+ void val_SINH (BlResult & result);
+ void val_COSH (BlResult & result);
+ void val_TANH (BlResult & result);
+ void val_ASINH (BlResult & result);
+ void val_ACOSH (BlResult & result);
+ void val_ATANH (BlResult & result);
+ void val_ATAN2 (BlResult & result);
+
+ void valinstrbase (BlResult & result, bool reverse);
+ void val_INSTR (BlResult & result);
+ void val_RINSTR (BlResult & result);
+
+ void valfindfirstlast (BlResult & result, bool first, bool yesno);
+ void val_FIND_FIRST_OF (BlResult & result);
+ void val_FIND_LAST_OF (BlResult & result);
+ void val_FIND_FIRST_NOT_OF (BlResult & result);
+ void val_FIND_LAST_NOT_OF (BlResult & result);
+
+ void val_USR (BlResult & result);
+ void val_VAL (BlResult & result);
+ void val_EOF (BlResult & result);
+ void val_VARPTR (BlResult & result);
+ void val_SGN (BlResult & result);
+ void val_CVI (BlResult & result);
+ void val_CVS (BlResult & result);
+ void val_CVD (BlResult & result);
+ void val_CVL (BlResult & result);
+ void val_MIN (BlResult & result);
+ void val_MAX (BlResult & result);
+ void val_CINT (BlResult & result);
+ void val_TEST (BlResult & result);
+ void val_TESTR (BlResult & result);
+ void val_POS (BlResult & result);
+ void val_VPOS (BlResult & result);
+ void val_LOF (BlResult & result);
+ void val_FREEFILE (BlResult & result);
+ void val_INKEY (BlResult & result);
+ void val_ROUND (BlResult & result);
+ void val_CVSMBF (BlResult & result);
+ void val_CVDMBF (BlResult & result);
+ void val_REGEXP_INSTR (BlResult & result);
+ void val_ALLOC_MEMORY (BlResult & result);
+ void val_LOC (BlResult & result);
+
+ void val_MID_S (BlResult & result);
+ void val_LEFT_S (BlResult & result);
+ void val_RIGHT_S (BlResult & result);
+ void val_CHR_S (BlResult & result);
+ void val_ENVIRON_S (BlResult & result);
+ void val_STRING_S (BlResult & result);
+ void val_OSFAMILY_S (BlResult & result);
+ void val_OSNAME_S (BlResult & result);
+ void val_HEX_S (BlResult & result);
+ void val_SPACE_S (BlResult & result);
+ void val_UPPER_S (BlResult & result);
+ void val_LOWER_S (BlResult & result);
+ void val_STR_S (BlResult & result);
+ void val_OCT_S (BlResult & result);
+ void val_BIN_S (BlResult & result);
+ void val_INKEY_S (BlResult & result);
+ void val_PROGRAMARG_S (BlResult & result);
+ void val_DATE_S (BlResult & result);
+ void val_TIME_S (BlResult & result);
+ void val_INPUT_S (BlResult & result);
+ void val_MKI_S (BlResult & result);
+ void val_MKS_S (BlResult & result);
+ void val_MKD_S (BlResult & result);
+ void val_MKL_S (BlResult & result);
+ void valtrimbase (BlResult & result, bool tleft, bool trigth);
+ void val_TRIM_S (BlResult & result);
+ void val_LTRIM_S (BlResult & result);
+ void val_RTRIM_S (BlResult & result);
+ void val_FINDFIRST_S (BlResult & result);
+ void val_FINDNEXT_S (BlResult & result);
+ void val_COPYCHR_S (BlResult & result);
+ void val_STRERR_S (BlResult & result);
+ void val_DEC_S (BlResult & result);
+ void val_VAL_S (BlResult & result);
+ void val_SCREEN_S (BlResult & result);
+ void val_MKSMBF_S (BlResult & result);
+ void val_MKDMBF_S (BlResult & result);
+ void val_REGEXP_REPLACE_S (BlResult & result);
+
+ void val_LET (BlResult & result);
+ void val_LABEL (BlResult & result);
+ void val_IDENTIFIER (BlResult & result);
+ void val_NUMBER (BlResult & result);
+ void val_STRING (BlResult & result);
+ void val_INTEGER (BlResult & result);
+ void val_OpenPar (BlResult & result);
+
+public:
+ void callfn (Function & f, const std::string & fname,
+ LocalLevel & ll, BlResult & result);
+private:
+ void val_FN (BlResult & result);
+
+ void valsubindex (const std::string & varname, BlResult & result);
+ void valbase (BlResult & result);
+ //void valparen (BlResult & result);
+
+ void slice (BlResult & result);
+
+ void valexponent (BlResult & result);
+ void valmod (BlResult & result);
+ void valunary (BlResult & result);
+ void valdivint (BlResult & result);
+ void valmuldiv (BlResult & result);
+ void valplusmin (BlResult & result);
+ void valcomp (BlResult & result);
+ void valorand (BlResult & result);
+
+ void eval (BlResult & result);
+ void expect (BlResult & result);
+
+ std::string::size_type evalstringindex ();
+ void evalstringslice (const std::string & str,
+ std::string::size_type & from, std::string::size_type & to);
+ void assignslice (VarPointer & vp, const BlResult & result);
+
+ VarPointer evalvarpointer ();
+ typedef std::list <VarPointer> ListVarPointer;
+ void evalmultivarpointer (ListVarPointer & lvp);
+ VarPointer eval_let ();
+
+ BlLineNumber evallinenumber ();
+ void evallinerange (BlLineNumber & blnBeg, BlLineNumber & blnEnd);
+ Dimension getdims ();
+ Dimension evaldims ();
+ Dimension expectdims ();
+
+ void errorifparam ();
+ void gosub_line (BlLineNumber dest);
+
+ void getinkparams ();
+ void getdrawargs (BlInteger & y);
+ void getdrawargs (BlInteger & x, BlInteger & y);
+
+ void make_clear ();
+
+ void print_using (blassic::file::BlFile & out);
+ void letsubindex (const std::string &varname);
+ void do_line_input ();
+ void do_get_image ();
+ void do_put_image ();
+ void definevars (VarType type);
+ void do_graphics_pen ();
+ void do_graphics_paper ();
+ void do_graphics_cls ();
+ bool do_def_fn ();
+ void do_list (BlChannel nfile);
+
+ bool do_Colon ();
+ bool do_ENDLINE ();
+ bool do_INTEGER ();
+ bool do_NUMBER ();
+ bool do_END ();
+ bool do_LIST ();
+ bool do_LLIST ();
+ bool do_REM ();
+ bool do_LOAD ();
+ bool do_SAVE ();
+ bool do_NEW ();
+ bool do_EXIT ();
+ bool do_RUN ();
+ bool do_PRINT ();
+ bool do_FOR ();
+ bool do_NEXT ();
+ bool do_IF ();
+ bool do_TRON ();
+ bool do_TROFF ();
+ bool do_IDENTIFIER ();
+ bool do_LET ();
+ bool do_GOTO ();
+ bool do_GOSUB ();
+ bool do_STOP ();
+ bool do_CONT ();
+ bool do_CLEAR ();
+ bool do_RETURN ();
+ bool do_POKE ();
+ bool do_READ ();
+ bool do_DATA ();
+ bool do_RESTORE ();
+ bool do_INPUT ();
+ bool do_LINE ();
+ bool do_RANDOMIZE ();
+ bool do_AUTO ();
+ bool do_DIM ();
+ bool do_SYSTEM ();
+ bool do_ON ();
+ bool do_ERROR ();
+ bool do_OPEN ();
+ bool do_POPEN ();
+ bool do_CLOSE ();
+ bool do_LOCATE ();
+ bool do_CLS ();
+ bool do_WRITE ();
+ bool do_MODE ();
+ bool do_MOVE ();
+ bool do_COLOR ();
+ bool do_GET ();
+ bool do_LABEL ();
+ bool do_DELIMITER ();
+ bool do_REPEAT ();
+ bool do_UNTIL ();
+ bool do_WHILE ();
+ bool do_WEND ();
+ bool do_PLOT ();
+ bool do_RESUME ();
+ bool do_DELETE ();
+ bool do_LOCAL ();
+ bool do_PUT ();
+ bool do_FIELD ();
+ bool do_LSET ();
+ bool do_SOCKET ();
+ bool do_MID_S ();
+ bool do_DRAW ();
+ bool do_DEF ();
+ bool do_FN ();
+ bool do_PROGRAMARG_S ();
+ bool do_ERASE ();
+ bool do_SWAP ();
+ bool do_SYMBOL ();
+ bool do_ZONE ();
+ bool do_POP ();
+ bool do_NAME ();
+ bool do_KILL ();
+ bool do_FILES ();
+ bool do_PAPER ();
+ bool do_PEN ();
+ bool do_SHELL ();
+ bool do_MERGE ();
+ bool do_CHDIR ();
+ bool do_MKDIR ();
+ bool do_RMDIR ();
+ bool do_SYNCHRONIZE ();
+ bool do_PAUSE ();
+ bool do_CHAIN ();
+ bool do_ENVIRON ();
+ bool do_EDIT ();
+ bool do_DRAWR ();
+ bool do_PLOTR ();
+ bool do_MOVER ();
+ bool do_POKE16 ();
+ bool do_POKE32 ();
+ bool do_RENUM ();
+ bool do_CIRCLE ();
+ bool do_MASK ();
+ bool do_WINDOW ();
+ bool do_GRAPHICS ();
+ bool do_BEEP ();
+ bool do_DEFINT ();
+ bool do_INK ();
+ bool do_SET_TITLE ();
+ bool do_TAG ();
+ bool do_ORIGIN ();
+ bool do_DEG ();
+ bool do_INVERSE ();
+ bool do_IF_DEBUG ();
+ bool do_WIDTH ();
+ bool do_BRIGHT ();
+ bool do_PLEASE ();
+ bool do_DRAWARC ();
+ bool do_PULL ();
+ bool do_PAINT ();
+ bool do_FREE_MEMORY ();
+ bool do_SCROLL ();
+ bool do_ZX_PLOT ();
+ bool do_ZX_UNPLOT ();
+ bool do_ELSE ();
+};
+
+#endif
+
+// End of runnerline_impl.h
Un proyecto texto-plano.xyz