blob: 514e81feacc7ea1433fed24967716a382cafad20 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/*****
* process.h
* Andy Hammerlindl 2006/08/19
*
* Handles processing blocks of code (including files, strings, and the
* interactive prompt, for listing and parse-only modes as well as actually
* running it.
*****/
#ifndef PROCESS_H
#define PROCESS_H
#include "common.h"
#include "stm.h"
#include "stack.h"
#include "pipestream.h"
#include "callable.h"
#include "pen.h"
#ifdef HAVE_RPC_RPC_H
#include "xstream.h"
#endif
// Process the code respecting the parseonly and listvariables flags of
// settings.
void processCode(absyntax::block *code);
void processFile(const string& filename, bool purge=false);
void processPrompt();
// Run the code in its own environment.
void runCode(absyntax::block *code);
void runString(const string& s, bool interactiveWrite=false);
void runFile(const string& filename);
void runPrompt();
// Run the code in a given run-time environment.
typedef vm::interactiveStack istack;
void runCodeEmbedded(absyntax::block *code, trans::coenv &e, istack &s);
void runStringEmbedded(const string& str, trans::coenv &e, istack &s);
void runPromptEmbedded(trans::coenv &e, istack &s);
// Basic listing.
void doUnrestrictedList();
template<class T>
class terminator {
public:
typedef mem::vector<T *> Pointer;
Pointer pointer;
// Return first available index
size_t available() {
size_t index=0;
for(typename Pointer::iterator p=pointer.begin(); p != pointer.end(); ++p) {
if(*p == NULL) {return index;}
++index;
}
pointer.push_back(NULL);
return index;
}
size_t add(T *p) {
size_t index=available();
pointer[index]=p;
return index;
}
void remove(size_t index) {
pointer[index]=NULL;
}
~terminator() {
for(typename Pointer::iterator p=pointer.begin(); p != pointer.end(); ++p) {
if(*p != NULL) {
(*p)->~T();
(*p)=NULL;
}
}
}
};
class texstream : public iopipestream {
public:
~texstream();
};
struct processDataStruct {
texstream tex; // Bi-directional pipe to latex (to find label bbox)
mem::list<string> TeXpipepreamble;
mem::list<string> TeXpreamble;
vm::callable *atExitFunction;
vm::callable *atUpdateFunction;
vm::callable *atBreakpointFunction;
camp::pen defaultpen;
camp::pen currentpen;
terminator<std::ofstream> ofile;
terminator<std::fstream> ifile;
#ifdef HAVE_RPC_RPC_H
terminator<xdr::ioxstream> ixfile;
terminator<xdr::oxstream> oxfile;
#endif
processDataStruct() {
atExitFunction=NULL;
atUpdateFunction=NULL;
atBreakpointFunction=NULL;
defaultpen=camp::pen::initialpen();
currentpen=camp::pen();
}
};
processDataStruct &processData();
#endif
|