0.9.8.10
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
LoadDataEscape.cc
Go to the documentation of this file.
1 
22 #include "Common/Compat.h"
23 
24 #include "LoadDataEscape.h"
25 
26 using namespace Hypertable;
27 using namespace std;
28 
29 
30 bool
31 LoadDataEscape::escape(const char *in_buf, size_t in_len,
32  const char **out_bufp, size_t *out_lenp) {
33  bool transformed = false;
34  const char *in_ptr = in_buf;
35  const char *in_end = in_buf + in_len;
36  const char *last_xfer = in_buf;
37 
38  while (in_ptr < in_end) {
39  if (*in_ptr == '\n' || *in_ptr == '\t' || *in_ptr == '\0' || *in_ptr == '\\') {
40  if (*in_ptr == '\t' && m_field_separator != '\t') {
41  in_ptr++;
42  continue;
43  }
44  if (!transformed) {
45  m_buf.clear();
46  m_buf.reserve((in_len*2)+1);
47  transformed = true;
48  }
49  memcpy(m_buf.ptr, last_xfer, in_ptr-last_xfer);
50  m_buf.ptr += (in_ptr-last_xfer);
51 
52  *m_buf.ptr++ = '\\';
53  if (*in_ptr == '\n')
54  *m_buf.ptr++ = 'n';
55  else if (*in_ptr == '\t')
56  *m_buf.ptr++ = 't';
57  else if (*in_ptr == '\0')
58  *m_buf.ptr++ = '0';
59  else
60  *m_buf.ptr++ = '\\';
61  in_ptr++;
62  last_xfer = in_ptr;
63  }
64  else
65  in_ptr++;
66  }
67 
68  if (transformed) {
69  memcpy(m_buf.ptr, last_xfer, in_ptr-last_xfer);
70  m_buf.ptr += (in_ptr-last_xfer);
71  *m_buf.ptr = 0;
72  *out_bufp = (const char *)m_buf.base;
73  *out_lenp = m_buf.fill();
74  return true;
75  }
76 
77  *out_bufp = in_buf;
78  *out_lenp = in_len;
79  return false;
80 }
81 
82 
83 bool
84 LoadDataEscape::unescape(const char *in_buf, size_t in_len,
85  const char **out_bufp, size_t *out_lenp) {
86  bool transformed = false;
87  const char *in_ptr = in_buf;
88  const char *in_end = in_buf + (in_len - 1);
89  const char *last_xfer = in_buf;
90 
91  if (in_len < 2) {
92  *out_bufp = in_buf;
93  *out_lenp = in_len;
94  return false;
95  }
96 
97  while (in_ptr < in_end) {
98  if (*in_ptr == '\\' &&
99  (*(in_ptr+1) == 'n' || *(in_ptr+1) == 't' || *(in_ptr+1) == '0' || *(in_ptr+1) == '\\')) {
100  // if field separator is not a tab and we're looking at '\' 't',
101  // increment and continue
102  if (*(in_ptr+1) == 't' && m_field_separator != '\t') {
103  in_ptr++;
104  continue;
105  }
106  if (!transformed) {
107  m_buf.clear();
108  m_buf.reserve(in_len+1);
109  transformed = true;
110  }
111  memcpy(m_buf.ptr, last_xfer, in_ptr-last_xfer);
112  m_buf.ptr += (in_ptr-last_xfer);
113 
114  if (*(in_ptr+1) == 'n')
115  *m_buf.ptr++ = '\n';
116  else if (*(in_ptr+1) == 't')
117  *m_buf.ptr++ = '\t';
118  else if (*(in_ptr+1) == '0')
119  *m_buf.ptr++ = '\0';
120  else
121  *m_buf.ptr++ = '\\';
122  in_ptr += 2;
123  last_xfer = in_ptr;
124  }
125  else
126  in_ptr++;
127  }
128 
129  in_ptr = in_end + 1;
130 
131  if (transformed) {
132  memcpy(m_buf.ptr, last_xfer, in_ptr-last_xfer);
133  m_buf.ptr += (in_ptr-last_xfer);
134  *m_buf.ptr = 0;
135  *out_bufp = (const char *)m_buf.base;
136  *out_lenp = m_buf.fill();
137  return true;
138  }
139 
140  *out_bufp = in_buf;
141  *out_lenp = in_len;
142  return false;
143 }
STL namespace.
bool escape(const char *in_buf, size_t in_len, const char **out_bufp, size_t *out_lenp)
Compatibility Macros for C/C++.
Hypertable definitions
bool unescape(const char *in_buf, size_t in_len, const char **out_bufp, size_t *out_lenp)