Clingo
Loading...
Searching...
No Matches
string.hh
1#pragma once
2
3#include <cassert>
4#include <string_view>
5
6namespace CppClingo::Util {
7
8void quote(std::string_view in, auto out) {
9 for (auto c : in) {
10 switch (c) {
11 case '\n': {
12 *out++ = '\\';
13 *out++ = 'n';
14 break;
15 }
16 case '\t': {
17 *out++ = '\\';
18 *out++ = 't';
19 break;
20 }
21 case '\\': {
22 *out++ = '\\';
23 *out++ = '\\';
24 break;
25 }
26 case '"': {
27 *out++ = '\\';
28 *out++ = '"';
29 break;
30 }
31 default: {
32 *out++ = c;
33 break;
34 }
35 }
36 }
37}
38void unquote(std::string_view in, auto out, bool fstring = false) {
39 auto escape = '\0';
40 for (auto c : in) {
41 if (escape == '{' || escape == '}') {
42 if (c == escape) {
43 *out++ = escape;
44 } else {
45 assert(false);
46 }
47 escape = '\0';
48 } else if (escape == '\\') {
49 switch (c) {
50 case 'n': {
51 *out++ = '\n';
52 break;
53 }
54 case 't': {
55 *out++ = '\t';
56 break;
57 }
58 case '\\': {
59 *out++ = '\\';
60 break;
61 }
62 case '"': {
63 *out++ = '"';
64 break;
65 }
66 default: {
67 assert(false);
68 break;
69 }
70 }
71 escape = '\0';
72 } else if (c == '\\' || (fstring && (c == '{' || c == '}'))) {
73 escape = c;
74 } else {
75 *out++ = c;
76 }
77 }
78}
79
80} // namespace CppClingo::Util