8#ifndef INCLUDED_BDLDE_HEXDECODER
9#define INCLUDED_BDLDE_HEXDECODER
308#include <bdlscm_version.h>
312#include <bsl_iterator.h>
336 const char *d_decodeTable_p;
342 static bool isSpace(
char character);
346 static bool isXdigit(
char character);
380 template <
class OUTPUT_ITERATOR,
class INPUT_ITERATOR>
381 int convert(OUTPUT_ITERATOR out,
382 INPUT_ITERATOR begin,
384 template <
class OUTPUT_ITERATOR,
class INPUT_ITERATOR>
385 int convert(OUTPUT_ITERATOR out,
388 INPUT_ITERATOR begin,
445bool HexDecoder::isSpace(
char character)
447 static const bool k_SPACE_TABLE[256] = {
449 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
450 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
451 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
452 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
453 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
454 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
455 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
456 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
459 return k_SPACE_TABLE[
static_cast<unsigned char>(character)];
463bool HexDecoder::isXdigit(
char character)
465 static const bool k_XDIGIT_TABLE[256] = {
467 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
468 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
469 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
470 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
471 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
472 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
473 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
474 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
477 return k_XDIGIT_TABLE[
static_cast<unsigned char>(character)];
481template <
class OUTPUT_ITERATOR,
class INPUT_ITERATOR>
483 INPUT_ITERATOR begin,
489 return convert(out, &dummyNumOut, &dummyNumIn, begin, end, -1);
492template <
class OUTPUT_ITERATOR,
class INPUT_ITERATOR>
496 INPUT_ITERATOR begin,
503 if (e_ERROR_STATE == d_state || e_DONE_STATE == d_state) {
504 int rv = e_DONE_STATE == d_state ? -2 : -1;
505 d_state = e_ERROR_STATE;
511 if (0 == maxNumOut) {
517 INPUT_ITERATOR originalBegin = begin;
520 while (begin != end && numEmitted != maxNumOut) {
521 const char digit =
static_cast<char>(*begin);
524 if (!isSpace(digit)) {
525 if (!isXdigit(digit)) {
526 *numOut = numEmitted;
527 d_outputLength += numEmitted;
528 *numIn =
static_cast<int>(bsl::distance(originalBegin, begin));
529 d_state = e_ERROR_STATE;
533 if (0 == d_firstDigit) {
534 d_firstDigit = digit;
537 char value =
static_cast<char>(
538 (d_decodeTable_p[
static_cast<int>(d_firstDigit)] << 4) |
539 (d_decodeTable_p[
static_cast<int>(digit )]));
549 *numOut = numEmitted;
550 d_outputLength += numEmitted;
551 *numIn =
static_cast<int>(bsl::distance(originalBegin, begin));
558 d_state = e_INPUT_STATE;
567 return e_INPUT_STATE == d_state && !d_firstDigit;
573 return e_DONE_STATE == d_state;
579 return e_ERROR_STATE == d_state;
585 return e_INPUT_STATE == d_state && 0 == d_outputLength && !d_firstDigit;
597 return d_outputLength;
Definition bdlde_hexdecoder.h:321
void reset()
Definition bdlde_hexdecoder.h:556
bool isInitialState() const
Definition bdlde_hexdecoder.h:583
bool isAcceptable() const
Definition bdlde_hexdecoder.h:565
int convert(OUTPUT_ITERATOR out, INPUT_ITERATOR begin, INPUT_ITERATOR end)
Definition bdlde_hexdecoder.h:482
HexDecoder()
Create a Hex decoder in the initial state.
int outputLength() const
Definition bdlde_hexdecoder.h:595
bool isDone() const
Definition bdlde_hexdecoder.h:571
bool isMaximal() const
Definition bdlde_hexdecoder.h:589
bool isError() const
Definition bdlde_hexdecoder.h:577
~HexDecoder()=default
Destroy this object.
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlde_base64alphabet.h:118