1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef _BC_UTILS_H_
8#define _BC_UTILS_H_
9typedef CFX_MapPtrTemplate<void*, int32_t> CFX_PtrToInt32;
10FX_BOOL BC_FX_ByteString_Replace(CFX_ByteString& dst,
11                                 FX_DWORD first,
12                                 FX_DWORD last,
13                                 int32_t count,
14                                 FX_CHAR c);
15void BC_FX_ByteString_Append(CFX_ByteString& dst, int32_t count, FX_CHAR c);
16void BC_FX_ByteString_Append(CFX_ByteString& dst, const CFX_ByteArray& ba);
17typedef FX_BOOL (*BC_PtrArrayCompareCallback)(void* l, void* r);
18void BC_FX_PtrArray_Sort(CFX_PtrArray& src, BC_PtrArrayCompareCallback fun);
19template <class _Ty>
20class CBC_AutoPtr {
21 public:
22  typedef _Ty element_type;
23  explicit CBC_AutoPtr(_Ty* _P = 0) : _Owns(_P != 0), _Ptr(_P) {}
24  CBC_AutoPtr(const CBC_AutoPtr<_Ty>& _Y)
25      : _Owns(_Y._Owns), _Ptr(_Y.release()) {}
26  CBC_AutoPtr<_Ty>& operator=(const CBC_AutoPtr<_Ty>& _Y) {
27    if (this != &_Y) {
28      if (_Ptr != _Y.get()) {
29        if (_Owns) {
30          delete _Ptr;
31        }
32        _Owns = _Y._Owns;
33      } else if (_Y._Owns) {
34        _Owns = TRUE;
35      }
36      _Ptr = _Y.release();
37    }
38    return (*this);
39  }
40  ~CBC_AutoPtr() {
41    if (_Owns) {
42      delete _Ptr;
43    }
44  }
45  _Ty& operator*() const { return (*get()); }
46  _Ty* operator->() const { return (get()); }
47  _Ty* get() const { return (_Ptr); }
48  _Ty* release() const {
49    ((CBC_AutoPtr<_Ty>*)this)->_Owns = FALSE;
50    return (_Ptr);
51  }
52
53 private:
54  FX_BOOL _Owns;
55  _Ty* _Ptr;
56};
57#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
58#include <limits>
59#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || \
60      _FX_OS_ == _FX_IOS_)
61#include <limits.h>
62#endif
63#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
64#define FXSYS_isnan(x) _isnan(x)
65#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_)
66#include <cmath>
67#define FXSYS_isnan(x) std::isnan(x)
68#elif(_FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_)
69#include <math.h>
70#define FXSYS_isnan(x) isnan(x)
71#endif
72#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
73#define FXSYS_nan() (std::numeric_limits<float>::quiet_NaN())
74#elif(_FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_LINUX_DESKTOP_ || \
75      _FX_OS_ == _FX_IOS_ || _FX_OS_ == _FX_ANDROID_)
76#define FXSYS_nan() NAN
77#endif
78enum BCFORMAT {
79  BCFORMAT_UNSPECIFY = -1,
80  BCFORMAT_CODABAR,
81  BCFORMAT_CODE_39,
82  BCFORMAT_CODE_128,
83  BCFORMAT_CODE_128B,
84  BCFORMAT_CODE_128C,
85  BCFORMAT_EAN_8,
86  BCFORMAT_UPC_A,
87  BCFORMAT_EAN_13,
88  BCFORMAT_PDF_417,
89  BCFORMAT_DATAMATRIX,
90  BCFORMAT_QR_CODE
91};
92#define BCFORMAT_ECLEVEL_L 0
93#define BCFORMAT_ECLEVEL_M 1
94#define BCFORMAT_ECLEVEL_Q 2
95#define BCFORMAT_ECLEVEL_H 3
96#include <ctype.h>
97#define FXSYS_IntMax INT_MAX
98#define FXSYS_Isdigit isdigit
99#define BCExceptionNO 0
100#define BCExceptionNotFound 1
101#define BCExceptionEndLessThanStart 2
102#define BCExceptionUnknownDecoder 3
103#define BCExceptionRotateNotSupported 4
104#define BCExceptionHeightAndWidthMustBeAtLeast1 5
105#define BCExceptionRegionMustFitInsideMatrix 6
106#define BCExceptionCanNotCallGetDimensionOnNonSquareMatrix 7
107#define BCExceptionFormatException 8
108#define BCExceptionIllegalArgumentMustMatchVersionSize 9
109#define BCExceptionChecksumException 10
110#define BCExceptionIllegalArgumentInvalidFirstDigit 11
111#define BCExceptionIllegalArgumentInvalidSecondDigit 12
112#define BCExceptionRuntimeDecodingInvalidISO_IEC 13
113#define BCExceptionRuntimeDecodingInvalidAlphanumeric 14
114#define BCExceptionLeftAndTopMustBeNonnegative 15
115#define BCExceptionIllegalArgument 16
116#define BCExceptionBadECI 17
117#define BCExceptionUnSupportedBarcode 18
118#define BCExceptionUnSupportedString 19
119#define BCExceptionDigitLengthMustBe8 20
120#define BCExceptionDataCheckException 21
121#define BCExceptionExtractNumberValueFromBitArray 22
122#define BCExceptionRead 23
123#define BCExceptionRequestedRowIsOutSizeTheImage 24
124#define BCExceptionNoContents 26
125#define BCExceptionUnSupportEclevel 27
126#define BCExceptionUnSupportMode 28
127#define BCExceptionReferenceMustBeBetween0And7 29
128#define BCExceptionBadErrorLocation 30
129#define BCExceptionDegreeIsNegative 31
130#define BCExceptionDivideByZero 32
131#define BCExceptionCoefficientsSizeIsNull 33
132#define BCExceptionNoCorrectionBytes 34
133#define BCExceptionNoDataBytesProvided 35
134#define BCExceptionR_I_1IsZero 36
135#define BCExceptionAIsZero 37
136#define BCExceptionIsZero 38
137#define BCExceptionDegreeNotMatchRoots 39
138#define BCExceptionContentsLengthShouldBetween1and80 40
139#define BCExceptionOnlyEncodeCODE_128 41
140#define BCExceptionOnlyEncodeCODE_39 42
141#define BCExceptionOnlyEncodeEAN_13 43
142#define BCExceptionOnlyEncodeEAN_8 44
143#define BCExceptionOnlyEncodeITF 45
144#define BCExceptionDigitLengthShould13 46
145#define BCExceptionDigitLengthMustBe6or8or10or12or14or16or20or24or44 47
146#define BCExceptionOnlyEncodeUPC_A 48
147#define BCExceptionDigitLengthShouldBe12 49
148#define BCExceptionValueMustBeEither0or1 50
149#define BCExceptionReedsolomnDecodeException 51
150#define BCExceptionBadIndexException 52
151#define BCExceptionBadValueException 53
152#define BCExceptionBadNumBitsException 54
153#define BCExceptioncanNotOperatexorOperator 55
154#define BCExceptionVersionMust1_40 56
155#define BCExceptionUnknown 57
156#define BCExceptionNoSuchVersion 58
157#define BCExceptionCannotFindBlockInfo 59
158#define BCExceptionDataTooBig 60
159#define BCExceptionInvalidQRCode 61
160#define BCExceptionDataTooMany 62
161#define BCExceptionBitsNotEqualCacity 63
162#define BCExceptionUnsupportedMode 64
163#define BCExceptionInvalidateCharacter 65
164#define BCExceptionBytesNotMatchOffset 66
165#define BCExceptionSizeInBytesDiffer 67
166#define BCExceptionInvalidateMaskPattern 68
167#define BCExceptionNullPointer 69
168#define BCExceptionBadMask 70
169#define BCExceptionBitSizeNot15 71
170#define BCExceptionBitSizeNot18 72
171#define BCExceptionInvalidateImageData 73
172#define BCExceptionHeight_8BeZero 74
173#define BCExceptionCharacterNotThisMode 75
174#define BCExceptionBitsBytesNotMatch 76
175#define BCExceptionInvalidateData 77
176#define BCExceptionLoadFile 78
177#define BCExceptionPDF417EncodeFail 79
178#define BCExceptionFailToCreateBitmap 80
179#define BCExceptionLoadFontFail 81
180#define BCExceptionOnlyEncodeCODEBAR 82
181#define BCExceptionCodabarShouldStartWithOneOfABCD 83
182#define BCExceptionCodabarShouldEndWithOneOfTNE 84
183#define BCExceptionCodabarEncodeCharsInvalid 85
184#define BCExceptionOnlyEncodeDATAMATRIX 86
185#define BCExceptionCharactersOutsideISO88591Encoding 87
186#define BCExceptionIllegalDataCodewords 88
187#define BCExceptionCannotHandleThisNumberOfDataRegions 89
188#define BCExceptionIllegalStateUnexpectedCase 90
189#define BCExceptionIllegalStateCountMustNotExceed4 91
190#define BCExceptionIllegalStateMessageLengthInvalid 92
191#define BCExceptionIllegalArgumentNotGigits 93
192#define BCExceptionIllegalStateIllegalMode 94
193#define BCExceptionOnlyEncodePDF417 95
194#define BCExceptionNonEncodableCharacterDetected 96
195#define BCExceptionErrorCorrectionLevelMustBeBetween0And8 97
196#define BCExceptionNoRecommendationPossible 98
197#define BCExceptionIllegalArgumentnMustBeAbove0 99
198#define BCExceptionUnableToFitMessageInColumns 100
199#define BCExceptionEncodedMessageContainsTooManyCodeWords 101
200#define BCExceptionBitmapSizeError 102
201#define BCExceptionFormatInstance 102
202#define BCExceptionChecksumInstance 103
203#define BCExceptiontNotFoundInstance 104
204#define BCExceptionNotFoundInstance 105
205#define BCExceptionCannotMetadata 106
206#define TWO_DIGIT_DATA_LENGTH_SIZE 24
207#define THREE_DIGIT_DATA_LENGTH_SIZE 23
208#define THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH_SIZE 57
209#define FOUR_DIGIT_DATA_LENGTH_SIZE 17
210#define BC_EXCEPTION_CHECK_ReturnVoid(e) \
211  if (e != BCExceptionNO)                \
212    return;
213#define BC_EXCEPTION_CHECK_ReturnValue(e, v) \
214  if (e != BCExceptionNO)                    \
215    return v;
216#endif
217