14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code is licensed as follows:
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann/*
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Copyright 2006-2007 Jeremias Maerki.
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * you may not use this file except in compliance with the License.
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * You may obtain a copy of the License at
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * See the License for the specific language governing permissions and
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann * limitations under the License.
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann */
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <limits>
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/BC_Dimension.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h"
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h"
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_TextEncoder.h"
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/datamatrix/BC_X12Encoder.h"
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxbarcode/utils.h"
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230;
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231;
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239;
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240;
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254;
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::PAD = 129;
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236;
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05";
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06";
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004;
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCBC_HighLevelEncoder::CBC_HighLevelEncoder() {}
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCBC_HighLevelEncoder::~CBC_HighLevelEncoder() {}
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannCFX_ArrayTemplate<uint8_t>& CBC_HighLevelEncoder::getBytesForMessage(
6233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_WideString msg) {
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString bytestr;
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr);
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int32_t i = 0; i < bytestr.GetLength(); i++) {
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bytearray.Add(bytestr.GetAt(i));
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bytearray;
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg,
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     CFX_WideString ecLevel,
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     int32_t& e) {
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return encodeHighLevel(msg, ecLevel, FORCE_NONE, nullptr, nullptr, e);
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg,
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     CFX_WideString ecLevel,
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     SymbolShapeHint shape,
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     CBC_Dimension* minSize,
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     CBC_Dimension* maxSize,
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     int32_t& e) {
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CBC_EncoderContext context(msg, ecLevel, e);
8233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (e != BCExceptionNO)
8333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return CFX_WideString();
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  context.setSymbolShape(shape);
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  context.setSizeConstraints(minSize, maxSize);
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if ((msg.Mid(0, 6) == MACRO_05_HEADER) &&
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) {
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    context.writeCodeword(MACRO_05);
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    context.setSkipAtEnd(2);
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    context.m_pos += 6;
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) &&
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) {
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    context.writeCodeword(MACRO_06);
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    context.setSkipAtEnd(2);
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    context.m_pos += 6;
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<std::unique_ptr<CBC_Encoder>> encoders;
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_ASCIIEncoder()));
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_C40Encoder()));
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_TextEncoder()));
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_X12Encoder()));
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_EdifactEncoder()));
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  encoders.push_back(std::unique_ptr<CBC_Encoder>(new CBC_Base256Encoder()));
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t encodingMode = ASCII_ENCODATION;
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (context.hasMoreCharacters()) {
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    encoders[encodingMode]->Encode(context, e);
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (e != BCExceptionNO)
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return L"";
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (context.m_newEncoding >= 0) {
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      encodingMode = context.m_newEncoding;
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      context.resetEncoderSignal();
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t len = context.m_codewords.GetLength();
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  context.updateSymbolInfo(e);
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (e != BCExceptionNO)
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return L"";
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t capacity = context.m_symbolInfo->m_dataCapacity;
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (len < capacity) {
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (encodingMode != ASCII_ENCODATION &&
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        encodingMode != BASE256_ENCODATION) {
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      context.writeCodeword(0x00fe);
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString codewords = context.m_codewords;
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (codewords.GetLength() < capacity) {
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    codewords += PAD;
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (codewords.GetLength() < capacity) {
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    codewords += (randomize253State(PAD, codewords.GetLength() + 1));
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return codewords;
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg,
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            int32_t startpos,
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            int32_t currentMode) {
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (startpos >= msg.GetLength()) {
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return currentMode;
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<FX_FLOAT> charCounts;
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (currentMode == ASCII_ENCODATION) {
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(0);
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(1);
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(1);
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(1);
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(1);
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(1.25f);
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(1);
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(2);
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(2);
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(2);
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(2);
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts.push_back(2.25f);
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charCounts[currentMode] = 0;
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t charsProcessed = 0;
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (true) {
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if ((startpos + charsProcessed) == msg.GetLength()) {
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int32_t min = std::numeric_limits<int32_t>::max();
16433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      CFX_ArrayTemplate<uint8_t> mins;
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      mins.SetSize(6);
16633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      CFX_ArrayTemplate<int32_t> intCharCounts;
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      intCharCounts.SetSize(6);
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      min = findMinimums(charCounts, intCharCounts, min, mins);
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int32_t minCount = getMinimumCount(mins);
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (intCharCounts[ASCII_ENCODATION] == min) {
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return ASCII_ENCODATION;
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (minCount == 1 && mins[BASE256_ENCODATION] > 0) {
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return BASE256_ENCODATION;
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) {
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return EDIFACT_ENCODATION;
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (minCount == 1 && mins[TEXT_ENCODATION] > 0) {
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return TEXT_ENCODATION;
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (minCount == 1 && mins[X12_ENCODATION] > 0) {
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return X12_ENCODATION;
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return C40_ENCODATION;
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_WCHAR c = msg.GetAt(startpos + charsProcessed);
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    charsProcessed++;
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (isDigit(c)) {
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[ASCII_ENCODATION] += 0.5;
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (isExtendedASCII(c)) {
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[ASCII_ENCODATION] =
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]);
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[ASCII_ENCODATION] += 2;
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[ASCII_ENCODATION] =
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]);
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[ASCII_ENCODATION]++;
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (isNativeC40(c)) {
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[C40_ENCODATION] += 2.0f / 3.0f;
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (isExtendedASCII(c)) {
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[C40_ENCODATION] += 8.0f / 3.0f;
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[C40_ENCODATION] += 4.0f / 3.0f;
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (isNativeText(c)) {
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[TEXT_ENCODATION] += 2.0f / 3.0f;
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (isExtendedASCII(c)) {
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[TEXT_ENCODATION] += 8.0f / 3.0f;
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[TEXT_ENCODATION] += 4.0f / 3.0f;
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (isNativeX12(c)) {
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[X12_ENCODATION] += 2.0f / 3.0f;
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (isExtendedASCII(c)) {
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[X12_ENCODATION] += 13.0f / 3.0f;
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[X12_ENCODATION] += 10.0f / 3.0f;
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (isNativeEDIFACT(c)) {
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f;
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (isExtendedASCII(c)) {
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f;
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f;
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (isSpecialB256(c)) {
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[BASE256_ENCODATION] += 4;
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      charCounts[BASE256_ENCODATION]++;
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (charsProcessed >= 4) {
23433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      CFX_ArrayTemplate<int32_t> intCharCounts;
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      intCharCounts.SetSize(6);
23633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      CFX_ArrayTemplate<uint8_t> mins;
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      mins.SetSize(6);
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      findMinimums(charCounts, intCharCounts,
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   std::numeric_limits<int32_t>::max(), mins);
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int32_t minCount = getMinimumCount(mins);
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] &&
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] &&
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] &&
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] &&
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) {
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return ASCII_ENCODATION;
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] ||
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] +
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann           mins[EDIFACT_ENCODATION]) == 0) {
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return BASE256_ENCODATION;
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) {
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return EDIFACT_ENCODATION;
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (minCount == 1 && mins[TEXT_ENCODATION] > 0) {
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return TEXT_ENCODATION;
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (minCount == 1 && mins[X12_ENCODATION] > 0) {
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return X12_ENCODATION;
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] &&
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          intCharCounts[C40_ENCODATION] + 1 <
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              intCharCounts[BASE256_ENCODATION] &&
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          intCharCounts[C40_ENCODATION] + 1 <
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              intCharCounts[EDIFACT_ENCODATION] &&
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) {
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) {
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return C40_ENCODATION;
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) {
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          int32_t p = startpos + charsProcessed + 1;
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          while (p < msg.GetLength()) {
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            FX_WCHAR tc = msg.GetAt(p);
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            if (isX12TermSep(tc)) {
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              return X12_ENCODATION;
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            }
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            if (!isNativeX12(tc)) {
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              break;
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            }
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            p++;
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return C40_ENCODATION;
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) {
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ch >= '0' && ch <= '9';
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) {
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ch >= 128 && ch <= 255;
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg,
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                             int32_t startpos) {
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t count = 0;
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t len = msg.GetLength();
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t idx = startpos;
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (idx < len) {
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_WCHAR ch = msg.GetAt(idx);
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (isDigit(ch) && idx < len) {
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      count++;
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      idx++;
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (idx < len) {
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        ch = msg.GetAt(idx);
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return count;
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, int32_t& e) {
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  e = BCExceptionIllegalArgument;
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch,
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                 int32_t codewordPosition) {
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t pseudoRandom = ((149 * codewordPosition) % 253) + 1;
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t tempVariable = ch + pseudoRandom;
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return tempVariable <= 254 ? (FX_WCHAR)tempVariable
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             : (FX_WCHAR)(tempVariable - 254);
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
32233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannint32_t CBC_HighLevelEncoder::findMinimums(
32333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    std::vector<FX_FLOAT>& charCounts,
32433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_ArrayTemplate<int32_t>& intCharCounts,
32533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    int32_t min,
32633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_ArrayTemplate<uint8_t>& mins) {
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int32_t l = 0; l < mins.GetSize(); l++) {
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    mins[l] = (uint8_t)0;
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int32_t i = 0; i < 6; i++) {
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    intCharCounts[i] = (int32_t)ceil(charCounts[i]);
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t current = intCharCounts[i];
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (min > current) {
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      min = current;
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (int32_t j = 0; j < mins.GetSize(); j++) {
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        mins[j] = (uint8_t)0;
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (min == current) {
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      mins[i]++;
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return min;
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
34533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannint32_t CBC_HighLevelEncoder::getMinimumCount(
34633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_ArrayTemplate<uint8_t>& mins) {
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t minCount = 0;
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int32_t i = 0; i < 6; i++) {
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    minCount += mins[i];
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return minCount;
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) {
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z');
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) {
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z');
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) {
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') ||
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         (ch >= 'A' && ch <= 'Z');
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) {
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (ch == '\r') || (ch == '*') || (ch == '>');
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) {
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ch >= ' ' && ch <= '^';
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) {
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
372