From ecdf859b6ce481abfd530425dcf6f0f764bd0001 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Tue, 28 Dec 2021 03:01:00 +0000 Subject: CTAN sync 202112280300 --- graphics/asymptote/process.h | 83 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 2 deletions(-) (limited to 'graphics/asymptote/process.h') diff --git a/graphics/asymptote/process.h b/graphics/asymptote/process.h index 3f3e739089..e076c39dfb 100644 --- a/graphics/asymptote/process.h +++ b/graphics/asymptote/process.h @@ -17,7 +17,9 @@ #include "pipestream.h" #include "callable.h" #include "pen.h" +#include "dec.h" #include "transform.h" +#include "parser.h" #ifdef HAVE_RPC_RPC_H #include "xstream.h" @@ -107,15 +109,16 @@ struct processDataStruct { string KEY; xkey_t xkey; xmap_t xmap; + unsigned int xmapCount; terminator ofile; terminator ifile; #ifdef HAVE_RPC_RPC_H - terminator ixfile; + terminator ixfile; terminator oxfile; #endif - processDataStruct() { + processDataStruct() : xmapCount(0) { atExitFunction=NULL; atUpdateFunction=NULL; atBreakpointFunction=NULL; @@ -125,6 +128,82 @@ struct processDataStruct { }; +enum transMode { + TRANS_INTERACTIVE, + TRANS_NORMAL +}; + +// Abstract base class for the core object being run in line-at-a-time mode, it +// may be a block of code, file, or interactive prompt. +struct icore { + virtual ~icore() {} + virtual void doParse() = 0; + virtual void doList() = 0; + +public: + virtual void preRun(trans::coenv &e, istack &s); + virtual void run(trans::coenv &e, istack &s, transMode tm=TRANS_NORMAL) = 0; + virtual void postRun(trans::coenv &, istack &s); + virtual void doRun(bool purge=false, transMode tm=TRANS_NORMAL); + virtual void process(bool purge=false); +}; + +// Abstract base class for one-time processing of an abstract syntax tree. +class itree : public icore { + string name; + absyntax::block *cachedTree; +public: + itree(string name=""); + virtual absyntax::block *buildTree() = 0; + + // Build the tree, possibly throwing a handled_error if it cannot be built. + virtual absyntax::block *getTree(); + virtual string getName(); + + void doParse(); + void doList(); + void run(trans::coenv &e, istack &s, transMode tm=TRANS_NORMAL); + void doExec(transMode tm=TRANS_NORMAL); +}; + +class ifile : public itree { + string filename; + string outname; + string outname_save; + +public: + ifile(const string& filename); + absyntax::block *buildTree(); + + void preRun(trans::coenv& e, istack& s); + void postRun(trans::coenv &e, istack& s); + void process(bool purge=false); +}; + +class icode : public itree { + absyntax::block *tree; + +public: + icode(absyntax::block *tree, string name="") + : itree(name), tree(tree) {} + + absyntax::block *buildTree() { + return tree; + } +}; + +class istring : public itree { + string str; + +public: + istring(const string& str, string name="") + : itree(name), str(str) {} + + absyntax::block *buildTree() { + return parser::parseString(str, getName()); + } +}; + processDataStruct &processData(); #endif -- cgit v1.2.3