-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathEventHandler.C
More file actions
69 lines (57 loc) · 2.44 KB
/
Copy pathEventHandler.C
File metadata and controls
69 lines (57 loc) · 2.44 KB
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
#include "STEClasses.h"
#include "Value.h"
#include "ParserUtil.h"
#include "InterCode.h"
#include "FinalMachineCodeGen.h"
#define TO_INT(str) ((int)(str).at(0))
void GlobalEntry::eventHandler(ostream& os) {
vector<EventEntry*> event_l;
EventEntry *event;
vector<Type*>* argtype_l;
// Store all EventEntry definitions
vector<RuleNode*>::const_iterator it;
for (it = rules_.begin(); it != rules_.end(); ++it) {
if ((*it)->pat()->kind() == BasePatNode::PatNodeKind::PRIMITIVE) {
event_l.push_back(((PrimitivePatNode*)(*it)->pat())->event());
}
}
os << "JMP begin" << endl;
// Generate code to input event parameter
for (unsigned int ii = 0; ii < event_l.size(); ii++) {
event = event_l[ii];
os << S_PREFIX << event->name() << ": ";
argtype_l = event->type()->argTypes();
os << "MOVL " << S_EVENT_END << R_PARAM << endl;
os << "STI" << R_PARAM << RSP << C_PUSH_RET << endl;
os << "SUB" << RSP << " 4" << RSP << endl;
if (argtype_l) {
std::vector<Type*>::iterator type_it = argtype_l->begin();
for (int i = 1; type_it != argtype_l->end(); ++type_it, ++i) {
os << "PRTS\"Enter Param " << i << ": \"" << endl;
if ((*type_it)->tag() == Type::DOUBLE) {
os << "INF" << F_PARAM << C_IN_EPARAM << endl;
os << "STF" << F_PARAM << RSP << C_APARAM << endl;
} else {
os << "INI" << R_PARAM << C_IN_EPARAM << endl;
os << "STI" << R_PARAM << RSP << C_APARAM << endl;
}
os << "SUB" << RSP << " 4" << RSP << endl;
}
}
os << "JMP " << E_PREFIX << event->name() << endl;
os << endl;
}
os << S_EVENT_END << ": ";
os << "IN" << R_PARAM << C_DUMMY_INP << endl;
os << S_START << ": ";
os << "PRTS " << "\"\\nEnter Event Name ('0' for exit): \"" << endl;
os << "IN" << R_PARAM << endl;
// Generate code to select appropriate event
for (unsigned int ii = 0; ii < event_l.size(); ii++) {
event = event_l[ii];
os << "JMPC EQ" << R_PARAM << " " << TO_INT(event->name()) << " " << S_PREFIX << event->name() << endl;
}
os << "JMPC EQ" << R_PARAM << " " << (int)'0' << " " << S_EXIT << endl;
os << "PRTS " << "\"Invalid Event Name\\n\"" << endl;
os << "JMP " << S_EVENT_END << endl << endl;
}