| 222 | |
| 223 | |
| 224 | static Local<Value> Encode(const char* buf, |
| 225 | size_t buflen, |
| 226 | enum Encoding encoding) { |
| 227 | assert(buflen <= node::Buffer::kMaxLength); |
| 228 | if (!buflen && encoding != BUFFER) |
| 229 | return New("").ToLocalChecked(); |
| 230 | |
| 231 | Local<String> val; |
| 232 | switch (encoding) { |
| 233 | case BUFFER: |
| 234 | return CopyBuffer(buf, buflen).ToLocalChecked(); |
| 235 | |
| 236 | case ASCII: |
| 237 | if (contains_non_ascii(buf, buflen)) { |
| 238 | char* out = new char[buflen]; |
| 239 | force_ascii(buf, out, buflen); |
| 240 | val = New<String>(out, buflen).ToLocalChecked(); |
| 241 | delete[] out; |
| 242 | } else { |
| 243 | val = New<String>(buf, buflen).ToLocalChecked(); |
| 244 | } |
| 245 | break; |
| 246 | |
| 247 | case UTF8: |
| 248 | val = New<String>(buf, buflen).ToLocalChecked(); |
| 249 | break; |
| 250 | |
| 251 | case BINARY: { |
| 252 | // TODO(isaacs) use ExternalTwoByteString? |
| 253 | const unsigned char *cbuf = reinterpret_cast<const unsigned char*>(buf); |
| 254 | uint16_t * twobytebuf = new uint16_t[buflen]; |
| 255 | for (size_t i = 0; i < buflen; i++) { |
| 256 | // XXX is the following line platform independent? |
| 257 | twobytebuf[i] = cbuf[i]; |
| 258 | } |
| 259 | val = New<String>(twobytebuf, buflen).ToLocalChecked(); |
| 260 | delete[] twobytebuf; |
| 261 | break; |
| 262 | } |
| 263 | |
| 264 | case BASE64: { |
| 265 | size_t dlen = base64_encoded_size(buflen); |
| 266 | char* dst = new char[dlen]; |
| 267 | |
| 268 | size_t written = base64_encode(buf, buflen, dst, dlen); |
| 269 | assert(written == dlen); |
| 270 | |
| 271 | val = New<String>(dst, dlen).ToLocalChecked(); |
| 272 | delete[] dst; |
| 273 | break; |
| 274 | } |
| 275 | |
| 276 | case UCS2: { |
| 277 | const uint16_t* data = reinterpret_cast<const uint16_t*>(buf); |
| 278 | val = New<String>(data, buflen / 2).ToLocalChecked(); |
| 279 | break; |
| 280 | } |
| 281 |
nothing calls this directly
no test coverage detected