1 #include "memorywatch.hpp"
2 #include "memorymanip.hpp"
11 std::string
evaluate_watch(const std::string
& expr
) throw(std::bad_alloc
)
15 std::string _expr
= expr
;
20 for(size_t i
= 0; i
< expr
.length(); i
++) {
23 y
= expr
.find_first_of("z", i
);
25 return "#syntax (noterm)";
26 t
= _expr
.substr(i
+ 1, y
- i
- 1);
27 if(t
.length() > 2 && t
.substr(0, 2) == "0x") {
29 s
.push(strtoull(t
.c_str() + 2, &end
, 16));
31 return "#syntax (badhex)";
34 s
.push(strtod(t
.c_str(), &end
));
36 return "#syntax (badnum)";
41 if(i
+ 1 == expr
.length())
42 return "#syntax (noparam)";
47 s
.push(floor(b
* a
+ 0.5) / b
);
51 return "#syntax (underflow)";
58 return "#syntax (underflow)";
67 return "#syntax (underflow)";
74 return "#syntax (underflow)";
81 return "#syntax (underflow)";
88 return "#syntax (underflow)";
95 return "#syntax (underflow)";
103 return "#syntax (underflow)";
112 return "#syntax (underflow)";
121 return "#syntax (underflow)";
130 return "#syntax (underflow)";
139 return "#syntax (underflow)";
144 s
.push(static_cast<int64_t>(a
/ b
));
148 return "#syntax (underflow)";
153 s
.push(a
- static_cast<int64_t>(a
/ b
) * b
);
157 return "#syntax (underflow)";
160 s
.push(static_cast<int8_t>(memory_read_byte(a
)));
164 return "#syntax (underflow)";
167 s
.push(static_cast<uint8_t>(memory_read_byte(a
)));
171 return "#syntax (underflow)";
174 s
.push(static_cast<int16_t>(memory_read_word(a
)));
178 return "#syntax (underflow)";
181 s
.push(static_cast<uint16_t>(memory_read_word(a
)));
185 return "#syntax (underflow)";
188 s
.push(static_cast<int32_t>(memory_read_dword(a
)));
192 return "#syntax (underflow)";
195 s
.push(static_cast<uint32_t>(memory_read_dword(a
)));
199 return "#syntax (underflow)";
202 s
.push(static_cast<int64_t>(memory_read_qword(a
)));
206 return "#syntax (underflow)";
209 s
.push(static_cast<uint64_t>(memory_read_qword(a
)));
212 return "#syntax (illchar)";
219 sprintf(buffer
, "%f", s
.top());