-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathFungeStateString.cpp
More file actions
94 lines (86 loc) · 1.46 KB
/
Copy pathFungeStateString.cpp
File metadata and controls
94 lines (86 loc) · 1.46 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
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
/**
* @file FungeStateString.cpp
* Controls execution of a single IP.
* @author Conlan Wesson
*/
#include "FungeStateString.h"
#include "FungeRunner.h"
#include "FungeUniverse.h"
namespace Funge {
FungeStateString::FungeStateString(FungeRunner& r) :
FungeState(r),
end('\"'),
previous('\0')
{
}
void FungeStateString::escape(inst_t i){
stack_t code = i;
switch(i){
case '0':
code = '\0';
break;
case 'a':
code = '\a';
break;
case 'b':
code = '\b';
break;
case 't':
code = '\t';
break;
case 'n':
code = '\n';
break;
case 'v':
code = '\v';
break;
case 'f':
code = '\f';
break;
case 'r':
code = '\r';
break;
case 'e':
code = '\e';
break;
default:
code = i;
break;
}
runner.push(code);
}
FungeError FungeStateString::execute(inst_t i){
if(i == end){
previous = '\0';
runner.setState(runner.getNormalState());
}else{
switch(runner.getUniverse().stringStyle()){
case STRING_MULTISPACE:
runner.push(static_cast<stack_t>(i));
break;
case STRING_SGML:
if(!isspace(i) || !isspace(previous)){
runner.push(static_cast<stack_t>(i));
previous = i;
}else{
return ERROR_SKIP;
}
break;
case STRING_C:
if(i == '\\'){
ip.next();
escape(ip.get());
}else{
runner.push(static_cast<stack_t>(i));
}
break;
default:
return ERROR_UNSPEC;
}
}
return ERROR_NONE;
}
void FungeStateString::setEnd(inst_t i){
end = i;
}
}