-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUtils.cpp
More file actions
132 lines (126 loc) · 3.81 KB
/
Utils.cpp
File metadata and controls
132 lines (126 loc) · 3.81 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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "Utils.h"
char* Utils::preprocessStringLiteral(const char* input) {
if (input == NULL) {
return NULL;
}
size_t inputLength = 0;
while (input[inputLength] != '\0') {
inputLength++;
}
char* result = (char*)malloc((2 * inputLength + 2) * sizeof(char));
if (result == NULL) {
return NULL;
}
size_t resultIndex = 0;
char prevChar = input[0];
for (size_t i = 1; i < inputLength - 1; i++) {
if (prevChar != '\\') {
if (input[i] != '\\') {
result[resultIndex++] = input[i];
}
prevChar = input[i];
continue;
}
switch(input[i]) {
case '"':
result[resultIndex++] = '"'; // double quote
break;
case '0':
result[resultIndex++] = '\0'; // null character
break;
case 'n':
result[resultIndex++] = '\n'; // newline
break;
case 't':
result[resultIndex++] = '\t'; // tab
break;
case 'r':
result[resultIndex++] = '\r'; // carriage return
break;
case '\'':
result[resultIndex++] = '\''; // single quote
break;
case '\\':
result[resultIndex++] = '\\'; // backslash
break;
case 'a':
result[resultIndex++] = '\a'; // alert (bell)
break;
case 'b':
result[resultIndex++] = '\b'; // backspace
break;
case 'f':
result[resultIndex++] = '\f'; // form feed
break;
case 'v':
result[resultIndex++] = '\v'; // vertical tab
break;
default:
result[resultIndex++] = prevChar;
result[resultIndex++] = input[i];
break;
}
prevChar = input[i];
}
result[resultIndex] = '\0';
return result;
}
char Utils::preprocessCharLiteral(const char* input) {
char* processed = preprocessStringLiteral(input);
if (processed == NULL or strlen(processed) < 1) {
return '\0';
}
char desired = processed[0];
free(processed);
return desired;
}
std::string Utils::encodeStringValue(const std::string& input) {
std::string result;
for (char c : input) {
switch (c) {
case '"':
result += "\\\"";
break;
case '\0':
result += "\\0";
break;
case '\n':
result += "\\n";
break;
case '\t':
result += "\\t";
break;
case '\r':
result += "\\r";
break;
case '\'':
result += "\\'";
break;
case '\\':
result += "\\\\";
break;
case '\a':
result += "\\a";
break;
case '\b':
result += "\\b";
break;
case '\f':
result += "\\f";
break;
case '\v':
result += "\\v";
break;
default:
result += c;
break;
}
}
return result;
}
void Utils::printWarning(const std::string& input, bool lineno) {
std::cerr << "\033[1;33mWarning:\033[0m " + input + " " + (!lineno ? "" : "\033[1;36m(at line: " + std::to_string(yylineno)+ ")") + "\033[0m\n";
}
void Utils::printError(const std::string& input, bool lineno) {
std::cerr << "\033[1;31mError:\033[0m " + input + " " + (!lineno ? "" : "\033[1;36m(at line: " + std::to_string(yylineno)+ ")") + "\033[0m\n";
}