Index: xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp |
diff --git a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp |
index 0b14ef3595e9234d70d172415c001b867e46fbde..7d9ccd7724f158b44e73862c2fda6b34ce37b7bc 100644 |
--- a/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp |
+++ b/xfa/src/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp |
@@ -1,371 +1,371 @@ |
-// Copyright 2014 PDFium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
-// Original code is licensed as follows: |
-/* |
- * Copyright 2006-2007 Jeremias Maerki. |
- * |
- * Licensed under the Apache License, Version 2.0 (the "License"); |
- * you may not use this file except in compliance with the License. |
- * You may obtain a copy of the License at |
- * |
- * http://www.apache.org/licenses/LICENSE-2.0 |
- * |
- * Unless required by applicable law or agreed to in writing, software |
- * distributed under the License is distributed on an "AS IS" BASIS, |
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
- * See the License for the specific language governing permissions and |
- * limitations under the License. |
- */ |
- |
-#include "xfa/src/fxbarcode/barcode.h" |
-#include "xfa/src/fxbarcode/BC_Dimension.h" |
-#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h" |
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h" |
-#include "BC_Encoder.h" |
-#include "BC_SymbolShapeHint.h" |
-#include "BC_SymbolInfo.h" |
-#include "BC_EncoderContext.h" |
-#include "BC_C40Encoder.h" |
-#include "BC_TextEncoder.h" |
-#include "BC_X12Encoder.h" |
-#include "BC_EdifactEncoder.h" |
-#include "BC_Base256Encoder.h" |
-#include "BC_ASCIIEncoder.h" |
-#include "BC_HighLevelEncoder.h" |
-#define Integer_MAX_VALUE 2147483647 |
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230; |
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231; |
-FX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235; |
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238; |
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239; |
-FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240; |
-FX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254; |
-FX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254; |
-FX_WCHAR CBC_HighLevelEncoder::PAD = 129; |
-FX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236; |
-FX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237; |
-const wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05"; |
-const wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06"; |
-const wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004; |
-CBC_HighLevelEncoder::CBC_HighLevelEncoder() {} |
-CBC_HighLevelEncoder::~CBC_HighLevelEncoder() {} |
-CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) { |
- CFX_ByteString bytestr; |
- CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr); |
- for (int32_t i = 0; i < bytestr.GetLength(); i++) { |
- m_bytearray.Add(bytestr.GetAt(i)); |
- } |
- return m_bytearray; |
-} |
-CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, |
- CFX_WideString ecLevel, |
- int32_t& e) { |
- return encodeHighLevel(msg, ecLevel, FORCE_NONE, NULL, NULL, e); |
-} |
-CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, |
- CFX_WideString ecLevel, |
- SymbolShapeHint shape, |
- CBC_Dimension* minSize, |
- CBC_Dimension* maxSize, |
- int32_t& e) { |
- CBC_EncoderContext context(msg, ecLevel, e); |
- BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)""); |
- context.setSymbolShape(shape); |
- context.setSizeConstraints(minSize, maxSize); |
- if ((msg.Mid(0, 6) == MACRO_05_HEADER) && |
- (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { |
- context.writeCodeword(MACRO_05); |
- context.setSkipAtEnd(2); |
- context.m_pos += 6; |
- } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) && |
- (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { |
- context.writeCodeword(MACRO_06); |
- context.setSkipAtEnd(2); |
- context.m_pos += 6; |
- } |
- CFX_PtrArray encoders; |
- encoders.Add(new CBC_ASCIIEncoder()); |
- encoders.Add(new CBC_C40Encoder()); |
- encoders.Add(new CBC_TextEncoder()); |
- encoders.Add(new CBC_X12Encoder()); |
- encoders.Add(new CBC_EdifactEncoder()); |
- encoders.Add(new CBC_Base256Encoder()); |
- int32_t encodingMode = ASCII_ENCODATION; |
- while (context.hasMoreCharacters()) { |
- ((CBC_Encoder*)encoders.GetAt(encodingMode))->Encode(context, e); |
- if (e != BCExceptionNO) { |
- for (int32_t i = 0; i < encoders.GetSize(); i++) { |
- delete (CBC_Encoder*)encoders.GetAt(i); |
- } |
- encoders.RemoveAll(); |
- return (FX_WCHAR*)""; |
- } |
- if (context.m_newEncoding >= 0) { |
- encodingMode = context.m_newEncoding; |
- context.resetEncoderSignal(); |
- } |
- } |
- int32_t len = context.m_codewords.GetLength(); |
- context.updateSymbolInfo(e); |
- if (e != BCExceptionNO) { |
- for (int32_t i = 0; i < encoders.GetSize(); i++) { |
- delete (CBC_Encoder*)encoders.GetAt(i); |
- } |
- encoders.RemoveAll(); |
- return (FX_WCHAR*)""; |
- } |
- int32_t capacity = context.m_symbolInfo->m_dataCapacity; |
- if (len < capacity) { |
- if (encodingMode != ASCII_ENCODATION && |
- encodingMode != BASE256_ENCODATION) { |
- context.writeCodeword(0x00fe); |
- } |
- } |
- CFX_WideString codewords = context.m_codewords; |
- if (codewords.GetLength() < capacity) { |
- codewords += PAD; |
- } |
- while (codewords.GetLength() < capacity) { |
- codewords += (randomize253State(PAD, codewords.GetLength() + 1)); |
- } |
- for (int32_t i = 0; i < encoders.GetSize(); i++) { |
- delete (CBC_Encoder*)encoders.GetAt(i); |
- } |
- encoders.RemoveAll(); |
- return codewords; |
-} |
-int32_t CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg, |
- int32_t startpos, |
- int32_t currentMode) { |
- if (startpos >= msg.GetLength()) { |
- return currentMode; |
- } |
- CFX_FloatArray charCounts; |
- if (currentMode == ASCII_ENCODATION) { |
- charCounts.Add(0); |
- charCounts.Add(1); |
- charCounts.Add(1); |
- charCounts.Add(1); |
- charCounts.Add(1); |
- charCounts.Add(1.25f); |
- } else { |
- charCounts.Add(1); |
- charCounts.Add(2); |
- charCounts.Add(2); |
- charCounts.Add(2); |
- charCounts.Add(2); |
- charCounts.Add(2.25f); |
- charCounts[currentMode] = 0; |
- } |
- int32_t charsProcessed = 0; |
- while (TRUE) { |
- if ((startpos + charsProcessed) == msg.GetLength()) { |
- FX_DWORD min = Integer_MAX_VALUE; |
- CFX_ByteArray mins; |
- mins.SetSize(6); |
- CFX_Int32Array intCharCounts; |
- intCharCounts.SetSize(6); |
- min = findMinimums(charCounts, intCharCounts, min, mins); |
- int32_t minCount = getMinimumCount(mins); |
- if (intCharCounts[ASCII_ENCODATION] == min) { |
- return ASCII_ENCODATION; |
- } |
- if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { |
- return BASE256_ENCODATION; |
- } |
- if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { |
- return EDIFACT_ENCODATION; |
- } |
- if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { |
- return TEXT_ENCODATION; |
- } |
- if (minCount == 1 && mins[X12_ENCODATION] > 0) { |
- return X12_ENCODATION; |
- } |
- return C40_ENCODATION; |
- } |
- FX_WCHAR c = msg.GetAt(startpos + charsProcessed); |
- charsProcessed++; |
- if (isDigit(c)) { |
- charCounts[ASCII_ENCODATION] += 0.5; |
- } else if (isExtendedASCII(c)) { |
- charCounts[ASCII_ENCODATION] = |
- (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]); |
- charCounts[ASCII_ENCODATION] += 2; |
- } else { |
- charCounts[ASCII_ENCODATION] = |
- (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]); |
- charCounts[ASCII_ENCODATION]++; |
- } |
- if (isNativeC40(c)) { |
- charCounts[C40_ENCODATION] += 2.0f / 3.0f; |
- } else if (isExtendedASCII(c)) { |
- charCounts[C40_ENCODATION] += 8.0f / 3.0f; |
- } else { |
- charCounts[C40_ENCODATION] += 4.0f / 3.0f; |
- } |
- if (isNativeText(c)) { |
- charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; |
- } else if (isExtendedASCII(c)) { |
- charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; |
- } else { |
- charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; |
- } |
- if (isNativeX12(c)) { |
- charCounts[X12_ENCODATION] += 2.0f / 3.0f; |
- } else if (isExtendedASCII(c)) { |
- charCounts[X12_ENCODATION] += 13.0f / 3.0f; |
- } else { |
- charCounts[X12_ENCODATION] += 10.0f / 3.0f; |
- } |
- if (isNativeEDIFACT(c)) { |
- charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; |
- } else if (isExtendedASCII(c)) { |
- charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; |
- } else { |
- charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; |
- } |
- if (isSpecialB256(c)) { |
- charCounts[BASE256_ENCODATION] += 4; |
- } else { |
- charCounts[BASE256_ENCODATION]++; |
- } |
- if (charsProcessed >= 4) { |
- CFX_Int32Array intCharCounts; |
- intCharCounts.SetSize(6); |
- CFX_ByteArray mins; |
- mins.SetSize(6); |
- findMinimums(charCounts, intCharCounts, Integer_MAX_VALUE, mins); |
- int32_t minCount = getMinimumCount(mins); |
- if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] && |
- intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] && |
- intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] && |
- intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] && |
- intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { |
- return ASCII_ENCODATION; |
- } |
- if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] || |
- (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + |
- mins[EDIFACT_ENCODATION]) == 0) { |
- return BASE256_ENCODATION; |
- } |
- if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { |
- return EDIFACT_ENCODATION; |
- } |
- if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { |
- return TEXT_ENCODATION; |
- } |
- if (minCount == 1 && mins[X12_ENCODATION] > 0) { |
- return X12_ENCODATION; |
- } |
- if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] && |
- intCharCounts[C40_ENCODATION] + 1 < |
- intCharCounts[BASE256_ENCODATION] && |
- intCharCounts[C40_ENCODATION] + 1 < |
- intCharCounts[EDIFACT_ENCODATION] && |
- intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { |
- if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { |
- return C40_ENCODATION; |
- } |
- if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { |
- int32_t p = startpos + charsProcessed + 1; |
- while (p < msg.GetLength()) { |
- FX_WCHAR tc = msg.GetAt(p); |
- if (isX12TermSep(tc)) { |
- return X12_ENCODATION; |
- } |
- if (!isNativeX12(tc)) { |
- break; |
- } |
- p++; |
- } |
- return C40_ENCODATION; |
- } |
- } |
- } |
- } |
-} |
-FX_BOOL CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) { |
- return ch >= '0' && ch <= '9'; |
-} |
-FX_BOOL CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) { |
- return ch >= 128 && ch <= 255; |
-} |
-int32_t CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, |
- int32_t startpos) { |
- int32_t count = 0; |
- int32_t len = msg.GetLength(); |
- int32_t idx = startpos; |
- if (idx < len) { |
- FX_WCHAR ch = msg.GetAt(idx); |
- while (isDigit(ch) && idx < len) { |
- count++; |
- idx++; |
- if (idx < len) { |
- ch = msg.GetAt(idx); |
- } |
- } |
- } |
- return count; |
-} |
-void CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, int32_t& e) { |
- e = BCExceptionIllegalArgument; |
-} |
-FX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch, |
- int32_t codewordPosition) { |
- int32_t pseudoRandom = ((149 * codewordPosition) % 253) + 1; |
- int32_t tempVariable = ch + pseudoRandom; |
- return tempVariable <= 254 ? (FX_WCHAR)tempVariable |
- : (FX_WCHAR)(tempVariable - 254); |
-} |
-int32_t CBC_HighLevelEncoder::findMinimums(CFX_FloatArray& charCounts, |
- CFX_Int32Array& intCharCounts, |
- int32_t min, |
- CFX_ByteArray& mins) { |
- for (int32_t l = 0; l < mins.GetSize(); l++) { |
- mins[l] = (uint8_t)0; |
- } |
- for (int32_t i = 0; i < 6; i++) { |
- intCharCounts[i] = (int32_t)ceil(charCounts[i]); |
- int32_t current = intCharCounts[i]; |
- if (min > current) { |
- min = current; |
- for (int32_t j = 0; j < mins.GetSize(); j++) { |
- mins[j] = (uint8_t)0; |
- } |
- } |
- if (min == current) { |
- mins[i]++; |
- } |
- } |
- return min; |
-} |
-int32_t CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray& mins) { |
- int32_t minCount = 0; |
- for (int32_t i = 0; i < 6; i++) { |
- minCount += mins[i]; |
- } |
- return minCount; |
-} |
-FX_BOOL CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) { |
- return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); |
-} |
-FX_BOOL CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) { |
- return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); |
-} |
-FX_BOOL CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) { |
- return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || |
- (ch >= 'A' && ch <= 'Z'); |
-} |
-FX_BOOL CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) { |
- return (ch == '\r') || (ch == '*') || (ch == '>'); |
-} |
-FX_BOOL CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) { |
- return ch >= ' ' && ch <= '^'; |
-} |
-FX_BOOL CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) { |
- return FALSE; |
-} |
+// Copyright 2014 PDFium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+// Original code is licensed as follows: |
+/* |
+ * Copyright 2006-2007 Jeremias Maerki. |
+ * |
+ * Licensed under the Apache License, Version 2.0 (the "License"); |
+ * you may not use this file except in compliance with the License. |
+ * You may obtain a copy of the License at |
+ * |
+ * http://www.apache.org/licenses/LICENSE-2.0 |
+ * |
+ * Unless required by applicable law or agreed to in writing, software |
+ * distributed under the License is distributed on an "AS IS" BASIS, |
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+ * See the License for the specific language governing permissions and |
+ * limitations under the License. |
+ */ |
+ |
+#include "xfa/src/fxbarcode/barcode.h" |
+#include "xfa/src/fxbarcode/BC_Dimension.h" |
+#include "xfa/src/fxbarcode/BC_UtilCodingConvert.h" |
+#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h" |
+#include "BC_Encoder.h" |
+#include "BC_SymbolShapeHint.h" |
+#include "BC_SymbolInfo.h" |
+#include "BC_EncoderContext.h" |
+#include "BC_C40Encoder.h" |
+#include "BC_TextEncoder.h" |
+#include "BC_X12Encoder.h" |
+#include "BC_EdifactEncoder.h" |
+#include "BC_Base256Encoder.h" |
+#include "BC_ASCIIEncoder.h" |
+#include "BC_HighLevelEncoder.h" |
+#define Integer_MAX_VALUE 2147483647 |
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_C40 = 230; |
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_BASE256 = 231; |
+FX_WCHAR CBC_HighLevelEncoder::UPPER_SHIFT = 235; |
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_ANSIX12 = 238; |
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_TEXT = 239; |
+FX_WCHAR CBC_HighLevelEncoder::LATCH_TO_EDIFACT = 240; |
+FX_WCHAR CBC_HighLevelEncoder::C40_UNLATCH = 254; |
+FX_WCHAR CBC_HighLevelEncoder::X12_UNLATCH = 254; |
+FX_WCHAR CBC_HighLevelEncoder::PAD = 129; |
+FX_WCHAR CBC_HighLevelEncoder::MACRO_05 = 236; |
+FX_WCHAR CBC_HighLevelEncoder::MACRO_06 = 237; |
+const wchar_t* CBC_HighLevelEncoder::MACRO_05_HEADER = L"[)>05"; |
+const wchar_t* CBC_HighLevelEncoder::MACRO_06_HEADER = L"[)>06"; |
+const wchar_t CBC_HighLevelEncoder::MACRO_TRAILER = 0x0004; |
+CBC_HighLevelEncoder::CBC_HighLevelEncoder() {} |
+CBC_HighLevelEncoder::~CBC_HighLevelEncoder() {} |
+CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) { |
+ CFX_ByteString bytestr; |
+ CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr); |
+ for (int32_t i = 0; i < bytestr.GetLength(); i++) { |
+ m_bytearray.Add(bytestr.GetAt(i)); |
+ } |
+ return m_bytearray; |
+} |
+CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, |
+ CFX_WideString ecLevel, |
+ int32_t& e) { |
+ return encodeHighLevel(msg, ecLevel, FORCE_NONE, NULL, NULL, e); |
+} |
+CFX_WideString CBC_HighLevelEncoder::encodeHighLevel(CFX_WideString msg, |
+ CFX_WideString ecLevel, |
+ SymbolShapeHint shape, |
+ CBC_Dimension* minSize, |
+ CBC_Dimension* maxSize, |
+ int32_t& e) { |
+ CBC_EncoderContext context(msg, ecLevel, e); |
+ BC_EXCEPTION_CHECK_ReturnValue(e, (FX_WCHAR*)""); |
+ context.setSymbolShape(shape); |
+ context.setSizeConstraints(minSize, maxSize); |
+ if ((msg.Mid(0, 6) == MACRO_05_HEADER) && |
+ (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { |
+ context.writeCodeword(MACRO_05); |
+ context.setSkipAtEnd(2); |
+ context.m_pos += 6; |
+ } else if ((msg.Mid(0, 6) == MACRO_06_HEADER) && |
+ (msg.Mid(msg.GetLength() - 1, 1) == MACRO_TRAILER)) { |
+ context.writeCodeword(MACRO_06); |
+ context.setSkipAtEnd(2); |
+ context.m_pos += 6; |
+ } |
+ CFX_PtrArray encoders; |
+ encoders.Add(new CBC_ASCIIEncoder()); |
+ encoders.Add(new CBC_C40Encoder()); |
+ encoders.Add(new CBC_TextEncoder()); |
+ encoders.Add(new CBC_X12Encoder()); |
+ encoders.Add(new CBC_EdifactEncoder()); |
+ encoders.Add(new CBC_Base256Encoder()); |
+ int32_t encodingMode = ASCII_ENCODATION; |
+ while (context.hasMoreCharacters()) { |
+ ((CBC_Encoder*)encoders.GetAt(encodingMode))->Encode(context, e); |
+ if (e != BCExceptionNO) { |
+ for (int32_t i = 0; i < encoders.GetSize(); i++) { |
+ delete (CBC_Encoder*)encoders.GetAt(i); |
+ } |
+ encoders.RemoveAll(); |
+ return (FX_WCHAR*)""; |
+ } |
+ if (context.m_newEncoding >= 0) { |
+ encodingMode = context.m_newEncoding; |
+ context.resetEncoderSignal(); |
+ } |
+ } |
+ int32_t len = context.m_codewords.GetLength(); |
+ context.updateSymbolInfo(e); |
+ if (e != BCExceptionNO) { |
+ for (int32_t i = 0; i < encoders.GetSize(); i++) { |
+ delete (CBC_Encoder*)encoders.GetAt(i); |
+ } |
+ encoders.RemoveAll(); |
+ return (FX_WCHAR*)""; |
+ } |
+ int32_t capacity = context.m_symbolInfo->m_dataCapacity; |
+ if (len < capacity) { |
+ if (encodingMode != ASCII_ENCODATION && |
+ encodingMode != BASE256_ENCODATION) { |
+ context.writeCodeword(0x00fe); |
+ } |
+ } |
+ CFX_WideString codewords = context.m_codewords; |
+ if (codewords.GetLength() < capacity) { |
+ codewords += PAD; |
+ } |
+ while (codewords.GetLength() < capacity) { |
+ codewords += (randomize253State(PAD, codewords.GetLength() + 1)); |
+ } |
+ for (int32_t i = 0; i < encoders.GetSize(); i++) { |
+ delete (CBC_Encoder*)encoders.GetAt(i); |
+ } |
+ encoders.RemoveAll(); |
+ return codewords; |
+} |
+int32_t CBC_HighLevelEncoder::lookAheadTest(CFX_WideString msg, |
+ int32_t startpos, |
+ int32_t currentMode) { |
+ if (startpos >= msg.GetLength()) { |
+ return currentMode; |
+ } |
+ CFX_FloatArray charCounts; |
+ if (currentMode == ASCII_ENCODATION) { |
+ charCounts.Add(0); |
+ charCounts.Add(1); |
+ charCounts.Add(1); |
+ charCounts.Add(1); |
+ charCounts.Add(1); |
+ charCounts.Add(1.25f); |
+ } else { |
+ charCounts.Add(1); |
+ charCounts.Add(2); |
+ charCounts.Add(2); |
+ charCounts.Add(2); |
+ charCounts.Add(2); |
+ charCounts.Add(2.25f); |
+ charCounts[currentMode] = 0; |
+ } |
+ int32_t charsProcessed = 0; |
+ while (TRUE) { |
+ if ((startpos + charsProcessed) == msg.GetLength()) { |
+ FX_DWORD min = Integer_MAX_VALUE; |
+ CFX_ByteArray mins; |
+ mins.SetSize(6); |
+ CFX_Int32Array intCharCounts; |
+ intCharCounts.SetSize(6); |
+ min = findMinimums(charCounts, intCharCounts, min, mins); |
+ int32_t minCount = getMinimumCount(mins); |
+ if (intCharCounts[ASCII_ENCODATION] == min) { |
+ return ASCII_ENCODATION; |
+ } |
+ if (minCount == 1 && mins[BASE256_ENCODATION] > 0) { |
+ return BASE256_ENCODATION; |
+ } |
+ if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { |
+ return EDIFACT_ENCODATION; |
+ } |
+ if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { |
+ return TEXT_ENCODATION; |
+ } |
+ if (minCount == 1 && mins[X12_ENCODATION] > 0) { |
+ return X12_ENCODATION; |
+ } |
+ return C40_ENCODATION; |
+ } |
+ FX_WCHAR c = msg.GetAt(startpos + charsProcessed); |
+ charsProcessed++; |
+ if (isDigit(c)) { |
+ charCounts[ASCII_ENCODATION] += 0.5; |
+ } else if (isExtendedASCII(c)) { |
+ charCounts[ASCII_ENCODATION] = |
+ (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]); |
+ charCounts[ASCII_ENCODATION] += 2; |
+ } else { |
+ charCounts[ASCII_ENCODATION] = |
+ (FX_FLOAT)ceil(charCounts[ASCII_ENCODATION]); |
+ charCounts[ASCII_ENCODATION]++; |
+ } |
+ if (isNativeC40(c)) { |
+ charCounts[C40_ENCODATION] += 2.0f / 3.0f; |
+ } else if (isExtendedASCII(c)) { |
+ charCounts[C40_ENCODATION] += 8.0f / 3.0f; |
+ } else { |
+ charCounts[C40_ENCODATION] += 4.0f / 3.0f; |
+ } |
+ if (isNativeText(c)) { |
+ charCounts[TEXT_ENCODATION] += 2.0f / 3.0f; |
+ } else if (isExtendedASCII(c)) { |
+ charCounts[TEXT_ENCODATION] += 8.0f / 3.0f; |
+ } else { |
+ charCounts[TEXT_ENCODATION] += 4.0f / 3.0f; |
+ } |
+ if (isNativeX12(c)) { |
+ charCounts[X12_ENCODATION] += 2.0f / 3.0f; |
+ } else if (isExtendedASCII(c)) { |
+ charCounts[X12_ENCODATION] += 13.0f / 3.0f; |
+ } else { |
+ charCounts[X12_ENCODATION] += 10.0f / 3.0f; |
+ } |
+ if (isNativeEDIFACT(c)) { |
+ charCounts[EDIFACT_ENCODATION] += 3.0f / 4.0f; |
+ } else if (isExtendedASCII(c)) { |
+ charCounts[EDIFACT_ENCODATION] += 17.0f / 4.0f; |
+ } else { |
+ charCounts[EDIFACT_ENCODATION] += 13.0f / 4.0f; |
+ } |
+ if (isSpecialB256(c)) { |
+ charCounts[BASE256_ENCODATION] += 4; |
+ } else { |
+ charCounts[BASE256_ENCODATION]++; |
+ } |
+ if (charsProcessed >= 4) { |
+ CFX_Int32Array intCharCounts; |
+ intCharCounts.SetSize(6); |
+ CFX_ByteArray mins; |
+ mins.SetSize(6); |
+ findMinimums(charCounts, intCharCounts, Integer_MAX_VALUE, mins); |
+ int32_t minCount = getMinimumCount(mins); |
+ if (intCharCounts[ASCII_ENCODATION] < intCharCounts[BASE256_ENCODATION] && |
+ intCharCounts[ASCII_ENCODATION] < intCharCounts[C40_ENCODATION] && |
+ intCharCounts[ASCII_ENCODATION] < intCharCounts[TEXT_ENCODATION] && |
+ intCharCounts[ASCII_ENCODATION] < intCharCounts[X12_ENCODATION] && |
+ intCharCounts[ASCII_ENCODATION] < intCharCounts[EDIFACT_ENCODATION]) { |
+ return ASCII_ENCODATION; |
+ } |
+ if (intCharCounts[BASE256_ENCODATION] < intCharCounts[ASCII_ENCODATION] || |
+ (mins[C40_ENCODATION] + mins[TEXT_ENCODATION] + mins[X12_ENCODATION] + |
+ mins[EDIFACT_ENCODATION]) == 0) { |
+ return BASE256_ENCODATION; |
+ } |
+ if (minCount == 1 && mins[EDIFACT_ENCODATION] > 0) { |
+ return EDIFACT_ENCODATION; |
+ } |
+ if (minCount == 1 && mins[TEXT_ENCODATION] > 0) { |
+ return TEXT_ENCODATION; |
+ } |
+ if (minCount == 1 && mins[X12_ENCODATION] > 0) { |
+ return X12_ENCODATION; |
+ } |
+ if (intCharCounts[C40_ENCODATION] + 1 < intCharCounts[ASCII_ENCODATION] && |
+ intCharCounts[C40_ENCODATION] + 1 < |
+ intCharCounts[BASE256_ENCODATION] && |
+ intCharCounts[C40_ENCODATION] + 1 < |
+ intCharCounts[EDIFACT_ENCODATION] && |
+ intCharCounts[C40_ENCODATION] + 1 < intCharCounts[TEXT_ENCODATION]) { |
+ if (intCharCounts[C40_ENCODATION] < intCharCounts[X12_ENCODATION]) { |
+ return C40_ENCODATION; |
+ } |
+ if (intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION]) { |
+ int32_t p = startpos + charsProcessed + 1; |
+ while (p < msg.GetLength()) { |
+ FX_WCHAR tc = msg.GetAt(p); |
+ if (isX12TermSep(tc)) { |
+ return X12_ENCODATION; |
+ } |
+ if (!isNativeX12(tc)) { |
+ break; |
+ } |
+ p++; |
+ } |
+ return C40_ENCODATION; |
+ } |
+ } |
+ } |
+ } |
+} |
+FX_BOOL CBC_HighLevelEncoder::isDigit(FX_WCHAR ch) { |
+ return ch >= '0' && ch <= '9'; |
+} |
+FX_BOOL CBC_HighLevelEncoder::isExtendedASCII(FX_WCHAR ch) { |
+ return ch >= 128 && ch <= 255; |
+} |
+int32_t CBC_HighLevelEncoder::determineConsecutiveDigitCount(CFX_WideString msg, |
+ int32_t startpos) { |
+ int32_t count = 0; |
+ int32_t len = msg.GetLength(); |
+ int32_t idx = startpos; |
+ if (idx < len) { |
+ FX_WCHAR ch = msg.GetAt(idx); |
+ while (isDigit(ch) && idx < len) { |
+ count++; |
+ idx++; |
+ if (idx < len) { |
+ ch = msg.GetAt(idx); |
+ } |
+ } |
+ } |
+ return count; |
+} |
+void CBC_HighLevelEncoder::illegalCharacter(FX_WCHAR c, int32_t& e) { |
+ e = BCExceptionIllegalArgument; |
+} |
+FX_WCHAR CBC_HighLevelEncoder::randomize253State(FX_WCHAR ch, |
+ int32_t codewordPosition) { |
+ int32_t pseudoRandom = ((149 * codewordPosition) % 253) + 1; |
+ int32_t tempVariable = ch + pseudoRandom; |
+ return tempVariable <= 254 ? (FX_WCHAR)tempVariable |
+ : (FX_WCHAR)(tempVariable - 254); |
+} |
+int32_t CBC_HighLevelEncoder::findMinimums(CFX_FloatArray& charCounts, |
+ CFX_Int32Array& intCharCounts, |
+ int32_t min, |
+ CFX_ByteArray& mins) { |
+ for (int32_t l = 0; l < mins.GetSize(); l++) { |
+ mins[l] = (uint8_t)0; |
+ } |
+ for (int32_t i = 0; i < 6; i++) { |
+ intCharCounts[i] = (int32_t)ceil(charCounts[i]); |
+ int32_t current = intCharCounts[i]; |
+ if (min > current) { |
+ min = current; |
+ for (int32_t j = 0; j < mins.GetSize(); j++) { |
+ mins[j] = (uint8_t)0; |
+ } |
+ } |
+ if (min == current) { |
+ mins[i]++; |
+ } |
+ } |
+ return min; |
+} |
+int32_t CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray& mins) { |
+ int32_t minCount = 0; |
+ for (int32_t i = 0; i < 6; i++) { |
+ minCount += mins[i]; |
+ } |
+ return minCount; |
+} |
+FX_BOOL CBC_HighLevelEncoder::isNativeC40(FX_WCHAR ch) { |
+ return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); |
+} |
+FX_BOOL CBC_HighLevelEncoder::isNativeText(FX_WCHAR ch) { |
+ return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); |
+} |
+FX_BOOL CBC_HighLevelEncoder::isNativeX12(FX_WCHAR ch) { |
+ return isX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') || |
+ (ch >= 'A' && ch <= 'Z'); |
+} |
+FX_BOOL CBC_HighLevelEncoder::isX12TermSep(FX_WCHAR ch) { |
+ return (ch == '\r') || (ch == '*') || (ch == '>'); |
+} |
+FX_BOOL CBC_HighLevelEncoder::isNativeEDIFACT(FX_WCHAR ch) { |
+ return ch >= ' ' && ch <= '^'; |
+} |
+FX_BOOL CBC_HighLevelEncoder::isSpecialB256(FX_WCHAR ch) { |
+ return FALSE; |
+} |