Turi Create  4.0
comma_escape_string.hpp
1 /* Copyright © 2017 Apple Inc. All rights reserved.
2  *
3  * Use of this source code is governed by a BSD-3-clause license that can
4  * be found in the LICENSE.txt file or at https://opensource.org/licenses/BSD-3-Clause
5  */
6 #ifndef TURI_SFRAME_COMMA_ESCAPE_STRING_HPP
7 #define TURI_SFRAME_COMMA_ESCAPE_STRING_HPP
8 
9 #include <string>
10 #include <iostream>
11 
12 namespace turi {
13 
14 constexpr char replace_char = '\x1F';
15 
16 inline void comma_escape_string(const std::string& val,
17  std::string& output, size_t& output_len) {
18  if (output.size() < 2 * val.size()) {
19  output.resize(2 * val.size());
20  }
21  char* cur_out = &(output[0]);
22  // loop through the input string
23  for (size_t i = 0; i < val.size(); ++i) {
24  char c = val[i];
25  switch(c) {
26  case '\\':
27  if (i < val.size() - 1 && (val[i+1] == 'u' || val[i+1] == 'x')) {
28  (*cur_out++) = c;
29  }else {
30  (*cur_out++) = '\\';
31  (*cur_out++) = c;
32  }
33  break;
34  case ',':
35  (*cur_out++) = '\\';
36  (*cur_out++) = replace_char;
37  break;
38  case '\'':
39  (*cur_out++) = '\\';
40  (*cur_out++) = '\'';
41  break;
42  case '\"':
43  (*cur_out++) = '\\';
44  (*cur_out++) = '\"';
45  break;
46  case '\t':
47  (*cur_out++) = '\\';
48  (*cur_out++) = 't';
49  break;
50  case '\r':
51  (*cur_out++) = '\\';
52  (*cur_out++) = 'r';
53  break;
54  case '\b':
55  (*cur_out++) = '\\';
56  (*cur_out++) = 'b';
57  break;
58  case '\n':
59  (*cur_out++) = '\\';
60  (*cur_out++) = 'n';
61  break;
62  default:
63  (*cur_out++) = c;
64  }
65  }
66  size_t len = cur_out - &(output[0]);
67  output_len = len;
68 }
69 
70 
71 inline void comma_unescape_string(const std::string& val,
72  std::string& output, size_t& output_len) {
73  if (output.size() < val.size()) {
74  output.resize(val.size());
75  }
76  char* cur_out = &(output[0]);
77  for (size_t i = 0; i < val.size(); ++i) {
78  char c = val[i];
79  switch(c) {
80  case '\\':
81  if (i < val.size() - 1 && (val[i+1] == '\\' )) {
82  (*cur_out++) = '\\';
83  i++;
84  }
85  else if (i < val.size() - 1 && (val[i+1] == replace_char )) {
86  (*cur_out++) = ',';
87  i++;
88  }
89  else if (i < val.size() - 1 && (val[i+1] == '\'' )) {
90  (*cur_out++) = '\'';
91  i++;
92  }
93  else if (i < val.size() - 1 && (val[i+1] == '\"' )) {
94  (*cur_out++) = '\"';
95  i++;
96  }
97  else if (i < val.size() - 1 && (val[i+1] == 'n' )) {
98  (*cur_out++) = '\n';
99  i++;
100  }
101  else if (i < val.size() - 1 && (val[i+1] == 'b' )) {
102  (*cur_out++) = '\b';
103  i++;
104  }
105  else if (i < val.size() - 1 && (val[i+1] == 't' )) {
106  (*cur_out++) = '\t';
107  i++;
108  }
109  else if (i < val.size() - 1 && (val[i+1] == 'r' )) {
110  (*cur_out++) = '\r';
111  i++;
112  }
113  else
114  (*cur_out++) = c;
115  break;
116  default:
117  (*cur_out++) = c;
118 
119  }
120  }
121  size_t len = cur_out - &(output[0]);
122  output_len = len;
123 }
124 
125 }
126 #endif