From 4856e86a46a5836d7ea793a78bea5637c85fe7c6 Mon Sep 17 00:00:00 2001 From: "srowen@gmail.com" Date: Sat, 30 Nov 2013 10:51:50 +0000 Subject: [PATCH] For 3.0.0, retire iphone/, cpp/, objc/ and remove temporary pointers in csharp/, qt/ git-svn-id: https://zxing.googlecode.com/svn/trunk@2978 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- CHANGES | 6 +- NOTICE | 66 - build.xml | 5 - cpp/.gdbinit | 3 - cpp/.gitignore | 7 - cpp/.svnignore | 5 - cpp/.valgrind.supp | 94 - cpp/.valgrindrc | 1 - cpp/CMakeLists.txt | 84 - cpp/README.md | 67 - cpp/SConscript | 87 - cpp/SConstruct | 7 - cpp/blackboxtest.results | 1080 --- cpp/blackboxtest.sh | 45 - cpp/cli/src/ImageReaderSource.cpp | 112 - cpp/cli/src/ImageReaderSource.h | 40 - cpp/cli/src/jpgd.cpp | 3174 --------- cpp/cli/src/jpgd.h | 319 - cpp/cli/src/lodepng.cpp | 6261 ----------------- cpp/cli/src/lodepng.h | 1695 ----- cpp/cli/src/main.cpp | 297 - cpp/cmake/FindCPPUNIT.cmake | 54 - cpp/cmake/FindIconv.cmake | 57 - cpp/core/src/bigint/.gitignore | 6 - cpp/core/src/bigint/BigInteger.cc | 405 -- cpp/core/src/bigint/BigInteger.hh | 215 - cpp/core/src/bigint/BigIntegerAlgorithms.cc | 70 - cpp/core/src/bigint/BigIntegerAlgorithms.hh | 25 - cpp/core/src/bigint/BigIntegerLibrary.hh | 8 - cpp/core/src/bigint/BigIntegerUtils.cc | 50 - cpp/core/src/bigint/BigIntegerUtils.hh | 72 - cpp/core/src/bigint/BigUnsigned.cc | 697 -- cpp/core/src/bigint/BigUnsigned.hh | 418 -- cpp/core/src/bigint/BigUnsignedInABase.cc | 125 - cpp/core/src/bigint/BigUnsignedInABase.hh | 122 - cpp/core/src/bigint/ChangeLog | 146 - cpp/core/src/bigint/Makefile | 73 - cpp/core/src/bigint/NumberlikeArray.hh | 177 - cpp/core/src/bigint/README | 71 - cpp/core/src/win32/zxing/iconv.h | 14 - cpp/core/src/win32/zxing/stdint.h | 247 - cpp/core/src/win32/zxing/win_iconv.c | 2035 ------ cpp/core/src/zxing/BarcodeFormat.cpp | 40 - cpp/core/src/zxing/BarcodeFormat.h | 60 - cpp/core/src/zxing/Binarizer.cpp | 45 - cpp/core/src/zxing/Binarizer.h | 50 - cpp/core/src/zxing/BinaryBitmap.cpp | 70 - cpp/core/src/zxing/BinaryBitmap.h | 56 - cpp/core/src/zxing/ChecksumException.cpp | 28 - cpp/core/src/zxing/ChecksumException.h | 34 - cpp/core/src/zxing/DecodeHints.cpp | 142 - cpp/core/src/zxing/DecodeHints.h | 85 - cpp/core/src/zxing/Exception.cpp | 43 - cpp/core/src/zxing/Exception.h | 51 - cpp/core/src/zxing/FormatException.cpp | 41 - cpp/core/src/zxing/FormatException.h | 37 - cpp/core/src/zxing/IllegalStateException.h | 35 - .../src/zxing/InvertedLuminanceSource.cpp | 68 - cpp/core/src/zxing/InvertedLuminanceSource.h | 48 - cpp/core/src/zxing/LuminanceSource.cpp | 86 - cpp/core/src/zxing/LuminanceSource.h | 59 - cpp/core/src/zxing/MultiFormatReader.cpp | 124 - cpp/core/src/zxing/MultiFormatReader.h | 48 - cpp/core/src/zxing/NotFoundException.h | 35 - cpp/core/src/zxing/Reader.cpp | 31 - cpp/core/src/zxing/Reader.h | 40 - cpp/core/src/zxing/ReaderException.h | 37 - cpp/core/src/zxing/Result.cpp | 61 - cpp/core/src/zxing/Result.h | 55 - cpp/core/src/zxing/ResultIO.cpp | 34 - cpp/core/src/zxing/ResultPoint.cpp | 108 - cpp/core/src/zxing/ResultPoint.h | 55 - cpp/core/src/zxing/ResultPointCallback.cpp | 26 - cpp/core/src/zxing/ResultPointCallback.h | 39 - cpp/core/src/zxing/ZXing.h | 133 - .../src/zxing/aztec/AztecDetectorResult.cpp | 54 - .../src/zxing/aztec/AztecDetectorResult.h | 48 - cpp/core/src/zxing/aztec/AztecReader.cpp | 68 - cpp/core/src/zxing/aztec/AztecReader.h | 49 - cpp/core/src/zxing/aztec/decoder/Decoder.cpp | 489 -- cpp/core/src/zxing/aztec/decoder/Decoder.h | 69 - .../src/zxing/aztec/detector/Detector.cpp | 548 -- cpp/core/src/zxing/aztec/detector/Detector.h | 92 - cpp/core/src/zxing/common/Array.h | 170 - cpp/core/src/zxing/common/BitArray.cpp | 155 - cpp/core/src/zxing/common/BitArray.h | 81 - cpp/core/src/zxing/common/BitArrayIO.cpp | 31 - cpp/core/src/zxing/common/BitMatrix.cpp | 143 - cpp/core/src/zxing/common/BitMatrix.h | 91 - cpp/core/src/zxing/common/BitSource.cpp | 76 - cpp/core/src/zxing/common/BitSource.h | 74 - cpp/core/src/zxing/common/CharacterSetECI.cpp | 104 - cpp/core/src/zxing/common/CharacterSetECI.h | 53 - cpp/core/src/zxing/common/Counted.h | 140 - cpp/core/src/zxing/common/DecoderResult.cpp | 46 - cpp/core/src/zxing/common/DecoderResult.h | 51 - cpp/core/src/zxing/common/DetectorResult.cpp | 39 - cpp/core/src/zxing/common/DetectorResult.h | 43 - .../zxing/common/GlobalHistogramBinarizer.cpp | 212 - .../zxing/common/GlobalHistogramBinarizer.h | 48 - .../zxing/common/GreyscaleLuminanceSource.cpp | 80 - .../zxing/common/GreyscaleLuminanceSource.h | 53 - .../GreyscaleRotatedLuminanceSource.cpp | 81 - .../common/GreyscaleRotatedLuminanceSource.h | 46 - cpp/core/src/zxing/common/GridSampler.cpp | 122 - cpp/core/src/zxing/common/GridSampler.h | 45 - cpp/core/src/zxing/common/HybridBinarizer.cpp | 226 - cpp/core/src/zxing/common/HybridBinarizer.h | 67 - .../zxing/common/IllegalArgumentException.cpp | 27 - .../zxing/common/IllegalArgumentException.h | 36 - .../src/zxing/common/PerspectiveTransform.cpp | 107 - .../src/zxing/common/PerspectiveTransform.h | 49 - cpp/core/src/zxing/common/Point.h | 47 - cpp/core/src/zxing/common/Str.cpp | 61 - cpp/core/src/zxing/common/Str.h | 51 - cpp/core/src/zxing/common/StringUtils.cpp | 198 - cpp/core/src/zxing/common/StringUtils.h | 52 - cpp/core/src/zxing/common/detector/JavaMath.h | 43 - .../src/zxing/common/detector/MathUtils.h | 57 - .../detector/MonochromeRectangleDetector.cpp | 174 - .../detector/MonochromeRectangleDetector.h | 62 - .../detector/WhiteRectangleDetector.cpp | 330 - .../common/detector/WhiteRectangleDetector.h | 59 - .../zxing/common/reedsolomon/GenericGF.cpp | 150 - .../src/zxing/common/reedsolomon/GenericGF.h | 73 - .../common/reedsolomon/GenericGFPoly.cpp | 218 - .../zxing/common/reedsolomon/GenericGFPoly.h | 56 - .../common/reedsolomon/ReedSolomonDecoder.cpp | 174 - .../common/reedsolomon/ReedSolomonDecoder.h | 49 - .../reedsolomon/ReedSolomonException.cpp | 30 - .../common/reedsolomon/ReedSolomonException.h | 33 - .../src/zxing/datamatrix/DataMatrixReader.cpp | 54 - .../src/zxing/datamatrix/DataMatrixReader.h | 45 - cpp/core/src/zxing/datamatrix/Version.cpp | 199 - cpp/core/src/zxing/datamatrix/Version.h | 87 - .../datamatrix/decoder/BitMatrixParser.cpp | 361 - .../datamatrix/decoder/BitMatrixParser.h | 59 - .../zxing/datamatrix/decoder/DataBlock.cpp | 113 - .../src/zxing/datamatrix/decoder/DataBlock.h | 49 - .../decoder/DecodedBitStreamParser.cpp | 416 -- .../decoder/DecodedBitStreamParser.h | 104 - .../src/zxing/datamatrix/decoder/Decoder.cpp | 93 - .../src/zxing/datamatrix/decoder/Decoder.h | 49 - .../zxing/datamatrix/detector/CornerPoint.cpp | 46 - .../zxing/datamatrix/detector/CornerPoint.h | 43 - .../zxing/datamatrix/detector/Detector.cpp | 446 -- .../src/zxing/datamatrix/detector/Detector.h | 94 - .../datamatrix/detector/DetectorException.cpp | 23 - .../datamatrix/detector/DetectorException.h | 23 - cpp/core/src/zxing/multi/ByQuadrantReader.cpp | 75 - cpp/core/src/zxing/multi/ByQuadrantReader.h | 42 - .../multi/GenericMultipleBarcodeReader.cpp | 137 - .../multi/GenericMultipleBarcodeReader.h | 51 - .../src/zxing/multi/MultipleBarcodeReader.cpp | 29 - .../src/zxing/multi/MultipleBarcodeReader.h | 41 - .../zxing/multi/qrcode/QRCodeMultiReader.cpp | 58 - .../zxing/multi/qrcode/QRCodeMultiReader.h | 36 - .../multi/qrcode/detector/MultiDetector.cpp | 47 - .../multi/qrcode/detector/MultiDetector.h | 37 - .../detector/MultiFinderPatternFinder.cpp | 236 - .../detector/MultiFinderPatternFinder.h | 47 - cpp/core/src/zxing/oned/CodaBarReader.cpp | 340 - cpp/core/src/zxing/oned/CodaBarReader.h | 57 - cpp/core/src/zxing/oned/Code128Reader.cpp | 496 -- cpp/core/src/zxing/oned/Code128Reader.h | 48 - cpp/core/src/zxing/oned/Code39Reader.cpp | 328 - cpp/core/src/zxing/oned/Code39Reader.h | 63 - cpp/core/src/zxing/oned/Code93Reader.cpp | 293 - cpp/core/src/zxing/oned/Code93Reader.h | 58 - cpp/core/src/zxing/oned/EAN13Reader.cpp | 85 - cpp/core/src/zxing/oned/EAN13Reader.h | 49 - cpp/core/src/zxing/oned/EAN8Reader.cpp | 65 - cpp/core/src/zxing/oned/EAN8Reader.h | 47 - cpp/core/src/zxing/oned/ITFReader.cpp | 337 - cpp/core/src/zxing/oned/ITFReader.h | 54 - .../src/zxing/oned/MultiFormatOneDReader.cpp | 96 - .../src/zxing/oned/MultiFormatOneDReader.h | 38 - .../zxing/oned/MultiFormatUPCEANReader.cpp | 110 - .../src/zxing/oned/MultiFormatUPCEANReader.h | 41 - cpp/core/src/zxing/oned/OneDReader.cpp | 227 - cpp/core/src/zxing/oned/OneDReader.h | 81 - cpp/core/src/zxing/oned/OneDResultPoint.cpp | 28 - cpp/core/src/zxing/oned/OneDResultPoint.h | 35 - cpp/core/src/zxing/oned/UPCAReader.cpp | 71 - cpp/core/src/zxing/oned/UPCAReader.h | 50 - cpp/core/src/zxing/oned/UPCEANReader.cpp | 309 - cpp/core/src/zxing/oned/UPCEANReader.h | 88 - cpp/core/src/zxing/oned/UPCEReader.cpp | 146 - cpp/core/src/zxing/oned/UPCEReader.h | 47 - cpp/core/src/zxing/pdf417/PDF417Reader.cpp | 170 - cpp/core/src/zxing/pdf417/PDF417Reader.h | 49 - .../zxing/pdf417/decoder/BitMatrixParser.cpp | 997 --- .../zxing/pdf417/decoder/BitMatrixParser.h | 84 - .../pdf417/decoder/DecodedBitStreamParser.cpp | 563 -- .../pdf417/decoder/DecodedBitStreamParser.h | 84 - cpp/core/src/zxing/pdf417/decoder/Decoder.cpp | 118 - cpp/core/src/zxing/pdf417/decoder/Decoder.h | 62 - .../pdf417/decoder/ec/ErrorCorrection.cpp | 214 - .../zxing/pdf417/decoder/ec/ErrorCorrection.h | 71 - .../src/zxing/pdf417/decoder/ec/ModulusGF.cpp | 120 - .../src/zxing/pdf417/decoder/ec/ModulusGF.h | 72 - .../zxing/pdf417/decoder/ec/ModulusPoly.cpp | 284 - .../src/zxing/pdf417/decoder/ec/ModulusPoly.h | 68 - .../src/zxing/pdf417/detector/Detector.cpp | 664 -- cpp/core/src/zxing/pdf417/detector/Detector.h | 106 - .../zxing/pdf417/detector/LinesSampler.cpp | 714 -- .../src/zxing/pdf417/detector/LinesSampler.h | 122 - .../src/zxing/qrcode/ErrorCorrectionLevel.cpp | 65 - .../src/zxing/qrcode/ErrorCorrectionLevel.h | 52 - .../src/zxing/qrcode/FormatInformation.cpp | 117 - cpp/core/src/zxing/qrcode/FormatInformation.h | 54 - cpp/core/src/zxing/qrcode/QRCodeReader.cpp | 52 - cpp/core/src/zxing/qrcode/QRCodeReader.h | 48 - cpp/core/src/zxing/qrcode/Version.cpp | 560 -- cpp/core/src/zxing/qrcode/Version.h | 85 - .../zxing/qrcode/decoder/BitMatrixParser.cpp | 183 - .../zxing/qrcode/decoder/BitMatrixParser.h | 56 - .../src/zxing/qrcode/decoder/DataBlock.cpp | 118 - cpp/core/src/zxing/qrcode/decoder/DataBlock.h | 50 - .../src/zxing/qrcode/decoder/DataMask.cpp | 159 - cpp/core/src/zxing/qrcode/decoder/DataMask.h | 50 - .../qrcode/decoder/DecodedBitStreamParser.cpp | 425 -- .../qrcode/decoder/DecodedBitStreamParser.h | 72 - cpp/core/src/zxing/qrcode/decoder/Decoder.cpp | 107 - cpp/core/src/zxing/qrcode/decoder/Decoder.h | 46 - cpp/core/src/zxing/qrcode/decoder/Mode.cpp | 90 - cpp/core/src/zxing/qrcode/decoder/Mode.h | 57 - .../qrcode/detector/AlignmentPattern.cpp | 47 - .../zxing/qrcode/detector/AlignmentPattern.h | 45 - .../detector/AlignmentPatternFinder.cpp | 208 - .../qrcode/detector/AlignmentPatternFinder.h | 68 - .../src/zxing/qrcode/detector/Detector.cpp | 314 - cpp/core/src/zxing/qrcode/detector/Detector.h | 69 - .../zxing/qrcode/detector/FinderPattern.cpp | 69 - .../src/zxing/qrcode/detector/FinderPattern.h | 48 - .../qrcode/detector/FinderPatternFinder.cpp | 559 -- .../qrcode/detector/FinderPatternFinder.h | 76 - .../qrcode/detector/FinderPatternInfo.cpp | 41 - .../zxing/qrcode/detector/FinderPatternInfo.h | 47 - cpp/core/tests/src/TestRunner.cpp | 30 - cpp/core/tests/src/common/BitArrayTest.cpp | 216 - cpp/core/tests/src/common/BitArrayTest.h | 61 - cpp/core/tests/src/common/BitMatrixTest.cpp | 106 - cpp/core/tests/src/common/BitMatrixTest.h | 55 - cpp/core/tests/src/common/BitSourceTest.cpp | 49 - cpp/core/tests/src/common/BitSourceTest.h | 42 - cpp/core/tests/src/common/CountedTest.cpp | 58 - cpp/core/tests/src/common/CountedTest.h | 46 - .../src/common/PerspectiveTransformTest.cpp | 69 - .../src/common/PerspectiveTransformTest.h | 47 - .../common/reedsolomon/ReedSolomonTest.cpp | 129 - .../src/common/reedsolomon/ReedSolomonTest.h | 62 - .../src/qrcode/ErrorCorrectionLevelTest.cpp | 47 - .../src/qrcode/ErrorCorrectionLevelTest.h | 45 - .../src/qrcode/FormatInformationTest.cpp | 88 - .../tests/src/qrcode/FormatInformationTest.h | 47 - cpp/core/tests/src/qrcode/VersionTest.cpp | 88 - cpp/core/tests/src/qrcode/VersionTest.h | 49 - .../tests/src/qrcode/decoder/DataMaskTest.cpp | 132 - .../tests/src/qrcode/decoder/DataMaskTest.h | 91 - .../tests/src/qrcode/decoder/ModeTest.cpp | 52 - cpp/core/tests/src/qrcode/decoder/ModeTest.h | 47 - cpp/format | 2 - cpp/ios.xcodeproj/.gitignore | 2 - cpp/ios.xcodeproj/project.pbxproj | 586 -- cpp/ios_Prefix.pch | 7 - cpp/osx.xcodeproj/.gitignore | 3 - cpp/osx.xcodeproj/project.pbxproj | 963 --- cpp/scons/scons-LICENSE | 25 - cpp/scons/scons-README | 204 - .../scons-local-2.0.0.final.0/SCons/Action.py | 1241 ---- .../SCons/Builder.py | 877 --- .../SCons/CacheDir.py | 216 - .../SCons/Conftest.py | 793 --- .../scons-local-2.0.0.final.0/SCons/Debug.py | 220 - .../SCons/Defaults.py | 480 -- .../SCons/Environment.py | 2318 ------ .../scons-local-2.0.0.final.0/SCons/Errors.py | 205 - .../SCons/Executor.py | 633 -- .../scons-local-2.0.0.final.0/SCons/Job.py | 435 -- .../SCons/Memoize.py | 244 - .../SCons/Node/Alias.py | 152 - .../SCons/Node/FS.py | 3142 --------- .../SCons/Node/Python.py | 128 - .../SCons/Node/__init__.py | 1328 ---- .../SCons/Options/BoolOption.py | 50 - .../SCons/Options/EnumOption.py | 50 - .../SCons/Options/ListOption.py | 50 - .../SCons/Options/PackageOption.py | 50 - .../SCons/Options/PathOption.py | 76 - .../SCons/Options/__init__.py | 67 - .../SCons/PathList.py | 231 - .../SCons/Platform/__init__.py | 241 - .../SCons/Platform/aix.py | 69 - .../SCons/Platform/cygwin.py | 55 - .../SCons/Platform/darwin.py | 46 - .../SCons/Platform/hpux.py | 46 - .../SCons/Platform/irix.py | 44 - .../SCons/Platform/os2.py | 58 - .../SCons/Platform/posix.py | 263 - .../SCons/Platform/sunos.py | 50 - .../SCons/Platform/win32.py | 385 - .../scons-local-2.0.0.final.0/SCons/SConf.py | 1030 --- .../SCons/SConsign.py | 383 - .../SCons/Scanner/C.py | 132 - .../SCons/Scanner/D.py | 73 - .../SCons/Scanner/Dir.py | 109 - .../SCons/Scanner/Fortran.py | 316 - .../SCons/Scanner/IDL.py | 48 - .../SCons/Scanner/LaTeX.py | 362 - .../SCons/Scanner/Prog.py | 101 - .../SCons/Scanner/RC.py | 55 - .../SCons/Scanner/__init__.py | 413 -- .../SCons/Script/Interactive.py | 384 - .../SCons/Script/Main.py | 1334 ---- .../SCons/Script/SConsOptions.py | 939 --- .../SCons/Script/SConscript.py | 640 -- .../SCons/Script/__init__.py | 412 -- .../scons-local-2.0.0.final.0/SCons/Sig.py | 63 - .../scons-local-2.0.0.final.0/SCons/Subst.py | 904 --- .../SCons/Taskmaster.py | 1017 --- .../SCons/Tool/386asm.py | 61 - .../SCons/Tool/BitKeeper.py | 67 - .../SCons/Tool/CVS.py | 73 - .../SCons/Tool/FortranCommon.py | 246 - .../SCons/Tool/JavaCommon.py | 323 - .../SCons/Tool/MSCommon/__init__.py | 56 - .../SCons/Tool/MSCommon/arch.py | 61 - .../SCons/Tool/MSCommon/common.py | 240 - .../SCons/Tool/MSCommon/netframework.py | 82 - .../SCons/Tool/MSCommon/sdk.py | 391 - .../SCons/Tool/MSCommon/vc.py | 456 -- .../SCons/Tool/MSCommon/vs.py | 499 -- .../SCons/Tool/Perforce.py | 103 - .../SCons/Tool/PharLapCommon.py | 137 - .../SCons/Tool/RCS.py | 64 - .../SCons/Tool/SCCS.py | 64 - .../SCons/Tool/Subversion.py | 71 - .../SCons/Tool/__init__.py | 681 -- .../SCons/Tool/aixc++.py | 82 - .../SCons/Tool/aixcc.py | 74 - .../SCons/Tool/aixf77.py | 80 - .../SCons/Tool/aixlink.py | 76 - .../SCons/Tool/applelink.py | 71 - .../SCons/Tool/ar.py | 63 - .../SCons/Tool/as.py | 78 - .../SCons/Tool/bcc32.py | 81 - .../SCons/Tool/c++.py | 99 - .../SCons/Tool/cc.py | 102 - .../SCons/Tool/cvf.py | 58 - .../SCons/Tool/default.py | 50 - .../SCons/Tool/dmd.py | 223 - .../SCons/Tool/dvi.py | 64 - .../SCons/Tool/dvipdf.py | 124 - .../SCons/Tool/dvips.py | 94 - .../SCons/Tool/f77.py | 62 - .../SCons/Tool/f90.py | 62 - .../SCons/Tool/f95.py | 63 - .../SCons/Tool/filesystem.py | 98 - .../SCons/Tool/fortran.py | 62 - .../SCons/Tool/g++.py | 90 - .../SCons/Tool/g77.py | 73 - .../SCons/Tool/gas.py | 53 - .../SCons/Tool/gcc.py | 80 - .../SCons/Tool/gfortran.py | 64 - .../SCons/Tool/gnulink.py | 63 - .../SCons/Tool/gs.py | 81 - .../SCons/Tool/hpc++.py | 84 - .../SCons/Tool/hpcc.py | 53 - .../SCons/Tool/hplink.py | 77 - .../SCons/Tool/icc.py | 59 - .../SCons/Tool/icl.py | 52 - .../SCons/Tool/ifl.py | 72 - .../SCons/Tool/ifort.py | 88 - .../SCons/Tool/ilink.py | 59 - .../SCons/Tool/ilink32.py | 60 - .../SCons/Tool/install.py | 229 - .../SCons/Tool/intelc.py | 482 -- .../SCons/Tool/ipkg.py | 67 - .../SCons/Tool/jar.py | 110 - .../SCons/Tool/javac.py | 230 - .../SCons/Tool/javah.py | 137 - .../SCons/Tool/latex.py | 79 - .../SCons/Tool/lex.py | 97 - .../SCons/Tool/link.py | 121 - .../SCons/Tool/linkloc.py | 112 - .../SCons/Tool/m4.py | 63 - .../SCons/Tool/masm.py | 77 - .../SCons/Tool/midl.py | 88 - .../SCons/Tool/mingw.py | 158 - .../SCons/Tool/mslib.py | 64 - .../SCons/Tool/mslink.py | 266 - .../SCons/Tool/mssdk.py | 50 - .../SCons/Tool/msvc.py | 268 - .../SCons/Tool/msvs.py | 1388 ---- .../SCons/Tool/mwcc.py | 207 - .../SCons/Tool/mwld.py | 107 - .../SCons/Tool/nasm.py | 72 - .../SCons/Tool/packaging/__init__.py | 312 - .../SCons/Tool/packaging/ipk.py | 185 - .../SCons/Tool/packaging/msi.py | 527 -- .../SCons/Tool/packaging/rpm.py | 365 - .../SCons/Tool/packaging/src_tarbz2.py | 43 - .../SCons/Tool/packaging/src_targz.py | 43 - .../SCons/Tool/packaging/src_zip.py | 43 - .../SCons/Tool/packaging/tarbz2.py | 44 - .../SCons/Tool/packaging/targz.py | 44 - .../SCons/Tool/packaging/zip.py | 44 - .../SCons/Tool/pdf.py | 78 - .../SCons/Tool/pdflatex.py | 83 - .../SCons/Tool/pdftex.py | 108 - .../SCons/Tool/qt.py | 336 - .../SCons/Tool/rmic.py | 120 - .../SCons/Tool/rpcgen.py | 70 - .../SCons/Tool/rpm.py | 132 - .../SCons/Tool/sgiar.py | 68 - .../SCons/Tool/sgic++.py | 58 - .../SCons/Tool/sgicc.py | 53 - .../SCons/Tool/sgilink.py | 63 - .../SCons/Tool/sunar.py | 67 - .../SCons/Tool/sunc++.py | 142 - .../SCons/Tool/suncc.py | 58 - .../SCons/Tool/sunf77.py | 63 - .../SCons/Tool/sunf90.py | 64 - .../SCons/Tool/sunf95.py | 64 - .../SCons/Tool/sunlink.py | 77 - .../SCons/Tool/swig.py | 182 - .../SCons/Tool/tar.py | 73 - .../SCons/Tool/tex.py | 807 --- .../SCons/Tool/textfile.py | 175 - .../SCons/Tool/tlib.py | 53 - .../SCons/Tool/wix.py | 99 - .../SCons/Tool/yacc.py | 130 - .../SCons/Tool/zip.py | 99 - .../scons-local-2.0.0.final.0/SCons/Util.py | 1496 ---- .../SCons/Variables/BoolVariable.py | 89 - .../SCons/Variables/EnumVariable.py | 103 - .../SCons/Variables/ListVariable.py | 135 - .../SCons/Variables/PackageVariable.py | 106 - .../SCons/Variables/PathVariable.py | 147 - .../SCons/Variables/__init__.py | 312 - .../SCons/Warnings.py | 246 - .../SCons/__init__.py | 49 - .../SCons/compat/__init__.py | 237 - .../SCons/compat/_scons_builtins.py | 150 - .../SCons/compat/_scons_collections.py | 45 - .../SCons/compat/_scons_dbm.py | 45 - .../SCons/compat/_scons_hashlib.py | 76 - .../SCons/compat/_scons_io.py | 45 - .../SCons/compat/_scons_sets.py | 563 -- .../SCons/compat/_scons_subprocess.py | 1281 ---- .../scons-local-2.0.0.final.0/SCons/cpp.py | 589 -- .../scons-local-2.0.0.final.0/SCons/dblite.py | 251 - .../SCons/exitfuncs.py | 77 - cpp/scons/scons-time.py | 1544 ---- cpp/scons/scons.py | 196 - cpp/scons/sconsign.py | 513 -- cpp/zxing-cpp.xcodeproj/project.pbxproj | 1250 ---- csharp/README.txt | 1 - iphone/.gitignore | 1 - iphone/Barcodes/.gitignore | 2 - iphone/Barcodes/Barcodes-Info.plist | 55 - .../Barcodes.xcodeproj/project.pbxproj | 766 -- iphone/Barcodes/Barcodes_Prefix.pch | 8 - iphone/Barcodes/Classes/ArchiveController.h | 40 - iphone/Barcodes/Classes/ArchiveController.m | 176 - iphone/Barcodes/Classes/BarcodesAppDelegate.h | 26 - iphone/Barcodes/Classes/BarcodesAppDelegate.m | 149 - iphone/Barcodes/Classes/Database.h | 41 - iphone/Barcodes/Classes/Database.m | 122 - .../Barcodes/Classes/MessageViewController.h | 48 - .../Barcodes/Classes/MessageViewController.m | 108 - .../Classes/ModalViewControllerDelegate.h | 15 - iphone/Barcodes/Classes/Scan.h | 37 - iphone/Barcodes/Classes/Scan.m | 46 - iphone/Barcodes/Classes/ScanCell.h | 42 - iphone/Barcodes/Classes/ScanCell.m | 176 - iphone/Barcodes/Classes/ScanViewController.h | 39 - iphone/Barcodes/Classes/ScanViewController.m | 260 - .../Barcodes/Classes/ZXMainViewController.h | 35 - .../Barcodes/Classes/ZXMainViewController.mm | 230 - iphone/Barcodes/Default-568h@2x.png | Bin 18594 -> 0 bytes iphone/Barcodes/MainWindow.xib | 833 --- iphone/Barcodes/ZXMainViewController.xib | 250 - iphone/Barcodes/beep-beep.aiff | Bin 66046 -> 0 bytes iphone/Barcodes/de.lproj/About.html | 23 - iphone/Barcodes/de.lproj/DecoderView.xib | 450 -- iphone/Barcodes/de.lproj/Hints.html | 14 - iphone/Barcodes/de.lproj/InfoPlist.strings | 1 - iphone/Barcodes/de.lproj/Localizable.strings | 141 - iphone/Barcodes/de.lproj/MainWindow.xib | 171 - iphone/Barcodes/de.lproj/Message.xib | 424 -- iphone/Barcodes/design/ClickHereToScan.psd | Bin 215188 -> 0 bytes iphone/Barcodes/design/Transparent-logo.png | Bin 38073 -> 0 bytes iphone/Barcodes/design/Transparent-logo.psd | Bin 210707 -> 0 bytes iphone/Barcodes/design/ZXingRounded.psd | Bin 296656 -> 0 bytes iphone/Barcodes/design/ZxingLarge@2x.png | Bin 41911 -> 0 bytes iphone/Barcodes/design/clickHere.png | Bin 6848 -> 0 bytes iphone/Barcodes/design/rounded rect.graffle | 1113 --- iphone/Barcodes/design/zxing-512-rounded.png | Bin 54769 -> 0 bytes iphone/Barcodes/en.lproj/About.html | 23 - iphone/Barcodes/en.lproj/DecoderView.xib | 450 -- iphone/Barcodes/en.lproj/Hints.html | 17 - iphone/Barcodes/en.lproj/InfoPlist.strings | 1 - iphone/Barcodes/en.lproj/Localizable.strings | 174 - iphone/Barcodes/en.lproj/MainWindow.xib | 362 - iphone/Barcodes/en.lproj/Message.xib | 424 -- iphone/Barcodes/fr.lproj/About.html | 23 - iphone/Barcodes/fr.lproj/DecoderView.xib | 450 -- iphone/Barcodes/fr.lproj/Hints.html | 17 - iphone/Barcodes/fr.lproj/InfoPlist.strings | 1 - iphone/Barcodes/fr.lproj/Localizable.strings | 152 - iphone/Barcodes/fr.lproj/MainWindow.xib | 171 - iphone/Barcodes/fr.lproj/Message.xib | 424 -- iphone/Barcodes/images/Default.png | Bin 48476 -> 0 bytes iphone/Barcodes/images/Default@2x.png | Bin 122298 -> 0 bytes .../images/LatestResultBackground.png | Bin 9901 -> 0 bytes .../images/LatestResultBackground@2x.png | Bin 16527 -> 0 bytes iphone/Barcodes/images/Scanning.png | Bin 4337 -> 0 bytes iphone/Barcodes/images/Scanning@2x.png | Bin 7223 -> 0 bytes iphone/Barcodes/images/ZxingLarge.png | Bin 19016 -> 0 bytes iphone/Barcodes/images/ZxingLarge@2x.png | Bin 41911 -> 0 bytes iphone/Barcodes/images/business-card.png | Bin 334 -> 0 bytes iphone/Barcodes/images/clickHere.png | Bin 6848 -> 0 bytes iphone/Barcodes/images/email.png | Bin 608 -> 0 bytes iphone/Barcodes/images/filmroll-2.png | Bin 326 -> 0 bytes iphone/Barcodes/images/icon.png | Bin 3713 -> 0 bytes iphone/Barcodes/images/icon@2x.png | Bin 10959 -> 0 bytes iphone/Barcodes/images/link1.png | Bin 578 -> 0 bytes iphone/Barcodes/images/link2.png | Bin 340 -> 0 bytes iphone/Barcodes/images/map-pin.png | Bin 515 -> 0 bytes iphone/Barcodes/images/phone.png | Bin 417 -> 0 bytes iphone/Barcodes/images/photolib.png | Bin 204 -> 0 bytes iphone/Barcodes/images/sms.png | Bin 657 -> 0 bytes iphone/Barcodes/images/text.png | Bin 376 -> 0 bytes iphone/Barcodes/images/zxing-512-rounded.png | Bin 54769 -> 0 bytes iphone/Barcodes/images/zxing-512.tiff | Bin 47058 -> 0 bytes iphone/Barcodes/main.mm | 17 - iphone/Barcodes/scans.db | Bin 2048 -> 0 bytes iphone/Barcodes/sv.lproj/About.html | 23 - iphone/Barcodes/sv.lproj/DecoderView.xib | 450 -- iphone/Barcodes/sv.lproj/Hints.html | 14 - iphone/Barcodes/sv.lproj/InfoPlist.strings | 1 - iphone/Barcodes/sv.lproj/Localizable.strings | 141 - iphone/Barcodes/sv.lproj/MainWindow.xib | 171 - iphone/Barcodes/sv.lproj/Message.xib | 424 -- iphone/README.md | 100 - iphone/ScanTest/.gitignore | 6 - iphone/ScanTest/Classes/RootViewController.h | 20 - iphone/ScanTest/Classes/RootViewController.mm | 87 - iphone/ScanTest/Classes/ScanTestAppDelegate.h | 21 - iphone/ScanTest/Classes/ScanTestAppDelegate.m | 54 - iphone/ScanTest/Default-568h@2x.png | Bin 18594 -> 0 bytes iphone/ScanTest/Icon.png | Bin 3713 -> 0 bytes iphone/ScanTest/MainWindow.xib | 279 - iphone/ScanTest/README | 2 - iphone/ScanTest/RootViewController.xib | 465 -- iphone/ScanTest/ScanTest-Info.plist | 36 - .../ScanTest.xcodeproj/project.pbxproj | 429 -- iphone/ScanTest/ScanTest_Prefix.pch | 14 - iphone/ScanTest/beep-beep.aiff | Bin 66046 -> 0 bytes iphone/ScanTest/iPad/MainWindow-iPad.xib | 270 - iphone/ScanTest/main.mm | 17 - iphone/ZXingWidget/.gitignore | 4 - .../Classes/ArrayAndStringCategories.h | 44 - .../Classes/ArrayAndStringCategories.m | 143 - iphone/ZXingWidget/Classes/AztecReader.h | 15 - iphone/ZXingWidget/Classes/AztecReader.mm | 25 - iphone/ZXingWidget/Classes/CBarcodeFormat.h | 47 - iphone/ZXingWidget/Classes/CBarcodeFormat.mm | 65 - iphone/ZXingWidget/Classes/DataMatrixReader.h | 17 - .../ZXingWidget/Classes/DataMatrixReader.mm | 19 - iphone/ZXingWidget/Classes/Decoder.h | 40 - iphone/ZXingWidget/Classes/Decoder.mm | 276 - iphone/ZXingWidget/Classes/DecoderDelegate.h | 34 - iphone/ZXingWidget/Classes/FormatReader.h | 39 - iphone/ZXingWidget/Classes/FormatReader.mm | 71 - .../Classes/MultiFormatOneDReader.h | 17 - .../Classes/MultiFormatOneDReader.mm | 19 - .../ZXingWidget/Classes/MultiFormatReader.h | 16 - .../ZXingWidget/Classes/MultiFormatReader.mm | 40 - .../Classes/MultiFormatUPCEANReader.h | 17 - .../Classes/MultiFormatUPCEANReader.mm | 19 - iphone/ZXingWidget/Classes/NSString+HTML.h | 32 - iphone/ZXingWidget/Classes/NSString+HTML.m | 70 - iphone/ZXingWidget/Classes/OverlayView.h | 50 - iphone/ZXingWidget/Classes/OverlayView.m | 288 - iphone/ZXingWidget/Classes/QRCodeReader.h | 16 - iphone/ZXingWidget/Classes/QRCodeReader.mm | 20 - .../ZXingWidget/Classes/TwoDDecoderResult.h | 37 - .../ZXingWidget/Classes/TwoDDecoderResult.m | 63 - .../Classes/ZXingWidgetController.h | 76 - .../Classes/ZXingWidgetController.m | 526 -- .../Classes/actions/AddContactAction.h | 57 - .../Classes/actions/AddContactAction.m | 249 - .../ZXingWidget/Classes/actions/CallAction.h | 36 - .../ZXingWidget/Classes/actions/CallAction.m | 67 - .../ZXingWidget/Classes/actions/EmailAction.h | 34 - .../ZXingWidget/Classes/actions/EmailAction.m | 68 - .../Classes/actions/OpenUrlAction.h | 42 - .../Classes/actions/OpenUrlAction.m | 82 - .../Classes/actions/ResultAction.h | 32 - .../Classes/actions/ResultAction.m | 36 - .../ZXingWidget/Classes/actions/SMSAction.h | 34 - .../ZXingWidget/Classes/actions/SMSAction.m | 85 - .../Classes/actions/ShowMapAction.h | 34 - .../Classes/actions/ShowMapAction.m | 68 - .../parsedResults/BusinessCardParsedResult.h | 49 - .../parsedResults/BusinessCardParsedResult.m | 130 - .../Classes/parsedResults/EmailParsedResult.h | 37 - .../Classes/parsedResults/EmailParsedResult.m | 76 - .../Classes/parsedResults/GeoParsedResult.h | 34 - .../Classes/parsedResults/GeoParsedResult.m | 59 - .../Classes/parsedResults/ISBNParsedResult.h | 31 - .../Classes/parsedResults/ISBNParsedResult.m | 32 - .../Classes/parsedResults/ParsedResult.h | 35 - .../Classes/parsedResults/ParsedResult.m | 107 - .../parsedResults/ProductParsedResult.h | 36 - .../parsedResults/ProductParsedResult.m | 43 - .../Classes/parsedResults/SMSParsedResult.h | 36 - .../Classes/parsedResults/SMSParsedResult.m | 65 - .../Classes/parsedResults/TelParsedResult.h | 33 - .../Classes/parsedResults/TelParsedResult.m | 58 - .../Classes/parsedResults/TextParsedResult.h | 34 - .../Classes/parsedResults/TextParsedResult.m | 58 - .../Classes/parsedResults/URIParsedResult.h | 45 - .../Classes/parsedResults/URIParsedResult.m | 88 - .../resultParsers/AddressBookAUResultParser.h | 31 - .../resultParsers/AddressBookAUResultParser.m | 126 - .../resultParsers/BizcardResultParser.h | 30 - .../resultParsers/BizcardResultParser.m | 102 - .../BookmarkDoCoMoResultParser.h | 29 - .../BookmarkDoCoMoResultParser.m | 52 - .../resultParsers/EmailAddressResultParser.h | 31 - .../resultParsers/EmailAddressResultParser.m | 130 - .../resultParsers/EmailDoCoMoResultParser.h | 29 - .../resultParsers/EmailDoCoMoResultParser.m | 53 - .../Classes/resultParsers/GeoResultParser.h | 29 - .../Classes/resultParsers/GeoResultParser.m | 45 - .../Classes/resultParsers/ISBNResultParser.h | 27 - .../Classes/resultParsers/ISBNResultParser.m | 57 - .../Classes/resultParsers/MeCardParser.h | 29 - .../Classes/resultParsers/MeCardParser.m | 89 - .../resultParsers/PlainEmailResultParser.h | 30 - .../resultParsers/PlainEmailResultParser.m | 42 - .../resultParsers/ProductResultParser.h | 30 - .../resultParsers/ProductResultParser.mm | 71 - .../Classes/resultParsers/ResultParser.h | 35 - .../Classes/resultParsers/ResultParser.m | 112 - .../Classes/resultParsers/SMSResultParser.h | 29 - .../Classes/resultParsers/SMSResultParser.m | 80 - .../Classes/resultParsers/SMSTOResultParser.h | 29 - .../Classes/resultParsers/SMSTOResultParser.m | 59 - .../Classes/resultParsers/SMTPResultParser.h | 27 - .../Classes/resultParsers/SMTPResultParser.m | 74 - .../Classes/resultParsers/TelResultParser.h | 29 - .../Classes/resultParsers/TelResultParser.m | 46 - .../Classes/resultParsers/TextResultParser.h | 30 - .../Classes/resultParsers/TextResultParser.m | 34 - .../Classes/resultParsers/URLResultParser.h | 30 - .../Classes/resultParsers/URLResultParser.m | 88 - .../Classes/resultParsers/URLTOResultParser.h | 29 - .../Classes/resultParsers/URLTOResultParser.m | 56 - .../resultParsers/UniversalResultParser.h | 21 - .../resultParsers/UniversalResultParser.m | 94 - .../Classes/resultParsers/VCardResultParser.h | 30 - .../Classes/resultParsers/VCardResultParser.m | 435 -- .../Tests/AddressBookAUResultParserTests.m | 113 - .../Tests/BizcardResultParserTests.m | 135 - .../ZXingWidget/Tests/BookmarkDoCoMoTests.m | 50 - .../Tests/EmailAddressResultParserTests.m | 130 - .../Tests/EmailDoCoMoResultParserTests.m | 48 - .../ZXingWidget/Tests/ISBNResultParserTests.m | 52 - iphone/ZXingWidget/Tests/MeCardParserTests.m | 111 - .../ZXingWidget/Tests/SMTPResultParserTests.m | 86 - .../Tests/VCardResultParserTests.m | 150 - iphone/ZXingWidget/ZXingTests-Info.plist | 20 - .../ZXingWidget.xcodeproj/default.pbxuser | 78 - .../ZXingWidget.xcodeproj/project.pbxproj | 1814 ----- iphone/ZXingWidget/ZXingWidget_Prefix.pch | 7 - iphone/ZXingWidget/beep-beep.caf | Bin 518418 -> 0 bytes iphone/ZXingWidget/exportList | 1 - objc/.gitignore | 8 - objc/README | 4 - objc/examples/ios/bare/Default-568h@2x.png | Bin 18594 -> 0 bytes .../ios/bare/bare.xcodeproj/project.pbxproj | 433 -- objc/examples/ios/bare/bare/AppDelegate.h | 19 - objc/examples/ios/bare/bare/AppDelegate.m | 62 - objc/examples/ios/bare/bare/ViewController.h | 27 - objc/examples/ios/bare/bare/ViewController.m | 152 - objc/examples/ios/bare/bare/bare-Info.plist | 43 - objc/examples/ios/bare/bare/bare-Prefix.pch | 14 - .../ios/bare/bare/en.lproj/InfoPlist.strings | 2 - .../bare/en.lproj/ViewController_iPad.xib | 120 - .../bare/en.lproj/ViewController_iPhone.xib | 119 - objc/examples/ios/bare/bare/main.mm | 27 - .../osx/bare/bare.xcodeproj/project.pbxproj | 364 - objc/examples/osx/bare/bare/AppDelegate.h | 44 - objc/examples/osx/bare/bare/AppDelegate.mm | 675 -- objc/examples/osx/bare/bare/bare-Info.plist | 32 - objc/examples/osx/bare/bare/bare-Prefix.pch | 7 - objc/examples/osx/bare/bare/main.mm | 34 - .../osx/demo/demo.xcodeproj/project.pbxproj | 422 -- objc/examples/osx/demo/demo/AppDelegate.h | 124 - objc/examples/osx/demo/demo/AppDelegate.m | 736 -- objc/examples/osx/demo/demo/Defs.h | 35 - objc/examples/osx/demo/demo/demo-Info.plist | 34 - objc/examples/osx/demo/demo/demo-Prefix.pch | 23 - .../osx/demo/demo/en.lproj/Credits.rtf | 33 - .../osx/demo/demo/en.lproj/InfoPlist.strings | 2 - .../osx/demo/demo/en.lproj/MainMenu.xib | 1996 ------ .../osx/demo/demo/en.lproj/ZXingType.png | Bin 12085 -> 0 bytes .../osx/demo/demo/en.lproj/applogo.icns | Bin 30327 -> 0 bytes .../osx/demo/demo/en.lproj/beepbeep.aif | Bin 59870 -> 0 bytes .../osx/demo/demo/en.lproj/zxinglogo.png | Bin 12268 -> 0 bytes objc/examples/osx/demo/demo/main.m | 23 - objc/ios.xcodeproj/.gitignore | 2 - objc/ios.xcodeproj/project.pbxproj | 422 -- objc/ios_Prefix.pch | 8 - objc/osx.xcodeproj/project.pbxproj | 469 -- objc/osx_Prefix.pch | 4 - objc/src/Prefix.pch | 13 - objc/src/ZXing/CGImageLuminanceSource.mm | 233 - objc/src/ZXing/ZXBinarizer.h | 29 - objc/src/ZXing/ZXBinarizer.mm | 88 - objc/src/ZXing/ZXBinaryBitmap.h | 30 - objc/src/ZXing/ZXBinaryBitmap.mm | 38 - objc/src/ZXing/ZXCGImageLuminanceSource.h | 110 - objc/src/ZXing/ZXCGImageLuminanceSource.mm | 91 - objc/src/ZXing/ZXCapture.h | 142 - objc/src/ZXing/ZXCapture.mm | 734 -- objc/src/ZXing/ZXCaptureDelegate.h | 30 - objc/src/ZXing/ZXCaptureView.h | 25 - objc/src/ZXing/ZXCaptureView.mm | 33 - objc/src/ZXing/ZXDecodeHints.h | 28 - objc/src/ZXing/ZXDecodeHints.mm | 36 - objc/src/ZXing/ZXHybridBinarizer.h | 26 - objc/src/ZXing/ZXHybridBinarizer.mm | 29 - objc/src/ZXing/ZXIllegalArgumentException.h | 21 - objc/src/ZXing/ZXIllegalArgumentException.mm | 23 - objc/src/ZXing/ZXImage.h | 28 - objc/src/ZXing/ZXImage.mm | 65 - objc/src/ZXing/ZXInit.c | 18 - objc/src/ZXing/ZXLuminanceSource.h | 27 - objc/src/ZXing/ZXLuminanceSource.mm | 36 - objc/src/ZXing/ZXMultiFormatReader.h | 25 - objc/src/ZXing/ZXMultiFormatReader.mm | 29 - objc/src/ZXing/ZXQRCodeReader.h | 25 - objc/src/ZXing/ZXQRCodeReader.mm | 29 - objc/src/ZXing/ZXReader.h | 31 - objc/src/ZXing/ZXReader.mm | 58 - objc/src/ZXing/ZXReaderException.h | 21 - objc/src/ZXing/ZXReaderException.mm | 23 - objc/src/ZXing/ZXResult.h | 28 - objc/src/ZXing/ZXResult.mm | 59 - objc/src/ZXing/ZXView.h | 22 - .../en.lproj/InfoPlist.strings | 2 - .../zxing-objc-framework-Info.plist | 30 - .../zxing-objc-framework-Prefix.pch | 7 - .../zxing_objc_framework.h | 13 - .../zxing_objc_framework.m | 13 - objc/zxing-objc.xcodeproj/project.pbxproj | 694 -- qt/README.txt | 1 - 763 files changed, 5 insertions(+), 124155 deletions(-) delete mode 100644 cpp/.gdbinit delete mode 100644 cpp/.gitignore delete mode 100644 cpp/.svnignore delete mode 100644 cpp/.valgrind.supp delete mode 100644 cpp/.valgrindrc delete mode 100644 cpp/CMakeLists.txt delete mode 100644 cpp/README.md delete mode 100644 cpp/SConscript delete mode 100644 cpp/SConstruct delete mode 100644 cpp/blackboxtest.results delete mode 100755 cpp/blackboxtest.sh delete mode 100644 cpp/cli/src/ImageReaderSource.cpp delete mode 100644 cpp/cli/src/ImageReaderSource.h delete mode 100644 cpp/cli/src/jpgd.cpp delete mode 100644 cpp/cli/src/jpgd.h delete mode 100644 cpp/cli/src/lodepng.cpp delete mode 100644 cpp/cli/src/lodepng.h delete mode 100644 cpp/cli/src/main.cpp delete mode 100644 cpp/cmake/FindCPPUNIT.cmake delete mode 100644 cpp/cmake/FindIconv.cmake delete mode 100644 cpp/core/src/bigint/.gitignore delete mode 100644 cpp/core/src/bigint/BigInteger.cc delete mode 100644 cpp/core/src/bigint/BigInteger.hh delete mode 100644 cpp/core/src/bigint/BigIntegerAlgorithms.cc delete mode 100644 cpp/core/src/bigint/BigIntegerAlgorithms.hh delete mode 100644 cpp/core/src/bigint/BigIntegerLibrary.hh delete mode 100644 cpp/core/src/bigint/BigIntegerUtils.cc delete mode 100644 cpp/core/src/bigint/BigIntegerUtils.hh delete mode 100644 cpp/core/src/bigint/BigUnsigned.cc delete mode 100644 cpp/core/src/bigint/BigUnsigned.hh delete mode 100644 cpp/core/src/bigint/BigUnsignedInABase.cc delete mode 100644 cpp/core/src/bigint/BigUnsignedInABase.hh delete mode 100644 cpp/core/src/bigint/ChangeLog delete mode 100644 cpp/core/src/bigint/Makefile delete mode 100644 cpp/core/src/bigint/NumberlikeArray.hh delete mode 100644 cpp/core/src/bigint/README delete mode 100644 cpp/core/src/win32/zxing/iconv.h delete mode 100644 cpp/core/src/win32/zxing/stdint.h delete mode 100644 cpp/core/src/win32/zxing/win_iconv.c delete mode 100644 cpp/core/src/zxing/BarcodeFormat.cpp delete mode 100644 cpp/core/src/zxing/BarcodeFormat.h delete mode 100644 cpp/core/src/zxing/Binarizer.cpp delete mode 100644 cpp/core/src/zxing/Binarizer.h delete mode 100644 cpp/core/src/zxing/BinaryBitmap.cpp delete mode 100644 cpp/core/src/zxing/BinaryBitmap.h delete mode 100644 cpp/core/src/zxing/ChecksumException.cpp delete mode 100644 cpp/core/src/zxing/ChecksumException.h delete mode 100644 cpp/core/src/zxing/DecodeHints.cpp delete mode 100644 cpp/core/src/zxing/DecodeHints.h delete mode 100644 cpp/core/src/zxing/Exception.cpp delete mode 100644 cpp/core/src/zxing/Exception.h delete mode 100644 cpp/core/src/zxing/FormatException.cpp delete mode 100644 cpp/core/src/zxing/FormatException.h delete mode 100644 cpp/core/src/zxing/IllegalStateException.h delete mode 100644 cpp/core/src/zxing/InvertedLuminanceSource.cpp delete mode 100644 cpp/core/src/zxing/InvertedLuminanceSource.h delete mode 100644 cpp/core/src/zxing/LuminanceSource.cpp delete mode 100644 cpp/core/src/zxing/LuminanceSource.h delete mode 100644 cpp/core/src/zxing/MultiFormatReader.cpp delete mode 100644 cpp/core/src/zxing/MultiFormatReader.h delete mode 100644 cpp/core/src/zxing/NotFoundException.h delete mode 100644 cpp/core/src/zxing/Reader.cpp delete mode 100644 cpp/core/src/zxing/Reader.h delete mode 100644 cpp/core/src/zxing/ReaderException.h delete mode 100644 cpp/core/src/zxing/Result.cpp delete mode 100644 cpp/core/src/zxing/Result.h delete mode 100644 cpp/core/src/zxing/ResultIO.cpp delete mode 100644 cpp/core/src/zxing/ResultPoint.cpp delete mode 100644 cpp/core/src/zxing/ResultPoint.h delete mode 100644 cpp/core/src/zxing/ResultPointCallback.cpp delete mode 100644 cpp/core/src/zxing/ResultPointCallback.h delete mode 100644 cpp/core/src/zxing/ZXing.h delete mode 100644 cpp/core/src/zxing/aztec/AztecDetectorResult.cpp delete mode 100644 cpp/core/src/zxing/aztec/AztecDetectorResult.h delete mode 100644 cpp/core/src/zxing/aztec/AztecReader.cpp delete mode 100644 cpp/core/src/zxing/aztec/AztecReader.h delete mode 100644 cpp/core/src/zxing/aztec/decoder/Decoder.cpp delete mode 100644 cpp/core/src/zxing/aztec/decoder/Decoder.h delete mode 100644 cpp/core/src/zxing/aztec/detector/Detector.cpp delete mode 100644 cpp/core/src/zxing/aztec/detector/Detector.h delete mode 100644 cpp/core/src/zxing/common/Array.h delete mode 100644 cpp/core/src/zxing/common/BitArray.cpp delete mode 100644 cpp/core/src/zxing/common/BitArray.h delete mode 100644 cpp/core/src/zxing/common/BitArrayIO.cpp delete mode 100644 cpp/core/src/zxing/common/BitMatrix.cpp delete mode 100644 cpp/core/src/zxing/common/BitMatrix.h delete mode 100644 cpp/core/src/zxing/common/BitSource.cpp delete mode 100644 cpp/core/src/zxing/common/BitSource.h delete mode 100644 cpp/core/src/zxing/common/CharacterSetECI.cpp delete mode 100644 cpp/core/src/zxing/common/CharacterSetECI.h delete mode 100644 cpp/core/src/zxing/common/Counted.h delete mode 100644 cpp/core/src/zxing/common/DecoderResult.cpp delete mode 100644 cpp/core/src/zxing/common/DecoderResult.h delete mode 100644 cpp/core/src/zxing/common/DetectorResult.cpp delete mode 100644 cpp/core/src/zxing/common/DetectorResult.h delete mode 100644 cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp delete mode 100644 cpp/core/src/zxing/common/GlobalHistogramBinarizer.h delete mode 100644 cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp delete mode 100644 cpp/core/src/zxing/common/GreyscaleLuminanceSource.h delete mode 100644 cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp delete mode 100644 cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h delete mode 100644 cpp/core/src/zxing/common/GridSampler.cpp delete mode 100644 cpp/core/src/zxing/common/GridSampler.h delete mode 100644 cpp/core/src/zxing/common/HybridBinarizer.cpp delete mode 100644 cpp/core/src/zxing/common/HybridBinarizer.h delete mode 100644 cpp/core/src/zxing/common/IllegalArgumentException.cpp delete mode 100644 cpp/core/src/zxing/common/IllegalArgumentException.h delete mode 100644 cpp/core/src/zxing/common/PerspectiveTransform.cpp delete mode 100644 cpp/core/src/zxing/common/PerspectiveTransform.h delete mode 100644 cpp/core/src/zxing/common/Point.h delete mode 100644 cpp/core/src/zxing/common/Str.cpp delete mode 100644 cpp/core/src/zxing/common/Str.h delete mode 100644 cpp/core/src/zxing/common/StringUtils.cpp delete mode 100644 cpp/core/src/zxing/common/StringUtils.h delete mode 100644 cpp/core/src/zxing/common/detector/JavaMath.h delete mode 100644 cpp/core/src/zxing/common/detector/MathUtils.h delete mode 100644 cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp delete mode 100644 cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h delete mode 100644 cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp delete mode 100644 cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h delete mode 100644 cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp delete mode 100644 cpp/core/src/zxing/common/reedsolomon/GenericGF.h delete mode 100644 cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp delete mode 100644 cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h delete mode 100644 cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp delete mode 100644 cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h delete mode 100644 cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp delete mode 100644 cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h delete mode 100644 cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/DataMatrixReader.h delete mode 100644 cpp/core/src/zxing/datamatrix/Version.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/Version.h delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/DataBlock.h delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/decoder/Decoder.h delete mode 100644 cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/detector/CornerPoint.h delete mode 100644 cpp/core/src/zxing/datamatrix/detector/Detector.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/detector/Detector.h delete mode 100644 cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp delete mode 100644 cpp/core/src/zxing/datamatrix/detector/DetectorException.h delete mode 100644 cpp/core/src/zxing/multi/ByQuadrantReader.cpp delete mode 100644 cpp/core/src/zxing/multi/ByQuadrantReader.h delete mode 100644 cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp delete mode 100644 cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h delete mode 100644 cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp delete mode 100644 cpp/core/src/zxing/multi/MultipleBarcodeReader.h delete mode 100644 cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp delete mode 100644 cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h delete mode 100644 cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp delete mode 100644 cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h delete mode 100644 cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp delete mode 100644 cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h delete mode 100644 cpp/core/src/zxing/oned/CodaBarReader.cpp delete mode 100644 cpp/core/src/zxing/oned/CodaBarReader.h delete mode 100644 cpp/core/src/zxing/oned/Code128Reader.cpp delete mode 100644 cpp/core/src/zxing/oned/Code128Reader.h delete mode 100644 cpp/core/src/zxing/oned/Code39Reader.cpp delete mode 100644 cpp/core/src/zxing/oned/Code39Reader.h delete mode 100644 cpp/core/src/zxing/oned/Code93Reader.cpp delete mode 100644 cpp/core/src/zxing/oned/Code93Reader.h delete mode 100644 cpp/core/src/zxing/oned/EAN13Reader.cpp delete mode 100644 cpp/core/src/zxing/oned/EAN13Reader.h delete mode 100644 cpp/core/src/zxing/oned/EAN8Reader.cpp delete mode 100644 cpp/core/src/zxing/oned/EAN8Reader.h delete mode 100644 cpp/core/src/zxing/oned/ITFReader.cpp delete mode 100644 cpp/core/src/zxing/oned/ITFReader.h delete mode 100644 cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp delete mode 100644 cpp/core/src/zxing/oned/MultiFormatOneDReader.h delete mode 100644 cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp delete mode 100644 cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h delete mode 100644 cpp/core/src/zxing/oned/OneDReader.cpp delete mode 100644 cpp/core/src/zxing/oned/OneDReader.h delete mode 100644 cpp/core/src/zxing/oned/OneDResultPoint.cpp delete mode 100644 cpp/core/src/zxing/oned/OneDResultPoint.h delete mode 100644 cpp/core/src/zxing/oned/UPCAReader.cpp delete mode 100644 cpp/core/src/zxing/oned/UPCAReader.h delete mode 100644 cpp/core/src/zxing/oned/UPCEANReader.cpp delete mode 100644 cpp/core/src/zxing/oned/UPCEANReader.h delete mode 100644 cpp/core/src/zxing/oned/UPCEReader.cpp delete mode 100644 cpp/core/src/zxing/oned/UPCEReader.h delete mode 100644 cpp/core/src/zxing/pdf417/PDF417Reader.cpp delete mode 100644 cpp/core/src/zxing/pdf417/PDF417Reader.h delete mode 100644 cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp delete mode 100644 cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h delete mode 100644 cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp delete mode 100644 cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h delete mode 100644 cpp/core/src/zxing/pdf417/decoder/Decoder.cpp delete mode 100644 cpp/core/src/zxing/pdf417/decoder/Decoder.h delete mode 100644 cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp delete mode 100644 cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h delete mode 100644 cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp delete mode 100644 cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h delete mode 100644 cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp delete mode 100644 cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h delete mode 100644 cpp/core/src/zxing/pdf417/detector/Detector.cpp delete mode 100644 cpp/core/src/zxing/pdf417/detector/Detector.h delete mode 100644 cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp delete mode 100644 cpp/core/src/zxing/pdf417/detector/LinesSampler.h delete mode 100644 cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp delete mode 100644 cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h delete mode 100644 cpp/core/src/zxing/qrcode/FormatInformation.cpp delete mode 100644 cpp/core/src/zxing/qrcode/FormatInformation.h delete mode 100644 cpp/core/src/zxing/qrcode/QRCodeReader.cpp delete mode 100644 cpp/core/src/zxing/qrcode/QRCodeReader.h delete mode 100644 cpp/core/src/zxing/qrcode/Version.cpp delete mode 100644 cpp/core/src/zxing/qrcode/Version.h delete mode 100644 cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp delete mode 100644 cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h delete mode 100644 cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp delete mode 100644 cpp/core/src/zxing/qrcode/decoder/DataBlock.h delete mode 100644 cpp/core/src/zxing/qrcode/decoder/DataMask.cpp delete mode 100644 cpp/core/src/zxing/qrcode/decoder/DataMask.h delete mode 100644 cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp delete mode 100644 cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h delete mode 100644 cpp/core/src/zxing/qrcode/decoder/Decoder.cpp delete mode 100644 cpp/core/src/zxing/qrcode/decoder/Decoder.h delete mode 100644 cpp/core/src/zxing/qrcode/decoder/Mode.cpp delete mode 100644 cpp/core/src/zxing/qrcode/decoder/Mode.h delete mode 100644 cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp delete mode 100644 cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h delete mode 100644 cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp delete mode 100644 cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h delete mode 100644 cpp/core/src/zxing/qrcode/detector/Detector.cpp delete mode 100644 cpp/core/src/zxing/qrcode/detector/Detector.h delete mode 100644 cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp delete mode 100644 cpp/core/src/zxing/qrcode/detector/FinderPattern.h delete mode 100644 cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp delete mode 100644 cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h delete mode 100644 cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp delete mode 100644 cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h delete mode 100644 cpp/core/tests/src/TestRunner.cpp delete mode 100644 cpp/core/tests/src/common/BitArrayTest.cpp delete mode 100644 cpp/core/tests/src/common/BitArrayTest.h delete mode 100644 cpp/core/tests/src/common/BitMatrixTest.cpp delete mode 100644 cpp/core/tests/src/common/BitMatrixTest.h delete mode 100644 cpp/core/tests/src/common/BitSourceTest.cpp delete mode 100644 cpp/core/tests/src/common/BitSourceTest.h delete mode 100644 cpp/core/tests/src/common/CountedTest.cpp delete mode 100644 cpp/core/tests/src/common/CountedTest.h delete mode 100644 cpp/core/tests/src/common/PerspectiveTransformTest.cpp delete mode 100644 cpp/core/tests/src/common/PerspectiveTransformTest.h delete mode 100644 cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp delete mode 100644 cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h delete mode 100644 cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp delete mode 100644 cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h delete mode 100644 cpp/core/tests/src/qrcode/FormatInformationTest.cpp delete mode 100644 cpp/core/tests/src/qrcode/FormatInformationTest.h delete mode 100644 cpp/core/tests/src/qrcode/VersionTest.cpp delete mode 100644 cpp/core/tests/src/qrcode/VersionTest.h delete mode 100644 cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp delete mode 100644 cpp/core/tests/src/qrcode/decoder/DataMaskTest.h delete mode 100644 cpp/core/tests/src/qrcode/decoder/ModeTest.cpp delete mode 100644 cpp/core/tests/src/qrcode/decoder/ModeTest.h delete mode 100755 cpp/format delete mode 100644 cpp/ios.xcodeproj/.gitignore delete mode 100644 cpp/ios.xcodeproj/project.pbxproj delete mode 100644 cpp/ios_Prefix.pch delete mode 100644 cpp/osx.xcodeproj/.gitignore delete mode 100644 cpp/osx.xcodeproj/project.pbxproj delete mode 100644 cpp/scons/scons-LICENSE delete mode 100644 cpp/scons/scons-README delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Action.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Builder.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/CacheDir.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Conftest.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Debug.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Defaults.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Environment.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Errors.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Executor.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Job.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Memoize.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Alias.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Node/FS.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Python.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Node/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Options/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/PathList.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/aix.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/irix.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/os2.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/posix.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/win32.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/SConf.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/SConsign.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/C.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/D.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Main.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Script/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Sig.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Subst.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Taskmaster.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ar.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/as.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/c++.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/default.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f77.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f90.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f95.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g++.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g77.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gas.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gs.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icl.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/install.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/jar.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javac.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javah.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/latex.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/lex.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/link.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/m4.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/masm.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/midl.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mwcc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mwld.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/nasm.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/ipk.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/msi.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/rpm.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_tarbz2.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_targz.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_zip.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/tarbz2.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/targz.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/zip.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/pdf.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/pdflatex.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/pdftex.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/qt.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/rmic.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/rpcgen.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/rpm.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sgiar.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sgic++.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sgicc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sgilink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sunar.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sunc++.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/suncc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sunf77.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sunf90.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sunf95.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/sunlink.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/swig.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/tar.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/tex.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/textfile.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/tlib.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/wix.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/yacc.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/zip.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Util.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Variables/BoolVariable.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Variables/EnumVariable.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Variables/ListVariable.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Variables/PackageVariable.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Variables/PathVariable.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Variables/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/Warnings.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/__init__.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_builtins.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_collections.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_dbm.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_hashlib.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_io.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_sets.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_subprocess.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/cpp.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/dblite.py delete mode 100644 cpp/scons/scons-local-2.0.0.final.0/SCons/exitfuncs.py delete mode 100755 cpp/scons/scons-time.py delete mode 100755 cpp/scons/scons.py delete mode 100755 cpp/scons/sconsign.py delete mode 100644 cpp/zxing-cpp.xcodeproj/project.pbxproj delete mode 100644 csharp/README.txt delete mode 100644 iphone/.gitignore delete mode 100644 iphone/Barcodes/.gitignore delete mode 100644 iphone/Barcodes/Barcodes-Info.plist delete mode 100755 iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj delete mode 100644 iphone/Barcodes/Barcodes_Prefix.pch delete mode 100644 iphone/Barcodes/Classes/ArchiveController.h delete mode 100644 iphone/Barcodes/Classes/ArchiveController.m delete mode 100644 iphone/Barcodes/Classes/BarcodesAppDelegate.h delete mode 100644 iphone/Barcodes/Classes/BarcodesAppDelegate.m delete mode 100644 iphone/Barcodes/Classes/Database.h delete mode 100644 iphone/Barcodes/Classes/Database.m delete mode 100644 iphone/Barcodes/Classes/MessageViewController.h delete mode 100644 iphone/Barcodes/Classes/MessageViewController.m delete mode 100644 iphone/Barcodes/Classes/ModalViewControllerDelegate.h delete mode 100644 iphone/Barcodes/Classes/Scan.h delete mode 100644 iphone/Barcodes/Classes/Scan.m delete mode 100644 iphone/Barcodes/Classes/ScanCell.h delete mode 100644 iphone/Barcodes/Classes/ScanCell.m delete mode 100644 iphone/Barcodes/Classes/ScanViewController.h delete mode 100644 iphone/Barcodes/Classes/ScanViewController.m delete mode 100644 iphone/Barcodes/Classes/ZXMainViewController.h delete mode 100644 iphone/Barcodes/Classes/ZXMainViewController.mm delete mode 100644 iphone/Barcodes/Default-568h@2x.png delete mode 100644 iphone/Barcodes/MainWindow.xib delete mode 100644 iphone/Barcodes/ZXMainViewController.xib delete mode 100644 iphone/Barcodes/beep-beep.aiff delete mode 100644 iphone/Barcodes/de.lproj/About.html delete mode 100644 iphone/Barcodes/de.lproj/DecoderView.xib delete mode 100644 iphone/Barcodes/de.lproj/Hints.html delete mode 100644 iphone/Barcodes/de.lproj/InfoPlist.strings delete mode 100644 iphone/Barcodes/de.lproj/Localizable.strings delete mode 100644 iphone/Barcodes/de.lproj/MainWindow.xib delete mode 100644 iphone/Barcodes/de.lproj/Message.xib delete mode 100644 iphone/Barcodes/design/ClickHereToScan.psd delete mode 100644 iphone/Barcodes/design/Transparent-logo.png delete mode 100644 iphone/Barcodes/design/Transparent-logo.psd delete mode 100644 iphone/Barcodes/design/ZXingRounded.psd delete mode 100644 iphone/Barcodes/design/ZxingLarge@2x.png delete mode 100644 iphone/Barcodes/design/clickHere.png delete mode 100644 iphone/Barcodes/design/rounded rect.graffle delete mode 100644 iphone/Barcodes/design/zxing-512-rounded.png delete mode 100644 iphone/Barcodes/en.lproj/About.html delete mode 100644 iphone/Barcodes/en.lproj/DecoderView.xib delete mode 100644 iphone/Barcodes/en.lproj/Hints.html delete mode 100644 iphone/Barcodes/en.lproj/InfoPlist.strings delete mode 100644 iphone/Barcodes/en.lproj/Localizable.strings delete mode 100644 iphone/Barcodes/en.lproj/MainWindow.xib delete mode 100644 iphone/Barcodes/en.lproj/Message.xib delete mode 100644 iphone/Barcodes/fr.lproj/About.html delete mode 100644 iphone/Barcodes/fr.lproj/DecoderView.xib delete mode 100644 iphone/Barcodes/fr.lproj/Hints.html delete mode 100644 iphone/Barcodes/fr.lproj/InfoPlist.strings delete mode 100644 iphone/Barcodes/fr.lproj/Localizable.strings delete mode 100644 iphone/Barcodes/fr.lproj/MainWindow.xib delete mode 100644 iphone/Barcodes/fr.lproj/Message.xib delete mode 100644 iphone/Barcodes/images/Default.png delete mode 100644 iphone/Barcodes/images/Default@2x.png delete mode 100644 iphone/Barcodes/images/LatestResultBackground.png delete mode 100644 iphone/Barcodes/images/LatestResultBackground@2x.png delete mode 100644 iphone/Barcodes/images/Scanning.png delete mode 100644 iphone/Barcodes/images/Scanning@2x.png delete mode 100644 iphone/Barcodes/images/ZxingLarge.png delete mode 100644 iphone/Barcodes/images/ZxingLarge@2x.png delete mode 100644 iphone/Barcodes/images/business-card.png delete mode 100644 iphone/Barcodes/images/clickHere.png delete mode 100644 iphone/Barcodes/images/email.png delete mode 100644 iphone/Barcodes/images/filmroll-2.png delete mode 100644 iphone/Barcodes/images/icon.png delete mode 100644 iphone/Barcodes/images/icon@2x.png delete mode 100644 iphone/Barcodes/images/link1.png delete mode 100644 iphone/Barcodes/images/link2.png delete mode 100644 iphone/Barcodes/images/map-pin.png delete mode 100644 iphone/Barcodes/images/phone.png delete mode 100644 iphone/Barcodes/images/photolib.png delete mode 100644 iphone/Barcodes/images/sms.png delete mode 100644 iphone/Barcodes/images/text.png delete mode 100644 iphone/Barcodes/images/zxing-512-rounded.png delete mode 100644 iphone/Barcodes/images/zxing-512.tiff delete mode 100644 iphone/Barcodes/main.mm delete mode 100644 iphone/Barcodes/scans.db delete mode 100644 iphone/Barcodes/sv.lproj/About.html delete mode 100644 iphone/Barcodes/sv.lproj/DecoderView.xib delete mode 100644 iphone/Barcodes/sv.lproj/Hints.html delete mode 100644 iphone/Barcodes/sv.lproj/InfoPlist.strings delete mode 100644 iphone/Barcodes/sv.lproj/Localizable.strings delete mode 100644 iphone/Barcodes/sv.lproj/MainWindow.xib delete mode 100644 iphone/Barcodes/sv.lproj/Message.xib delete mode 100644 iphone/README.md delete mode 100644 iphone/ScanTest/.gitignore delete mode 100644 iphone/ScanTest/Classes/RootViewController.h delete mode 100644 iphone/ScanTest/Classes/RootViewController.mm delete mode 100644 iphone/ScanTest/Classes/ScanTestAppDelegate.h delete mode 100644 iphone/ScanTest/Classes/ScanTestAppDelegate.m delete mode 100644 iphone/ScanTest/Default-568h@2x.png delete mode 100644 iphone/ScanTest/Icon.png delete mode 100644 iphone/ScanTest/MainWindow.xib delete mode 100644 iphone/ScanTest/README delete mode 100644 iphone/ScanTest/RootViewController.xib delete mode 100644 iphone/ScanTest/ScanTest-Info.plist delete mode 100755 iphone/ScanTest/ScanTest.xcodeproj/project.pbxproj delete mode 100644 iphone/ScanTest/ScanTest_Prefix.pch delete mode 100644 iphone/ScanTest/beep-beep.aiff delete mode 100644 iphone/ScanTest/iPad/MainWindow-iPad.xib delete mode 100644 iphone/ScanTest/main.mm delete mode 100644 iphone/ZXingWidget/.gitignore delete mode 100644 iphone/ZXingWidget/Classes/ArrayAndStringCategories.h delete mode 100644 iphone/ZXingWidget/Classes/ArrayAndStringCategories.m delete mode 100644 iphone/ZXingWidget/Classes/AztecReader.h delete mode 100644 iphone/ZXingWidget/Classes/AztecReader.mm delete mode 100644 iphone/ZXingWidget/Classes/CBarcodeFormat.h delete mode 100644 iphone/ZXingWidget/Classes/CBarcodeFormat.mm delete mode 100644 iphone/ZXingWidget/Classes/DataMatrixReader.h delete mode 100644 iphone/ZXingWidget/Classes/DataMatrixReader.mm delete mode 100644 iphone/ZXingWidget/Classes/Decoder.h delete mode 100644 iphone/ZXingWidget/Classes/Decoder.mm delete mode 100644 iphone/ZXingWidget/Classes/DecoderDelegate.h delete mode 100644 iphone/ZXingWidget/Classes/FormatReader.h delete mode 100644 iphone/ZXingWidget/Classes/FormatReader.mm delete mode 100644 iphone/ZXingWidget/Classes/MultiFormatOneDReader.h delete mode 100644 iphone/ZXingWidget/Classes/MultiFormatOneDReader.mm delete mode 100644 iphone/ZXingWidget/Classes/MultiFormatReader.h delete mode 100644 iphone/ZXingWidget/Classes/MultiFormatReader.mm delete mode 100644 iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.h delete mode 100644 iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.mm delete mode 100644 iphone/ZXingWidget/Classes/NSString+HTML.h delete mode 100644 iphone/ZXingWidget/Classes/NSString+HTML.m delete mode 100644 iphone/ZXingWidget/Classes/OverlayView.h delete mode 100644 iphone/ZXingWidget/Classes/OverlayView.m delete mode 100644 iphone/ZXingWidget/Classes/QRCodeReader.h delete mode 100644 iphone/ZXingWidget/Classes/QRCodeReader.mm delete mode 100644 iphone/ZXingWidget/Classes/TwoDDecoderResult.h delete mode 100644 iphone/ZXingWidget/Classes/TwoDDecoderResult.m delete mode 100644 iphone/ZXingWidget/Classes/ZXingWidgetController.h delete mode 100644 iphone/ZXingWidget/Classes/ZXingWidgetController.m delete mode 100644 iphone/ZXingWidget/Classes/actions/AddContactAction.h delete mode 100644 iphone/ZXingWidget/Classes/actions/AddContactAction.m delete mode 100644 iphone/ZXingWidget/Classes/actions/CallAction.h delete mode 100644 iphone/ZXingWidget/Classes/actions/CallAction.m delete mode 100644 iphone/ZXingWidget/Classes/actions/EmailAction.h delete mode 100644 iphone/ZXingWidget/Classes/actions/EmailAction.m delete mode 100644 iphone/ZXingWidget/Classes/actions/OpenUrlAction.h delete mode 100644 iphone/ZXingWidget/Classes/actions/OpenUrlAction.m delete mode 100644 iphone/ZXingWidget/Classes/actions/ResultAction.h delete mode 100644 iphone/ZXingWidget/Classes/actions/ResultAction.m delete mode 100644 iphone/ZXingWidget/Classes/actions/SMSAction.h delete mode 100644 iphone/ZXingWidget/Classes/actions/SMSAction.m delete mode 100644 iphone/ZXingWidget/Classes/actions/ShowMapAction.h delete mode 100644 iphone/ZXingWidget/Classes/actions/ShowMapAction.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/ParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/ParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.h delete mode 100644 iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/MeCardParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/MeCardParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.mm delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/ResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/ResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/TelResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/TelResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/TextResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/TextResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/URLResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/URLResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.m delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.h delete mode 100644 iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.m delete mode 100644 iphone/ZXingWidget/Tests/AddressBookAUResultParserTests.m delete mode 100644 iphone/ZXingWidget/Tests/BizcardResultParserTests.m delete mode 100644 iphone/ZXingWidget/Tests/BookmarkDoCoMoTests.m delete mode 100644 iphone/ZXingWidget/Tests/EmailAddressResultParserTests.m delete mode 100644 iphone/ZXingWidget/Tests/EmailDoCoMoResultParserTests.m delete mode 100644 iphone/ZXingWidget/Tests/ISBNResultParserTests.m delete mode 100644 iphone/ZXingWidget/Tests/MeCardParserTests.m delete mode 100644 iphone/ZXingWidget/Tests/SMTPResultParserTests.m delete mode 100644 iphone/ZXingWidget/Tests/VCardResultParserTests.m delete mode 100644 iphone/ZXingWidget/ZXingTests-Info.plist delete mode 100644 iphone/ZXingWidget/ZXingWidget.xcodeproj/default.pbxuser delete mode 100644 iphone/ZXingWidget/ZXingWidget.xcodeproj/project.pbxproj delete mode 100644 iphone/ZXingWidget/ZXingWidget_Prefix.pch delete mode 100644 iphone/ZXingWidget/beep-beep.caf delete mode 100644 iphone/ZXingWidget/exportList delete mode 100644 objc/.gitignore delete mode 100644 objc/README delete mode 100644 objc/examples/ios/bare/Default-568h@2x.png delete mode 100644 objc/examples/ios/bare/bare.xcodeproj/project.pbxproj delete mode 100644 objc/examples/ios/bare/bare/AppDelegate.h delete mode 100644 objc/examples/ios/bare/bare/AppDelegate.m delete mode 100644 objc/examples/ios/bare/bare/ViewController.h delete mode 100644 objc/examples/ios/bare/bare/ViewController.m delete mode 100644 objc/examples/ios/bare/bare/bare-Info.plist delete mode 100644 objc/examples/ios/bare/bare/bare-Prefix.pch delete mode 100644 objc/examples/ios/bare/bare/en.lproj/InfoPlist.strings delete mode 100644 objc/examples/ios/bare/bare/en.lproj/ViewController_iPad.xib delete mode 100644 objc/examples/ios/bare/bare/en.lproj/ViewController_iPhone.xib delete mode 100644 objc/examples/ios/bare/bare/main.mm delete mode 100644 objc/examples/osx/bare/bare.xcodeproj/project.pbxproj delete mode 100644 objc/examples/osx/bare/bare/AppDelegate.h delete mode 100644 objc/examples/osx/bare/bare/AppDelegate.mm delete mode 100644 objc/examples/osx/bare/bare/bare-Info.plist delete mode 100644 objc/examples/osx/bare/bare/bare-Prefix.pch delete mode 100644 objc/examples/osx/bare/bare/main.mm delete mode 100644 objc/examples/osx/demo/demo.xcodeproj/project.pbxproj delete mode 100644 objc/examples/osx/demo/demo/AppDelegate.h delete mode 100644 objc/examples/osx/demo/demo/AppDelegate.m delete mode 100644 objc/examples/osx/demo/demo/Defs.h delete mode 100644 objc/examples/osx/demo/demo/demo-Info.plist delete mode 100644 objc/examples/osx/demo/demo/demo-Prefix.pch delete mode 100644 objc/examples/osx/demo/demo/en.lproj/Credits.rtf delete mode 100644 objc/examples/osx/demo/demo/en.lproj/InfoPlist.strings delete mode 100644 objc/examples/osx/demo/demo/en.lproj/MainMenu.xib delete mode 100644 objc/examples/osx/demo/demo/en.lproj/ZXingType.png delete mode 100644 objc/examples/osx/demo/demo/en.lproj/applogo.icns delete mode 100644 objc/examples/osx/demo/demo/en.lproj/beepbeep.aif delete mode 100644 objc/examples/osx/demo/demo/en.lproj/zxinglogo.png delete mode 100644 objc/examples/osx/demo/demo/main.m delete mode 100644 objc/ios.xcodeproj/.gitignore delete mode 100644 objc/ios.xcodeproj/project.pbxproj delete mode 100644 objc/ios_Prefix.pch delete mode 100644 objc/osx.xcodeproj/project.pbxproj delete mode 100644 objc/osx_Prefix.pch delete mode 100644 objc/src/Prefix.pch delete mode 100644 objc/src/ZXing/CGImageLuminanceSource.mm delete mode 100644 objc/src/ZXing/ZXBinarizer.h delete mode 100644 objc/src/ZXing/ZXBinarizer.mm delete mode 100644 objc/src/ZXing/ZXBinaryBitmap.h delete mode 100644 objc/src/ZXing/ZXBinaryBitmap.mm delete mode 100644 objc/src/ZXing/ZXCGImageLuminanceSource.h delete mode 100644 objc/src/ZXing/ZXCGImageLuminanceSource.mm delete mode 100644 objc/src/ZXing/ZXCapture.h delete mode 100644 objc/src/ZXing/ZXCapture.mm delete mode 100644 objc/src/ZXing/ZXCaptureDelegate.h delete mode 100644 objc/src/ZXing/ZXCaptureView.h delete mode 100644 objc/src/ZXing/ZXCaptureView.mm delete mode 100644 objc/src/ZXing/ZXDecodeHints.h delete mode 100644 objc/src/ZXing/ZXDecodeHints.mm delete mode 100644 objc/src/ZXing/ZXHybridBinarizer.h delete mode 100644 objc/src/ZXing/ZXHybridBinarizer.mm delete mode 100644 objc/src/ZXing/ZXIllegalArgumentException.h delete mode 100644 objc/src/ZXing/ZXIllegalArgumentException.mm delete mode 100644 objc/src/ZXing/ZXImage.h delete mode 100644 objc/src/ZXing/ZXImage.mm delete mode 100644 objc/src/ZXing/ZXInit.c delete mode 100644 objc/src/ZXing/ZXLuminanceSource.h delete mode 100644 objc/src/ZXing/ZXLuminanceSource.mm delete mode 100644 objc/src/ZXing/ZXMultiFormatReader.h delete mode 100644 objc/src/ZXing/ZXMultiFormatReader.mm delete mode 100644 objc/src/ZXing/ZXQRCodeReader.h delete mode 100644 objc/src/ZXing/ZXQRCodeReader.mm delete mode 100644 objc/src/ZXing/ZXReader.h delete mode 100644 objc/src/ZXing/ZXReader.mm delete mode 100644 objc/src/ZXing/ZXReaderException.h delete mode 100644 objc/src/ZXing/ZXReaderException.mm delete mode 100644 objc/src/ZXing/ZXResult.h delete mode 100644 objc/src/ZXing/ZXResult.mm delete mode 100644 objc/src/ZXing/ZXView.h delete mode 100644 objc/zxing-objc-framework/en.lproj/InfoPlist.strings delete mode 100644 objc/zxing-objc-framework/zxing-objc-framework-Info.plist delete mode 100644 objc/zxing-objc-framework/zxing-objc-framework-Prefix.pch delete mode 100644 objc/zxing-objc-framework/zxing_objc_framework.h delete mode 100644 objc/zxing-objc-framework/zxing_objc_framework.m delete mode 100644 objc/zxing-objc.xcodeproj/project.pbxproj delete mode 100644 qt/README.txt diff --git a/CHANGES b/CHANGES index 9de2209e6..67323c068 100644 --- a/CHANGES +++ b/CHANGES @@ -328,4 +328,8 @@ - Barcode Scanner Android up requires Android 4 and is updated to use Android 4+ APIs - javase/ and zxingorg/ modules now use Java 7 - Many small fixes and improvements - - (Last release including cpp/ and iphone/ code) \ No newline at end of file + - (Last release including cpp/ and iphone/ code) + +3.0.0 (??) + + - iphone/, cpp/ and objc/ are retired \ No newline at end of file diff --git a/NOTICE b/NOTICE index 7f6b7fa27..8d9769a1d 100644 --- a/NOTICE +++ b/NOTICE @@ -18,69 +18,3 @@ Copyright 2002-2010 The Apache Software Foundation This product includes software developed by The Apache Software Foundation (http://www.apache.org/). - --------------------------------------------------------------------------------- -NOTICES FOR ISO C9x compliant stdint.h for Microsoft Visual Studio --------------------------------------------------------------------------------- - -Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 - - Copyright (c) 2006-2008 Alexander Chemeris - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of the author may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- -NOTICES FOR LodePNG --------------------------------------------------------------------------------- - -Copyright (c) 2005-2013 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. - --------------------------------------------------------------------------------- -NOTICES FOR C++ Big Integer Library --------------------------------------------------------------------------------- - -I, Matt McCutchen, the sole author of the original Big Integer -Library, waive my copyright to it, placing it in the public domain. -The library comes with absolutely no warranty. - diff --git a/build.xml b/build.xml index 2e4faff93..0fa81d498 100644 --- a/build.xml +++ b/build.xml @@ -41,14 +41,9 @@ - - - - - diff --git a/cpp/.gdbinit b/cpp/.gdbinit deleted file mode 100644 index 8db67b724..000000000 --- a/cpp/.gdbinit +++ /dev/null @@ -1,3 +0,0 @@ -set history save on -b __cxa_throw -r diff --git a/cpp/.gitignore b/cpp/.gitignore deleted file mode 100644 index 9d49746ce..000000000 --- a/cpp/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/build -/.sconsign.dblite -xcuserdata -callgrind.out.* -contents.xcworkspacedata -*.pyc -/.rbenv-version \ No newline at end of file diff --git a/cpp/.svnignore b/cpp/.svnignore deleted file mode 100644 index a2365b194..000000000 --- a/cpp/.svnignore +++ /dev/null @@ -1,5 +0,0 @@ -testout -build -report.html -.sconsign.dblite - diff --git a/cpp/.valgrind.supp b/cpp/.valgrind.supp deleted file mode 100644 index be2293869..000000000 --- a/cpp/.valgrind.supp +++ /dev/null @@ -1,94 +0,0 @@ -{ - dlsym - Memcheck:Value8 - fun:_simple_salloc - fun:_ZN4dyld9mkstringfEPKcz - -} -{ - dlsym - Memcheck:Cond - fun:_ZN4dyld9mkstringfEPKcz -} - -{ - osx - Memcheck:Leak - fun:malloc_zone_malloc - fun:recursive_mutex_init - fun:_objc_init - fun:libSystem_initializer -} - -{ - throws - Memcheck:Leak - fun:calloc - fun:__cxa_get_globals - fun:__cxa_throw -} - -{ - osx - Memcheck:Leak - fun:malloc_zone_calloc - ... - fun:map_images -} - -{ - c++ - Memcheck:Leak - ... - fun:__cxa_get_globals -} - -{ - stdio - Memcheck:Leak - ... - fun:sprintf -} - -{ - objc - Memcheck:Leak - ... - fun:prepareForMethodLookup - fun:lookUpMethod -} - -{ - os - Memcheck:Leak - ... - fun:dlopen -} - -{ - osx - Memcheck:Leak - ... - fun:map_images -} - -{ - at_exit - Memcheck:Leak - ... - fun:atexit_register -} - -{ - osx - Memcheck:Value8 - ... - fun:dlsym -} - -{ - osx - Memcheck:Cond - ... - fun:dlsym -} \ No newline at end of file diff --git a/cpp/.valgrindrc b/cpp/.valgrindrc deleted file mode 100644 index f364c12b9..000000000 --- a/cpp/.valgrindrc +++ /dev/null @@ -1 +0,0 @@ ---memcheck:leak-check=full --memcheck:suppressions=.valgrind.supp --memcheck:gen-suppressions=all \ No newline at end of file diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt deleted file mode 100644 index b10dbd22a..000000000 --- a/cpp/CMakeLists.txt +++ /dev/null @@ -1,84 +0,0 @@ -# -# CMake listfile to specify the build process, see: -# http://www.cmake.org/cmake/help/documentation.html -# -project(zxing) -cmake_minimum_required(VERSION 2.8.0) - -set(CMAKE_LIBRARY_PATH /opt/local/lib ${CMAKE_LIBRARY_PATH}) - -# Check for polluted source tree. -if(EXISTS ${CMAKE_SOURCE_DIR}/CMakeCache.txt OR - EXISTS ${CMAKE_SOURCE_DIR}/CMakeFiles) - message(FATAL_ERROR - "Source directory is polluted:" - "\n * remove CMakeCache.txt" - "\n * remove CMakeFiles directory") -endif() - -# Suppress in-source builds. -if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) - message(FATAL_ERROR - "CMake generation is not allowed within the source directory:" - "\n * mkdir build" - "\n * cd build" - "\n * Unix-like: cmake -G \"Unix Makefiles\" .." - "\n * Windows: cmake -G \"Visual Studio 10\" ..") -endif() - -# Adjust CMake's module path. -set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/) - -# Suppress MSVC CRT warnings. -if(MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - add_definitions(/Za) -endif() - -# Add libzxing library. -file(GLOB_RECURSE LIBZXING_FILES - "./core/src/*.cpp" - "./core/src/*.h" - "./core/src/*.cc" - "./core/src/*.hh" -) -if(WIN32) - file(GLOB LIBZXING_WIN32_FILES - "./core/lib/win32/*.c" - "./core/lib/win32/*.h" - ) - set(LIBZXING_FILES ${LIBZXING_FILES} ${LIBZXING_WIN32_FILES}) - include_directories(SYSTEM "./core/lib/win32/") -endif() -include_directories("./core/src/") -add_library(libzxing STATIC ${LIBZXING_FILES}) -set_target_properties(libzxing PROPERTIES PREFIX "") -find_package(Iconv) -if(ICONV_FOUND) - include_directories(${ICONV_INCLUDE_DIR}) - target_link_libraries(libzxing ${ICONV_LIBRARIES}) -else() - add_definitions(-DNO_ICONV=1) -endif() - -# Add cli executable. -file(GLOB_RECURSE ZXING_FILES - "./cli/src/*.cpp" - "./cli/src/*.h" -) -add_executable(zxing ${ZXING_FILES}) -target_link_libraries(zxing libzxing) - -# Add testrunner executable. -find_package(CPPUNIT) -if(CPPUNIT_FOUND) - file(GLOB_RECURSE TESTRUNNER_FILES - "./core/tests/src/*.cpp" - "./core/tests/src/*.h" - ) - add_executable(testrunner ${TESTRUNNER_FILES}) - include_directories(${CPPUNIT_INCLUDE_DIR}) - target_link_libraries(testrunner libzxing ${CPPUNIT_LIBRARIES}) -else() - message(WARNING "Not building testrunner, because CppUnit is missing") -endif() diff --git a/cpp/README.md b/cpp/README.md deleted file mode 100644 index 8b9704438..000000000 --- a/cpp/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# ZXing C++ Port - -This is a manual port of ZXing to C++. It has been tested on Linux, Mac OS X and Windows. - -## Building using SCons - -SCons is a build tool written in Python. You'll need to have Python -installed, but scons installation is optional: a run time copy of -SCons (called `scons-local`) is included. To use the included copy, -replace `scons` with `python scons/scons.py` in the instructions below. - -To build the library only: - - 1. Install libiconv (optional; included in many operating systems) - 2. `cd` to the `cpp` folder - 3. Run `scons lib` - -To build the command line utility utility: - - 1. Run `scons zxing` - 2. Run `build/zxing` for a command line reference - -To build the unit tests (optional): - - 1. Install CppUnit (`libcppunit-dev` on Ubuntu) - 2. Run `scons tests` - 3. Run `build/testrunner` - -To clean: - - 1. Run `scons -c all` - -# Building using CMake - -CMake is a tool, that generates native makefiles and workspaces. It -integrates well with a number of IDEs including Qt Creator and Visual -Studio. - -Usage with Qt Creator: - - 1. Open `CMakeLists.txt` as new project - 2. Specify command line arguments (see below) and press _Finish_ - -Usage with Makefiles, Visual Studio, etc. (see `cmake --help` for a complete list of generators): - - 1. `cd` to `cpp/build` - 3. Unix: run `cmake -G "Unix Makefiles" ..` - 3. Windows: run `cmake -G "Visual Studio 10" ..` - -You can switch between build modes by specifying: - - - `-DCMAKE_BUILD_TYPE=Debug` or - - `-DCMAKE_BUILD_TYPE=Release` - -# Development tips - -To profile the code (very useful to optimize the code): - - 1. Install Valgrind - 2. Run `valgrind --tool=callgrind build/zxing - path/to/test/data/*.jpg > report.html` - 3. Analyze output using KCachegrind - -To run the black box tests and check for changes: - - 1. Build `zxing-img`, e.g., scons zxing - 2. Run the tests: `bash blackboxtest.sh 2>&1 | tee bb.results` - 3. Diff them with the known results: `diff bb.results blackboxtest.results` diff --git a/cpp/SConscript b/cpp/SConscript deleted file mode 100644 index ab563c47d..000000000 --- a/cpp/SConscript +++ /dev/null @@ -1,87 +0,0 @@ -# -*- python -*- - -# -# SConscript file to specify the build process, see: -# http://scons.org/doc/production/HTML/scons-man.html -# -Decider('MD5') -import platform -import fnmatch -import os - -vars = Variables() -vars.Add(BoolVariable('DEBUG', 'Set to disable optimizations', True)) -vars.Add(BoolVariable('PIC', 'Set to 1 for to always generate PIC code', False)) -env = Environment(variables = vars) -#env.Replace(CXX = 'clang++') - -compile_options = {} -if platform.system() is 'Windows': - compile_options['CXXFLAGS'] = '-D_CRT_SECURE_NO_WARNINGS /fp:fast /EHsc' -else: - # Force ANSI (C++98) to ensure compatibility with MSVC. - cxxflags = ['-ansi -pedantic'] - if env['DEBUG']: - #compile_options['CPPDEFINES'] = '-DDEBUG' - cxxflags.append('-O0 -g3 -ggdb') - cxxflags.append('-Wall -Wextra -Werror') - # -Werror - else: - cxxflags.append('-Os -g3 -ggdb -Wall -Wextra') - if env['PIC']: - cxxflags.append('-fPIC') - compile_options['CXXFLAGS'] = ' '.join(cxxflags) - compile_options['LINKFLAGS'] = '-ldl -L/usr/lib -L/opt/local/lib -L/usr/local/lib' - -def all_files(dir, ext='.cpp', level=6): - files = [] - for i in range(1, level): - files += Glob(dir + ('/*' * i) + ext) - return files - -def all_libs(name, dir): - matches = [] - for root, dirnames, filenames in os.walk(dir): - for filename in fnmatch.filter(filenames, name): - matches.append(os.path.join(root, filename)) - return matches - -# Setup libiconv, if possible -libiconv_include = [] -libiconv_libs = [] -if all_libs('libiconv.*', '/opt/local/lib'): - libiconv_include.append('/opt/local/include/') - libiconv_libs.append('iconv') -else: - if all_libs('libiconv.*', '/usr/lib'): - libiconv_libs.append('iconv') - -# Add libzxing library. -libzxing_files = all_files('core/src')+all_files('core/src', '.cc') -libzxing_include = ['core/src'] -if platform.system() is 'Windows': - libzxing_files += all_files('core/src/win32') - libzxing_include += ['core/src/win32'] -libzxing = env.Library('zxing', source=libzxing_files, - CPPPATH=libzxing_include + libiconv_libs, **compile_options) - -# Add cli. -zxing_files = all_files('cli/src') -zxing = env.Program('zxing', zxing_files, - CPPPATH=libzxing_include, - LIBS=libzxing + libiconv_libs, **compile_options) - -# Setup CPPUnit. -cppunit_include = ['/opt/local/include/'] -cppunit_libs = ['cppunit'] - -# Add testrunner program. -test_files = all_files('core/tests/src') -test = env.Program('testrunner', test_files, - CPPPATH=libzxing_include + cppunit_include, - LIBS=libzxing + cppunit_libs, **compile_options) - -# Setup some aliases. -Alias('lib', libzxing) -Alias('zxing', zxing) -Alias('tests', test) diff --git a/cpp/SConstruct b/cpp/SConstruct deleted file mode 100644 index 3acb0a955..000000000 --- a/cpp/SConstruct +++ /dev/null @@ -1,7 +0,0 @@ -SConscript('SConscript', variant_dir='build') - -Alias('all', ['lib', 'tests', 'zxing']) -Default('all') - -# Remove build folder on "scons -c all" -Clean('all', 'build') diff --git a/cpp/blackboxtest.results b/cpp/blackboxtest.results deleted file mode 100644 index 185401a9e..000000000 --- a/cpp/blackboxtest.results +++ /dev/null @@ -1,1080 +0,0 @@ -***** finished - 0 of 0 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/ean13-1/1.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/10.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/12.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/13.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/14.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/15.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/18.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/19.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/2.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/20.JPG ... FAILED - Expected: 4000539017100 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-1/21.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/22.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/23.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/24.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/25.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/26.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/28.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/29.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/3.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/30.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/31.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/32.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/33.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-1/34.jpg ... FAILED - Expected: 9781558604971 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-1/35.jpg ... FAILED - Expected: 5030159003930 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-1/36.jpg ... FAILED - Expected: 5000213101025 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-1/37.jpg ... FAILED - Expected: 5000213002834 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-1/38.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-1/4.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/5.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/6.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/7.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/8.JPG ... passed. -Processing: ../core/test/data/blackbox/ean13-1/9.JPG ... passed. -***** ean13-1 finished - 29 of 34 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/ean13-2/01.png ... FAILED - Expected: 9780804816632 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/02.png ... FAILED - Expected: 9780804816632 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/03.png ... FAILED - Expected: 9780804816632 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/04.png ... FAILED - Expected: 9780804816632 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/05.png ... FAILED - Expected: 9780804816632 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/06.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/07.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/08.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/09.png ... FAILED - Expected: 9780345348036 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/10.png ... FAILED - Expected: 9780345348036 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/11.png ... FAILED - Expected: 9780345348036 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/12.png ... FAILED - Expected: 9780345348036 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/13.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/14.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/15.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/16.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/17.png ... FAILED - Expected: 9784872348880 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/18.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/19.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/20.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/21.png ... FAILED - Expected: 9784872348880 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/22.png ... FAILED - Expected: 9784872348880 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/23.png ... FAILED - Expected: 1920081045006 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/24.png ... FAILED - Expected: 9784872348880 - Detected: zxing::IllegalArgumentException: Invalid position (ReedSolomonDecoder) -Processing: ../core/test/data/blackbox/ean13-2/25.png ... FAILED - Expected: 9784872348880 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/26.png ... FAILED - Expected: 9784872348880 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-2/27.png ... passed. -Processing: ../core/test/data/blackbox/ean13-2/28.png ... FAILED - Expected: 1920081045006 - Detected: zxing::ReaderException: No code detected -***** ean13-2 finished - 11 of 28 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/ean13-3/01.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/02.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/03.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/04.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/05.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/06.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/07.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/08.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/09.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/10.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/11.jpg ... FAILED - Expected: 9780596008574 - Detected: zxing::IllegalArgumentException: Invalid position (ReedSolomonDecoder) -Processing: ../core/test/data/blackbox/ean13-3/12.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/13.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/14.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/15.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/16.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/17.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/18.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/19.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/20.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/21.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/22.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/23.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/24.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/25.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/26.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/27.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/28.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/29.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/30.jpg ... FAILED - Expected: 9780201310054 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-3/31.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/32.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/33.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/34.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/35.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/36.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/37.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/38.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/39.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/40.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/41.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/42.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/43.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/44.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/45.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/46.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/47.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/48.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/49.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/50.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/51.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/52.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/53.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/54.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-3/55.jpg ... passed. -***** ean13-3 finished - 53 of 55 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/ean13-4/01.jpg ... FAILED - Expected: 9780441014989 - Detected: 17804419 -Processing: ../core/test/data/blackbox/ean13-4/02.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-4/03.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/04.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/05.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/06.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-4/07.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/08.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/09.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/10.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/11.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-4/12.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/13.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-4/14.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/15.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-4/16.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/17.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/18.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/19.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/20.jpg ... passed. -Processing: ../core/test/data/blackbox/ean13-4/21.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-4/22.jpg ... FAILED - Expected: 9780441014989 - Detected: zxing::ReaderException: No code detected -***** ean13-4 finished - 6 of 22 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/ean13-5/01.png ... FAILED - Expected: 9780679601050 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/02.png ... FAILED - Expected: 9780679601050 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/03.png ... FAILED - Expected: 9780679601050 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/04.png ... FAILED - Expected: 9780679601050 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/05.png ... FAILED - Expected: 9780679601050 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/06.png ... FAILED - Expected: 9780345460950 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/07.png ... FAILED - Expected: 9780345460950 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/08.png ... FAILED - Expected: 9780345460950 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/09.png ... FAILED - Expected: 9780345460950 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/10.png ... FAILED - Expected: 9780345460950 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/11.png ... FAILED - Expected: 9780345460950 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/12.png ... FAILED - Expected: 9780345460950 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/13.png ... FAILED - Expected: 9780446579803 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/14.png ... FAILED - Expected: 9780446579803 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/15.png ... FAILED - Expected: 9780446579803 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/16.png ... FAILED - Expected: 9780446579803 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/17.png ... FAILED - Expected: 9780446579803 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/ean13-5/18.png ... FAILED - Expected: 9780446579803 - Detected: zxing::ReaderException: No code detected -***** ean13-5 finished - 0 of 18 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/ean8-1/1.gif ... passed. -Processing: ../core/test/data/blackbox/ean8-1/2.gif ... passed. -Processing: ../core/test/data/blackbox/ean8-1/3.gif ... passed. -Processing: ../core/test/data/blackbox/ean8-1/4.jpg ... passed. -Processing: ../core/test/data/blackbox/ean8-1/5.gif ... passed. -Processing: ../core/test/data/blackbox/ean8-1/6.jpg ... passed. -Processing: ../core/test/data/blackbox/ean8-1/7.jpg ... passed. -Processing: ../core/test/data/blackbox/ean8-1/8.gif ... passed. -***** ean8-1 finished - 8 of 8 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upce-1/1.gif ... passed. -Processing: ../core/test/data/blackbox/upce-1/2.gif ... passed. -Processing: ../core/test/data/blackbox/upce-1/4.jpg ... passed. -***** upce-1 finished - 3 of 3 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upce-2/01.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/02.jpg ... FAILED - Expected: 05096893 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/03.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/04.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/05.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/06.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/07.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/08.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/09.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/10.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/11.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/12.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/13.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/14.jpg ... FAILED - Expected: 04963406 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/15.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/16.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/17.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/18.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/19.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/20.jpg ... FAILED - Expected: 04124498 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/21.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/22.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/23.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/24.jpg ... FAILED - Expected: 04124498 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/25.jpg ... FAILED - Expected: 04124498 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/26.jpg ... FAILED - Expected: 04124498 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/27.jpg ... FAILED - Expected: 04124498 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/28.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/29.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/30.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/31.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/32.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/33.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/34.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/35.jpg ... FAILED - Expected: 01264904 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/36.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/37.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/38.jpg ... FAILED - Expected: 01264904 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/39.jpg ... FAILED - Expected: 01264904 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-2/40.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-2/41.jpg ... FAILED - Expected: 01264904 - Detected: zxing::ReaderException: No code detected -***** upce-2 finished - 30 of 41 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upce-3/01.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-3/02.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-3/03.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-3/04.jpg ... FAILED - Expected: 04965802 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-3/05.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-3/06.jpg ... FAILED - Expected: 04965802 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-3/07.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-3/08.jpg ... FAILED - Expected: 04965802 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-3/09.jpg ... passed. -Processing: ../core/test/data/blackbox/upce-3/10.jpg ... FAILED - Expected: 04965802 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upce-3/11.jpg ... FAILED - Expected: 04965802 - Detected: zxing::ReaderException: No code detected -***** upce-3 finished - 6 of 11 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upca-1/1.jpg ... FAILED - Expected: 036602301467 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-1/10.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/11.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/12.jpg ... FAILED - Expected: 781735802045 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-1/13.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/16.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/17.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/18.jpg ... FAILED - Expected: 024543136538 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-1/19.jpg ... FAILED - Expected: 024543136538 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-1/2.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/20.jpg ... FAILED - Expected: 752919460009 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-1/21.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/27.JPG ... passed. -Processing: ../core/test/data/blackbox/upca-1/28.JPG ... passed. -Processing: ../core/test/data/blackbox/upca-1/29.JPG ... passed. -Processing: ../core/test/data/blackbox/upca-1/3.jpg ... FAILED - Expected: 070097025088 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-1/35.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/4.jpg ... FAILED - Expected: 070097025088 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-1/5.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/8.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-1/9.jpg ... passed. -***** upca-1 finished - 14 of 21 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upca-2/01.jpg ... FAILED - Expected: 890444000335 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/02.jpg ... FAILED - Expected: 890444000335 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/03.jpg ... FAILED - Expected: 890444000335 - Detected: 89040003 -Processing: ../core/test/data/blackbox/upca-2/04.jpg ... FAILED - Expected: 890444000335 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/05.jpg ... FAILED - Expected: 890444000335 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/06.jpg ... FAILED - Expected: 890444000335 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/07.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/08.jpg ... FAILED - Expected: 181497000879 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/09.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/10.jpg ... FAILED - Expected: 181497000879 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/11.jpg ... FAILED - Expected: 181497000879 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/12.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/13.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/14.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/15.jpg ... FAILED - Expected: 051000000675 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/16.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/17.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/18.jpg ... FAILED - Expected: 051000000675 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/19.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/20.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/21.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/22.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/23.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/24.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/25.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/26.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/27.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/28.jpg ... FAILED - Expected: 752050200137 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/29.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/30.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/31.jpg ... FAILED - Expected: 899684001003 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/32.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/33.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/34.jpg ... FAILED - Expected: 899684001003 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/35.jpg ... FAILED - Expected: 899684001003 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/36.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/37.jpg ... FAILED - Expected: 899684001003 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/38.jpg ... FAILED - Expected: 012546619592 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/39.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/40.jpg ... FAILED - Expected: 012546619592 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/41.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/42.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/43.jpg ... FAILED - Expected: 012546619592 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/44.jpg ... FAILED - Expected: 012546619592 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/45.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/46.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/47.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/48.jpg ... FAILED - Expected: 075720003259 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/49.jpg ... FAILED - Expected: 075720003259 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/50.jpg ... FAILED - Expected: 075720003259 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-2/51.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-2/52.jpg ... passed. -***** upca-2 finished - 29 of 52 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upca-3/01.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/02.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/03.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/04.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/05.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/06.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/07.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/08.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/09.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/10.jpg ... FAILED - Expected: 049000042566 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/11.jpg ... FAILED - Expected: 854818000116 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/12.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-3/13.jpg ... FAILED - Expected: 854818000116 - Detected: 85480001 -Processing: ../core/test/data/blackbox/upca-3/14.jpg ... FAILED - Expected: 854818000116 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/15.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-3/16.jpg ... FAILED - Expected: 854818000116 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-3/17.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-3/18.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-3/19.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-3/20.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-3/21.jpg ... passed. -***** upca-3 finished - 7 of 21 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upca-4/1.jpg ... FAILED - Expected: 023942431015 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-4/10.jpg ... FAILED - Expected: 066721010995 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-4/11.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/12.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/13.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/14.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/15.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/16.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/17.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/18.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/19.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/2.jpg ... FAILED - Expected: 023942431015 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-4/3.jpg ... FAILED - Expected: 023942431015 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-4/4.jpg ... FAILED - Expected: 023942431015 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-4/5.jpg ... FAILED - Expected: 023942431015 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-4/6.jpg ... FAILED - Expected: 023942431015 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-4/7.jpg ... FAILED - Expected: 023942431015 - Detected: zxing::IllegalArgumentException: Invalid position (ReedSolomonDecoder) -Processing: ../core/test/data/blackbox/upca-4/8.jpg ... passed. -Processing: ../core/test/data/blackbox/upca-4/9.jpg ... FAILED - Expected: 060410049235 - Detected: zxing::ReaderException: No code detected -***** upca-4 finished - 10 of 19 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upca-5/01.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/02.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/03.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/04.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/05.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/06.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/07.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/08.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/09.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/10.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/11.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/12.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/13.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/14.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/15.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/16.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/17.png ... FAILED - Expected: 312547701310 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/18.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/19.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/20.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/21.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/22.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/23.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/24.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/25.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/26.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/27.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/28.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/29.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/30.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/31.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/32.png ... FAILED - Expected: 625034201058 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-5/33.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/34.png ... passed. -Processing: ../core/test/data/blackbox/upca-5/35.png ... passed. -***** upca-5 finished - 19 of 35 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/upca-6/01.png ... FAILED - Expected: 071831007995 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/02.png ... FAILED - Expected: 071831007995 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/03.png ... FAILED - Expected: 071831007995 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/04.png ... FAILED - Expected: 071831007995 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/05.png ... FAILED - Expected: 071831007995 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/06.png ... FAILED - Expected: 071831007995 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/07.png ... FAILED - Expected: 605482330012 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/08.png ... FAILED - Expected: 605482330012 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/09.png ... FAILED - Expected: 605482330012 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/10.png ... FAILED - Expected: 605482330012 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/11.png ... FAILED - Expected: 605482330012 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/12.png ... FAILED - Expected: 605482330012 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/13.png ... FAILED - Expected: 073333531084 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/14.png ... FAILED - Expected: 073333531084 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/15.png ... FAILED - Expected: 073333531084 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/16.png ... FAILED - Expected: 073333531084 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/17.png ... FAILED - Expected: 073333531084 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/18.png ... FAILED - Expected: 073333531084 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/upca-6/19.png ... FAILED - Expected: 073333531084 - Detected: zxing::ReaderException: No code detected -***** upca-6 finished - 0 of 19 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/qrcode-1/1.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/10.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/11.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/12.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/13.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/14.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/15.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/16.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/17.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/18.jpg ... FAILED - Expected: Sean Owen -srowen@google.com -917-364-2918 -http://awesome-thoughts.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-1/19.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/2.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/20.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/3.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/4.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/5.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/6.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/7.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/8.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-1/9.jpg ... passed. -***** qrcode-1 finished - 19 of 20 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/qrcode-2/1.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/10.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/11.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/12.jpg ... FAILED - Expected: The 2005 USGS aerial photography of the Washington Monument is censored. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-2/13.jpg ... FAILED - Expected: The 2005 USGS aerial photograph of the Washington Monument is censored. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-2/14.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/15.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/16.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/17.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/18.jpg ... FAILED - Expected: *デザインQR* -http://d-qr.net/ex/ - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-2/19.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/2.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/20.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/21.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/22.jpg ... FAILED - Expected: http://www.hotpepper.jp/mobile/cgi-bin/MBLC80100.cgi?SA=00&Z=AG&vos=hpp064&uid=NULLGWDOCOMO - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-2/23.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/24.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/25.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/26.png ... FAILED - Expected: <デザインQR> -イラスト入りカラーQRコード -http://d-qr.net/ex/ - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-2/27.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/28.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/29.jpg ... FAILED - Expected: http://live.fdgm.jp/u/event/hype/hype_top.html - -MEBKM:TITLE:hypeモバイル;URL:http\://live.fdgm.jp/u/event/hype/hype_top.html;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-2/30.png ... FAILED - Expected: MECARD:N:測試;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-2/31.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/32.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/33.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/34.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/35.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/4.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/5.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/6.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/7.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/8.gif ... passed. -Processing: ../core/test/data/blackbox/qrcode-2/9.png ... passed. -***** qrcode-2 finished - 27 of 34 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/qrcode-3/01.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/02.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/03.jpg ... FAILED - Expected: http://arnaud.sahuguet.com/graffiti/test.php?ll=-74.00309961503218,40.74102573163046,0 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-3/04.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/05.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/06.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/07.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/08.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/09.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/10.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/11.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/12.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/13.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/14.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/15.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/16.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/17.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/18.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/19.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/20.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/21.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/22.jpg ... FAILED - Expected: UI office hours signup -http://www.corp.google.com/sparrow/ui_office_hours/ - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-3/23.jpg ... FAILED - Expected: UI office hours signup -http://www.corp.google.com/sparrow/ui_office_hours/ - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-3/24.jpg ... FAILED - Expected: UI office hours signup -http://www.corp.google.com/sparrow/ui_office_hours/ - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-3/25.jpg ... FAILED - Expected: UI office hours signup -http://www.corp.google.com/sparrow/ui_office_hours/ - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-3/26.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/27.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/28.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/29.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/30.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/31.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/32.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/33.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/34.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/35.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/36.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/37.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/38.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/39.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/40.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-3/41.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-3/42.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -***** qrcode-3 finished - 35 of 42 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/qrcode-4/01.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/02.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/03.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/04.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/05.jpg ... FAILED - Expected: Google Print Ads - T.G.I.A.F. - January 31, 2008 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/06.jpg ... FAILED - Expected: Google Print Ads - T.G.I.A.F. - January 31, 2008 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/07.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/08.jpg ... FAILED - Expected: Google Print Ads - T.G.I.A.F. - January 31, 2008 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/09.jpg ... FAILED - Expected: Google Print Ads - T.G.I.A.F. - January 31, 2008 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/10.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/11.jpg ... FAILED - Expected: Google Print Ads - T.G.I.A.F. - January 31, 2008 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/12.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/13.jpg ... FAILED - Expected: Google Print Ads - T.G.I.A.F. - January 31, 2008 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/14.jpg ... FAILED - Expected: Google Print Ads - T.G.I.A.F. - January 31, 2008 - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/15.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/16.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/17.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/18.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/19.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/20.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/21.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/22.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/23.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/24.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/25.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/26.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/27.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/28.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/29.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/30.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/31.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/32.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/33.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/34.jpg ... FAILED - Expected: http://code.google.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/35.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/36.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/37.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/38.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/39.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/40.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/41.jpg ... FAILED - Expected: http://code.google.com/p/zxing/ - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-4/42.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/43.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/44.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/45.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/46.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/47.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-4/48.jpg ... passed. -***** qrcode-4 finished - 32 of 48 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/qrcode-5/01.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/02.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/03.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/04.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/05.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/06.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/07.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/08.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/09.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/10.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/11.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/12.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/13.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/14.jpg ... FAILED - Expected: MECARD:N:Sean Owen;TEL:+12125658770;EMAIL:srowen@google.com;; - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/qrcode-5/15.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/16.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/17.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/18.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-5/19.png ... passed. -***** qrcode-5 finished - 9 of 19 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/qrcode-6/1.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/10.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/11.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/12.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/13.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/14.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/15.jpg ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/2.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/3.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/4.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/5.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/6.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/7.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/8.png ... passed. -Processing: ../core/test/data/blackbox/qrcode-6/9.png ... passed. -***** qrcode-6 finished - 15 of 15 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/aztec-1/7.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/Historico.gif ... passed. -Processing: ../core/test/data/blackbox/aztec-1/HistoricoLong.gif ... passed. -Processing: ../core/test/data/blackbox/aztec-1/abc-19x19C.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/abc-37x37.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/lorem-075x075.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/lorem-105x105.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/lorem-151x151.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/tableShifts.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/tag.png ... passed. -Processing: ../core/test/data/blackbox/aztec-1/texte.png ... passed. -***** aztec-1 finished - 11 of 11 passed **** ***** ******* ***** ********************* -Processing: ../core/test/data/blackbox/aztec-2/01.png ... FAILED - Expected: This is a real world Aztec barcode test. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/02.png ... passed. -Processing: ../core/test/data/blackbox/aztec-2/03.png ... FAILED - Expected: This is a real world Aztec barcode test. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/04.png ... FAILED - Expected: This is a real world Aztec barcode test. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/05.png ... FAILED - Expected: This is a real world Aztec barcode test. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/06.png ... FAILED - Expected: This is a real world Aztec barcode test. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/07.png ... FAILED - Expected: This is a real world Aztec barcode test. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/08.png ... FAILED - Expected: This is a real world Aztec barcode test. - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/09.png ... FAILED - Expected: mailto:zxing@googlegroups.com - Detected: zxing::IllegalArgumentException: Invalid position (ReedSolomonDecoder) -Processing: ../core/test/data/blackbox/aztec-2/10.png ... FAILED - Expected: mailto:zxing@googlegroups.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/11.png ... FAILED - Expected: mailto:zxing@googlegroups.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/12.png ... FAILED - Expected: mailto:zxing@googlegroups.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/13.png ... FAILED - Expected: mailto:zxing@googlegroups.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/14.png ... FAILED - Expected: mailto:zxing@googlegroups.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/15.png ... FAILED - Expected: mailto:zxing@googlegroups.com - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/16.png ... FAILED - Expected: http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/result/URIResultHandler.java - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/17.png ... FAILED - Expected: http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/result/URIResultHandler.java - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/18.png ... passed. -Processing: ../core/test/data/blackbox/aztec-2/19.png ... FAILED - Expected: http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/result/URIResultHandler.java - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/20.png ... FAILED - Expected: http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/result/URIResultHandler.java - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/21.png ... FAILED - Expected: http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/result/URIResultHandler.java - Detected: zxing::ReaderException: No code detected -Processing: ../core/test/data/blackbox/aztec-2/22.png ... FAILED - Expected: http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/result/URIResultHandler.java - Detected: zxing::ReaderException: No code detected -***** aztec-2 finished - 2 of 22 passed **** ***** ******* ***** ********************* diff --git a/cpp/blackboxtest.sh b/cpp/blackboxtest.sh deleted file mode 100755 index 2a98f88c8..000000000 --- a/cpp/blackboxtest.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash - -blackboxpath="../core/test/data/blackbox" - -if [ "$*" != "" ]; then - formats="$*" -else - formats="ean13 ean8 upce upca qrcode aztec" -fi - -passed=0; -failed=0; -oldcat=""; - -for format in $formats; do - for pic in `ls ${blackboxpath}/${format}-*/*.{jpg,JPG,gif,GIF,png,PNG} 2>/dev/null | sort -n`; do - category=${pic%/*}; - category=${category##*/}; - if [ "$oldcat" != "$category" ]; then - echo "***** $oldcat finished - $passed of $((passed+failed)) passed **** ***** ******* ***** *********************" - oldcat=$category; - passed=0; - failed=0; - fi - echo -n "Processing: $pic ... " - tmp="${pic}" - tmp="${tmp%JPG}"; - tmp="${tmp%jpg}"; - tmp="${tmp%gif}"; - tmp="${tmp%GIF}"; - tmp="${tmp%png}"; - tmp="${tmp%PNG}"; - txt="${tmp}txt"; - expected=`cat "$txt"`; - actual=`$VALGRIND build/zxing $pic`; - if [ "$expected" == "$actual" ]; then - echo "passed." - passed=$((passed+1)); - else - echo -e "FAILED\n Expected: $expected\n Detected: $actual" - failed=$((failed+1)); - fi - done -done -echo "***** $oldcat finished - $passed of $((passed+failed)) passed **** ***** ******* ***** *********************" diff --git a/cpp/cli/src/ImageReaderSource.cpp b/cpp/cli/src/ImageReaderSource.cpp deleted file mode 100644 index 5de3c886c..000000000 --- a/cpp/cli/src/ImageReaderSource.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2010-2011 ZXing authors - * - * 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 "ImageReaderSource.h" -#include -#include -#include -#include -#include -#include "lodepng.h" -#include "jpgd.h" - -using std::string; -using std::ostringstream; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::LuminanceSource; - -inline char ImageReaderSource::convertPixel(char const* pixel_) const { - unsigned char const* pixel = (unsigned char const*)pixel_; - if (comps == 1 || comps == 2) { - // Gray or gray+alpha - return pixel[0]; - } if (comps == 3 || comps == 4) { - // Red, Green, Blue, (Alpha) - // We assume 16 bit values here - // 0x200 = 1<<9, half an lsb of the result to force rounding - return (char)((306 * (int)pixel[0] + 601 * (int)pixel[1] + - 117 * (int)pixel[2] + 0x200) >> 10); - } else { - throw zxing::IllegalArgumentException("Unexpected image depth"); - } -} - -ImageReaderSource::ImageReaderSource(ArrayRef image_, int width, int height, int comps_) - : Super(width, height), image(image_), comps(comps_) {} - -Ref ImageReaderSource::create(string const& filename) { - string extension = filename.substr(filename.find_last_of(".") + 1); - std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); - int width, height; - int comps = 0; - zxing::ArrayRef image; - if (extension == "png") { - std::vector out; - - { unsigned w, h; - unsigned error = lodepng::decode(out, w, h, filename); - if (error) { - ostringstream msg; - msg << "Error while loading '" << lodepng_error_text(error) << "'"; - throw zxing::IllegalArgumentException(msg.str().c_str()); - } - width = w; - height = h; - } - - comps = 4; - image = zxing::ArrayRef(4 * width * height); - memcpy(&image[0], &out[0], image->size()); - } else if (extension == "jpg" || extension == "jpeg") { - char *buffer = reinterpret_cast(jpgd::decompress_jpeg_image_from_file( - filename.c_str(), &width, &height, &comps, 4)); - image = zxing::ArrayRef(buffer, 4 * width * height); - } - if (!image) { - ostringstream msg; - msg << "Loading \"" << filename << "\" failed."; - throw zxing::IllegalArgumentException(msg.str().c_str()); - } - - return Ref(new ImageReaderSource(image, width, height, comps)); -} - -zxing::ArrayRef ImageReaderSource::getRow(int y, zxing::ArrayRef row) const { - const char* pixelRow = &image[0] + y * getWidth() * 4; - if (!row) { - row = zxing::ArrayRef(getWidth()); - } - for (int x = 0; x < getWidth(); x++) { - row[x] = convertPixel(pixelRow + (x * 4)); - } - return row; -} - -/** This is a more efficient implementation. */ -zxing::ArrayRef ImageReaderSource::getMatrix() const { - const char* p = &image[0]; - zxing::ArrayRef matrix(getWidth() * getHeight()); - char* m = &matrix[0]; - for (int y = 0; y < getHeight(); y++) { - for (int x = 0; x < getWidth(); x++) { - *m = convertPixel(p); - m++; - p += 4; - } - } - return matrix; -} diff --git a/cpp/cli/src/ImageReaderSource.h b/cpp/cli/src/ImageReaderSource.h deleted file mode 100644 index b5ccc3d97..000000000 --- a/cpp/cli/src/ImageReaderSource.h +++ /dev/null @@ -1,40 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __IMAGE_READER_SOURCE_H_ -#define __IMAGE_READER_SOURCE_H_ -/* - * Copyright 2010-2011 ZXing authors - * - * 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 - -class ImageReaderSource : public zxing::LuminanceSource { -private: - typedef LuminanceSource Super; - - const zxing::ArrayRef image; - const int comps; - - char convertPixel(const char* pixel) const; - -public: - static zxing::Ref create(std::string const& filename); - - ImageReaderSource(zxing::ArrayRef image, int width, int height, int comps); - - zxing::ArrayRef getRow(int y, zxing::ArrayRef row) const; - zxing::ArrayRef getMatrix() const; -}; - -#endif /* __IMAGE_READER_SOURCE_H_ */ diff --git a/cpp/cli/src/jpgd.cpp b/cpp/cli/src/jpgd.cpp deleted file mode 100644 index b648c0896..000000000 --- a/cpp/cli/src/jpgd.cpp +++ /dev/null @@ -1,3174 +0,0 @@ -// jpgd.cpp - C++ class for JPEG decompression. -// Public domain, Rich Geldreich -// Alex Evans: Linear memory allocator (taken from jpge.h). -// v1.04, May. 19, 2012: Code tweaks to fix VS2008 static code analysis warnings (all looked harmless) -// -// Supports progressive and baseline sequential JPEG image files, and the most common chroma subsampling factors: Y, H1V1, H2V1, H1V2, and H2V2. -// -// Chroma upsampling quality: H2V2 is upsampled in the frequency domain, H2V1 and H1V2 are upsampled using point sampling. -// Chroma upsampling reference: "Fast Scheme for Image Size Change in the Compressed Domain" -// http://vision.ai.uiuc.edu/~dugad/research/dct/index.html - -#include "jpgd.h" -#include - -#include -#define JPGD_ASSERT(x) assert(x) - -#ifdef _MSC_VER -#pragma warning (disable : 4611) // warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable -#endif - -// Set to 1 to enable freq. domain chroma upsampling on images using H2V2 subsampling (0=faster nearest neighbor sampling). -// This is slower, but results in higher quality on images with highly saturated colors. -#define JPGD_SUPPORT_FREQ_DOMAIN_UPSAMPLING 1 - -#define JPGD_TRUE (1) -#define JPGD_FALSE (0) - -#define JPGD_MAX(a,b) (((a)>(b)) ? (a) : (b)) -#define JPGD_MIN(a,b) (((a)<(b)) ? (a) : (b)) - -namespace jpgd { - -static inline void *jpgd_malloc(size_t nSize) { return malloc(nSize); } -static inline void jpgd_free(void *p) { free(p); } - -// DCT coefficients are stored in this sequence. -static int g_ZAG[64] = { 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 }; - -enum JPEG_MARKER -{ - M_SOF0 = 0xC0, M_SOF1 = 0xC1, M_SOF2 = 0xC2, M_SOF3 = 0xC3, M_SOF5 = 0xC5, M_SOF6 = 0xC6, M_SOF7 = 0xC7, M_JPG = 0xC8, - M_SOF9 = 0xC9, M_SOF10 = 0xCA, M_SOF11 = 0xCB, M_SOF13 = 0xCD, M_SOF14 = 0xCE, M_SOF15 = 0xCF, M_DHT = 0xC4, M_DAC = 0xCC, - M_RST0 = 0xD0, M_RST1 = 0xD1, M_RST2 = 0xD2, M_RST3 = 0xD3, M_RST4 = 0xD4, M_RST5 = 0xD5, M_RST6 = 0xD6, M_RST7 = 0xD7, - M_SOI = 0xD8, M_EOI = 0xD9, M_SOS = 0xDA, M_DQT = 0xDB, M_DNL = 0xDC, M_DRI = 0xDD, M_DHP = 0xDE, M_EXP = 0xDF, - M_APP0 = 0xE0, M_APP15 = 0xEF, M_JPG0 = 0xF0, M_JPG13 = 0xFD, M_COM = 0xFE, M_TEM = 0x01, M_ERROR = 0x100, RST0 = 0xD0 -}; - -enum JPEG_SUBSAMPLING { JPGD_GRAYSCALE = 0, JPGD_YH1V1, JPGD_YH2V1, JPGD_YH1V2, JPGD_YH2V2 }; - -#define CONST_BITS 13 -#define PASS1_BITS 2 -#define SCALEDONE ((int32)1) - -#define FIX_0_298631336 ((int32)2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((int32)3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((int32)4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((int32)6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((int32)7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((int32)9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((int32)12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((int32)15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((int32)16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((int32)16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((int32)20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((int32)25172) /* FIX(3.072711026) */ - -#define DESCALE(x,n) (((x) + (SCALEDONE << ((n)-1))) >> (n)) -#define DESCALE_ZEROSHIFT(x,n) (((x) + (128 << (n)) + (SCALEDONE << ((n)-1))) >> (n)) - -#define MULTIPLY(var, cnst) ((var) * (cnst)) - -#define CLAMP(i) ((static_cast(i) > 255) ? (((~i) >> 31) & 0xFF) : (i)) - -// Compiler creates a fast path 1D IDCT for X non-zero columns -template -struct Row -{ - static void idct(int* pTemp, const jpgd_block_t* pSrc) - { - // ACCESS_COL() will be optimized at compile time to either an array access, or 0. - #define ACCESS_COL(x) (((x) < NONZERO_COLS) ? (int)pSrc[x] : 0) - - const int z2 = ACCESS_COL(2), z3 = ACCESS_COL(6); - - const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - const int tmp0 = (ACCESS_COL(0) + ACCESS_COL(4)) << CONST_BITS; - const int tmp1 = (ACCESS_COL(0) - ACCESS_COL(4)) << CONST_BITS; - - const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; - - const int atmp0 = ACCESS_COL(7), atmp1 = ACCESS_COL(5), atmp2 = ACCESS_COL(3), atmp3 = ACCESS_COL(1); - - const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; - const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); - - const int az1 = MULTIPLY(bz1, - FIX_0_899976223); - const int az2 = MULTIPLY(bz2, - FIX_2_562915447); - const int az3 = MULTIPLY(bz3, - FIX_1_961570560) + bz5; - const int az4 = MULTIPLY(bz4, - FIX_0_390180644) + bz5; - - const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; - const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; - const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; - const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; - - pTemp[0] = DESCALE(tmp10 + btmp3, CONST_BITS-PASS1_BITS); - pTemp[7] = DESCALE(tmp10 - btmp3, CONST_BITS-PASS1_BITS); - pTemp[1] = DESCALE(tmp11 + btmp2, CONST_BITS-PASS1_BITS); - pTemp[6] = DESCALE(tmp11 - btmp2, CONST_BITS-PASS1_BITS); - pTemp[2] = DESCALE(tmp12 + btmp1, CONST_BITS-PASS1_BITS); - pTemp[5] = DESCALE(tmp12 - btmp1, CONST_BITS-PASS1_BITS); - pTemp[3] = DESCALE(tmp13 + btmp0, CONST_BITS-PASS1_BITS); - pTemp[4] = DESCALE(tmp13 - btmp0, CONST_BITS-PASS1_BITS); - } -}; - -template <> -struct Row<0> -{ - static void idct(int* pTemp, const jpgd_block_t* pSrc) - { - (void)pTemp; - (void)pSrc; -#ifdef _MSC_VER - pTemp; pSrc; -#endif - } -}; - -template <> -struct Row<1> -{ - static void idct(int* pTemp, const jpgd_block_t* pSrc) - { - const int dcval = (pSrc[0] << PASS1_BITS); - - pTemp[0] = dcval; - pTemp[1] = dcval; - pTemp[2] = dcval; - pTemp[3] = dcval; - pTemp[4] = dcval; - pTemp[5] = dcval; - pTemp[6] = dcval; - pTemp[7] = dcval; - } -}; - -// Compiler creates a fast path 1D IDCT for X non-zero rows -template -struct Col -{ - static void idct(uint8* pDst_ptr, const int* pTemp) - { - // ACCESS_ROW() will be optimized at compile time to either an array access, or 0. - #define ACCESS_ROW(x) (((x) < NONZERO_ROWS) ? pTemp[x * 8] : 0) - - const int z2 = ACCESS_ROW(2); - const int z3 = ACCESS_ROW(6); - - const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - const int tmp0 = (ACCESS_ROW(0) + ACCESS_ROW(4)) << CONST_BITS; - const int tmp1 = (ACCESS_ROW(0) - ACCESS_ROW(4)) << CONST_BITS; - - const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; - - const int atmp0 = ACCESS_ROW(7), atmp1 = ACCESS_ROW(5), atmp2 = ACCESS_ROW(3), atmp3 = ACCESS_ROW(1); - - const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; - const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); - - const int az1 = MULTIPLY(bz1, - FIX_0_899976223); - const int az2 = MULTIPLY(bz2, - FIX_2_562915447); - const int az3 = MULTIPLY(bz3, - FIX_1_961570560) + bz5; - const int az4 = MULTIPLY(bz4, - FIX_0_390180644) + bz5; - - const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; - const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; - const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; - const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; - - int i = DESCALE_ZEROSHIFT(tmp10 + btmp3, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*0] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp10 - btmp3, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*7] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp11 + btmp2, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*1] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp11 - btmp2, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*6] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp12 + btmp1, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*2] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp12 - btmp1, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*5] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp13 + btmp0, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*3] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp13 - btmp0, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*4] = (uint8)CLAMP(i); - } -}; - -template <> -struct Col<1> -{ - static void idct(uint8* pDst_ptr, const int* pTemp) - { - int dcval = DESCALE_ZEROSHIFT(pTemp[0], PASS1_BITS+3); - const uint8 dcval_clamped = (uint8)CLAMP(dcval); - pDst_ptr[0*8] = dcval_clamped; - pDst_ptr[1*8] = dcval_clamped; - pDst_ptr[2*8] = dcval_clamped; - pDst_ptr[3*8] = dcval_clamped; - pDst_ptr[4*8] = dcval_clamped; - pDst_ptr[5*8] = dcval_clamped; - pDst_ptr[6*8] = dcval_clamped; - pDst_ptr[7*8] = dcval_clamped; - } -}; - -static const uint8 s_idct_row_table[] = -{ - 1,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0, 2,1,0,0,0,0,0,0, 2,1,1,0,0,0,0,0, 2,2,1,0,0,0,0,0, 3,2,1,0,0,0,0,0, 4,2,1,0,0,0,0,0, 4,3,1,0,0,0,0,0, - 4,3,2,0,0,0,0,0, 4,3,2,1,0,0,0,0, 4,3,2,1,1,0,0,0, 4,3,2,2,1,0,0,0, 4,3,3,2,1,0,0,0, 4,4,3,2,1,0,0,0, 5,4,3,2,1,0,0,0, 6,4,3,2,1,0,0,0, - 6,5,3,2,1,0,0,0, 6,5,4,2,1,0,0,0, 6,5,4,3,1,0,0,0, 6,5,4,3,2,0,0,0, 6,5,4,3,2,1,0,0, 6,5,4,3,2,1,1,0, 6,5,4,3,2,2,1,0, 6,5,4,3,3,2,1,0, - 6,5,4,4,3,2,1,0, 6,5,5,4,3,2,1,0, 6,6,5,4,3,2,1,0, 7,6,5,4,3,2,1,0, 8,6,5,4,3,2,1,0, 8,7,5,4,3,2,1,0, 8,7,6,4,3,2,1,0, 8,7,6,5,3,2,1,0, - 8,7,6,5,4,2,1,0, 8,7,6,5,4,3,1,0, 8,7,6,5,4,3,2,0, 8,7,6,5,4,3,2,1, 8,7,6,5,4,3,2,2, 8,7,6,5,4,3,3,2, 8,7,6,5,4,4,3,2, 8,7,6,5,5,4,3,2, - 8,7,6,6,5,4,3,2, 8,7,7,6,5,4,3,2, 8,8,7,6,5,4,3,2, 8,8,8,6,5,4,3,2, 8,8,8,7,5,4,3,2, 8,8,8,7,6,4,3,2, 8,8,8,7,6,5,3,2, 8,8,8,7,6,5,4,2, - 8,8,8,7,6,5,4,3, 8,8,8,7,6,5,4,4, 8,8,8,7,6,5,5,4, 8,8,8,7,6,6,5,4, 8,8,8,7,7,6,5,4, 8,8,8,8,7,6,5,4, 8,8,8,8,8,6,5,4, 8,8,8,8,8,7,5,4, - 8,8,8,8,8,7,6,4, 8,8,8,8,8,7,6,5, 8,8,8,8,8,7,6,6, 8,8,8,8,8,7,7,6, 8,8,8,8,8,8,7,6, 8,8,8,8,8,8,8,6, 8,8,8,8,8,8,8,7, 8,8,8,8,8,8,8,8, -}; - -static const uint8 s_idct_col_table[] = { 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; - -void idct(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr, int block_max_zag) -{ - JPGD_ASSERT(block_max_zag >= 1); - JPGD_ASSERT(block_max_zag <= 64); - - if (block_max_zag <= 1) - { - int k = ((pSrc_ptr[0] + 4) >> 3) + 128; - k = CLAMP(k); - k = k | (k<<8); - k = k | (k<<16); - - for (int i = 8; i > 0; i--) - { - *(int*)&pDst_ptr[0] = k; - *(int*)&pDst_ptr[4] = k; - pDst_ptr += 8; - } - return; - } - - int temp[64]; - - const jpgd_block_t* pSrc = pSrc_ptr; - int* pTemp = temp; - - const uint8* pRow_tab = &s_idct_row_table[(block_max_zag - 1) * 8]; - int i; - for (i = 8; i > 0; i--, pRow_tab++) - { - switch (*pRow_tab) - { - case 0: Row<0>::idct(pTemp, pSrc); break; - case 1: Row<1>::idct(pTemp, pSrc); break; - case 2: Row<2>::idct(pTemp, pSrc); break; - case 3: Row<3>::idct(pTemp, pSrc); break; - case 4: Row<4>::idct(pTemp, pSrc); break; - case 5: Row<5>::idct(pTemp, pSrc); break; - case 6: Row<6>::idct(pTemp, pSrc); break; - case 7: Row<7>::idct(pTemp, pSrc); break; - case 8: Row<8>::idct(pTemp, pSrc); break; - } - - pSrc += 8; - pTemp += 8; - } - - pTemp = temp; - - const int nonzero_rows = s_idct_col_table[block_max_zag - 1]; - for (i = 8; i > 0; i--) - { - switch (nonzero_rows) - { - case 1: Col<1>::idct(pDst_ptr, pTemp); break; - case 2: Col<2>::idct(pDst_ptr, pTemp); break; - case 3: Col<3>::idct(pDst_ptr, pTemp); break; - case 4: Col<4>::idct(pDst_ptr, pTemp); break; - case 5: Col<5>::idct(pDst_ptr, pTemp); break; - case 6: Col<6>::idct(pDst_ptr, pTemp); break; - case 7: Col<7>::idct(pDst_ptr, pTemp); break; - case 8: Col<8>::idct(pDst_ptr, pTemp); break; - } - - pTemp++; - pDst_ptr++; - } -} - -void idct_4x4(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr) -{ - int temp[64]; - int* pTemp = temp; - const jpgd_block_t* pSrc = pSrc_ptr; - - for (int i = 4; i > 0; i--) - { - Row<4>::idct(pTemp, pSrc); - pSrc += 8; - pTemp += 8; - } - - pTemp = temp; - for (int i = 8; i > 0; i--) - { - Col<4>::idct(pDst_ptr, pTemp); - pTemp++; - pDst_ptr++; - } -} - -// Retrieve one character from the input stream. -inline uint jpeg_decoder::get_char() -{ - // Any bytes remaining in buffer? - if (!m_in_buf_left) - { - // Try to get more bytes. - prep_in_buffer(); - // Still nothing to get? - if (!m_in_buf_left) - { - // Pad the end of the stream with 0xFF 0xD9 (EOI marker) - int t = m_tem_flag; - m_tem_flag ^= 1; - if (t) - return 0xD9; - else - return 0xFF; - } - } - - uint c = *m_pIn_buf_ofs++; - m_in_buf_left--; - - return c; -} - -// Same as previous method, except can indicate if the character is a pad character or not. -inline uint jpeg_decoder::get_char(bool *pPadding_flag) -{ - if (!m_in_buf_left) - { - prep_in_buffer(); - if (!m_in_buf_left) - { - *pPadding_flag = true; - int t = m_tem_flag; - m_tem_flag ^= 1; - if (t) - return 0xD9; - else - return 0xFF; - } - } - - *pPadding_flag = false; - - uint c = *m_pIn_buf_ofs++; - m_in_buf_left--; - - return c; -} - -// Inserts a previously retrieved character back into the input buffer. -inline void jpeg_decoder::stuff_char(uint8 q) -{ - *(--m_pIn_buf_ofs) = q; - m_in_buf_left++; -} - -// Retrieves one character from the input stream, but does not read past markers. Will continue to return 0xFF when a marker is encountered. -inline uint8 jpeg_decoder::get_octet() -{ - bool padding_flag; - int c = get_char(&padding_flag); - - if (c == 0xFF) - { - if (padding_flag) - return 0xFF; - - c = get_char(&padding_flag); - if (padding_flag) - { - stuff_char(0xFF); - return 0xFF; - } - - if (c == 0x00) - return 0xFF; - else - { - stuff_char(static_cast(c)); - stuff_char(0xFF); - return 0xFF; - } - } - - return static_cast(c); -} - -// Retrieves a variable number of bits from the input stream. Does not recognize markers. -inline uint jpeg_decoder::get_bits(int num_bits) -{ - if (!num_bits) - return 0; - - uint i = m_bit_buf >> (32 - num_bits); - - if ((m_bits_left -= num_bits) <= 0) - { - m_bit_buf <<= (num_bits += m_bits_left); - - uint c1 = get_char(); - uint c2 = get_char(); - m_bit_buf = (m_bit_buf & 0xFFFF0000) | (c1 << 8) | c2; - - m_bit_buf <<= -m_bits_left; - - m_bits_left += 16; - - JPGD_ASSERT(m_bits_left >= 0); - } - else - m_bit_buf <<= num_bits; - - return i; -} - -// Retrieves a variable number of bits from the input stream. Markers will not be read into the input bit buffer. Instead, an infinite number of all 1's will be returned when a marker is encountered. -inline uint jpeg_decoder::get_bits_no_markers(int num_bits) -{ - if (!num_bits) - return 0; - - uint i = m_bit_buf >> (32 - num_bits); - - if ((m_bits_left -= num_bits) <= 0) - { - m_bit_buf <<= (num_bits += m_bits_left); - - if ((m_in_buf_left < 2) || (m_pIn_buf_ofs[0] == 0xFF) || (m_pIn_buf_ofs[1] == 0xFF)) - { - uint c1 = get_octet(); - uint c2 = get_octet(); - m_bit_buf |= (c1 << 8) | c2; - } - else - { - m_bit_buf |= ((uint)m_pIn_buf_ofs[0] << 8) | m_pIn_buf_ofs[1]; - m_in_buf_left -= 2; - m_pIn_buf_ofs += 2; - } - - m_bit_buf <<= -m_bits_left; - - m_bits_left += 16; - - JPGD_ASSERT(m_bits_left >= 0); - } - else - m_bit_buf <<= num_bits; - - return i; -} - -// Decodes a Huffman encoded symbol. -inline int jpeg_decoder::huff_decode(huff_tables *pH) -{ - int symbol; - - // Check first 8-bits: do we have a complete symbol? - if ((symbol = pH->look_up[m_bit_buf >> 24]) < 0) - { - // Decode more bits, use a tree traversal to find symbol. - int ofs = 23; - do - { - symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))]; - ofs--; - } while (symbol < 0); - - get_bits_no_markers(8 + (23 - ofs)); - } - else - get_bits_no_markers(pH->code_size[symbol]); - - return symbol; -} - -// Decodes a Huffman encoded symbol. -inline int jpeg_decoder::huff_decode(huff_tables *pH, int& extra_bits) -{ - int symbol; - - // Check first 8-bits: do we have a complete symbol? - if ((symbol = pH->look_up2[m_bit_buf >> 24]) < 0) - { - // Use a tree traversal to find symbol. - int ofs = 23; - do - { - symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))]; - ofs--; - } while (symbol < 0); - - get_bits_no_markers(8 + (23 - ofs)); - - extra_bits = get_bits_no_markers(symbol & 0xF); - } - else - { - JPGD_ASSERT(((symbol >> 8) & 31) == pH->code_size[symbol & 255] + ((symbol & 0x8000) ? (symbol & 15) : 0)); - - if (symbol & 0x8000) - { - get_bits_no_markers((symbol >> 8) & 31); - extra_bits = symbol >> 16; - } - else - { - int code_size = (symbol >> 8) & 31; - int num_extra_bits = symbol & 0xF; - int bits = code_size + num_extra_bits; - if (bits <= (m_bits_left + 16)) - extra_bits = get_bits_no_markers(bits) & ((1 << num_extra_bits) - 1); - else - { - get_bits_no_markers(code_size); - extra_bits = get_bits_no_markers(num_extra_bits); - } - } - - symbol &= 0xFF; - } - - return symbol; -} - -// Tables and macro used to fully decode the DPCM differences. -static const int s_extend_test[16] = { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; -static const int s_extend_offset[16] = { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; -static const int s_extend_mask[] = { 0, (1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7), (1<<8), (1<<9), (1<<10), (1<<11), (1<<12), (1<<13), (1<<14), (1<<15), (1<<16) }; -// The logical AND's in this macro are to shut up static code analysis (aren't really necessary - couldn't find another way to do this) -#define JPGD_HUFF_EXTEND(x, s) (((x) < s_extend_test[s & 15]) ? ((x) + s_extend_offset[s & 15]) : (x)) - -// Clamps a value between 0-255. -inline uint8 jpeg_decoder::clamp(int i) -{ - if (static_cast(i) > 255) - i = (((~i) >> 31) & 0xFF); - - return static_cast(i); -} - -namespace DCT_Upsample -{ - struct Matrix44 - { - typedef int Element_Type; - enum { NUM_ROWS = 4, NUM_COLS = 4 }; - - Element_Type v[NUM_ROWS][NUM_COLS]; - - inline int rows() const { return NUM_ROWS; } - inline int cols() const { return NUM_COLS; } - - inline const Element_Type & at(int r, int c) const { return v[r][c]; } - inline Element_Type & at(int r, int c) { return v[r][c]; } - - inline Matrix44() { } - - inline Matrix44& operator += (const Matrix44& a) - { - for (int r = 0; r < NUM_ROWS; r++) - { - at(r, 0) += a.at(r, 0); - at(r, 1) += a.at(r, 1); - at(r, 2) += a.at(r, 2); - at(r, 3) += a.at(r, 3); - } - return *this; - } - - inline Matrix44& operator -= (const Matrix44& a) - { - for (int r = 0; r < NUM_ROWS; r++) - { - at(r, 0) -= a.at(r, 0); - at(r, 1) -= a.at(r, 1); - at(r, 2) -= a.at(r, 2); - at(r, 3) -= a.at(r, 3); - } - return *this; - } - - friend inline Matrix44 operator + (const Matrix44& a, const Matrix44& b) - { - Matrix44 ret; - for (int r = 0; r < NUM_ROWS; r++) - { - ret.at(r, 0) = a.at(r, 0) + b.at(r, 0); - ret.at(r, 1) = a.at(r, 1) + b.at(r, 1); - ret.at(r, 2) = a.at(r, 2) + b.at(r, 2); - ret.at(r, 3) = a.at(r, 3) + b.at(r, 3); - } - return ret; - } - - friend inline Matrix44 operator - (const Matrix44& a, const Matrix44& b) - { - Matrix44 ret; - for (int r = 0; r < NUM_ROWS; r++) - { - ret.at(r, 0) = a.at(r, 0) - b.at(r, 0); - ret.at(r, 1) = a.at(r, 1) - b.at(r, 1); - ret.at(r, 2) = a.at(r, 2) - b.at(r, 2); - ret.at(r, 3) = a.at(r, 3) - b.at(r, 3); - } - return ret; - } - - static inline void add_and_store(jpgd_block_t* pDst, const Matrix44& a, const Matrix44& b) - { - for (int r = 0; r < 4; r++) - { - pDst[0*8 + r] = static_cast(a.at(r, 0) + b.at(r, 0)); - pDst[1*8 + r] = static_cast(a.at(r, 1) + b.at(r, 1)); - pDst[2*8 + r] = static_cast(a.at(r, 2) + b.at(r, 2)); - pDst[3*8 + r] = static_cast(a.at(r, 3) + b.at(r, 3)); - } - } - - static inline void sub_and_store(jpgd_block_t* pDst, const Matrix44& a, const Matrix44& b) - { - for (int r = 0; r < 4; r++) - { - pDst[0*8 + r] = static_cast(a.at(r, 0) - b.at(r, 0)); - pDst[1*8 + r] = static_cast(a.at(r, 1) - b.at(r, 1)); - pDst[2*8 + r] = static_cast(a.at(r, 2) - b.at(r, 2)); - pDst[3*8 + r] = static_cast(a.at(r, 3) - b.at(r, 3)); - } - } - }; - - const int FRACT_BITS = 10; - const int SCALE = 1 << FRACT_BITS; - - typedef int Temp_Type; - #define D(i) (((i) + (SCALE >> 1)) >> FRACT_BITS) - #define F(i) ((int)((i) * SCALE + .5f)) - - // Any decent C++ compiler will optimize this at compile time to a 0, or an array access. - #define AT(c, r) ((((c)>=NUM_COLS)||((r)>=NUM_ROWS)) ? 0 : pSrc[(c)+(r)*8]) - - // NUM_ROWS/NUM_COLS = # of non-zero rows/cols in input matrix - template - struct P_Q - { - static void calc(Matrix44& P, Matrix44& Q, const jpgd_block_t* pSrc) - { - // 4x8 = 4x8 times 8x8, matrix 0 is constant - const Temp_Type X000 = AT(0, 0); - const Temp_Type X001 = AT(0, 1); - const Temp_Type X002 = AT(0, 2); - const Temp_Type X003 = AT(0, 3); - const Temp_Type X004 = AT(0, 4); - const Temp_Type X005 = AT(0, 5); - const Temp_Type X006 = AT(0, 6); - const Temp_Type X007 = AT(0, 7); - const Temp_Type X010 = D(F(0.415735f) * AT(1, 0) + F(0.791065f) * AT(3, 0) + F(-0.352443f) * AT(5, 0) + F(0.277785f) * AT(7, 0)); - const Temp_Type X011 = D(F(0.415735f) * AT(1, 1) + F(0.791065f) * AT(3, 1) + F(-0.352443f) * AT(5, 1) + F(0.277785f) * AT(7, 1)); - const Temp_Type X012 = D(F(0.415735f) * AT(1, 2) + F(0.791065f) * AT(3, 2) + F(-0.352443f) * AT(5, 2) + F(0.277785f) * AT(7, 2)); - const Temp_Type X013 = D(F(0.415735f) * AT(1, 3) + F(0.791065f) * AT(3, 3) + F(-0.352443f) * AT(5, 3) + F(0.277785f) * AT(7, 3)); - const Temp_Type X014 = D(F(0.415735f) * AT(1, 4) + F(0.791065f) * AT(3, 4) + F(-0.352443f) * AT(5, 4) + F(0.277785f) * AT(7, 4)); - const Temp_Type X015 = D(F(0.415735f) * AT(1, 5) + F(0.791065f) * AT(3, 5) + F(-0.352443f) * AT(5, 5) + F(0.277785f) * AT(7, 5)); - const Temp_Type X016 = D(F(0.415735f) * AT(1, 6) + F(0.791065f) * AT(3, 6) + F(-0.352443f) * AT(5, 6) + F(0.277785f) * AT(7, 6)); - const Temp_Type X017 = D(F(0.415735f) * AT(1, 7) + F(0.791065f) * AT(3, 7) + F(-0.352443f) * AT(5, 7) + F(0.277785f) * AT(7, 7)); - const Temp_Type X020 = AT(4, 0); - const Temp_Type X021 = AT(4, 1); - const Temp_Type X022 = AT(4, 2); - const Temp_Type X023 = AT(4, 3); - const Temp_Type X024 = AT(4, 4); - const Temp_Type X025 = AT(4, 5); - const Temp_Type X026 = AT(4, 6); - const Temp_Type X027 = AT(4, 7); - const Temp_Type X030 = D(F(0.022887f) * AT(1, 0) + F(-0.097545f) * AT(3, 0) + F(0.490393f) * AT(5, 0) + F(0.865723f) * AT(7, 0)); - const Temp_Type X031 = D(F(0.022887f) * AT(1, 1) + F(-0.097545f) * AT(3, 1) + F(0.490393f) * AT(5, 1) + F(0.865723f) * AT(7, 1)); - const Temp_Type X032 = D(F(0.022887f) * AT(1, 2) + F(-0.097545f) * AT(3, 2) + F(0.490393f) * AT(5, 2) + F(0.865723f) * AT(7, 2)); - const Temp_Type X033 = D(F(0.022887f) * AT(1, 3) + F(-0.097545f) * AT(3, 3) + F(0.490393f) * AT(5, 3) + F(0.865723f) * AT(7, 3)); - const Temp_Type X034 = D(F(0.022887f) * AT(1, 4) + F(-0.097545f) * AT(3, 4) + F(0.490393f) * AT(5, 4) + F(0.865723f) * AT(7, 4)); - const Temp_Type X035 = D(F(0.022887f) * AT(1, 5) + F(-0.097545f) * AT(3, 5) + F(0.490393f) * AT(5, 5) + F(0.865723f) * AT(7, 5)); - const Temp_Type X036 = D(F(0.022887f) * AT(1, 6) + F(-0.097545f) * AT(3, 6) + F(0.490393f) * AT(5, 6) + F(0.865723f) * AT(7, 6)); - const Temp_Type X037 = D(F(0.022887f) * AT(1, 7) + F(-0.097545f) * AT(3, 7) + F(0.490393f) * AT(5, 7) + F(0.865723f) * AT(7, 7)); - - // 4x4 = 4x8 times 8x4, matrix 1 is constant - P.at(0, 0) = X000; - P.at(0, 1) = D(X001 * F(0.415735f) + X003 * F(0.791065f) + X005 * F(-0.352443f) + X007 * F(0.277785f)); - P.at(0, 2) = X004; - P.at(0, 3) = D(X001 * F(0.022887f) + X003 * F(-0.097545f) + X005 * F(0.490393f) + X007 * F(0.865723f)); - P.at(1, 0) = X010; - P.at(1, 1) = D(X011 * F(0.415735f) + X013 * F(0.791065f) + X015 * F(-0.352443f) + X017 * F(0.277785f)); - P.at(1, 2) = X014; - P.at(1, 3) = D(X011 * F(0.022887f) + X013 * F(-0.097545f) + X015 * F(0.490393f) + X017 * F(0.865723f)); - P.at(2, 0) = X020; - P.at(2, 1) = D(X021 * F(0.415735f) + X023 * F(0.791065f) + X025 * F(-0.352443f) + X027 * F(0.277785f)); - P.at(2, 2) = X024; - P.at(2, 3) = D(X021 * F(0.022887f) + X023 * F(-0.097545f) + X025 * F(0.490393f) + X027 * F(0.865723f)); - P.at(3, 0) = X030; - P.at(3, 1) = D(X031 * F(0.415735f) + X033 * F(0.791065f) + X035 * F(-0.352443f) + X037 * F(0.277785f)); - P.at(3, 2) = X034; - P.at(3, 3) = D(X031 * F(0.022887f) + X033 * F(-0.097545f) + X035 * F(0.490393f) + X037 * F(0.865723f)); - // 40 muls 24 adds - - // 4x4 = 4x8 times 8x4, matrix 1 is constant - Q.at(0, 0) = D(X001 * F(0.906127f) + X003 * F(-0.318190f) + X005 * F(0.212608f) + X007 * F(-0.180240f)); - Q.at(0, 1) = X002; - Q.at(0, 2) = D(X001 * F(-0.074658f) + X003 * F(0.513280f) + X005 * F(0.768178f) + X007 * F(-0.375330f)); - Q.at(0, 3) = X006; - Q.at(1, 0) = D(X011 * F(0.906127f) + X013 * F(-0.318190f) + X015 * F(0.212608f) + X017 * F(-0.180240f)); - Q.at(1, 1) = X012; - Q.at(1, 2) = D(X011 * F(-0.074658f) + X013 * F(0.513280f) + X015 * F(0.768178f) + X017 * F(-0.375330f)); - Q.at(1, 3) = X016; - Q.at(2, 0) = D(X021 * F(0.906127f) + X023 * F(-0.318190f) + X025 * F(0.212608f) + X027 * F(-0.180240f)); - Q.at(2, 1) = X022; - Q.at(2, 2) = D(X021 * F(-0.074658f) + X023 * F(0.513280f) + X025 * F(0.768178f) + X027 * F(-0.375330f)); - Q.at(2, 3) = X026; - Q.at(3, 0) = D(X031 * F(0.906127f) + X033 * F(-0.318190f) + X035 * F(0.212608f) + X037 * F(-0.180240f)); - Q.at(3, 1) = X032; - Q.at(3, 2) = D(X031 * F(-0.074658f) + X033 * F(0.513280f) + X035 * F(0.768178f) + X037 * F(-0.375330f)); - Q.at(3, 3) = X036; - // 40 muls 24 adds - } - }; - - template - struct R_S - { - static void calc(Matrix44& R, Matrix44& S, const jpgd_block_t* pSrc) - { - // 4x8 = 4x8 times 8x8, matrix 0 is constant - const Temp_Type X100 = D(F(0.906127f) * AT(1, 0) + F(-0.318190f) * AT(3, 0) + F(0.212608f) * AT(5, 0) + F(-0.180240f) * AT(7, 0)); - const Temp_Type X101 = D(F(0.906127f) * AT(1, 1) + F(-0.318190f) * AT(3, 1) + F(0.212608f) * AT(5, 1) + F(-0.180240f) * AT(7, 1)); - const Temp_Type X102 = D(F(0.906127f) * AT(1, 2) + F(-0.318190f) * AT(3, 2) + F(0.212608f) * AT(5, 2) + F(-0.180240f) * AT(7, 2)); - const Temp_Type X103 = D(F(0.906127f) * AT(1, 3) + F(-0.318190f) * AT(3, 3) + F(0.212608f) * AT(5, 3) + F(-0.180240f) * AT(7, 3)); - const Temp_Type X104 = D(F(0.906127f) * AT(1, 4) + F(-0.318190f) * AT(3, 4) + F(0.212608f) * AT(5, 4) + F(-0.180240f) * AT(7, 4)); - const Temp_Type X105 = D(F(0.906127f) * AT(1, 5) + F(-0.318190f) * AT(3, 5) + F(0.212608f) * AT(5, 5) + F(-0.180240f) * AT(7, 5)); - const Temp_Type X106 = D(F(0.906127f) * AT(1, 6) + F(-0.318190f) * AT(3, 6) + F(0.212608f) * AT(5, 6) + F(-0.180240f) * AT(7, 6)); - const Temp_Type X107 = D(F(0.906127f) * AT(1, 7) + F(-0.318190f) * AT(3, 7) + F(0.212608f) * AT(5, 7) + F(-0.180240f) * AT(7, 7)); - const Temp_Type X110 = AT(2, 0); - const Temp_Type X111 = AT(2, 1); - const Temp_Type X112 = AT(2, 2); - const Temp_Type X113 = AT(2, 3); - const Temp_Type X114 = AT(2, 4); - const Temp_Type X115 = AT(2, 5); - const Temp_Type X116 = AT(2, 6); - const Temp_Type X117 = AT(2, 7); - const Temp_Type X120 = D(F(-0.074658f) * AT(1, 0) + F(0.513280f) * AT(3, 0) + F(0.768178f) * AT(5, 0) + F(-0.375330f) * AT(7, 0)); - const Temp_Type X121 = D(F(-0.074658f) * AT(1, 1) + F(0.513280f) * AT(3, 1) + F(0.768178f) * AT(5, 1) + F(-0.375330f) * AT(7, 1)); - const Temp_Type X122 = D(F(-0.074658f) * AT(1, 2) + F(0.513280f) * AT(3, 2) + F(0.768178f) * AT(5, 2) + F(-0.375330f) * AT(7, 2)); - const Temp_Type X123 = D(F(-0.074658f) * AT(1, 3) + F(0.513280f) * AT(3, 3) + F(0.768178f) * AT(5, 3) + F(-0.375330f) * AT(7, 3)); - const Temp_Type X124 = D(F(-0.074658f) * AT(1, 4) + F(0.513280f) * AT(3, 4) + F(0.768178f) * AT(5, 4) + F(-0.375330f) * AT(7, 4)); - const Temp_Type X125 = D(F(-0.074658f) * AT(1, 5) + F(0.513280f) * AT(3, 5) + F(0.768178f) * AT(5, 5) + F(-0.375330f) * AT(7, 5)); - const Temp_Type X126 = D(F(-0.074658f) * AT(1, 6) + F(0.513280f) * AT(3, 6) + F(0.768178f) * AT(5, 6) + F(-0.375330f) * AT(7, 6)); - const Temp_Type X127 = D(F(-0.074658f) * AT(1, 7) + F(0.513280f) * AT(3, 7) + F(0.768178f) * AT(5, 7) + F(-0.375330f) * AT(7, 7)); - const Temp_Type X130 = AT(6, 0); - const Temp_Type X131 = AT(6, 1); - const Temp_Type X132 = AT(6, 2); - const Temp_Type X133 = AT(6, 3); - const Temp_Type X134 = AT(6, 4); - const Temp_Type X135 = AT(6, 5); - const Temp_Type X136 = AT(6, 6); - const Temp_Type X137 = AT(6, 7); - // 80 muls 48 adds - - // 4x4 = 4x8 times 8x4, matrix 1 is constant - R.at(0, 0) = X100; - R.at(0, 1) = D(X101 * F(0.415735f) + X103 * F(0.791065f) + X105 * F(-0.352443f) + X107 * F(0.277785f)); - R.at(0, 2) = X104; - R.at(0, 3) = D(X101 * F(0.022887f) + X103 * F(-0.097545f) + X105 * F(0.490393f) + X107 * F(0.865723f)); - R.at(1, 0) = X110; - R.at(1, 1) = D(X111 * F(0.415735f) + X113 * F(0.791065f) + X115 * F(-0.352443f) + X117 * F(0.277785f)); - R.at(1, 2) = X114; - R.at(1, 3) = D(X111 * F(0.022887f) + X113 * F(-0.097545f) + X115 * F(0.490393f) + X117 * F(0.865723f)); - R.at(2, 0) = X120; - R.at(2, 1) = D(X121 * F(0.415735f) + X123 * F(0.791065f) + X125 * F(-0.352443f) + X127 * F(0.277785f)); - R.at(2, 2) = X124; - R.at(2, 3) = D(X121 * F(0.022887f) + X123 * F(-0.097545f) + X125 * F(0.490393f) + X127 * F(0.865723f)); - R.at(3, 0) = X130; - R.at(3, 1) = D(X131 * F(0.415735f) + X133 * F(0.791065f) + X135 * F(-0.352443f) + X137 * F(0.277785f)); - R.at(3, 2) = X134; - R.at(3, 3) = D(X131 * F(0.022887f) + X133 * F(-0.097545f) + X135 * F(0.490393f) + X137 * F(0.865723f)); - // 40 muls 24 adds - // 4x4 = 4x8 times 8x4, matrix 1 is constant - S.at(0, 0) = D(X101 * F(0.906127f) + X103 * F(-0.318190f) + X105 * F(0.212608f) + X107 * F(-0.180240f)); - S.at(0, 1) = X102; - S.at(0, 2) = D(X101 * F(-0.074658f) + X103 * F(0.513280f) + X105 * F(0.768178f) + X107 * F(-0.375330f)); - S.at(0, 3) = X106; - S.at(1, 0) = D(X111 * F(0.906127f) + X113 * F(-0.318190f) + X115 * F(0.212608f) + X117 * F(-0.180240f)); - S.at(1, 1) = X112; - S.at(1, 2) = D(X111 * F(-0.074658f) + X113 * F(0.513280f) + X115 * F(0.768178f) + X117 * F(-0.375330f)); - S.at(1, 3) = X116; - S.at(2, 0) = D(X121 * F(0.906127f) + X123 * F(-0.318190f) + X125 * F(0.212608f) + X127 * F(-0.180240f)); - S.at(2, 1) = X122; - S.at(2, 2) = D(X121 * F(-0.074658f) + X123 * F(0.513280f) + X125 * F(0.768178f) + X127 * F(-0.375330f)); - S.at(2, 3) = X126; - S.at(3, 0) = D(X131 * F(0.906127f) + X133 * F(-0.318190f) + X135 * F(0.212608f) + X137 * F(-0.180240f)); - S.at(3, 1) = X132; - S.at(3, 2) = D(X131 * F(-0.074658f) + X133 * F(0.513280f) + X135 * F(0.768178f) + X137 * F(-0.375330f)); - S.at(3, 3) = X136; - // 40 muls 24 adds - } - }; -} // end namespace DCT_Upsample - -// Unconditionally frees all allocated m_blocks. -void jpeg_decoder::free_all_blocks() -{ - m_pStream = NULL; - for (mem_block *b = m_pMem_blocks; b; ) - { - mem_block *n = b->m_pNext; - jpgd_free(b); - b = n; - } - m_pMem_blocks = NULL; -} - -// This method handles all errors. It will never return. -// It could easily be changed to use C++ exceptions. -JPGD_NORETURN void jpeg_decoder::stop_decoding(jpgd_status status) -{ - m_error_code = status; - free_all_blocks(); - longjmp(m_jmp_state, status); -} - -void *jpeg_decoder::alloc(size_t nSize, bool zero) -{ - nSize = (JPGD_MAX(nSize, 1) + 3) & ~3; - char *rv = NULL; - for (mem_block *b = m_pMem_blocks; b; b = b->m_pNext) - { - if ((b->m_used_count + nSize) <= b->m_size) - { - rv = b->m_data + b->m_used_count; - b->m_used_count += nSize; - break; - } - } - if (!rv) - { - int capacity = JPGD_MAX(32768 - 256, (nSize + 2047) & ~2047); - mem_block *b = (mem_block*)jpgd_malloc(sizeof(mem_block) + capacity); - if (!b) { stop_decoding(JPGD_NOTENOUGHMEM); } - b->m_pNext = m_pMem_blocks; m_pMem_blocks = b; - b->m_used_count = nSize; - b->m_size = capacity; - rv = b->m_data; - } - if (zero) memset(rv, 0, nSize); - return rv; -} - -void jpeg_decoder::word_clear(void *p, uint16 c, uint n) -{ - uint8 *pD = (uint8*)p; - const uint8 l = c & 0xFF, h = (c >> 8) & 0xFF; - while (n) - { - pD[0] = l; pD[1] = h; pD += 2; - n--; - } -} - -// Refill the input buffer. -// This method will sit in a loop until (A) the buffer is full or (B) -// the stream's read() method reports and end of file condition. -void jpeg_decoder::prep_in_buffer() -{ - m_in_buf_left = 0; - m_pIn_buf_ofs = m_in_buf; - - if (m_eof_flag) - return; - - do - { - int bytes_read = m_pStream->read(m_in_buf + m_in_buf_left, JPGD_IN_BUF_SIZE - m_in_buf_left, &m_eof_flag); - if (bytes_read == -1) - stop_decoding(JPGD_STREAM_READ); - - m_in_buf_left += bytes_read; - } while ((m_in_buf_left < JPGD_IN_BUF_SIZE) && (!m_eof_flag)); - - m_total_bytes_read += m_in_buf_left; - - // Pad the end of the block with M_EOI (prevents the decompressor from going off the rails if the stream is invalid). - // (This dates way back to when this decompressor was written in C/asm, and the all-asm Huffman decoder did some fancy things to increase perf.) - word_clear(m_pIn_buf_ofs + m_in_buf_left, 0xD9FF, 64); -} - -// Read a Huffman code table. -void jpeg_decoder::read_dht_marker() -{ - int i, index, count; - uint8 huff_num[17]; - uint8 huff_val[256]; - - uint num_left = get_bits(16); - - if (num_left < 2) - stop_decoding(JPGD_BAD_DHT_MARKER); - - num_left -= 2; - - while (num_left) - { - index = get_bits(8); - - huff_num[0] = 0; - - count = 0; - - for (i = 1; i <= 16; i++) - { - huff_num[i] = static_cast(get_bits(8)); - count += huff_num[i]; - } - - if (count > 255) - stop_decoding(JPGD_BAD_DHT_COUNTS); - - for (i = 0; i < count; i++) - huff_val[i] = static_cast(get_bits(8)); - - i = 1 + 16 + count; - - if (num_left < (uint)i) - stop_decoding(JPGD_BAD_DHT_MARKER); - - num_left -= i; - - if ((index & 0x10) > 0x10) - stop_decoding(JPGD_BAD_DHT_INDEX); - - index = (index & 0x0F) + ((index & 0x10) >> 4) * (JPGD_MAX_HUFF_TABLES >> 1); - - if (index >= JPGD_MAX_HUFF_TABLES) - stop_decoding(JPGD_BAD_DHT_INDEX); - - if (!m_huff_num[index]) - m_huff_num[index] = (uint8 *)alloc(17); - - if (!m_huff_val[index]) - m_huff_val[index] = (uint8 *)alloc(256); - - m_huff_ac[index] = (index & 0x10) != 0; - memcpy(m_huff_num[index], huff_num, 17); - memcpy(m_huff_val[index], huff_val, 256); - } -} - -// Read a quantization table. -void jpeg_decoder::read_dqt_marker() -{ - int n, i, prec; - uint num_left; - uint temp; - - num_left = get_bits(16); - - if (num_left < 2) - stop_decoding(JPGD_BAD_DQT_MARKER); - - num_left -= 2; - - while (num_left) - { - n = get_bits(8); - prec = n >> 4; - n &= 0x0F; - - if (n >= JPGD_MAX_QUANT_TABLES) - stop_decoding(JPGD_BAD_DQT_TABLE); - - if (!m_quant[n]) - m_quant[n] = (jpgd_quant_t *)alloc(64 * sizeof(jpgd_quant_t)); - - // read quantization entries, in zag order - for (i = 0; i < 64; i++) - { - temp = get_bits(8); - - if (prec) - temp = (temp << 8) + get_bits(8); - - m_quant[n][i] = static_cast(temp); - } - - i = 64 + 1; - - if (prec) - i += 64; - - if (num_left < (uint)i) - stop_decoding(JPGD_BAD_DQT_LENGTH); - - num_left -= i; - } -} - -// Read the start of frame (SOF) marker. -void jpeg_decoder::read_sof_marker() -{ - int i; - uint num_left; - - num_left = get_bits(16); - - if (get_bits(8) != 8) /* precision: sorry, only 8-bit precision is supported right now */ - stop_decoding(JPGD_BAD_PRECISION); - - m_image_y_size = get_bits(16); - - if ((m_image_y_size < 1) || (m_image_y_size > JPGD_MAX_HEIGHT)) - stop_decoding(JPGD_BAD_HEIGHT); - - m_image_x_size = get_bits(16); - - if ((m_image_x_size < 1) || (m_image_x_size > JPGD_MAX_WIDTH)) - stop_decoding(JPGD_BAD_WIDTH); - - m_comps_in_frame = get_bits(8); - - if (m_comps_in_frame > JPGD_MAX_COMPONENTS) - stop_decoding(JPGD_TOO_MANY_COMPONENTS); - - if (num_left != (uint)(m_comps_in_frame * 3 + 8)) - stop_decoding(JPGD_BAD_SOF_LENGTH); - - for (i = 0; i < m_comps_in_frame; i++) - { - m_comp_ident[i] = get_bits(8); - m_comp_h_samp[i] = get_bits(4); - m_comp_v_samp[i] = get_bits(4); - m_comp_quant[i] = get_bits(8); - } -} - -// Used to skip unrecognized markers. -void jpeg_decoder::skip_variable_marker() -{ - uint num_left; - - num_left = get_bits(16); - - if (num_left < 2) - stop_decoding(JPGD_BAD_VARIABLE_MARKER); - - num_left -= 2; - - while (num_left) - { - get_bits(8); - num_left--; - } -} - -// Read a define restart interval (DRI) marker. -void jpeg_decoder::read_dri_marker() -{ - if (get_bits(16) != 4) - stop_decoding(JPGD_BAD_DRI_LENGTH); - - m_restart_interval = get_bits(16); -} - -// Read a start of scan (SOS) marker. -void jpeg_decoder::read_sos_marker() -{ - uint num_left; - int i, ci, n, c, cc; - - num_left = get_bits(16); - - n = get_bits(8); - - m_comps_in_scan = n; - - num_left -= 3; - - if ( (num_left != (uint)(n * 2 + 3)) || (n < 1) || (n > JPGD_MAX_COMPS_IN_SCAN) ) - stop_decoding(JPGD_BAD_SOS_LENGTH); - - for (i = 0; i < n; i++) - { - cc = get_bits(8); - c = get_bits(8); - num_left -= 2; - - for (ci = 0; ci < m_comps_in_frame; ci++) - if (cc == m_comp_ident[ci]) - break; - - if (ci >= m_comps_in_frame) - stop_decoding(JPGD_BAD_SOS_COMP_ID); - - m_comp_list[i] = ci; - m_comp_dc_tab[ci] = (c >> 4) & 15; - m_comp_ac_tab[ci] = (c & 15) + (JPGD_MAX_HUFF_TABLES >> 1); - } - - m_spectral_start = get_bits(8); - m_spectral_end = get_bits(8); - m_successive_high = get_bits(4); - m_successive_low = get_bits(4); - - if (!m_progressive_flag) - { - m_spectral_start = 0; - m_spectral_end = 63; - } - - num_left -= 3; - - while (num_left) /* read past whatever is num_left */ - { - get_bits(8); - num_left--; - } -} - -// Finds the next marker. -int jpeg_decoder::next_marker() -{ - uint c, bytes; - - bytes = 0; - - do - { - do - { - bytes++; - c = get_bits(8); - } while (c != 0xFF); - - do - { - c = get_bits(8); - } while (c == 0xFF); - - } while (c == 0); - - // If bytes > 0 here, there where extra bytes before the marker (not good). - - return c; -} - -// Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is -// encountered. -int jpeg_decoder::process_markers() -{ - int c; - - for ( ; ; ) - { - c = next_marker(); - - switch (c) - { - case M_SOF0: - case M_SOF1: - case M_SOF2: - case M_SOF3: - case M_SOF5: - case M_SOF6: - case M_SOF7: -// case M_JPG: - case M_SOF9: - case M_SOF10: - case M_SOF11: - case M_SOF13: - case M_SOF14: - case M_SOF15: - case M_SOI: - case M_EOI: - case M_SOS: - { - return c; - } - case M_DHT: - { - read_dht_marker(); - break; - } - // No arithmitic support - dumb patents! - case M_DAC: - { - stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); - break; - } - case M_DQT: - { - read_dqt_marker(); - break; - } - case M_DRI: - { - read_dri_marker(); - break; - } - //case M_APP0: /* no need to read the JFIF marker */ - - case M_JPG: - case M_RST0: /* no parameters */ - case M_RST1: - case M_RST2: - case M_RST3: - case M_RST4: - case M_RST5: - case M_RST6: - case M_RST7: - case M_TEM: - { - stop_decoding(JPGD_UNEXPECTED_MARKER); - break; - } - default: /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */ - { - skip_variable_marker(); - break; - } - } - } -} - -// Finds the start of image (SOI) marker. -// This code is rather defensive: it only checks the first 512 bytes to avoid -// false positives. -void jpeg_decoder::locate_soi_marker() -{ - uint lastchar, thischar; - uint bytesleft; - - lastchar = get_bits(8); - - thischar = get_bits(8); - - /* ok if it's a normal JPEG file without a special header */ - - if ((lastchar == 0xFF) && (thischar == M_SOI)) - return; - - bytesleft = 4096; //512; - - for ( ; ; ) - { - if (--bytesleft == 0) - stop_decoding(JPGD_NOT_JPEG); - - lastchar = thischar; - - thischar = get_bits(8); - - if (lastchar == 0xFF) - { - if (thischar == M_SOI) - break; - else if (thischar == M_EOI) // get_bits will keep returning M_EOI if we read past the end - stop_decoding(JPGD_NOT_JPEG); - } - } - - // Check the next character after marker: if it's not 0xFF, it can't be the start of the next marker, so the file is bad. - thischar = (m_bit_buf >> 24) & 0xFF; - - if (thischar != 0xFF) - stop_decoding(JPGD_NOT_JPEG); -} - -// Find a start of frame (SOF) marker. -void jpeg_decoder::locate_sof_marker() -{ - locate_soi_marker(); - - int c = process_markers(); - - switch (c) - { - case M_SOF2: - m_progressive_flag = JPGD_TRUE; - case M_SOF0: /* baseline DCT */ - case M_SOF1: /* extended sequential DCT */ - { - read_sof_marker(); - break; - } - case M_SOF9: /* Arithmitic coding */ - { - stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); - break; - } - default: - { - stop_decoding(JPGD_UNSUPPORTED_MARKER); - break; - } - } -} - -// Find a start of scan (SOS) marker. -int jpeg_decoder::locate_sos_marker() -{ - int c; - - c = process_markers(); - - if (c == M_EOI) - return JPGD_FALSE; - else if (c != M_SOS) - stop_decoding(JPGD_UNEXPECTED_MARKER); - - read_sos_marker(); - - return JPGD_TRUE; -} - -// Reset everything to default/uninitialized state. -void jpeg_decoder::init(jpeg_decoder_stream *pStream) -{ - m_pMem_blocks = NULL; - m_error_code = JPGD_SUCCESS; - m_ready_flag = false; - m_image_x_size = m_image_y_size = 0; - m_pStream = pStream; - m_progressive_flag = JPGD_FALSE; - - memset(m_huff_ac, 0, sizeof(m_huff_ac)); - memset(m_huff_num, 0, sizeof(m_huff_num)); - memset(m_huff_val, 0, sizeof(m_huff_val)); - memset(m_quant, 0, sizeof(m_quant)); - - m_scan_type = 0; - m_comps_in_frame = 0; - - memset(m_comp_h_samp, 0, sizeof(m_comp_h_samp)); - memset(m_comp_v_samp, 0, sizeof(m_comp_v_samp)); - memset(m_comp_quant, 0, sizeof(m_comp_quant)); - memset(m_comp_ident, 0, sizeof(m_comp_ident)); - memset(m_comp_h_blocks, 0, sizeof(m_comp_h_blocks)); - memset(m_comp_v_blocks, 0, sizeof(m_comp_v_blocks)); - - m_comps_in_scan = 0; - memset(m_comp_list, 0, sizeof(m_comp_list)); - memset(m_comp_dc_tab, 0, sizeof(m_comp_dc_tab)); - memset(m_comp_ac_tab, 0, sizeof(m_comp_ac_tab)); - - m_spectral_start = 0; - m_spectral_end = 0; - m_successive_low = 0; - m_successive_high = 0; - m_max_mcu_x_size = 0; - m_max_mcu_y_size = 0; - m_blocks_per_mcu = 0; - m_max_blocks_per_row = 0; - m_mcus_per_row = 0; - m_mcus_per_col = 0; - m_expanded_blocks_per_component = 0; - m_expanded_blocks_per_mcu = 0; - m_expanded_blocks_per_row = 0; - m_freq_domain_chroma_upsample = false; - - memset(m_mcu_org, 0, sizeof(m_mcu_org)); - - m_total_lines_left = 0; - m_mcu_lines_left = 0; - m_real_dest_bytes_per_scan_line = 0; - m_dest_bytes_per_scan_line = 0; - m_dest_bytes_per_pixel = 0; - - memset(m_pHuff_tabs, 0, sizeof(m_pHuff_tabs)); - - memset(m_dc_coeffs, 0, sizeof(m_dc_coeffs)); - memset(m_ac_coeffs, 0, sizeof(m_ac_coeffs)); - memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); - - m_eob_run = 0; - - memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); - - m_pIn_buf_ofs = m_in_buf; - m_in_buf_left = 0; - m_eof_flag = false; - m_tem_flag = 0; - - memset(m_in_buf_pad_start, 0, sizeof(m_in_buf_pad_start)); - memset(m_in_buf, 0, sizeof(m_in_buf)); - memset(m_in_buf_pad_end, 0, sizeof(m_in_buf_pad_end)); - - m_restart_interval = 0; - m_restarts_left = 0; - m_next_restart_num = 0; - - m_max_mcus_per_row = 0; - m_max_blocks_per_mcu = 0; - m_max_mcus_per_col = 0; - - memset(m_last_dc_val, 0, sizeof(m_last_dc_val)); - m_pMCU_coefficients = NULL; - m_pSample_buf = NULL; - - m_total_bytes_read = 0; - - m_pScan_line_0 = NULL; - m_pScan_line_1 = NULL; - - // Ready the input buffer. - prep_in_buffer(); - - // Prime the bit buffer. - m_bits_left = 16; - m_bit_buf = 0; - - get_bits(16); - get_bits(16); - - for (int i = 0; i < JPGD_MAX_BLOCKS_PER_MCU; i++) - m_mcu_block_max_zag[i] = 64; -} - -#define SCALEBITS 16 -#define ONE_HALF ((int) 1 << (SCALEBITS-1)) -#define FIX(x) ((int) ((x) * (1L<> SCALEBITS; - m_cbb[i] = ( FIX(1.77200f) * k + ONE_HALF) >> SCALEBITS; - m_crg[i] = (-FIX(0.71414f)) * k; - m_cbg[i] = (-FIX(0.34414f)) * k + ONE_HALF; - } -} - -// This method throws back into the stream any bytes that where read -// into the bit buffer during initial marker scanning. -void jpeg_decoder::fix_in_buffer() -{ - // In case any 0xFF's where pulled into the buffer during marker scanning. - JPGD_ASSERT((m_bits_left & 7) == 0); - - if (m_bits_left == 16) - stuff_char( (uint8)(m_bit_buf & 0xFF)); - - if (m_bits_left >= 8) - stuff_char( (uint8)((m_bit_buf >> 8) & 0xFF)); - - stuff_char((uint8)((m_bit_buf >> 16) & 0xFF)); - stuff_char((uint8)((m_bit_buf >> 24) & 0xFF)); - - m_bits_left = 16; - get_bits_no_markers(16); - get_bits_no_markers(16); -} - -void jpeg_decoder::transform_mcu(int mcu_row) -{ - jpgd_block_t* pSrc_ptr = m_pMCU_coefficients; - uint8* pDst_ptr = m_pSample_buf + mcu_row * m_blocks_per_mcu * 64; - - for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) - { - idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block]); - pSrc_ptr += 64; - pDst_ptr += 64; - } -} - -static const uint8 s_max_rc[64] = -{ - 17, 18, 34, 50, 50, 51, 52, 52, 52, 68, 84, 84, 84, 84, 85, 86, 86, 86, 86, 86, - 102, 118, 118, 118, 118, 118, 118, 119, 120, 120, 120, 120, 120, 120, 120, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136 -}; - -void jpeg_decoder::transform_mcu_expand(int mcu_row) -{ - jpgd_block_t* pSrc_ptr = m_pMCU_coefficients; - uint8* pDst_ptr = m_pSample_buf + mcu_row * m_expanded_blocks_per_mcu * 64; - - // Y IDCT - int mcu_block; - for (mcu_block = 0; mcu_block < m_expanded_blocks_per_component; mcu_block++) - { - idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block]); - pSrc_ptr += 64; - pDst_ptr += 64; - } - - // Chroma IDCT, with upsampling - jpgd_block_t temp_block[64]; - - for (int i = 0; i < 2; i++) - { - DCT_Upsample::Matrix44 P, Q, R, S; - - JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] >= 1); - JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] <= 64); - - int max_zag = m_mcu_block_max_zag[mcu_block++] - 1; - if (max_zag <= 0) max_zag = 0; // should never happen, only here to shut up static analysis - switch (s_max_rc[max_zag]) - { - case 1*16+1: - DCT_Upsample::P_Q<1, 1>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<1, 1>::calc(R, S, pSrc_ptr); - break; - case 1*16+2: - DCT_Upsample::P_Q<1, 2>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<1, 2>::calc(R, S, pSrc_ptr); - break; - case 2*16+2: - DCT_Upsample::P_Q<2, 2>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<2, 2>::calc(R, S, pSrc_ptr); - break; - case 3*16+2: - DCT_Upsample::P_Q<3, 2>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<3, 2>::calc(R, S, pSrc_ptr); - break; - case 3*16+3: - DCT_Upsample::P_Q<3, 3>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<3, 3>::calc(R, S, pSrc_ptr); - break; - case 3*16+4: - DCT_Upsample::P_Q<3, 4>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<3, 4>::calc(R, S, pSrc_ptr); - break; - case 4*16+4: - DCT_Upsample::P_Q<4, 4>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<4, 4>::calc(R, S, pSrc_ptr); - break; - case 5*16+4: - DCT_Upsample::P_Q<5, 4>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<5, 4>::calc(R, S, pSrc_ptr); - break; - case 5*16+5: - DCT_Upsample::P_Q<5, 5>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<5, 5>::calc(R, S, pSrc_ptr); - break; - case 5*16+6: - DCT_Upsample::P_Q<5, 6>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<5, 6>::calc(R, S, pSrc_ptr); - break; - case 6*16+6: - DCT_Upsample::P_Q<6, 6>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<6, 6>::calc(R, S, pSrc_ptr); - break; - case 7*16+6: - DCT_Upsample::P_Q<7, 6>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<7, 6>::calc(R, S, pSrc_ptr); - break; - case 7*16+7: - DCT_Upsample::P_Q<7, 7>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<7, 7>::calc(R, S, pSrc_ptr); - break; - case 7*16+8: - DCT_Upsample::P_Q<7, 8>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<7, 8>::calc(R, S, pSrc_ptr); - break; - case 8*16+8: - DCT_Upsample::P_Q<8, 8>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<8, 8>::calc(R, S, pSrc_ptr); - break; - default: - JPGD_ASSERT(false); - } - - DCT_Upsample::Matrix44 a(P + Q); P -= Q; - DCT_Upsample::Matrix44& b = P; - DCT_Upsample::Matrix44 c(R + S); R -= S; - DCT_Upsample::Matrix44& d = R; - - DCT_Upsample::Matrix44::add_and_store(temp_block, a, c); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - DCT_Upsample::Matrix44::sub_and_store(temp_block, a, c); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - DCT_Upsample::Matrix44::add_and_store(temp_block, b, d); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - DCT_Upsample::Matrix44::sub_and_store(temp_block, b, d); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - pSrc_ptr += 64; - } -} - -// Loads and dequantizes the next row of (already decoded) coefficients. -// Progressive images only. -void jpeg_decoder::load_next_row() -{ - int i; - jpgd_block_t *p; - jpgd_quant_t *q; - int mcu_row, mcu_block, row_block = 0; - int component_num, component_id; - int block_x_mcu[JPGD_MAX_COMPONENTS]; - - memset(block_x_mcu, 0, JPGD_MAX_COMPONENTS * sizeof(int)); - - for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) - { - int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; - - for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) - { - component_id = m_mcu_org[mcu_block]; - q = m_quant[m_comp_quant[component_id]]; - - p = m_pMCU_coefficients + 64 * mcu_block; - - jpgd_block_t* pAC = coeff_buf_getp(m_ac_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); - jpgd_block_t* pDC = coeff_buf_getp(m_dc_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); - p[0] = pDC[0]; - memcpy(&p[1], &pAC[1], 63 * sizeof(jpgd_block_t)); - - for (i = 63; i > 0; i--) - if (p[g_ZAG[i]]) - break; - - m_mcu_block_max_zag[mcu_block] = i + 1; - - for ( ; i >= 0; i--) - if (p[g_ZAG[i]]) - p[g_ZAG[i]] = static_cast(p[g_ZAG[i]] * q[i]); - - row_block++; - - if (m_comps_in_scan == 1) - block_x_mcu[component_id]++; - else - { - if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) - { - block_x_mcu_ofs = 0; - - if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) - { - block_y_mcu_ofs = 0; - - block_x_mcu[component_id] += m_comp_h_samp[component_id]; - } - } - } - } - - if (m_freq_domain_chroma_upsample) - transform_mcu_expand(mcu_row); - else - transform_mcu(mcu_row); - } - - if (m_comps_in_scan == 1) - m_block_y_mcu[m_comp_list[0]]++; - else - { - for (component_num = 0; component_num < m_comps_in_scan; component_num++) - { - component_id = m_comp_list[component_num]; - - m_block_y_mcu[component_id] += m_comp_v_samp[component_id]; - } - } -} - -// Restart interval processing. -void jpeg_decoder::process_restart() -{ - int i; - int c = 0; - - // Align to a byte boundry - // FIXME: Is this really necessary? get_bits_no_markers() never reads in markers! - //get_bits_no_markers(m_bits_left & 7); - - // Let's scan a little bit to find the marker, but not _too_ far. - // 1536 is a "fudge factor" that determines how much to scan. - for (i = 1536; i > 0; i--) - if (get_char() == 0xFF) - break; - - if (i == 0) - stop_decoding(JPGD_BAD_RESTART_MARKER); - - for ( ; i > 0; i--) - if ((c = get_char()) != 0xFF) - break; - - if (i == 0) - stop_decoding(JPGD_BAD_RESTART_MARKER); - - // Is it the expected marker? If not, something bad happened. - if (c != (m_next_restart_num + M_RST0)) - stop_decoding(JPGD_BAD_RESTART_MARKER); - - // Reset each component's DC prediction values. - memset(&m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); - - m_eob_run = 0; - - m_restarts_left = m_restart_interval; - - m_next_restart_num = (m_next_restart_num + 1) & 7; - - // Get the bit buffer going again... - - m_bits_left = 16; - get_bits_no_markers(16); - get_bits_no_markers(16); -} - -static inline int dequantize_ac(int c, int q) { c *= q; return c; } - -// Decodes and dequantizes the next row of coefficients. -void jpeg_decoder::decode_next_row() -{ - int row_block = 0; - - for (int mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) - { - if ((m_restart_interval) && (m_restarts_left == 0)) - process_restart(); - - jpgd_block_t* p = m_pMCU_coefficients; - for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++, p += 64) - { - int component_id = m_mcu_org[mcu_block]; - jpgd_quant_t* q = m_quant[m_comp_quant[component_id]]; - - int r, s; - s = huff_decode(m_pHuff_tabs[m_comp_dc_tab[component_id]], r); - s = JPGD_HUFF_EXTEND(r, s); - - m_last_dc_val[component_id] = (s += m_last_dc_val[component_id]); - - p[0] = static_cast(s * q[0]); - - int prev_num_set = m_mcu_block_max_zag[mcu_block]; - - huff_tables *pH = m_pHuff_tabs[m_comp_ac_tab[component_id]]; - - int k; - for (k = 1; k < 64; k++) - { - int extra_bits; - s = huff_decode(pH, extra_bits); - - r = s >> 4; - s &= 15; - - if (s) - { - if (r) - { - if ((k + r) > 63) - stop_decoding(JPGD_DECODE_ERROR); - - if (k < prev_num_set) - { - int n = JPGD_MIN(r, prev_num_set - k); - int kt = k; - while (n--) - p[g_ZAG[kt++]] = 0; - } - - k += r; - } - - s = JPGD_HUFF_EXTEND(extra_bits, s); - - JPGD_ASSERT(k < 64); - - p[g_ZAG[k]] = static_cast(dequantize_ac(s, q[k])); //s * q[k]; - } - else - { - if (r == 15) - { - if ((k + 16) > 64) - stop_decoding(JPGD_DECODE_ERROR); - - if (k < prev_num_set) - { - int n = JPGD_MIN(16, prev_num_set - k); - int kt = k; - while (n--) - { - JPGD_ASSERT(kt <= 63); - p[g_ZAG[kt++]] = 0; - } - } - - k += 16 - 1; // - 1 because the loop counter is k - JPGD_ASSERT(p[g_ZAG[k]] == 0); - } - else - break; - } - } - - if (k < prev_num_set) - { - int kt = k; - while (kt < prev_num_set) - p[g_ZAG[kt++]] = 0; - } - - m_mcu_block_max_zag[mcu_block] = k; - - row_block++; - } - - if (m_freq_domain_chroma_upsample) - transform_mcu_expand(mcu_row); - else - transform_mcu(mcu_row); - - m_restarts_left--; - } -} - -// YCbCr H1V1 (1x1:1:1, 3 m_blocks per MCU) to RGB -void jpeg_decoder::H1V1Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d = m_pScan_line_0; - uint8 *s = m_pSample_buf + row * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int j = 0; j < 8; j++) - { - int y = s[j]; - int cb = s[64+j]; - int cr = s[128+j]; - - d[0] = clamp(y + m_crr[cr]); - d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16)); - d[2] = clamp(y + m_cbb[cb]); - d[3] = 255; - - d += 4; - } - - s += 64*3; - } -} - -// YCbCr H2V1 (2x1:1:1, 4 m_blocks per MCU) to RGB -void jpeg_decoder::H2V1Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d0 = m_pScan_line_0; - uint8 *y = m_pSample_buf + row * 8; - uint8 *c = m_pSample_buf + 2*64 + row * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int l = 0; l < 2; l++) - { - for (int j = 0; j < 4; j++) - { - int cb = c[0]; - int cr = c[64]; - - int rc = m_crr[cr]; - int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); - int bc = m_cbb[cb]; - - int yy = y[j<<1]; - d0[0] = clamp(yy+rc); - d0[1] = clamp(yy+gc); - d0[2] = clamp(yy+bc); - d0[3] = 255; - - yy = y[(j<<1)+1]; - d0[4] = clamp(yy+rc); - d0[5] = clamp(yy+gc); - d0[6] = clamp(yy+bc); - d0[7] = 255; - - d0 += 8; - - c++; - } - y += 64; - } - - y += 64*4 - 64*2; - c += 64*4 - 8; - } -} - -// YCbCr H2V1 (1x2:1:1, 4 m_blocks per MCU) to RGB -void jpeg_decoder::H1V2Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d0 = m_pScan_line_0; - uint8 *d1 = m_pScan_line_1; - uint8 *y; - uint8 *c; - - if (row < 8) - y = m_pSample_buf + row * 8; - else - y = m_pSample_buf + 64*1 + (row & 7) * 8; - - c = m_pSample_buf + 64*2 + (row >> 1) * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int j = 0; j < 8; j++) - { - int cb = c[0+j]; - int cr = c[64+j]; - - int rc = m_crr[cr]; - int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); - int bc = m_cbb[cb]; - - int yy = y[j]; - d0[0] = clamp(yy+rc); - d0[1] = clamp(yy+gc); - d0[2] = clamp(yy+bc); - d0[3] = 255; - - yy = y[8+j]; - d1[0] = clamp(yy+rc); - d1[1] = clamp(yy+gc); - d1[2] = clamp(yy+bc); - d1[3] = 255; - - d0 += 4; - d1 += 4; - } - - y += 64*4; - c += 64*4; - } -} - -// YCbCr H2V2 (2x2:1:1, 6 m_blocks per MCU) to RGB -void jpeg_decoder::H2V2Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d0 = m_pScan_line_0; - uint8 *d1 = m_pScan_line_1; - uint8 *y; - uint8 *c; - - if (row < 8) - y = m_pSample_buf + row * 8; - else - y = m_pSample_buf + 64*2 + (row & 7) * 8; - - c = m_pSample_buf + 64*4 + (row >> 1) * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int l = 0; l < 2; l++) - { - for (int j = 0; j < 8; j += 2) - { - int cb = c[0]; - int cr = c[64]; - - int rc = m_crr[cr]; - int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); - int bc = m_cbb[cb]; - - int yy = y[j]; - d0[0] = clamp(yy+rc); - d0[1] = clamp(yy+gc); - d0[2] = clamp(yy+bc); - d0[3] = 255; - - yy = y[j+1]; - d0[4] = clamp(yy+rc); - d0[5] = clamp(yy+gc); - d0[6] = clamp(yy+bc); - d0[7] = 255; - - yy = y[j+8]; - d1[0] = clamp(yy+rc); - d1[1] = clamp(yy+gc); - d1[2] = clamp(yy+bc); - d1[3] = 255; - - yy = y[j+8+1]; - d1[4] = clamp(yy+rc); - d1[5] = clamp(yy+gc); - d1[6] = clamp(yy+bc); - d1[7] = 255; - - d0 += 8; - d1 += 8; - - c++; - } - y += 64; - } - - y += 64*6 - 64*2; - c += 64*6 - 8; - } -} - -// Y (1 block per MCU) to 8-bit grayscale -void jpeg_decoder::gray_convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d = m_pScan_line_0; - uint8 *s = m_pSample_buf + row * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - *(uint *)d = *(uint *)s; - *(uint *)(&d[4]) = *(uint *)(&s[4]); - - s += 64; - d += 8; - } -} - -void jpeg_decoder::expanded_convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - - uint8* Py = m_pSample_buf + (row / 8) * 64 * m_comp_h_samp[0] + (row & 7) * 8; - - uint8* d = m_pScan_line_0; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int k = 0; k < m_max_mcu_x_size; k += 8) - { - const int Y_ofs = k * 8; - const int Cb_ofs = Y_ofs + 64 * m_expanded_blocks_per_component; - const int Cr_ofs = Y_ofs + 64 * m_expanded_blocks_per_component * 2; - for (int j = 0; j < 8; j++) - { - int y = Py[Y_ofs + j]; - int cb = Py[Cb_ofs + j]; - int cr = Py[Cr_ofs + j]; - - d[0] = clamp(y + m_crr[cr]); - d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16)); - d[2] = clamp(y + m_cbb[cb]); - d[3] = 255; - - d += 4; - } - } - - Py += 64 * m_expanded_blocks_per_mcu; - } -} - -// Find end of image (EOI) marker, so we can return to the user the exact size of the input stream. -void jpeg_decoder::find_eoi() -{ - if (!m_progressive_flag) - { - // Attempt to read the EOI marker. - //get_bits_no_markers(m_bits_left & 7); - - // Prime the bit buffer - m_bits_left = 16; - get_bits(16); - get_bits(16); - - // The next marker _should_ be EOI - process_markers(); - } - - m_total_bytes_read -= m_in_buf_left; -} - -int jpeg_decoder::decode(const void** pScan_line, uint* pScan_line_len) -{ - if ((m_error_code) || (!m_ready_flag)) - return JPGD_FAILED; - - if (m_total_lines_left == 0) - return JPGD_DONE; - - if (m_mcu_lines_left == 0) - { - if (setjmp(m_jmp_state)) - return JPGD_FAILED; - - if (m_progressive_flag) - load_next_row(); - else - decode_next_row(); - - // Find the EOI marker if that was the last row. - if (m_total_lines_left <= m_max_mcu_y_size) - find_eoi(); - - m_mcu_lines_left = m_max_mcu_y_size; - } - - if (m_freq_domain_chroma_upsample) - { - expanded_convert(); - *pScan_line = m_pScan_line_0; - } - else - { - switch (m_scan_type) - { - case JPGD_YH2V2: - { - if ((m_mcu_lines_left & 1) == 0) - { - H2V2Convert(); - *pScan_line = m_pScan_line_0; - } - else - *pScan_line = m_pScan_line_1; - - break; - } - case JPGD_YH2V1: - { - H2V1Convert(); - *pScan_line = m_pScan_line_0; - break; - } - case JPGD_YH1V2: - { - if ((m_mcu_lines_left & 1) == 0) - { - H1V2Convert(); - *pScan_line = m_pScan_line_0; - } - else - *pScan_line = m_pScan_line_1; - - break; - } - case JPGD_YH1V1: - { - H1V1Convert(); - *pScan_line = m_pScan_line_0; - break; - } - case JPGD_GRAYSCALE: - { - gray_convert(); - *pScan_line = m_pScan_line_0; - - break; - } - } - } - - *pScan_line_len = m_real_dest_bytes_per_scan_line; - - m_mcu_lines_left--; - m_total_lines_left--; - - return JPGD_SUCCESS; -} - -// Creates the tables needed for efficient Huffman decoding. -void jpeg_decoder::make_huff_table(int index, huff_tables *pH) -{ - int p, i, l, si; - uint8 huffsize[257]; - uint huffcode[257]; - uint code; - uint subtree; - int code_size; - int lastp; - int nextfreeentry; - int currententry; - - pH->ac_table = m_huff_ac[index] != 0; - - p = 0; - - for (l = 1; l <= 16; l++) - { - for (i = 1; i <= m_huff_num[index][l]; i++) - huffsize[p++] = static_cast(l); - } - - huffsize[p] = 0; - - lastp = p; - - code = 0; - si = huffsize[0]; - p = 0; - - while (huffsize[p]) - { - while (huffsize[p] == si) - { - huffcode[p++] = code; - code++; - } - - code <<= 1; - si++; - } - - memset(pH->look_up, 0, sizeof(pH->look_up)); - memset(pH->look_up2, 0, sizeof(pH->look_up2)); - memset(pH->tree, 0, sizeof(pH->tree)); - memset(pH->code_size, 0, sizeof(pH->code_size)); - - nextfreeentry = -1; - - p = 0; - - while (p < lastp) - { - i = m_huff_val[index][p]; - code = huffcode[p]; - code_size = huffsize[p]; - - pH->code_size[i] = static_cast(code_size); - - if (code_size <= 8) - { - code <<= (8 - code_size); - - for (l = 1 << (8 - code_size); l > 0; l--) - { - JPGD_ASSERT(i < 256); - - pH->look_up[code] = i; - - bool has_extrabits = false; - int extra_bits = 0; - int num_extra_bits = i & 15; - - int bits_to_fetch = code_size; - if (num_extra_bits) - { - int total_codesize = code_size + num_extra_bits; - if (total_codesize <= 8) - { - has_extrabits = true; - extra_bits = ((1 << num_extra_bits) - 1) & (code >> (8 - total_codesize)); - JPGD_ASSERT(extra_bits <= 0x7FFF); - bits_to_fetch += num_extra_bits; - } - } - - if (!has_extrabits) - pH->look_up2[code] = i | (bits_to_fetch << 8); - else - pH->look_up2[code] = i | 0x8000 | (extra_bits << 16) | (bits_to_fetch << 8); - - code++; - } - } - else - { - subtree = (code >> (code_size - 8)) & 0xFF; - - currententry = pH->look_up[subtree]; - - if (currententry == 0) - { - pH->look_up[subtree] = currententry = nextfreeentry; - pH->look_up2[subtree] = currententry = nextfreeentry; - - nextfreeentry -= 2; - } - - code <<= (16 - (code_size - 8)); - - for (l = code_size; l > 9; l--) - { - if ((code & 0x8000) == 0) - currententry--; - - if (pH->tree[-currententry - 1] == 0) - { - pH->tree[-currententry - 1] = nextfreeentry; - - currententry = nextfreeentry; - - nextfreeentry -= 2; - } - else - currententry = pH->tree[-currententry - 1]; - - code <<= 1; - } - - if ((code & 0x8000) == 0) - currententry--; - - pH->tree[-currententry - 1] = i; - } - - p++; - } -} - -// Verifies the quantization tables needed for this scan are available. -void jpeg_decoder::check_quant_tables() -{ - for (int i = 0; i < m_comps_in_scan; i++) - if (m_quant[m_comp_quant[m_comp_list[i]]] == NULL) - stop_decoding(JPGD_UNDEFINED_QUANT_TABLE); -} - -// Verifies that all the Huffman tables needed for this scan are available. -void jpeg_decoder::check_huff_tables() -{ - for (int i = 0; i < m_comps_in_scan; i++) - { - if ((m_spectral_start == 0) && (m_huff_num[m_comp_dc_tab[m_comp_list[i]]] == NULL)) - stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); - - if ((m_spectral_end > 0) && (m_huff_num[m_comp_ac_tab[m_comp_list[i]]] == NULL)) - stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); - } - - for (int i = 0; i < JPGD_MAX_HUFF_TABLES; i++) - if (m_huff_num[i]) - { - if (!m_pHuff_tabs[i]) - m_pHuff_tabs[i] = (huff_tables *)alloc(sizeof(huff_tables)); - - make_huff_table(i, m_pHuff_tabs[i]); - } -} - -// Determines the component order inside each MCU. -// Also calcs how many MCU's are on each row, etc. -void jpeg_decoder::calc_mcu_block_order() -{ - int component_num, component_id; - int max_h_samp = 0, max_v_samp = 0; - - for (component_id = 0; component_id < m_comps_in_frame; component_id++) - { - if (m_comp_h_samp[component_id] > max_h_samp) - max_h_samp = m_comp_h_samp[component_id]; - - if (m_comp_v_samp[component_id] > max_v_samp) - max_v_samp = m_comp_v_samp[component_id]; - } - - for (component_id = 0; component_id < m_comps_in_frame; component_id++) - { - m_comp_h_blocks[component_id] = ((((m_image_x_size * m_comp_h_samp[component_id]) + (max_h_samp - 1)) / max_h_samp) + 7) / 8; - m_comp_v_blocks[component_id] = ((((m_image_y_size * m_comp_v_samp[component_id]) + (max_v_samp - 1)) / max_v_samp) + 7) / 8; - } - - if (m_comps_in_scan == 1) - { - m_mcus_per_row = m_comp_h_blocks[m_comp_list[0]]; - m_mcus_per_col = m_comp_v_blocks[m_comp_list[0]]; - } - else - { - m_mcus_per_row = (((m_image_x_size + 7) / 8) + (max_h_samp - 1)) / max_h_samp; - m_mcus_per_col = (((m_image_y_size + 7) / 8) + (max_v_samp - 1)) / max_v_samp; - } - - if (m_comps_in_scan == 1) - { - m_mcu_org[0] = m_comp_list[0]; - - m_blocks_per_mcu = 1; - } - else - { - m_blocks_per_mcu = 0; - - for (component_num = 0; component_num < m_comps_in_scan; component_num++) - { - int num_blocks; - - component_id = m_comp_list[component_num]; - - num_blocks = m_comp_h_samp[component_id] * m_comp_v_samp[component_id]; - - while (num_blocks--) - m_mcu_org[m_blocks_per_mcu++] = component_id; - } - } -} - -// Starts a new scan. -int jpeg_decoder::init_scan() -{ - if (!locate_sos_marker()) - return JPGD_FALSE; - - calc_mcu_block_order(); - - check_huff_tables(); - - check_quant_tables(); - - memset(m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); - - m_eob_run = 0; - - if (m_restart_interval) - { - m_restarts_left = m_restart_interval; - m_next_restart_num = 0; - } - - fix_in_buffer(); - - return JPGD_TRUE; -} - -// Starts a frame. Determines if the number of components or sampling factors -// are supported. -void jpeg_decoder::init_frame() -{ - int i; - - if (m_comps_in_frame == 1) - { - if ((m_comp_h_samp[0] != 1) || (m_comp_v_samp[0] != 1)) - stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); - - m_scan_type = JPGD_GRAYSCALE; - m_max_blocks_per_mcu = 1; - m_max_mcu_x_size = 8; - m_max_mcu_y_size = 8; - } - else if (m_comps_in_frame == 3) - { - if ( ((m_comp_h_samp[1] != 1) || (m_comp_v_samp[1] != 1)) || - ((m_comp_h_samp[2] != 1) || (m_comp_v_samp[2] != 1)) ) - stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); - - if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 1)) - { - m_scan_type = JPGD_YH1V1; - - m_max_blocks_per_mcu = 3; - m_max_mcu_x_size = 8; - m_max_mcu_y_size = 8; - } - else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 1)) - { - m_scan_type = JPGD_YH2V1; - m_max_blocks_per_mcu = 4; - m_max_mcu_x_size = 16; - m_max_mcu_y_size = 8; - } - else if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 2)) - { - m_scan_type = JPGD_YH1V2; - m_max_blocks_per_mcu = 4; - m_max_mcu_x_size = 8; - m_max_mcu_y_size = 16; - } - else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 2)) - { - m_scan_type = JPGD_YH2V2; - m_max_blocks_per_mcu = 6; - m_max_mcu_x_size = 16; - m_max_mcu_y_size = 16; - } - else - stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); - } - else - stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); - - m_max_mcus_per_row = (m_image_x_size + (m_max_mcu_x_size - 1)) / m_max_mcu_x_size; - m_max_mcus_per_col = (m_image_y_size + (m_max_mcu_y_size - 1)) / m_max_mcu_y_size; - - // These values are for the *destination* pixels: after conversion. - if (m_scan_type == JPGD_GRAYSCALE) - m_dest_bytes_per_pixel = 1; - else - m_dest_bytes_per_pixel = 4; - - m_dest_bytes_per_scan_line = ((m_image_x_size + 15) & 0xFFF0) * m_dest_bytes_per_pixel; - - m_real_dest_bytes_per_scan_line = (m_image_x_size * m_dest_bytes_per_pixel); - - // Initialize two scan line buffers. - m_pScan_line_0 = (uint8 *)alloc(m_dest_bytes_per_scan_line, true); - if ((m_scan_type == JPGD_YH1V2) || (m_scan_type == JPGD_YH2V2)) - m_pScan_line_1 = (uint8 *)alloc(m_dest_bytes_per_scan_line, true); - - m_max_blocks_per_row = m_max_mcus_per_row * m_max_blocks_per_mcu; - - // Should never happen - if (m_max_blocks_per_row > JPGD_MAX_BLOCKS_PER_ROW) - stop_decoding(JPGD_ASSERTION_ERROR); - - // Allocate the coefficient buffer, enough for one MCU - m_pMCU_coefficients = (jpgd_block_t*)alloc(m_max_blocks_per_mcu * 64 * sizeof(jpgd_block_t)); - - for (i = 0; i < m_max_blocks_per_mcu; i++) - m_mcu_block_max_zag[i] = 64; - - m_expanded_blocks_per_component = m_comp_h_samp[0] * m_comp_v_samp[0]; - m_expanded_blocks_per_mcu = m_expanded_blocks_per_component * m_comps_in_frame; - m_expanded_blocks_per_row = m_max_mcus_per_row * m_expanded_blocks_per_mcu; - // Freq. domain chroma upsampling is only supported for H2V2 subsampling factor (the most common one I've seen). - m_freq_domain_chroma_upsample = false; -#if JPGD_SUPPORT_FREQ_DOMAIN_UPSAMPLING - m_freq_domain_chroma_upsample = (m_expanded_blocks_per_mcu == 4*3); -#endif - - if (m_freq_domain_chroma_upsample) - m_pSample_buf = (uint8 *)alloc(m_expanded_blocks_per_row * 64); - else - m_pSample_buf = (uint8 *)alloc(m_max_blocks_per_row * 64); - - m_total_lines_left = m_image_y_size; - - m_mcu_lines_left = 0; - - create_look_ups(); -} - -// The coeff_buf series of methods originally stored the coefficients -// into a "virtual" file which was located in EMS, XMS, or a disk file. A cache -// was used to make this process more efficient. Now, we can store the entire -// thing in RAM. -jpeg_decoder::coeff_buf* jpeg_decoder::coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y) -{ - coeff_buf* cb = (coeff_buf*)alloc(sizeof(coeff_buf)); - - cb->block_num_x = block_num_x; - cb->block_num_y = block_num_y; - cb->block_len_x = block_len_x; - cb->block_len_y = block_len_y; - cb->block_size = (block_len_x * block_len_y) * sizeof(jpgd_block_t); - cb->pData = (uint8 *)alloc(cb->block_size * block_num_x * block_num_y, true); - return cb; -} - -inline jpgd_block_t *jpeg_decoder::coeff_buf_getp(coeff_buf *cb, int block_x, int block_y) -{ - JPGD_ASSERT((block_x < cb->block_num_x) && (block_y < cb->block_num_y)); - return (jpgd_block_t *)(cb->pData + block_x * cb->block_size + block_y * (cb->block_size * cb->block_num_x)); -} - -// The following methods decode the various types of m_blocks encountered -// in progressively encoded images. -void jpeg_decoder::decode_block_dc_first(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - int s, r; - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); - - if ((s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_dc_tab[component_id]])) != 0) - { - r = pD->get_bits_no_markers(s); - s = JPGD_HUFF_EXTEND(r, s); - } - - pD->m_last_dc_val[component_id] = (s += pD->m_last_dc_val[component_id]); - - p[0] = static_cast(s << pD->m_successive_low); -} - -void jpeg_decoder::decode_block_dc_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - if (pD->get_bits_no_markers(1)) - { - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); - - p[0] |= (1 << pD->m_successive_low); - } -} - -void jpeg_decoder::decode_block_ac_first(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - int k, s, r; - - if (pD->m_eob_run) - { - pD->m_eob_run--; - return; - } - - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); - - for (k = pD->m_spectral_start; k <= pD->m_spectral_end; k++) - { - s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]); - - r = s >> 4; - s &= 15; - - if (s) - { - if ((k += r) > 63) - pD->stop_decoding(JPGD_DECODE_ERROR); - - r = pD->get_bits_no_markers(s); - s = JPGD_HUFF_EXTEND(r, s); - - p[g_ZAG[k]] = static_cast(s << pD->m_successive_low); - } - else - { - if (r == 15) - { - if ((k += 15) > 63) - pD->stop_decoding(JPGD_DECODE_ERROR); - } - else - { - pD->m_eob_run = 1 << r; - - if (r) - pD->m_eob_run += pD->get_bits_no_markers(r); - - pD->m_eob_run--; - - break; - } - } - } -} - -void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - int s, k, r; - int p1 = 1 << pD->m_successive_low; - int m1 = (-1) << pD->m_successive_low; - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); - - JPGD_ASSERT(pD->m_spectral_end <= 63); - - k = pD->m_spectral_start; - - if (pD->m_eob_run == 0) - { - for ( ; k <= pD->m_spectral_end; k++) - { - s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]); - - r = s >> 4; - s &= 15; - - if (s) - { - if (s != 1) - pD->stop_decoding(JPGD_DECODE_ERROR); - - if (pD->get_bits_no_markers(1)) - s = p1; - else - s = m1; - } - else - { - if (r != 15) - { - pD->m_eob_run = 1 << r; - - if (r) - pD->m_eob_run += pD->get_bits_no_markers(r); - - break; - } - } - - do - { - jpgd_block_t *this_coef = p + g_ZAG[k & 63]; - - if (*this_coef != 0) - { - if (pD->get_bits_no_markers(1)) - { - if ((*this_coef & p1) == 0) - { - if (*this_coef >= 0) - *this_coef = static_cast(*this_coef + p1); - else - *this_coef = static_cast(*this_coef + m1); - } - } - } - else - { - if (--r < 0) - break; - } - - k++; - - } while (k <= pD->m_spectral_end); - - if ((s) && (k < 64)) - { - p[g_ZAG[k]] = static_cast(s); - } - } - } - - if (pD->m_eob_run > 0) - { - for ( ; k <= pD->m_spectral_end; k++) - { - jpgd_block_t *this_coef = p + g_ZAG[k & 63]; // logical AND to shut up static code analysis - - if (*this_coef != 0) - { - if (pD->get_bits_no_markers(1)) - { - if ((*this_coef & p1) == 0) - { - if (*this_coef >= 0) - *this_coef = static_cast(*this_coef + p1); - else - *this_coef = static_cast(*this_coef + m1); - } - } - } - } - - pD->m_eob_run--; - } -} - -// Decode a scan in a progressively encoded image. -void jpeg_decoder::decode_scan(pDecode_block_func decode_block_func) -{ - int mcu_row, mcu_col, mcu_block; - int block_x_mcu[JPGD_MAX_COMPONENTS], m_block_y_mcu[JPGD_MAX_COMPONENTS]; - - memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); - - for (mcu_col = 0; mcu_col < m_mcus_per_col; mcu_col++) - { - int component_num, component_id; - - memset(block_x_mcu, 0, sizeof(block_x_mcu)); - - for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) - { - int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; - - if ((m_restart_interval) && (m_restarts_left == 0)) - process_restart(); - - for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) - { - component_id = m_mcu_org[mcu_block]; - - decode_block_func(this, component_id, block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); - - if (m_comps_in_scan == 1) - block_x_mcu[component_id]++; - else - { - if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) - { - block_x_mcu_ofs = 0; - - if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) - { - block_y_mcu_ofs = 0; - block_x_mcu[component_id] += m_comp_h_samp[component_id]; - } - } - } - } - - m_restarts_left--; - } - - if (m_comps_in_scan == 1) - m_block_y_mcu[m_comp_list[0]]++; - else - { - for (component_num = 0; component_num < m_comps_in_scan; component_num++) - { - component_id = m_comp_list[component_num]; - m_block_y_mcu[component_id] += m_comp_v_samp[component_id]; - } - } - } -} - -// Decode a progressively encoded image. -void jpeg_decoder::init_progressive() -{ - int i; - - if (m_comps_in_frame == 4) - stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); - - // Allocate the coefficient buffers. - for (i = 0; i < m_comps_in_frame; i++) - { - m_dc_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 1, 1); - m_ac_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 8, 8); - } - - for ( ; ; ) - { - int dc_only_scan, refinement_scan; - pDecode_block_func decode_block_func; - - if (!init_scan()) - break; - - dc_only_scan = (m_spectral_start == 0); - refinement_scan = (m_successive_high != 0); - - if ((m_spectral_start > m_spectral_end) || (m_spectral_end > 63)) - stop_decoding(JPGD_BAD_SOS_SPECTRAL); - - if (dc_only_scan) - { - if (m_spectral_end) - stop_decoding(JPGD_BAD_SOS_SPECTRAL); - } - else if (m_comps_in_scan != 1) /* AC scans can only contain one component */ - stop_decoding(JPGD_BAD_SOS_SPECTRAL); - - if ((refinement_scan) && (m_successive_low != m_successive_high - 1)) - stop_decoding(JPGD_BAD_SOS_SUCCESSIVE); - - if (dc_only_scan) - { - if (refinement_scan) - decode_block_func = decode_block_dc_refine; - else - decode_block_func = decode_block_dc_first; - } - else - { - if (refinement_scan) - decode_block_func = decode_block_ac_refine; - else - decode_block_func = decode_block_ac_first; - } - - decode_scan(decode_block_func); - - m_bits_left = 16; - get_bits(16); - get_bits(16); - } - - m_comps_in_scan = m_comps_in_frame; - - for (i = 0; i < m_comps_in_frame; i++) - m_comp_list[i] = i; - - calc_mcu_block_order(); -} - -void jpeg_decoder::init_sequential() -{ - if (!init_scan()) - stop_decoding(JPGD_UNEXPECTED_MARKER); -} - -void jpeg_decoder::decode_start() -{ - init_frame(); - - if (m_progressive_flag) - init_progressive(); - else - init_sequential(); -} - -void jpeg_decoder::decode_init(jpeg_decoder_stream *pStream) -{ - init(pStream); - locate_sof_marker(); -} - -jpeg_decoder::jpeg_decoder(jpeg_decoder_stream *pStream) -{ - if (setjmp(m_jmp_state)) - return; - decode_init(pStream); -} - -int jpeg_decoder::begin_decoding() -{ - if (m_ready_flag) - return JPGD_SUCCESS; - - if (m_error_code) - return JPGD_FAILED; - - if (setjmp(m_jmp_state)) - return JPGD_FAILED; - - decode_start(); - - m_ready_flag = true; - - return JPGD_SUCCESS; -} - -jpeg_decoder::~jpeg_decoder() -{ - free_all_blocks(); -} - -jpeg_decoder_file_stream::jpeg_decoder_file_stream() -{ - m_pFile = NULL; - m_eof_flag = false; - m_error_flag = false; -} - -void jpeg_decoder_file_stream::close() -{ - if (m_pFile) - { - fclose(m_pFile); - m_pFile = NULL; - } - - m_eof_flag = false; - m_error_flag = false; -} - -jpeg_decoder_file_stream::~jpeg_decoder_file_stream() -{ - close(); -} - -bool jpeg_decoder_file_stream::open(const char *Pfilename) -{ - close(); - - m_eof_flag = false; - m_error_flag = false; - -#if defined(_MSC_VER) - m_pFile = NULL; - fopen_s(&m_pFile, Pfilename, "rb"); -#else - m_pFile = fopen(Pfilename, "rb"); -#endif - return m_pFile != NULL; -} - -int jpeg_decoder_file_stream::read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag) -{ - if (!m_pFile) - return -1; - - if (m_eof_flag) - { - *pEOF_flag = true; - return 0; - } - - if (m_error_flag) - return -1; - - int bytes_read = static_cast(fread(pBuf, 1, max_bytes_to_read, m_pFile)); - if (bytes_read < max_bytes_to_read) - { - if (ferror(m_pFile)) - { - m_error_flag = true; - return -1; - } - - m_eof_flag = true; - *pEOF_flag = true; - } - - return bytes_read; -} - -bool jpeg_decoder_mem_stream::open(const uint8 *pSrc_data, uint size) -{ - close(); - m_pSrc_data = pSrc_data; - m_ofs = 0; - m_size = size; - return true; -} - -int jpeg_decoder_mem_stream::read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag) -{ - *pEOF_flag = false; - - if (!m_pSrc_data) - return -1; - - uint bytes_remaining = m_size - m_ofs; - if ((uint)max_bytes_to_read > bytes_remaining) - { - max_bytes_to_read = bytes_remaining; - *pEOF_flag = true; - } - - memcpy(pBuf, m_pSrc_data + m_ofs, max_bytes_to_read); - m_ofs += max_bytes_to_read; - - return max_bytes_to_read; -} - -unsigned char *decompress_jpeg_image_from_stream(jpeg_decoder_stream *pStream, int *width, int *height, int *actual_comps, int req_comps) -{ - if (!actual_comps) - return NULL; - *actual_comps = 0; - - if ((!pStream) || (!width) || (!height) || (!req_comps)) - return NULL; - - if ((req_comps != 1) && (req_comps != 3) && (req_comps != 4)) - return NULL; - - jpeg_decoder decoder(pStream); - if (decoder.get_error_code() != JPGD_SUCCESS) - return NULL; - - const int image_width = decoder.get_width(), image_height = decoder.get_height(); - *width = image_width; - *height = image_height; - *actual_comps = decoder.get_num_components(); - - if (decoder.begin_decoding() != JPGD_SUCCESS) - return NULL; - - const int dst_bpl = image_width * req_comps; - - uint8 *pImage_data = (uint8*)jpgd_malloc(dst_bpl * image_height); - if (!pImage_data) - return NULL; - - for (int y = 0; y < image_height; y++) - { - const uint8* pScan_line; - uint scan_line_len; - if (decoder.decode((const void**)&pScan_line, &scan_line_len) != JPGD_SUCCESS) - { - jpgd_free(pImage_data); - return NULL; - } - - uint8 *pDst = pImage_data + y * dst_bpl; - - if (((req_comps == 1) && (decoder.get_num_components() == 1)) || ((req_comps == 4) && (decoder.get_num_components() == 3))) - memcpy(pDst, pScan_line, dst_bpl); - else if (decoder.get_num_components() == 1) - { - if (req_comps == 3) - { - for (int x = 0; x < image_width; x++) - { - uint8 luma = pScan_line[x]; - pDst[0] = luma; - pDst[1] = luma; - pDst[2] = luma; - pDst += 3; - } - } - else - { - for (int x = 0; x < image_width; x++) - { - uint8 luma = pScan_line[x]; - pDst[0] = luma; - pDst[1] = luma; - pDst[2] = luma; - pDst[3] = 255; - pDst += 4; - } - } - } - else if (decoder.get_num_components() == 3) - { - if (req_comps == 1) - { - const int YR = 19595, YG = 38470, YB = 7471; - for (int x = 0; x < image_width; x++) - { - int r = pScan_line[x*4+0]; - int g = pScan_line[x*4+1]; - int b = pScan_line[x*4+2]; - *pDst++ = static_cast((r * YR + g * YG + b * YB + 32768) >> 16); - } - } - else - { - for (int x = 0; x < image_width; x++) - { - pDst[0] = pScan_line[x*4+0]; - pDst[1] = pScan_line[x*4+1]; - pDst[2] = pScan_line[x*4+2]; - pDst += 3; - } - } - } - } - - return pImage_data; -} - -unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data, int src_data_size, int *width, int *height, int *actual_comps, int req_comps) -{ - jpgd::jpeg_decoder_mem_stream mem_stream(pSrc_data, src_data_size); - return decompress_jpeg_image_from_stream(&mem_stream, width, height, actual_comps, req_comps); -} - -unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename, int *width, int *height, int *actual_comps, int req_comps) -{ - jpgd::jpeg_decoder_file_stream file_stream; - if (!file_stream.open(pSrc_filename)) - return NULL; - return decompress_jpeg_image_from_stream(&file_stream, width, height, actual_comps, req_comps); -} - -} // namespace jpgd diff --git a/cpp/cli/src/jpgd.h b/cpp/cli/src/jpgd.h deleted file mode 100644 index 150b9a0b2..000000000 --- a/cpp/cli/src/jpgd.h +++ /dev/null @@ -1,319 +0,0 @@ -// jpgd.h - C++ class for JPEG decompression. -// Public domain, Rich Geldreich -#ifndef JPEG_DECODER_H -#define JPEG_DECODER_H - -#include -#include -#include - -#ifdef _MSC_VER - #define JPGD_NORETURN __declspec(noreturn) -#elif defined(__GNUC__) - #define JPGD_NORETURN __attribute__ ((noreturn)) -#else - #define JPGD_NORETURN -#endif - -namespace jpgd -{ - typedef unsigned char uint8; - typedef signed short int16; - typedef unsigned short uint16; - typedef unsigned int uint; - typedef signed int int32; - - // Loads a JPEG image from a memory buffer or a file. - // req_comps can be 1 (grayscale), 3 (RGB), or 4 (RGBA). - // On return, width/height will be set to the image's dimensions, and actual_comps will be set to the either 1 (grayscale) or 3 (RGB). - // Notes: For more control over where and how the source data is read, see the decompress_jpeg_image_from_stream() function below, or call the jpeg_decoder class directly. - // Requesting a 8 or 32bpp image is currently a little faster than 24bpp because the jpeg_decoder class itself currently always unpacks to either 8 or 32bpp. - unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data, int src_data_size, int *width, int *height, int *actual_comps, int req_comps); - unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename, int *width, int *height, int *actual_comps, int req_comps); - - // Success/failure error codes. - enum jpgd_status - { - JPGD_SUCCESS = 0, JPGD_FAILED = -1, JPGD_DONE = 1, - JPGD_BAD_DHT_COUNTS = -256, JPGD_BAD_DHT_INDEX, JPGD_BAD_DHT_MARKER, JPGD_BAD_DQT_MARKER, JPGD_BAD_DQT_TABLE, - JPGD_BAD_PRECISION, JPGD_BAD_HEIGHT, JPGD_BAD_WIDTH, JPGD_TOO_MANY_COMPONENTS, - JPGD_BAD_SOF_LENGTH, JPGD_BAD_VARIABLE_MARKER, JPGD_BAD_DRI_LENGTH, JPGD_BAD_SOS_LENGTH, - JPGD_BAD_SOS_COMP_ID, JPGD_W_EXTRA_BYTES_BEFORE_MARKER, JPGD_NO_ARITHMITIC_SUPPORT, JPGD_UNEXPECTED_MARKER, - JPGD_NOT_JPEG, JPGD_UNSUPPORTED_MARKER, JPGD_BAD_DQT_LENGTH, JPGD_TOO_MANY_BLOCKS, - JPGD_UNDEFINED_QUANT_TABLE, JPGD_UNDEFINED_HUFF_TABLE, JPGD_NOT_SINGLE_SCAN, JPGD_UNSUPPORTED_COLORSPACE, - JPGD_UNSUPPORTED_SAMP_FACTORS, JPGD_DECODE_ERROR, JPGD_BAD_RESTART_MARKER, JPGD_ASSERTION_ERROR, - JPGD_BAD_SOS_SPECTRAL, JPGD_BAD_SOS_SUCCESSIVE, JPGD_STREAM_READ, JPGD_NOTENOUGHMEM - }; - - // Input stream interface. - // Derive from this class to read input data from sources other than files or memory. Set m_eof_flag to true when no more data is available. - // The decoder is rather greedy: it will keep on calling this method until its internal input buffer is full, or until the EOF flag is set. - // It the input stream contains data after the JPEG stream's EOI (end of image) marker it will probably be pulled into the internal buffer. - // Call the get_total_bytes_read() method to determine the actual size of the JPEG stream after successful decoding. - class jpeg_decoder_stream - { - public: - jpeg_decoder_stream() { } - virtual ~jpeg_decoder_stream() { } - - // The read() method is called when the internal input buffer is empty. - // Parameters: - // pBuf - input buffer - // max_bytes_to_read - maximum bytes that can be written to pBuf - // pEOF_flag - set this to true if at end of stream (no more bytes remaining) - // Returns -1 on error, otherwise return the number of bytes actually written to the buffer (which may be 0). - // Notes: This method will be called in a loop until you set *pEOF_flag to true or the internal buffer is full. - virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag) = 0; - }; - - // stdio FILE stream class. - class jpeg_decoder_file_stream : public jpeg_decoder_stream - { - jpeg_decoder_file_stream(const jpeg_decoder_file_stream &); - jpeg_decoder_file_stream &operator =(const jpeg_decoder_file_stream &); - - FILE *m_pFile; - bool m_eof_flag, m_error_flag; - - public: - jpeg_decoder_file_stream(); - virtual ~jpeg_decoder_file_stream(); - - bool open(const char *Pfilename); - void close(); - - virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag); - }; - - // Memory stream class. - class jpeg_decoder_mem_stream : public jpeg_decoder_stream - { - const uint8 *m_pSrc_data; - uint m_ofs, m_size; - - public: - jpeg_decoder_mem_stream() : m_pSrc_data(NULL), m_ofs(0), m_size(0) { } - jpeg_decoder_mem_stream(const uint8 *pSrc_data, uint size) : m_pSrc_data(pSrc_data), m_ofs(0), m_size(size) { } - - virtual ~jpeg_decoder_mem_stream() { } - - bool open(const uint8 *pSrc_data, uint size); - void close() { m_pSrc_data = NULL; m_ofs = 0; m_size = 0; } - - virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag); - }; - - // Loads JPEG file from a jpeg_decoder_stream. - unsigned char *decompress_jpeg_image_from_stream(jpeg_decoder_stream *pStream, int *width, int *height, int *actual_comps, int req_comps); - - enum - { - JPGD_IN_BUF_SIZE = 8192, JPGD_MAX_BLOCKS_PER_MCU = 10, JPGD_MAX_HUFF_TABLES = 8, JPGD_MAX_QUANT_TABLES = 4, - JPGD_MAX_COMPONENTS = 4, JPGD_MAX_COMPS_IN_SCAN = 4, JPGD_MAX_BLOCKS_PER_ROW = 8192, JPGD_MAX_HEIGHT = 16384, JPGD_MAX_WIDTH = 16384 - }; - - typedef int16 jpgd_quant_t; - typedef int16 jpgd_block_t; - - class jpeg_decoder - { - public: - // Call get_error_code() after constructing to determine if the stream is valid or not. You may call the get_width(), get_height(), etc. - // methods after the constructor is called. You may then either destruct the object, or begin decoding the image by calling begin_decoding(), then decode() on each scanline. - jpeg_decoder(jpeg_decoder_stream *pStream); - - ~jpeg_decoder(); - - // Call this method after constructing the object to begin decompression. - // If JPGD_SUCCESS is returned you may then call decode() on each scanline. - int begin_decoding(); - - // Returns the next scan line. - // For grayscale images, pScan_line will point to a buffer containing 8-bit pixels (get_bytes_per_pixel() will return 1). - // Otherwise, it will always point to a buffer containing 32-bit RGBA pixels (A will always be 255, and get_bytes_per_pixel() will return 4). - // Returns JPGD_SUCCESS if a scan line has been returned. - // Returns JPGD_DONE if all scan lines have been returned. - // Returns JPGD_FAILED if an error occurred. Call get_error_code() for a more info. - int decode(const void** pScan_line, uint* pScan_line_len); - - inline jpgd_status get_error_code() const { return m_error_code; } - - inline int get_width() const { return m_image_x_size; } - inline int get_height() const { return m_image_y_size; } - - inline int get_num_components() const { return m_comps_in_frame; } - - inline int get_bytes_per_pixel() const { return m_dest_bytes_per_pixel; } - inline int get_bytes_per_scan_line() const { return m_image_x_size * get_bytes_per_pixel(); } - - // Returns the total number of bytes actually consumed by the decoder (which should equal the actual size of the JPEG file). - inline int get_total_bytes_read() const { return m_total_bytes_read; } - - private: - jpeg_decoder(const jpeg_decoder &); - jpeg_decoder &operator =(const jpeg_decoder &); - - typedef void (*pDecode_block_func)(jpeg_decoder *, int, int, int); - - struct huff_tables - { - bool ac_table; - uint look_up[256]; - uint look_up2[256]; - uint8 code_size[256]; - uint tree[512]; - }; - - struct coeff_buf - { - uint8 *pData; - int block_num_x, block_num_y; - int block_len_x, block_len_y; - int block_size; - }; - - struct mem_block - { - mem_block *m_pNext; - size_t m_used_count; - size_t m_size; - char m_data[1]; - }; - - jmp_buf m_jmp_state; - mem_block *m_pMem_blocks; - int m_image_x_size; - int m_image_y_size; - jpeg_decoder_stream *m_pStream; - int m_progressive_flag; - uint8 m_huff_ac[JPGD_MAX_HUFF_TABLES]; - uint8* m_huff_num[JPGD_MAX_HUFF_TABLES]; // pointer to number of Huffman codes per bit size - uint8* m_huff_val[JPGD_MAX_HUFF_TABLES]; // pointer to Huffman codes per bit size - jpgd_quant_t* m_quant[JPGD_MAX_QUANT_TABLES]; // pointer to quantization tables - int m_scan_type; // Gray, Yh1v1, Yh1v2, Yh2v1, Yh2v2 (CMYK111, CMYK4114 no longer supported) - int m_comps_in_frame; // # of components in frame - int m_comp_h_samp[JPGD_MAX_COMPONENTS]; // component's horizontal sampling factor - int m_comp_v_samp[JPGD_MAX_COMPONENTS]; // component's vertical sampling factor - int m_comp_quant[JPGD_MAX_COMPONENTS]; // component's quantization table selector - int m_comp_ident[JPGD_MAX_COMPONENTS]; // component's ID - int m_comp_h_blocks[JPGD_MAX_COMPONENTS]; - int m_comp_v_blocks[JPGD_MAX_COMPONENTS]; - int m_comps_in_scan; // # of components in scan - int m_comp_list[JPGD_MAX_COMPS_IN_SCAN]; // components in this scan - int m_comp_dc_tab[JPGD_MAX_COMPONENTS]; // component's DC Huffman coding table selector - int m_comp_ac_tab[JPGD_MAX_COMPONENTS]; // component's AC Huffman coding table selector - int m_spectral_start; // spectral selection start - int m_spectral_end; // spectral selection end - int m_successive_low; // successive approximation low - int m_successive_high; // successive approximation high - int m_max_mcu_x_size; // MCU's max. X size in pixels - int m_max_mcu_y_size; // MCU's max. Y size in pixels - int m_blocks_per_mcu; - int m_max_blocks_per_row; - int m_mcus_per_row, m_mcus_per_col; - int m_mcu_org[JPGD_MAX_BLOCKS_PER_MCU]; - int m_total_lines_left; // total # lines left in image - int m_mcu_lines_left; // total # lines left in this MCU - int m_real_dest_bytes_per_scan_line; - int m_dest_bytes_per_scan_line; // rounded up - int m_dest_bytes_per_pixel; // 4 (RGB) or 1 (Y) - huff_tables* m_pHuff_tabs[JPGD_MAX_HUFF_TABLES]; - coeff_buf* m_dc_coeffs[JPGD_MAX_COMPONENTS]; - coeff_buf* m_ac_coeffs[JPGD_MAX_COMPONENTS]; - int m_eob_run; - int m_block_y_mcu[JPGD_MAX_COMPONENTS]; - uint8* m_pIn_buf_ofs; - int m_in_buf_left; - int m_tem_flag; - bool m_eof_flag; - uint8 m_in_buf_pad_start[128]; - uint8 m_in_buf[JPGD_IN_BUF_SIZE + 128]; - uint8 m_in_buf_pad_end[128]; - int m_bits_left; - uint m_bit_buf; - int m_restart_interval; - int m_restarts_left; - int m_next_restart_num; - int m_max_mcus_per_row; - int m_max_blocks_per_mcu; - int m_expanded_blocks_per_mcu; - int m_expanded_blocks_per_row; - int m_expanded_blocks_per_component; - bool m_freq_domain_chroma_upsample; - int m_max_mcus_per_col; - uint m_last_dc_val[JPGD_MAX_COMPONENTS]; - jpgd_block_t* m_pMCU_coefficients; - int m_mcu_block_max_zag[JPGD_MAX_BLOCKS_PER_MCU]; - uint8* m_pSample_buf; - int m_crr[256]; - int m_cbb[256]; - int m_crg[256]; - int m_cbg[256]; - uint8* m_pScan_line_0; - uint8* m_pScan_line_1; - jpgd_status m_error_code; - bool m_ready_flag; - int m_total_bytes_read; - - void free_all_blocks(); - JPGD_NORETURN void stop_decoding(jpgd_status status); - void *alloc(size_t n, bool zero = false); - void word_clear(void *p, uint16 c, uint n); - void prep_in_buffer(); - void read_dht_marker(); - void read_dqt_marker(); - void read_sof_marker(); - void skip_variable_marker(); - void read_dri_marker(); - void read_sos_marker(); - int next_marker(); - int process_markers(); - void locate_soi_marker(); - void locate_sof_marker(); - int locate_sos_marker(); - void init(jpeg_decoder_stream * pStream); - void create_look_ups(); - void fix_in_buffer(); - void transform_mcu(int mcu_row); - void transform_mcu_expand(int mcu_row); - coeff_buf* coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y); - inline jpgd_block_t *coeff_buf_getp(coeff_buf *cb, int block_x, int block_y); - void load_next_row(); - void decode_next_row(); - void make_huff_table(int index, huff_tables *pH); - void check_quant_tables(); - void check_huff_tables(); - void calc_mcu_block_order(); - int init_scan(); - void init_frame(); - void process_restart(); - void decode_scan(pDecode_block_func decode_block_func); - void init_progressive(); - void init_sequential(); - void decode_start(); - void decode_init(jpeg_decoder_stream * pStream); - void H2V2Convert(); - void H2V1Convert(); - void H1V2Convert(); - void H1V1Convert(); - void gray_convert(); - void expanded_convert(); - void find_eoi(); - inline uint get_char(); - inline uint get_char(bool *pPadding_flag); - inline void stuff_char(uint8 q); - inline uint8 get_octet(); - inline uint get_bits(int num_bits); - inline uint get_bits_no_markers(int numbits); - inline int huff_decode(huff_tables *pH); - inline int huff_decode(huff_tables *pH, int& extrabits); - static inline uint8 clamp(int i); - static void decode_block_dc_first(jpeg_decoder *pD, int component_id, int block_x, int block_y); - static void decode_block_dc_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y); - static void decode_block_ac_first(jpeg_decoder *pD, int component_id, int block_x, int block_y); - static void decode_block_ac_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y); - }; - -} // namespace jpgd - -#endif // JPEG_DECODER_H diff --git a/cpp/cli/src/lodepng.cpp b/cpp/cli/src/lodepng.cpp deleted file mode 100644 index 0e6a62742..000000000 --- a/cpp/cli/src/lodepng.cpp +++ /dev/null @@ -1,6261 +0,0 @@ -/* -LodePNG version 20130325 - -Copyright (c) 2005-2013 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -/* -The manual and changelog are in the header file "lodepng.h" -Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. -*/ - -#include "lodepng.h" - -#include -#include - -#ifdef LODEPNG_COMPILE_CPP -#include -#endif /*LODEPNG_COMPILE_CPP*/ - -#define VERSION_STRING "20130325" - -/* -This source file is built up in the following large parts. The code sections -with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. --Tools for C and common code for PNG and Zlib --C Code for Zlib (huffman, deflate, ...) --C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) --The C++ wrapper around all of the above -*/ - -/*The malloc, realloc and free functions defined here with "lodepng_" in front -of the name, so that you can easily change them to others related to your -platform if needed. Everything else in the code calls these. Pass --DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out -#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and -define them in your own project's source files without needing to change -lodepng source code. Don't forget to remove "static" if you copypaste them -from here.*/ - -#ifdef LODEPNG_COMPILE_ALLOCATORS -static void* lodepng_malloc(size_t size) -{ - return malloc(size); -} - -static void* lodepng_realloc(void* ptr, size_t new_size) -{ - return realloc(ptr, new_size); -} - -static void lodepng_free(void* ptr) -{ - free(ptr); -} -#else /*LODEPNG_COMPILE_ALLOCATORS*/ -void* lodepng_malloc(size_t size); -void* lodepng_realloc(void* ptr, size_t new_size); -void lodepng_free(void* ptr); -#endif /*LODEPNG_COMPILE_ALLOCATORS*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // Tools for C, and common code for PNG and Zlib. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/* -Often in case of an error a value is assigned to a variable and then it breaks -out of a loop (to go to the cleanup phase of a function). This macro does that. -It makes the error handling code shorter and more readable. - -Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); -*/ -#define CERROR_BREAK(errorvar, code)\ -{\ - errorvar = code;\ - break;\ -} - -/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ -#define ERROR_BREAK(code) CERROR_BREAK(error, code) - -/*Set error var to the error code, and return it.*/ -#define CERROR_RETURN_ERROR(errorvar, code)\ -{\ - errorvar = code;\ - return code;\ -} - -/*Try the code, if it returns error, also return the error.*/ -#define CERROR_TRY_RETURN(call)\ -{\ - unsigned error = call;\ - if(error) return error;\ -} - -/* -About uivector, ucvector and string: --All of them wrap dynamic arrays or text strings in a similar way. --LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. --The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. --They're not used in the interface, only internally in this file as static functions. --As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. -*/ - -#ifdef LODEPNG_COMPILE_ZLIB -/*dynamic vector of unsigned ints*/ -typedef struct uivector -{ - unsigned* data; - size_t size; /*size in number of unsigned longs*/ - size_t allocsize; /*allocated size in bytes*/ -} uivector; - -static void uivector_cleanup(void* p) -{ - ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; - lodepng_free(((uivector*)p)->data); - ((uivector*)p)->data = NULL; -} - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_resize(uivector* p, size_t size) -{ - if(size * sizeof(unsigned) > p->allocsize) - { - size_t newsize = size * sizeof(unsigned) * 2; - void* data = lodepng_realloc(p->data, newsize); - if(data) - { - p->allocsize = newsize; - p->data = (unsigned*)data; - p->size = size; - } - else return 0; - } - else p->size = size; - return 1; -} - -/*resize and give all new elements the value*/ -static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) -{ - size_t oldsize = p->size, i; - if(!uivector_resize(p, size)) return 0; - for(i = oldsize; i < size; i++) p->data[i] = value; - return 1; -} - -static void uivector_init(uivector* p) -{ - p->data = NULL; - p->size = p->allocsize = 0; -} - -#ifdef LODEPNG_COMPILE_ENCODER -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_push_back(uivector* p, unsigned c) -{ - if(!uivector_resize(p, p->size + 1)) return 0; - p->data[p->size - 1] = c; - return 1; -} - -/*copy q to p, returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_copy(uivector* p, const uivector* q) -{ - size_t i; - if(!uivector_resize(p, q->size)) return 0; - for(i = 0; i < q->size; i++) p->data[i] = q->data[i]; - return 1; -} - -static void uivector_swap(uivector* p, uivector* q) -{ - size_t tmp; - unsigned* tmpp; - tmp = p->size; p->size = q->size; q->size = tmp; - tmp = p->allocsize; p->allocsize = q->allocsize; q->allocsize = tmp; - tmpp = p->data; p->data = q->data; q->data = tmpp; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* /////////////////////////////////////////////////////////////////////////// */ - -/*dynamic vector of unsigned chars*/ -typedef struct ucvector -{ - unsigned char* data; - size_t size; /*used size*/ - size_t allocsize; /*allocated size*/ -} ucvector; - -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_resize(ucvector* p, size_t size) -{ - if(size * sizeof(unsigned char) > p->allocsize) - { - size_t newsize = size * sizeof(unsigned char) * 2; - void* data = lodepng_realloc(p->data, newsize); - if(data) - { - p->allocsize = newsize; - p->data = (unsigned char*)data; - p->size = size; - } - else return 0; /*error: not enough memory*/ - } - else p->size = size; - return 1; -} - -#ifdef LODEPNG_COMPILE_PNG - -static void ucvector_cleanup(void* p) -{ - ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; - lodepng_free(((ucvector*)p)->data); - ((ucvector*)p)->data = NULL; -} - -static void ucvector_init(ucvector* p) -{ - p->data = NULL; - p->size = p->allocsize = 0; -} - -#ifdef LODEPNG_COMPILE_DECODER -/*resize and give all new elements the value*/ -static unsigned ucvector_resizev(ucvector* p, size_t size, unsigned char value) -{ - size_t oldsize = p->size, i; - if(!ucvector_resize(p, size)) return 0; - for(i = oldsize; i < size; i++) p->data[i] = value; - return 1; -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ZLIB -/*you can both convert from vector to buffer&size and vica versa. If you use -init_buffer to take over a buffer and size, it is not needed to use cleanup*/ -static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) -{ - p->data = buffer; - p->allocsize = p->size = size; -} -#endif /*LODEPNG_COMPILE_ZLIB*/ - -#if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER) -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_push_back(ucvector* p, unsigned char c) -{ - if(!ucvector_resize(p, p->size + 1)) return 0; - p->data[p->size - 1] = c; - return 1; -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ - - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned string_resize(char** out, size_t size) -{ - char* data = (char*)lodepng_realloc(*out, size + 1); - if(data) - { - data[size] = 0; /*null termination char*/ - *out = data; - } - return data != 0; -} - -/*init a {char*, size_t} pair for use as string*/ -static void string_init(char** out) -{ - *out = NULL; - string_resize(out, 0); -} - -/*free the above pair again*/ -static void string_cleanup(char** out) -{ - lodepng_free(*out); - *out = NULL; -} - -static void string_set(char** out, const char* in) -{ - size_t insize = strlen(in), i = 0; - if(string_resize(out, insize)) - { - for(i = 0; i < insize; i++) - { - (*out)[i] = in[i]; - } - } -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -unsigned lodepng_read32bitInt(const unsigned char* buffer) -{ - return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; -} - -#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) -/*buffer must have at least 4 allocated bytes available*/ -static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) -{ - buffer[0] = (unsigned char)((value >> 24) & 0xff); - buffer[1] = (unsigned char)((value >> 16) & 0xff); - buffer[2] = (unsigned char)((value >> 8) & 0xff); - buffer[3] = (unsigned char)((value ) & 0xff); -} -#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ - -#ifdef LODEPNG_COMPILE_ENCODER -static void lodepng_add32bitInt(ucvector* buffer, unsigned value) -{ - ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ - lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / File IO / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DISK - -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) -{ - FILE* file; - long size; - - /*provide some proper output values if error will happen*/ - *out = 0; - *outsize = 0; - - file = fopen(filename, "rb"); - if(!file) return 78; - - /*get filesize:*/ - fseek(file , 0 , SEEK_END); - size = ftell(file); - rewind(file); - - /*read contents of the file into the vector*/ - *outsize = 0; - *out = (unsigned char*)lodepng_malloc((size_t)size); - if(size && (*out)) (*outsize) = fread(*out, 1, (size_t)size, file); - - fclose(file); - if(!(*out) && size) return 83; /*the above malloc failed*/ - return 0; -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) -{ - FILE* file; - file = fopen(filename, "wb" ); - if(!file) return 79; - fwrite((char*)buffer , 1 , buffersize, file); - fclose(file); - return 0; -} - -#endif /*LODEPNG_COMPILE_DISK*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of common code and tools. Begin of Zlib related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_ENCODER -/*TODO: this ignores potential out of memory errors*/ -static void addBitToStream(size_t* bitpointer, ucvector* bitstream, unsigned char bit) -{ - /*add a new byte at the end*/ - if((*bitpointer) % 8 == 0) ucvector_push_back(bitstream, (unsigned char)0); - /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ - (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7)); - (*bitpointer)++; -} - -static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) -{ - size_t i; - for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); -} - -static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) -{ - size_t i; - for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) - -static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) -{ - unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); - (*bitpointer)++; - return result; -} - -static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) -{ - unsigned result = 0, i; - for(i = 0; i < nbits; i++) - { - result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; - (*bitpointer)++; - } - return result; -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflate - Huffman / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#define FIRST_LENGTH_CODE_INDEX 257 -#define LAST_LENGTH_CODE_INDEX 285 -/*256 literals, the end code, some length codes, and 2 unused codes*/ -#define NUM_DEFLATE_CODE_SYMBOLS 288 -/*the distance codes have their own symbols, 30 used, 2 unused*/ -#define NUM_DISTANCE_SYMBOLS 32 -/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ -#define NUM_CODE_LENGTH_CODES 19 - -/*the base lengths represented by codes 257-285*/ -static const unsigned LENGTHBASE[29] - = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, - 67, 83, 99, 115, 131, 163, 195, 227, 258}; - -/*the extra bits used by codes 257-285 (added to base length)*/ -static const unsigned LENGTHEXTRA[29] - = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 5, 0}; - -/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ -static const unsigned DISTANCEBASE[30] - = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, - 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; - -/*the extra bits of backwards distances (added to base)*/ -static const unsigned DISTANCEEXTRA[30] - = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, - 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - -/*the order in which "code length alphabet code lengths" are stored, out of this -the huffman tree of the dynamic huffman tree lengths is generated*/ -static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] - = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* ////////////////////////////////////////////////////////////////////////// */ - -/* -Huffman tree struct, containing multiple representations of the tree -*/ -typedef struct HuffmanTree -{ - unsigned* tree2d; - unsigned* tree1d; - unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ - unsigned maxbitlen; /*maximum number of bits a single code can get*/ - unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ -} HuffmanTree; - -/*function used for debug purposes to draw the tree in ascii art with C++*/ -/* -static void HuffmanTree_draw(HuffmanTree* tree) -{ - std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; - for(size_t i = 0; i < tree->tree1d.size; i++) - { - if(tree->lengths.data[i]) - std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; - } - std::cout << std::endl; -}*/ - -static void HuffmanTree_init(HuffmanTree* tree) -{ - tree->tree2d = 0; - tree->tree1d = 0; - tree->lengths = 0; -} - -static void HuffmanTree_cleanup(HuffmanTree* tree) -{ - lodepng_free(tree->tree2d); - lodepng_free(tree->tree1d); - lodepng_free(tree->lengths); -} - -/*the tree representation used by the decoder. return value is error*/ -static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) -{ - unsigned nodefilled = 0; /*up to which node it is filled*/ - unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ - unsigned n, i; - - tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned)); - if(!tree->tree2d) return 83; /*alloc fail*/ - - /* - convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means - uninited, a value >= numcodes is an address to another bit, a value < numcodes - is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as - many columns as codes - 1. - A good huffmann tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. - Here, the internal nodes are stored (what their 0 and 1 option point to). - There is only memory for such good tree currently, if there are more nodes - (due to too long length codes), error 55 will happen - */ - for(n = 0; n < tree->numcodes * 2; n++) - { - tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ - } - - for(n = 0; n < tree->numcodes; n++) /*the codes*/ - { - for(i = 0; i < tree->lengths[n]; i++) /*the bits for this code*/ - { - unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); - if(treepos > tree->numcodes - 2) return 55; /*oversubscribed, see comment in lodepng_error_text*/ - if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ - { - if(i + 1 == tree->lengths[n]) /*last bit*/ - { - tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ - treepos = 0; - } - else - { - /*put address of the next step in here, first that address has to be found of course - (it's just nodefilled + 1)...*/ - nodefilled++; - /*addresses encoded with numcodes added to it*/ - tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; - treepos = nodefilled; - } - } - else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; - } - } - - for(n = 0; n < tree->numcodes * 2; n++) - { - if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ - } - - return 0; -} - -/* -Second step for the ...makeFromLengths and ...makeFromFrequencies functions. -numcodes, lengths and maxbitlen must already be filled in correctly. return -value is error. -*/ -static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) -{ - uivector blcount; - uivector nextcode; - unsigned bits, n, error = 0; - - uivector_init(&blcount); - uivector_init(&nextcode); - - tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); - if(!tree->tree1d) error = 83; /*alloc fail*/ - - if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) - || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) - error = 83; /*alloc fail*/ - - if(!error) - { - /*step 1: count number of instances of each code length*/ - for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++; - /*step 2: generate the nextcode values*/ - for(bits = 1; bits <= tree->maxbitlen; bits++) - { - nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; - } - /*step 3: generate all the codes*/ - for(n = 0; n < tree->numcodes; n++) - { - if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; - } - } - - uivector_cleanup(&blcount); - uivector_cleanup(&nextcode); - - if(!error) return HuffmanTree_make2DTree(tree); - else return error; -} - -/* -given the code lengths (as stored in the PNG file), generate the tree as defined -by Deflate. maxbitlen is the maximum bits that a code in the tree can have. -return value is error. -*/ -static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, - size_t numcodes, unsigned maxbitlen) -{ - unsigned i; - tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - for(i = 0; i < numcodes; i++) tree->lengths[i] = bitlen[i]; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - tree->maxbitlen = maxbitlen; - return HuffmanTree_makeFromLengths2(tree); -} - -#ifdef LODEPNG_COMPILE_ENCODER - -/* -A coin, this is the terminology used for the package-merge algorithm and the -coin collector's problem. This is used to generate the huffman tree. -A coin can be multiple coins (when they're merged) -*/ -typedef struct Coin -{ - uivector symbols; - float weight; /*the sum of all weights in this coin*/ -} Coin; - -static void coin_init(Coin* c) -{ - uivector_init(&c->symbols); -} - -/*argument c is void* so that this dtor can be given as function pointer to the vector resize function*/ -static void coin_cleanup(void* c) -{ - uivector_cleanup(&((Coin*)c)->symbols); -} - -static void coin_copy(Coin* c1, const Coin* c2) -{ - c1->weight = c2->weight; - uivector_copy(&c1->symbols, &c2->symbols); -} - -static void add_coins(Coin* c1, const Coin* c2) -{ - size_t i; - for(i = 0; i < c2->symbols.size; i++) uivector_push_back(&c1->symbols, c2->symbols.data[i]); - c1->weight += c2->weight; -} - -static void init_coins(Coin* coins, size_t num) -{ - size_t i; - for(i = 0; i < num; i++) coin_init(&coins[i]); -} - -static void cleanup_coins(Coin* coins, size_t num) -{ - size_t i; - for(i = 0; i < num; i++) coin_cleanup(&coins[i]); -} - -/* -This uses a simple combsort to sort the data. This function is not critical for -overall encoding speed and the data amount isn't that large. -*/ -static void sort_coins(Coin* data, size_t amount) -{ - size_t gap = amount; - unsigned char swapped = 0; - while((gap > 1) || swapped) - { - size_t i; - gap = (gap * 10) / 13; /*shrink factor 1.3*/ - if(gap == 9 || gap == 10) gap = 11; /*combsort11*/ - if(gap < 1) gap = 1; - swapped = 0; - for(i = 0; i < amount - gap; i++) - { - size_t j = i + gap; - if(data[j].weight < data[i].weight) - { - float temp = data[j].weight; data[j].weight = data[i].weight; data[i].weight = temp; - uivector_swap(&data[i].symbols, &data[j].symbols); - swapped = 1; - } - } - } -} - -static unsigned append_symbol_coins(Coin* coins, const unsigned* frequencies, unsigned numcodes, size_t sum) -{ - unsigned i; - unsigned j = 0; /*index of present symbols*/ - for(i = 0; i < numcodes; i++) - { - if(frequencies[i] != 0) /*only include symbols that are present*/ - { - coins[j].weight = frequencies[i] / (float)sum; - uivector_push_back(&coins[j].symbols, i); - j++; - } - } - return 0; -} - -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen) -{ - unsigned i, j; - size_t sum = 0, numpresent = 0; - unsigned error = 0; - Coin* coins; /*the coins of the currently calculated row*/ - Coin* prev_row; /*the previous row of coins*/ - unsigned numcoins; - unsigned coinmem; - - if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ - - for(i = 0; i < numcodes; i++) - { - if(frequencies[i] > 0) - { - numpresent++; - sum += frequencies[i]; - } - } - - for(i = 0; i < numcodes; i++) lengths[i] = 0; - - /*ensure at least two present symbols. There should be at least one symbol - according to RFC 1951 section 3.2.7. To decoders incorrectly require two. To - make these work as well ensure there are at least two symbols. The - Package-Merge code below also doesn't work correctly if there's only one - symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/ - if(numpresent == 0) - { - lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ - } - else if(numpresent == 1) - { - for(i = 0; i < numcodes; i++) - { - if(frequencies[i]) - { - lengths[i] = 1; - lengths[i == 0 ? 1 : 0] = 1; - break; - } - } - } - else - { - /*Package-Merge algorithm represented by coin collector's problem - For every symbol, maxbitlen coins will be created*/ - - coinmem = numpresent * 2; /*max amount of coins needed with the current algo*/ - coins = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem); - prev_row = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem); - if(!coins || !prev_row) return 83; /*alloc fail*/ - init_coins(coins, coinmem); - init_coins(prev_row, coinmem); - - /*first row, lowest denominator*/ - error = append_symbol_coins(coins, frequencies, numcodes, sum); - numcoins = numpresent; - sort_coins(coins, numcoins); - if(!error) - { - unsigned numprev = 0; - for(j = 1; j <= maxbitlen && !error; j++) /*each of the remaining rows*/ - { - unsigned tempnum; - Coin* tempcoins; - /*swap prev_row and coins, and their amounts*/ - tempcoins = prev_row; prev_row = coins; coins = tempcoins; - tempnum = numprev; numprev = numcoins; numcoins = tempnum; - - cleanup_coins(coins, numcoins); - init_coins(coins, numcoins); - - numcoins = 0; - - /*fill in the merged coins of the previous row*/ - for(i = 0; i + 1 < numprev; i += 2) - { - /*merge prev_row[i] and prev_row[i + 1] into new coin*/ - Coin* coin = &coins[numcoins++]; - coin_copy(coin, &prev_row[i]); - add_coins(coin, &prev_row[i + 1]); - } - /*fill in all the original symbols again*/ - if(j < maxbitlen) - { - error = append_symbol_coins(coins + numcoins, frequencies, numcodes, sum); - numcoins += numpresent; - } - sort_coins(coins, numcoins); - } - } - - if(!error) - { - /*calculate the lenghts of each symbol, as the amount of times a coin of each symbol is used*/ - for(i = 0; i < numpresent - 1; i++) - { - Coin* coin = &coins[i]; - for(j = 0; j < coin->symbols.size; j++) lengths[coin->symbols.data[j]]++; - } - } - - cleanup_coins(coins, coinmem); - lodepng_free(coins); - cleanup_coins(prev_row, coinmem); - lodepng_free(prev_row); - } - - return error; -} - -/*Create the Huffman tree given the symbol frequencies*/ -static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, - size_t mincodes, size_t numcodes, unsigned maxbitlen) -{ - unsigned error = 0; - while(!frequencies[numcodes - 1] && numcodes > mincodes) numcodes--; /*trim zeroes*/ - tree->maxbitlen = maxbitlen; - tree->numcodes = (unsigned)numcodes; /*number of symbols*/ - tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); - if(!tree->lengths) return 83; /*alloc fail*/ - /*initialize all lengths to 0*/ - memset(tree->lengths, 0, numcodes * sizeof(unsigned)); - - error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); - if(!error) error = HuffmanTree_makeFromLengths2(tree); - return error; -} - -static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) -{ - return tree->tree1d[index]; -} - -static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) -{ - return tree->lengths[index]; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ -static unsigned generateFixedLitLenTree(HuffmanTree* tree) -{ - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ - for(i = 0; i <= 143; i++) bitlen[i] = 8; - for(i = 144; i <= 255; i++) bitlen[i] = 9; - for(i = 256; i <= 279; i++) bitlen[i] = 7; - for(i = 280; i <= 287; i++) bitlen[i] = 8; - - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ -static unsigned generateFixedDistanceTree(HuffmanTree* tree) -{ - unsigned i, error = 0; - unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen) return 83; /*alloc fail*/ - - /*there are 32 distance codes, but 30-31 are unused*/ - for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen[i] = 5; - error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); - - lodepng_free(bitlen); - return error; -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* -returns the code, or (unsigned)(-1) if error happened -inbitlength is the length of the complete buffer, in bits (so its byte length times 8) -*/ -static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, - const HuffmanTree* codetree, size_t inbitlength) -{ - unsigned treepos = 0, ct; - for(;;) - { - if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/ - /* - decode the symbol from the tree. The "readBitFromStream" code is inlined in - the expression below because this is the biggest bottleneck while decoding - */ - ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; - (*bp)++; - if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ - else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ - - if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/ - } -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Inflator (Decompressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/ -static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) -{ - /*TODO: check for out of memory errors*/ - generateFixedLitLenTree(tree_ll); - generateFixedDistanceTree(tree_d); -} - -/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ -static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, - const unsigned char* in, size_t* bp, size_t inlength) -{ - /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ - unsigned error = 0; - unsigned n, HLIT, HDIST, HCLEN, i; - size_t inbitlength = inlength * 8; - - /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ - unsigned* bitlen_ll = 0; /*lit,len code lengths*/ - unsigned* bitlen_d = 0; /*dist code lengths*/ - /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ - unsigned* bitlen_cl = 0; - HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ - - if((*bp) >> 3 >= inlength - 2) return 49; /*error: the bit pointer is or will go past the memory*/ - - /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ - HLIT = readBitsFromStream(bp, in, 5) + 257; - /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ - HDIST = readBitsFromStream(bp, in, 5) + 1; - /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ - HCLEN = readBitsFromStream(bp, in, 4) + 4; - - HuffmanTree_init(&tree_cl); - - while(!error) - { - /*read the code length codes out of 3 * (amount of code length codes) bits*/ - - bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); - if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); - - for(i = 0; i < NUM_CODE_LENGTH_CODES; i++) - { - if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); - else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ - } - - error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); - if(error) break; - - /*now we can use this tree to read the lengths for the tree that this function will return*/ - bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); - bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); - if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < NUM_DEFLATE_CODE_SYMBOLS; i++) bitlen_ll[i] = 0; - for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen_d[i] = 0; - - /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ - i = 0; - while(i < HLIT + HDIST) - { - unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength); - if(code <= 15) /*a length code*/ - { - if(i < HLIT) bitlen_ll[i] = code; - else bitlen_d[i - HLIT] = code; - i++; - } - else if(code == 16) /*repeat previous*/ - { - unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ - unsigned value; /*set value to the previous code*/ - - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - if (i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ - - replength += readBitsFromStream(bp, in, 2); - - if(i < HLIT + 1) value = bitlen_ll[i - 1]; - else value = bitlen_d[i - HLIT - 1]; - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) - { - if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ - if(i < HLIT) bitlen_ll[i] = value; - else bitlen_d[i - HLIT] = value; - i++; - } - } - else if(code == 17) /*repeat "0" 3-10 times*/ - { - unsigned replength = 3; /*read in the bits that indicate repeat length*/ - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - - replength += readBitsFromStream(bp, in, 3); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) - { - if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - i++; - } - } - else if(code == 18) /*repeat "0" 11-138 times*/ - { - unsigned replength = 11; /*read in the bits that indicate repeat length*/ - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - - replength += readBitsFromStream(bp, in, 7); - - /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) - { - if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ - - if(i < HLIT) bitlen_ll[i] = 0; - else bitlen_d[i - HLIT] = 0; - i++; - } - } - else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ - { - if(code == (unsigned)(-1)) - { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - error = (*bp) > inbitlength ? 10 : 11; - } - else error = 16; /*unexisting code, this can never happen*/ - break; - } - } - if(error) break; - - if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ - - /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ - error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); - if(error) break; - error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); - - break; /*end of error-while*/ - } - - lodepng_free(bitlen_cl); - lodepng_free(bitlen_ll); - lodepng_free(bitlen_d); - HuffmanTree_cleanup(&tree_cl); - - return error; -} - -/*inflate a block with dynamic of fixed Huffman tree*/ -static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, - size_t* pos, size_t inlength, unsigned btype) -{ - unsigned error = 0; - HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ - HuffmanTree tree_d; /*the huffman tree for distance codes*/ - size_t inbitlength = inlength * 8; - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d); - else if(btype == 2) error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength); - - while(!error) /*decode all symbols until end reached, breaks at end code*/ - { - /*code_ll is literal, length or end code*/ - unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); - if(code_ll <= 255) /*literal symbol*/ - { - if((*pos) >= out->size) - { - /*reserve more room at once*/ - if(!ucvector_resize(out, ((*pos) + 1) * 2)) ERROR_BREAK(83 /*alloc fail*/); - } - out->data[(*pos)] = (unsigned char)(code_ll); - (*pos)++; - } - else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ - { - unsigned code_d, distance; - unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ - size_t start, forward, backward, length; - - /*part 1: get length base*/ - length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; - - /*part 2: get extra bits and add the value of that to length*/ - numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; - if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ - length += readBitsFromStream(bp, in, numextrabits_l); - - /*part 3: get distance code*/ - code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength); - if(code_d > 29) - { - if(code_ll == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ - { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - error = (*bp) > inlength * 8 ? 10 : 11; - } - else error = 18; /*error: invalid distance code (30-31 are never used)*/ - break; - } - distance = DISTANCEBASE[code_d]; - - /*part 4: get extra bits from distance*/ - numextrabits_d = DISTANCEEXTRA[code_d]; - if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ - - distance += readBitsFromStream(bp, in, numextrabits_d); - - /*part 5: fill in all the out[n] values based on the length and dist*/ - start = (*pos); - if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ - backward = start - distance; - if((*pos) + length >= out->size) - { - /*reserve more room at once*/ - if(!ucvector_resize(out, ((*pos) + length) * 2)) ERROR_BREAK(83 /*alloc fail*/); - } - - for(forward = 0; forward < length; forward++) - { - out->data[(*pos)] = out->data[backward]; - (*pos)++; - backward++; - if(backward >= start) backward = start - distance; - } - } - else if(code_ll == 256) - { - break; /*end code, break the loop*/ - } - else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ - { - /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol - (10=no endcode, 11=wrong jump outside of tree)*/ - error = (*bp) > inlength * 8 ? 10 : 11; - break; - } - } - - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) -{ - /*go to first boundary of byte*/ - size_t p; - unsigned LEN, NLEN, n, error = 0; - while(((*bp) & 0x7) != 0) (*bp)++; - p = (*bp) / 8; /*byte position*/ - - /*read LEN (2 bytes) and NLEN (2 bytes)*/ - if(p >= inlength - 4) return 52; /*error, bit pointer will jump past memory*/ - LEN = in[p] + 256 * in[p + 1]; p += 2; - NLEN = in[p] + 256 * in[p + 1]; p += 2; - - /*check if 16-bit NLEN is really the one's complement of LEN*/ - if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ - - if((*pos) + LEN >= out->size) - { - if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ - } - - /*read the literal data: LEN bytes are now stored in the out buffer*/ - if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ - for(n = 0; n < LEN; n++) out->data[(*pos)++] = in[p++]; - - (*bp) = p * 8; - - return error; -} - -static unsigned lodepng_inflatev(ucvector* out, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) -{ - /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/ - size_t bp = 0; - unsigned BFINAL = 0; - size_t pos = 0; /*byte position in the out buffer*/ - - unsigned error = 0; - - (void)settings; - - while(!BFINAL) - { - unsigned BTYPE; - if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ - BFINAL = readBitFromStream(&bp, in); - BTYPE = 1 * readBitFromStream(&bp, in); - BTYPE += 2 * readBitFromStream(&bp, in); - - if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ - else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ - else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/ - - if(error) return error; - } - - /*Only now we know the true size of out, resize it to that*/ - if(!ucvector_resize(out, pos)) error = 83; /*alloc fail*/ - - return error; -} - -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) -{ - unsigned error; - ucvector v; - ucvector_init_buffer(&v, *out, *outsize); - error = lodepng_inflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings) -{ - if(settings->custom_inflate) - { - return settings->custom_inflate(out, outsize, in, insize, settings); - } - else - { - return lodepng_inflate(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Deflator (Compressor) / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; - -/*bitlen is the size in bits of the code*/ -static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen) -{ - addBitsToStreamReversed(bp, compressed, code, bitlen); -} - -/*search the index in the array, that has the largest value smaller than or equal to the given value, -given array must be sorted (if no value is smaller, it returns the size of the given array)*/ -static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) -{ - /*linear search implementation*/ - /*for(size_t i = 1; i < array_size; i++) if(array[i] > value) return i - 1; - return array_size - 1;*/ - - /*binary search implementation (not that much faster) (precondition: array_size > 0)*/ - size_t left = 1; - size_t right = array_size - 1; - while(left <= right) - { - size_t mid = (left + right) / 2; - if(array[mid] <= value) left = mid + 1; /*the value to find is more to the right*/ - else if(array[mid - 1] > value) right = mid - 1; /*the value to find is more to the left*/ - else return mid - 1; - } - return array_size - 1; -} - -static void addLengthDistance(uivector* values, size_t length, size_t distance) -{ - /*values in encoded vector are those used by deflate: - 0-255: literal bytes - 256: end - 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) - 286-287: invalid*/ - - unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); - unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); - unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); - unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); - - uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX); - uivector_push_back(values, extra_length); - uivector_push_back(values, dist_code); - uivector_push_back(values, extra_distance); -} - -static const unsigned HASH_NUM_VALUES = 65536; -static const unsigned HASH_NUM_CHARACTERS = 3; -static const unsigned HASH_SHIFT = 2; -/* -The HASH_NUM_CHARACTERS value is used to make encoding faster by using longer -sequences to generate a hash value from the stream bytes. Setting it to 3 -gives exactly the same compression as the brute force method, since deflate's -run length encoding starts with lengths of 3. Setting it to higher values, -like 6, can make the encoding faster (not always though!), but will cause the -encoding to miss any length between 3 and this value, so that the compression -may be worse (but this can vary too depending on the image, sometimes it is -even a bit better instead). -The HASH_NUM_VALUES is the amount of unique possible hash values that -combinations of bytes can give, the higher it is the more memory is needed, but -if it's too low the advantage of hashing is gone. -*/ - -typedef struct Hash -{ - int* head; /*hash value to head circular pos*/ - int* val; /*circular pos to hash value*/ - /*circular pos to prev circular pos*/ - unsigned short* chain; - unsigned short* zeros; -} Hash; - -static unsigned hash_init(Hash* hash, unsigned windowsize) -{ - unsigned i; - hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); - hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); - hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - - if(!hash->head || !hash->val || !hash->chain || !hash->zeros) return 83; /*alloc fail*/ - - /*initialize hash table*/ - for(i = 0; i < HASH_NUM_VALUES; i++) hash->head[i] = -1; - for(i = 0; i < windowsize; i++) hash->val[i] = -1; - for(i = 0; i < windowsize; i++) hash->chain[i] = i; /*same value as index indicates uninitialized*/ - - return 0; -} - -static void hash_cleanup(Hash* hash) -{ - lodepng_free(hash->head); - lodepng_free(hash->val); - lodepng_free(hash->chain); - lodepng_free(hash->zeros); -} - -static unsigned getHash(const unsigned char* data, size_t size, size_t pos) -{ - unsigned result = 0; - size_t amount, i; - if(pos >= size) return 0; - amount = HASH_NUM_CHARACTERS; - if(pos + amount >= size) amount = size - pos; - for(i = 0; i < amount; i++) result ^= (data[pos + i] << (i * HASH_SHIFT)); - return result % HASH_NUM_VALUES; -} - -static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) -{ - const unsigned char* start = data + pos; - const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; - if(end > data + size) end = data + size; - data = start; - while (data != end && *data == 0) data++; - /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ - return (unsigned)(data - start); -} - -static void updateHashChain(Hash* hash, size_t pos, int hashval, unsigned windowsize) -{ - unsigned wpos = pos % windowsize; - hash->val[wpos] = hashval; - if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; - hash->head[hashval] = wpos; -} - -/* -LZ77-encode the data. Return value is error code. The input are raw bytes, the output -is in the form of unsigned integers with codes representing for example literal bytes, or -length/distance pairs. -It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a -sliding window (of windowsize) is used, and all past bytes in that window can be used as -the "dictionary". A brute force search through all possible distances would be slow, and -this hash technique is one out of several ways to speed this up. -*/ -static unsigned encodeLZ77(uivector* out, Hash* hash, - const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, - unsigned minmatch, unsigned nicematch, unsigned lazymatching) -{ - unsigned short numzeros = 0; - int usezeros = windowsize >= 8192; /*for small window size, the 'max chain length' optimization does a better job*/ - unsigned pos, i, error = 0; - /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ - unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; - unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; - - if(!error) - { - unsigned offset; /*the offset represents the distance in LZ77 terminology*/ - unsigned length; - unsigned lazy = 0; - unsigned lazylength = 0, lazyoffset = 0; - unsigned hashval; - unsigned current_offset, current_length; - const unsigned char *lastptr, *foreptr, *backptr; - unsigned short hashpos, prevpos; - - for(pos = inpos; pos < insize; pos++) - { - size_t wpos = pos % windowsize; /*position for in 'circular' hash buffers*/ - - hashval = getHash(in, insize, pos); - updateHashChain(hash, pos, hashval, windowsize); - - if(usezeros && hashval == 0) - { - numzeros = countZeros(in, insize, pos); - hash->zeros[wpos] = numzeros; - } - - /*the length and offset found for the current position*/ - length = 0; - offset = 0; - - prevpos = hash->head[hashval]; - hashpos = hash->chain[prevpos]; - - lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; - - /*search for the longest string*/ - if(hash->val[wpos] == (int)hashval) - { - unsigned chainlength = 0; - for(;;) - { - /*stop when went completely around the circular buffer*/ - if(prevpos < wpos && hashpos > prevpos && hashpos <= wpos) break; - if(prevpos > wpos && (hashpos <= wpos || hashpos > prevpos)) break; - if(chainlength++ >= maxchainlength) break; - - current_offset = hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize; - if(current_offset > 0) - { - /*test the next characters*/ - foreptr = &in[pos]; - backptr = &in[pos - current_offset]; - - /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ - if(usezeros && hashval == 0 && hash->val[hashpos] == 0 /*hashval[hashpos] may be out of date*/) - { - unsigned short skip = hash->zeros[hashpos]; - if(skip > numzeros) skip = numzeros; - backptr += skip; - foreptr += skip; - } - - /* multiple checks at once per array bounds check */ - while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ - { - ++backptr; - ++foreptr; - } - current_length = (unsigned)(foreptr - &in[pos]); - - if(current_length > length) - { - length = current_length; /*the longest length*/ - offset = current_offset; /*the offset that is related to this longest length*/ - /*jump out once a length of max length is found (speed gain)*/ - if(current_length >= nicematch || current_length == MAX_SUPPORTED_DEFLATE_LENGTH) break; - } - } - - if(hashpos == hash->chain[hashpos]) break; - - prevpos = hashpos; - hashpos = hash->chain[hashpos]; - } - } - - if(lazymatching) - { - if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) - { - lazy = 1; - lazylength = length; - lazyoffset = offset; - continue; /*try the next byte*/ - } - if(lazy) - { - lazy = 0; - if(pos == 0) ERROR_BREAK(81); - if(length > lazylength + 1) - { - /*push the previous character as literal*/ - if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); - } - else - { - length = lazylength; - offset = lazyoffset; - hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ - pos--; - } - } - } - if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); - - /**encode it as length/distance pair or literal value**/ - if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ - { - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } - else if(length < minmatch || (length == 3 && offset > 4096)) - { - /*compensate for the fact that longer offsets have more extra bits, a - length of only 3 may be not worth it then*/ - if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); - } - else - { - addLengthDistance(out, length, offset); - for(i = 1; i < length; i++) - { - pos++; - hashval = getHash(in, insize, pos); - updateHashChain(hash, pos, hashval, windowsize); - if(usezeros && hashval == 0) - { - hash->zeros[pos % windowsize] = countZeros(in, insize, pos); - } - } - } - - } /*end of the loop through each character of input*/ - } /*end of "if(!error)"*/ - - return error; -} - -/* /////////////////////////////////////////////////////////////////////////// */ - -static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) -{ - /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, - 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ - - size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; - unsigned datapos = 0; - for(i = 0; i < numdeflateblocks; i++) - { - unsigned BFINAL, BTYPE, LEN, NLEN; - unsigned char firstbyte; - - BFINAL = (i == numdeflateblocks - 1); - BTYPE = 0; - - firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1)); - ucvector_push_back(out, firstbyte); - - LEN = 65535; - if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos; - NLEN = 65535 - LEN; - - ucvector_push_back(out, (unsigned char)(LEN % 256)); - ucvector_push_back(out, (unsigned char)(LEN / 256)); - ucvector_push_back(out, (unsigned char)(NLEN % 256)); - ucvector_push_back(out, (unsigned char)(NLEN / 256)); - - /*Decompressed data*/ - for(j = 0; j < 65535 && datapos < datasize; j++) - { - ucvector_push_back(out, data[datapos++]); - } - } - - return 0; -} - -/* -write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. -tree_ll: the tree for lit and len codes. -tree_d: the tree for distance codes. -*/ -static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, - const HuffmanTree* tree_ll, const HuffmanTree* tree_d) -{ - size_t i = 0; - for(i = 0; i < lz77_encoded->size; i++) - { - unsigned val = lz77_encoded->data[i]; - addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); - if(val > 256) /*for a length code, 3 more things have to be added*/ - { - unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; - unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; - unsigned length_extra_bits = lz77_encoded->data[++i]; - - unsigned distance_code = lz77_encoded->data[++i]; - - unsigned distance_index = distance_code; - unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; - unsigned distance_extra_bits = lz77_encoded->data[++i]; - - addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits); - addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code), - HuffmanTree_getLength(tree_d, distance_code)); - addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits); - } - } -} - -/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ -static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, - const unsigned char* data, size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, int final) -{ - unsigned error = 0; - - /* - A block is compressed as follows: The PNG data is lz77 encoded, resulting in - literal bytes and length/distance pairs. This is then huffman compressed with - two huffman trees. One huffman tree is used for the lit and len values ("ll"), - another huffman tree is used for the dist values ("d"). These two trees are - stored using their code lengths, and to compress even more these code lengths - are also run-length encoded and huffman compressed. This gives a huffman tree - of code lengths "cl". The code lenghts used to describe this third tree are - the code length code lengths ("clcl"). - */ - - /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ - uivector lz77_encoded; - HuffmanTree tree_ll; /*tree for lit,len values*/ - HuffmanTree tree_d; /*tree for distance codes*/ - HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ - uivector frequencies_ll; /*frequency of lit,len codes*/ - uivector frequencies_d; /*frequency of dist codes*/ - uivector frequencies_cl; /*frequency of code length codes*/ - uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/ - uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/ - /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl - (these are written as is in the file, it would be crazy to compress these using yet another huffman - tree that needs to be represented by yet another set of code lengths)*/ - uivector bitlen_cl; - size_t datasize = dataend - datapos; - - /* - Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies: - bitlen_lld is to tree_cl what data is to tree_ll and tree_d. - bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. - bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. - */ - - unsigned BFINAL = final; - size_t numcodes_ll, numcodes_d, i; - unsigned HLIT, HDIST, HCLEN; - - uivector_init(&lz77_encoded); - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - HuffmanTree_init(&tree_cl); - uivector_init(&frequencies_ll); - uivector_init(&frequencies_d); - uivector_init(&frequencies_cl); - uivector_init(&bitlen_lld); - uivector_init(&bitlen_lld_e); - uivector_init(&bitlen_cl); - - /*This while loop never loops due to a break at the end, it is here to - allow breaking out of it to the cleanup phase on error conditions.*/ - while(!error) - { - if(settings->use_lz77) - { - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(error) break; - } - else - { - if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); - for(i = datapos; i < dataend; i++) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/ - } - - if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); - if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); - - /*Count the frequencies of lit, len and dist codes*/ - for(i = 0; i < lz77_encoded.size; i++) - { - unsigned symbol = lz77_encoded.data[i]; - frequencies_ll.data[symbol]++; - if(symbol > 256) - { - unsigned dist = lz77_encoded.data[i + 2]; - frequencies_d.data[dist]++; - i += 3; - } - } - frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ - - /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ - error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, 257, frequencies_ll.size, 15); - if(error) break; - /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ - error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, 2, frequencies_d.size, 15); - if(error) break; - - numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; - numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; - /*store the code lengths of both generated trees in bitlen_lld*/ - for(i = 0; i < numcodes_ll; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); - for(i = 0; i < numcodes_d; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); - - /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), - 17 (3-10 zeroes), 18 (11-138 zeroes)*/ - for(i = 0; i < (unsigned)bitlen_lld.size; i++) - { - unsigned j = 0; /*amount of repititions*/ - while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) j++; - - if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ - { - j++; /*include the first zero*/ - if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ - { - uivector_push_back(&bitlen_lld_e, 17); - uivector_push_back(&bitlen_lld_e, j - 3); - } - else /*repeat code 18 supports max 138 zeroes*/ - { - if(j > 138) j = 138; - uivector_push_back(&bitlen_lld_e, 18); - uivector_push_back(&bitlen_lld_e, j - 11); - } - i += (j - 1); - } - else if(j >= 3) /*repeat code for value other than zero*/ - { - size_t k; - unsigned num = j / 6, rest = j % 6; - uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); - for(k = 0; k < num; k++) - { - uivector_push_back(&bitlen_lld_e, 16); - uivector_push_back(&bitlen_lld_e, 6 - 3); - } - if(rest >= 3) - { - uivector_push_back(&bitlen_lld_e, 16); - uivector_push_back(&bitlen_lld_e, rest - 3); - } - else j -= rest; - i += j; - } - else /*too short to benefit from repeat code*/ - { - uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); - } - } - - /*generate tree_cl, the huffmantree of huffmantrees*/ - - if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < bitlen_lld_e.size; i++) - { - frequencies_cl.data[bitlen_lld_e.data[i]]++; - /*after a repeat code come the bits that specify the number of repetitions, - those don't need to be in the frequencies_cl calculation*/ - if(bitlen_lld_e.data[i] >= 16) i++; - } - - error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, - frequencies_cl.size, frequencies_cl.size, 7); - if(error) break; - - if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < tree_cl.numcodes; i++) - { - /*lenghts of code length tree is in the order as specified by deflate*/ - bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); - } - while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4) - { - /*remove zeros at the end, but minimum size must be 4*/ - if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/); - } - if(error) break; - - /* - Write everything into the output - - After the BFINAL and BTYPE, the dynamic block consists out of the following: - - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN - - (HCLEN+4)*3 bits code lengths of code length alphabet - - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - HDIST + 1 code lengths of distance alphabet (encoded using the code length - alphabet, + possible repetition codes 16, 17, 18) - - compressed data - - 256 (end code) - */ - - /*Write block type*/ - addBitToStream(bp, out, BFINAL); - addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/ - addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/ - - /*write the HLIT, HDIST and HCLEN values*/ - HLIT = (unsigned)(numcodes_ll - 257); - HDIST = (unsigned)(numcodes_d - 1); - HCLEN = (unsigned)bitlen_cl.size - 4; - /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/ - while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) HCLEN--; - addBitsToStream(bp, out, HLIT, 5); - addBitsToStream(bp, out, HDIST, 5); - addBitsToStream(bp, out, HCLEN, 4); - - /*write the code lenghts of the code length alphabet*/ - for(i = 0; i < HCLEN + 4; i++) addBitsToStream(bp, out, bitlen_cl.data[i], 3); - - /*write the lenghts of the lit/len AND the dist alphabet*/ - for(i = 0; i < bitlen_lld_e.size; i++) - { - addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), - HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); - /*extra bits of repeat codes*/ - if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2); - else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3); - else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7); - } - - /*write the compressed data symbols*/ - writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); - /*error: the length of the end code 256 must be larger than 0*/ - if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64); - - /*write the end code*/ - addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); - - break; /*end of error-while*/ - } - - /*cleanup*/ - uivector_cleanup(&lz77_encoded); - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - HuffmanTree_cleanup(&tree_cl); - uivector_cleanup(&frequencies_ll); - uivector_cleanup(&frequencies_d); - uivector_cleanup(&frequencies_cl); - uivector_cleanup(&bitlen_lld_e); - uivector_cleanup(&bitlen_lld); - uivector_cleanup(&bitlen_cl); - - return error; -} - -static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, - const unsigned char* data, - size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, int final) -{ - HuffmanTree tree_ll; /*tree for literal values and length codes*/ - HuffmanTree tree_d; /*tree for distance codes*/ - - unsigned BFINAL = final; - unsigned error = 0; - size_t i; - - HuffmanTree_init(&tree_ll); - HuffmanTree_init(&tree_d); - - generateFixedLitLenTree(&tree_ll); - generateFixedDistanceTree(&tree_d); - - addBitToStream(bp, out, BFINAL); - addBitToStream(bp, out, 1); /*first bit of BTYPE*/ - addBitToStream(bp, out, 0); /*second bit of BTYPE*/ - - if(settings->use_lz77) /*LZ77 encoded*/ - { - uivector lz77_encoded; - uivector_init(&lz77_encoded); - error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, - settings->minmatch, settings->nicematch, settings->lazymatching); - if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); - uivector_cleanup(&lz77_encoded); - } - else /*no LZ77, but still will be Huffman compressed*/ - { - for(i = datapos; i < dataend; i++) - { - addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); - } - } - /*add END code*/ - if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); - - /*cleanup*/ - HuffmanTree_cleanup(&tree_ll); - HuffmanTree_cleanup(&tree_d); - - return error; -} - -static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) -{ - unsigned error = 0; - size_t i, blocksize, numdeflateblocks; - size_t bp = 0; /*the bit pointer*/ - Hash hash; - - if(settings->btype > 2) return 61; - else if(settings->btype == 0) return deflateNoCompression(out, in, insize); - else if(settings->btype == 1) blocksize = insize; - else /*if(settings->btype == 2)*/ - { - blocksize = insize / 8 + 8; - if(blocksize < 65535) blocksize = 65535; - } - - numdeflateblocks = (insize + blocksize - 1) / blocksize; - if(numdeflateblocks == 0) numdeflateblocks = 1; - - error = hash_init(&hash, settings->windowsize); - if(error) return error; - - for(i = 0; i < numdeflateblocks && !error; i++) - { - int final = i == numdeflateblocks - 1; - size_t start = i * blocksize; - size_t end = start + blocksize; - if(end > insize) end = insize; - - if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final); - else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final); - } - - hash_cleanup(&hash); - - return error; -} - -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) -{ - unsigned error; - ucvector v; - ucvector_init_buffer(&v, *out, *outsize); - error = lodepng_deflatev(&v, in, insize, settings); - *out = v.data; - *outsize = v.size; - return error; -} - -static unsigned deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings) -{ - if(settings->custom_deflate) - { - return settings->custom_deflate(out, outsize, in, insize, settings); - } - else - { - return lodepng_deflate(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Adler32 */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) -{ - unsigned s1 = adler & 0xffff; - unsigned s2 = (adler >> 16) & 0xffff; - - while(len > 0) - { - /*at least 5550 sums can be done before the sums overflow, saving a lot of module divisions*/ - unsigned amount = len > 5550 ? 5550 : len; - len -= amount; - while(amount > 0) - { - s1 += (*data++); - s2 += s1; - amount--; - } - s1 %= 65521; - s2 %= 65521; - } - - return (s2 << 16) | s1; -} - -/*Return the adler32 of the bytes data[0..len-1]*/ -static unsigned adler32(const unsigned char* data, unsigned len) -{ - return update_adler32(1L, data, len); -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Zlib / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_DECODER - -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) -{ - unsigned error = 0; - unsigned CM, CINFO, FDICT; - - if(insize < 2) return 53; /*error, size of zlib data too small*/ - /*read information from zlib header*/ - if((in[0] * 256 + in[1]) % 31 != 0) - { - /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ - return 24; - } - - CM = in[0] & 15; - CINFO = (in[0] >> 4) & 15; - /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ - FDICT = (in[1] >> 5) & 1; - /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ - - if(CM != 8 || CINFO > 7) - { - /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ - return 25; - } - if(FDICT != 0) - { - /*error: the specification of PNG says about the zlib stream: - "The additional flags shall not specify a preset dictionary."*/ - return 26; - } - - error = inflate(out, outsize, in + 2, insize - 2, settings); - if(error) return error; - - if(!settings->ignore_adler32) - { - unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); - unsigned checksum = adler32(*out, (unsigned)(*outsize)); - if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ - } - - return 0; /*no error*/ -} - -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) -{ - if(settings->custom_zlib) - return settings->custom_zlib(out, outsize, in, insize, settings); - else - return lodepng_zlib_decompress(out, outsize, in, insize, settings); -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER - -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) -{ - /*initially, *out must be NULL and outsize 0, if you just give some random *out - that's pointing to a non allocated buffer, this'll crash*/ - ucvector outv; - size_t i; - unsigned error; - unsigned char* deflatedata = 0; - size_t deflatesize = 0; - - unsigned ADLER32; - /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ - unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ - unsigned FLEVEL = 0; - unsigned FDICT = 0; - unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; - unsigned FCHECK = 31 - CMFFLG % 31; - CMFFLG += FCHECK; - - /*ucvector-controlled version of the output buffer, for dynamic array*/ - ucvector_init_buffer(&outv, *out, *outsize); - - ucvector_push_back(&outv, (unsigned char)(CMFFLG / 256)); - ucvector_push_back(&outv, (unsigned char)(CMFFLG % 256)); - - error = deflate(&deflatedata, &deflatesize, in, insize, settings); - - if(!error) - { - ADLER32 = adler32(in, (unsigned)insize); - for(i = 0; i < deflatesize; i++) ucvector_push_back(&outv, deflatedata[i]); - lodepng_free(deflatedata); - lodepng_add32bitInt(&outv, ADLER32); - } - - *out = outv.data; - *outsize = outv.size; - - return error; -} - -/* compress using the default or custom zlib function */ -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) -{ - if(settings->custom_zlib) - { - return settings->custom_zlib(out, outsize, in, insize, settings); - } - else - { - return lodepng_zlib_compress(out, outsize, in, insize, settings); - } -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#else /*no LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DECODER -static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGDecompressSettings* settings) -{ - if (!settings->custom_zlib) return 87; /*no custom zlib function provided */ - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER -static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, - size_t insize, const LodePNGCompressSettings* settings) -{ - if (!settings->custom_zlib) return 87; /*no custom zlib function provided */ - return settings->custom_zlib(out, outsize, in, insize, settings); -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#endif /*LODEPNG_COMPILE_ZLIB*/ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/*this is a good tradeoff between speed and compression ratio*/ -#define DEFAULT_WINDOWSIZE 2048 - -void lodepng_compress_settings_init(LodePNGCompressSettings* settings) -{ - /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ - settings->btype = 2; - settings->use_lz77 = 1; - settings->windowsize = DEFAULT_WINDOWSIZE; - settings->minmatch = 3; - settings->nicematch = 128; - settings->lazymatching = 1; - - settings->custom_zlib = 0; - settings->custom_deflate = 0; - settings->custom_context = 0; -} - -const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; - - -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DECODER - -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) -{ - settings->ignore_adler32 = 0; - - settings->custom_zlib = 0; - settings->custom_inflate = 0; - settings->custom_context = 0; -} - -const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0}; - -#endif /*LODEPNG_COMPILE_DECODER*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // End of Zlib related code. Begin of PNG related code. // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef LODEPNG_COMPILE_PNG - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / CRC32 / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned Crc32_crc_table_computed = 0; -static unsigned Crc32_crc_table[256]; - -/*Make the table for a fast CRC.*/ -static void Crc32_make_crc_table(void) -{ - unsigned c, k, n; - for(n = 0; n < 256; n++) - { - c = n; - for(k = 0; k < 8; k++) - { - if(c & 1) c = 0xedb88320L ^ (c >> 1); - else c = c >> 1; - } - Crc32_crc_table[n] = c; - } - Crc32_crc_table_computed = 1; -} - -/*Update a running CRC with the bytes buf[0..len-1]--the CRC should be -initialized to all 1's, and the transmitted value is the 1's complement of the -final running CRC (see the crc() routine below).*/ -static unsigned Crc32_update_crc(const unsigned char* buf, unsigned crc, size_t len) -{ - unsigned c = crc; - size_t n; - - if(!Crc32_crc_table_computed) Crc32_make_crc_table(); - for(n = 0; n < len; n++) - { - c = Crc32_crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); - } - return c; -} - -/*Return the CRC of the bytes buf[0..len-1].*/ -unsigned lodepng_crc32(const unsigned char* buf, size_t len) -{ - return Crc32_update_crc(buf, 0xffffffffL, len) ^ 0xffffffffL; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Reading and writing single bits and bytes from/to stream for LodePNG / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) -{ - unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); - (*bitpointer)++; - return result; -} - -static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) -{ - unsigned result = 0; - size_t i; - for(i = nbits - 1; i < nbits; i--) - { - result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i; - } - return result; -} - -#ifdef LODEPNG_COMPILE_DECODER -static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) -{ - /*the current bit in bitstream must be 0 for this to work*/ - if(bit) - { - /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ - bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); - } - (*bitpointer)++; -} -#endif /*LODEPNG_COMPILE_DECODER*/ - -static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) -{ - /*the current bit in bitstream may be 0 or 1 for this to work*/ - if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); - else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); - (*bitpointer)++; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG chunks / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -unsigned lodepng_chunk_length(const unsigned char* chunk) -{ - return lodepng_read32bitInt(&chunk[0]); -} - -void lodepng_chunk_type(char type[5], const unsigned char* chunk) -{ - unsigned i; - for(i = 0; i < 4; i++) type[i] = chunk[4 + i]; - type[4] = 0; /*null termination char*/ -} - -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) -{ - if(strlen(type) != 4) return 0; - return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); -} - -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) -{ - return((chunk[4] & 32) != 0); -} - -unsigned char lodepng_chunk_private(const unsigned char* chunk) -{ - return((chunk[6] & 32) != 0); -} - -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) -{ - return((chunk[7] & 32) != 0); -} - -unsigned char* lodepng_chunk_data(unsigned char* chunk) -{ - return &chunk[8]; -} - -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) -{ - return &chunk[8]; -} - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk) -{ - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); - /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ - unsigned checksum = lodepng_crc32(&chunk[4], length + 4); - if(CRC != checksum) return 1; - else return 0; -} - -void lodepng_chunk_generate_crc(unsigned char* chunk) -{ - unsigned length = lodepng_chunk_length(chunk); - unsigned CRC = lodepng_crc32(&chunk[4], length + 4); - lodepng_set32bitInt(chunk + 8 + length, CRC); -} - -unsigned char* lodepng_chunk_next(unsigned char* chunk) -{ - unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; - return &chunk[total_chunk_length]; -} - -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk) -{ - unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; - return &chunk[total_chunk_length]; -} - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk) -{ - unsigned i; - unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; - unsigned char *chunk_start, *new_buffer; - size_t new_length = (*outlength) + total_chunk_length; - if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/ - - new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); - if(!new_buffer) return 83; /*alloc fail*/ - (*out) = new_buffer; - (*outlength) = new_length; - chunk_start = &(*out)[new_length - total_chunk_length]; - - for(i = 0; i < total_chunk_length; i++) chunk_start[i] = chunk[i]; - - return 0; -} - -unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, - const char* type, const unsigned char* data) -{ - unsigned i; - unsigned char *chunk, *new_buffer; - size_t new_length = (*outlength) + length + 12; - if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/ - new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); - if(!new_buffer) return 83; /*alloc fail*/ - (*out) = new_buffer; - (*outlength) = new_length; - chunk = &(*out)[(*outlength) - length - 12]; - - /*1: length*/ - lodepng_set32bitInt(chunk, (unsigned)length); - - /*2: chunk name (4 letters)*/ - chunk[4] = type[0]; - chunk[5] = type[1]; - chunk[6] = type[2]; - chunk[7] = type[3]; - - /*3: the data*/ - for(i = 0; i < length; i++) chunk[8 + i] = data[i]; - - /*4: CRC (of the chunkname characters and the data)*/ - lodepng_chunk_generate_crc(chunk); - - return 0; -} - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / Color types and such / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*return type is a LodePNG error code*/ -static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/ -{ - switch(colortype) - { - case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/ - case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/ - case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/ - case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/ - case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/ - default: return 31; - } - return 0; /*allowed color type / bits combination*/ -} - -static unsigned getNumColorChannels(LodePNGColorType colortype) -{ - switch(colortype) - { - case 0: return 1; /*grey*/ - case 2: return 3; /*RGB*/ - case 3: return 1; /*palette*/ - case 4: return 2; /*grey + alpha*/ - case 6: return 4; /*RGBA*/ - } - return 0; /*unexisting color type*/ -} - -static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) -{ - /*bits per pixel is amount of channels * bits per channel*/ - return getNumColorChannels(colortype) * bitdepth; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -void lodepng_color_mode_init(LodePNGColorMode* info) -{ - info->key_defined = 0; - info->key_r = info->key_g = info->key_b = 0; - info->colortype = LCT_RGBA; - info->bitdepth = 8; - info->palette = 0; - info->palettesize = 0; -} - -void lodepng_color_mode_cleanup(LodePNGColorMode* info) -{ - lodepng_palette_clear(info); -} - -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) -{ - size_t i; - lodepng_color_mode_cleanup(dest); - *dest = *source; - if(source->palette) - { - dest->palette = (unsigned char*)lodepng_malloc(source->palettesize * 4); - if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ - for(i = 0; i < source->palettesize * 4; i++) dest->palette[i] = source->palette[i]; - } - return 0; -} - -static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) -{ - size_t i; - if(a->colortype != b->colortype) return 0; - if(a->bitdepth != b->bitdepth) return 0; - if(a->key_defined != b->key_defined) return 0; - if(a->key_defined) - { - if(a->key_r != b->key_r) return 0; - if(a->key_g != b->key_g) return 0; - if(a->key_b != b->key_b) return 0; - } - if(a->palettesize != b->palettesize) return 0; - for(i = 0; i < a->palettesize * 4; i++) - { - if(a->palette[i] != b->palette[i]) return 0; - } - return 1; -} - -void lodepng_palette_clear(LodePNGColorMode* info) -{ - if(info->palette) lodepng_free(info->palette); - info->palettesize = 0; -} - -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - unsigned char* data; - /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with - the max of 256 colors, it'll have the exact alloc size*/ - if(!(info->palettesize & (info->palettesize - 1))) /*if palettesize is 0 or a power of two*/ - { - /*allocated data must be at least 4* palettesize (for 4 color bytes)*/ - size_t alloc_size = info->palettesize == 0 ? 4 : info->palettesize * 4 * 2; - data = (unsigned char*)lodepng_realloc(info->palette, alloc_size); - if(!data) return 83; /*alloc fail*/ - else info->palette = data; - } - info->palette[4 * info->palettesize + 0] = r; - info->palette[4 * info->palettesize + 1] = g; - info->palette[4 * info->palettesize + 2] = b; - info->palette[4 * info->palettesize + 3] = a; - info->palettesize++; - return 0; -} - -unsigned lodepng_get_bpp(const LodePNGColorMode* info) -{ - /*calculate bits per pixel out of colortype and bitdepth*/ - return lodepng_get_bpp_lct(info->colortype, info->bitdepth); -} - -unsigned lodepng_get_channels(const LodePNGColorMode* info) -{ - return getNumColorChannels(info->colortype); -} - -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) -{ - return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; -} - -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) -{ - return (info->colortype & 4) != 0; /*4 or 6*/ -} - -unsigned lodepng_is_palette_type(const LodePNGColorMode* info) -{ - return info->colortype == LCT_PALETTE; -} - -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) -{ - size_t i; - for(i = 0; i < info->palettesize; i++) - { - if(info->palette[i * 4 + 3] < 255) return 1; - } - return 0; -} - -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) -{ - return info->key_defined - || lodepng_is_alpha_type(info) - || lodepng_has_palette_alpha(info); -} - -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) -{ - return (w * h * lodepng_get_bpp(color) + 7) / 8; -} - -size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) -{ - return (w * h * lodepng_get_bpp_lct(colortype, bitdepth) + 7) / 8; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static void LodePNGUnknownChunks_init(LodePNGInfo* info) -{ - unsigned i; - for(i = 0; i < 3; i++) info->unknown_chunks_data[i] = 0; - for(i = 0; i < 3; i++) info->unknown_chunks_size[i] = 0; -} - -static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) -{ - unsigned i; - for(i = 0; i < 3; i++) lodepng_free(info->unknown_chunks_data[i]); -} - -static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) -{ - unsigned i; - - LodePNGUnknownChunks_cleanup(dest); - - for(i = 0; i < 3; i++) - { - size_t j; - dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; - dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); - if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ - for(j = 0; j < src->unknown_chunks_size[i]; j++) - { - dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; - } - } - - return 0; -} - -/******************************************************************************/ - -static void LodePNGText_init(LodePNGInfo* info) -{ - info->text_num = 0; - info->text_keys = NULL; - info->text_strings = NULL; -} - -static void LodePNGText_cleanup(LodePNGInfo* info) -{ - size_t i; - for(i = 0; i < info->text_num; i++) - { - string_cleanup(&info->text_keys[i]); - string_cleanup(&info->text_strings[i]); - } - lodepng_free(info->text_keys); - lodepng_free(info->text_strings); -} - -static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) -{ - size_t i = 0; - dest->text_keys = 0; - dest->text_strings = 0; - dest->text_num = 0; - for(i = 0; i < source->text_num; i++) - { - CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); - } - return 0; -} - -void lodepng_clear_text(LodePNGInfo* info) -{ - LodePNGText_cleanup(info); -} - -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) -{ - char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); - if(!new_keys || !new_strings) - { - lodepng_free(new_keys); - lodepng_free(new_strings); - return 83; /*alloc fail*/ - } - - info->text_num++; - info->text_keys = new_keys; - info->text_strings = new_strings; - - string_init(&info->text_keys[info->text_num - 1]); - string_set(&info->text_keys[info->text_num - 1], key); - - string_init(&info->text_strings[info->text_num - 1]); - string_set(&info->text_strings[info->text_num - 1], str); - - return 0; -} - -/******************************************************************************/ - -static void LodePNGIText_init(LodePNGInfo* info) -{ - info->itext_num = 0; - info->itext_keys = NULL; - info->itext_langtags = NULL; - info->itext_transkeys = NULL; - info->itext_strings = NULL; -} - -static void LodePNGIText_cleanup(LodePNGInfo* info) -{ - size_t i; - for(i = 0; i < info->itext_num; i++) - { - string_cleanup(&info->itext_keys[i]); - string_cleanup(&info->itext_langtags[i]); - string_cleanup(&info->itext_transkeys[i]); - string_cleanup(&info->itext_strings[i]); - } - lodepng_free(info->itext_keys); - lodepng_free(info->itext_langtags); - lodepng_free(info->itext_transkeys); - lodepng_free(info->itext_strings); -} - -static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) -{ - size_t i = 0; - dest->itext_keys = 0; - dest->itext_langtags = 0; - dest->itext_transkeys = 0; - dest->itext_strings = 0; - dest->itext_num = 0; - for(i = 0; i < source->itext_num; i++) - { - CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], - source->itext_transkeys[i], source->itext_strings[i])); - } - return 0; -} - -void lodepng_clear_itext(LodePNGInfo* info) -{ - LodePNGIText_cleanup(info); -} - -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str) -{ - char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); - char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); - char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); - char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); - if(!new_keys || !new_langtags || !new_transkeys || !new_strings) - { - lodepng_free(new_keys); - lodepng_free(new_langtags); - lodepng_free(new_transkeys); - lodepng_free(new_strings); - return 83; /*alloc fail*/ - } - - info->itext_num++; - info->itext_keys = new_keys; - info->itext_langtags = new_langtags; - info->itext_transkeys = new_transkeys; - info->itext_strings = new_strings; - - string_init(&info->itext_keys[info->itext_num - 1]); - string_set(&info->itext_keys[info->itext_num - 1], key); - - string_init(&info->itext_langtags[info->itext_num - 1]); - string_set(&info->itext_langtags[info->itext_num - 1], langtag); - - string_init(&info->itext_transkeys[info->itext_num - 1]); - string_set(&info->itext_transkeys[info->itext_num - 1], transkey); - - string_init(&info->itext_strings[info->itext_num - 1]); - string_set(&info->itext_strings[info->itext_num - 1], str); - - return 0; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -void lodepng_info_init(LodePNGInfo* info) -{ - lodepng_color_mode_init(&info->color); - info->interlace_method = 0; - info->compression_method = 0; - info->filter_method = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - info->background_defined = 0; - info->background_r = info->background_g = info->background_b = 0; - - LodePNGText_init(info); - LodePNGIText_init(info); - - info->time_defined = 0; - info->phys_defined = 0; - - LodePNGUnknownChunks_init(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -void lodepng_info_cleanup(LodePNGInfo* info) -{ - lodepng_color_mode_cleanup(&info->color); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - LodePNGText_cleanup(info); - LodePNGIText_cleanup(info); - - LodePNGUnknownChunks_cleanup(info); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) -{ - lodepng_info_cleanup(dest); - *dest = *source; - lodepng_color_mode_init(&dest->color); - CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); - CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); - - LodePNGUnknownChunks_init(dest); - CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - return 0; -} - -void lodepng_info_swap(LodePNGInfo* a, LodePNGInfo* b) -{ - LodePNGInfo temp = *a; - *a = *b; - *b = temp; -} - -/* ////////////////////////////////////////////////////////////////////////// */ - -/*index: bitgroup index, bits: bitgroup size(1, 2 or 4, in: bitgroup value, out: octet array to add bits to*/ -static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) -{ - /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ - unsigned p = index % (8 / bits); - in &= (1 << bits) - 1; /*filter out any other bits of the input value*/ - in = in << (bits * (8 / bits - p - 1)); - if(p == 0) out[index * bits / 8] = in; - else out[index * bits / 8] |= in; -} - -typedef struct ColorTree ColorTree; - -/* -One node of a color tree -This is the data structure used to count the number of unique colors and to get a palette -index for a color. It's like an octree, but because the alpha channel is used too, each -node has 16 instead of 8 children. -*/ -struct ColorTree -{ - ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ - int index; /*the payload. Only has a meaningful value if this is in the last level*/ -}; - -static void color_tree_init(ColorTree* tree) -{ - int i; - for(i = 0; i < 16; i++) tree->children[i] = 0; - tree->index = -1; -} - -static void color_tree_cleanup(ColorTree* tree) -{ - int i; - for(i = 0; i < 16; i++) - { - if(tree->children[i]) - { - color_tree_cleanup(tree->children[i]); - lodepng_free(tree->children[i]); - } - } -} - -/*returns -1 if color not present, its index otherwise*/ -static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - int bit = 0; - for(bit = 0; bit < 8; bit++) - { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) return -1; - else tree = tree->children[i]; - } - return tree ? tree->index : -1; -} - -#ifdef LODEPNG_COMPILE_ENCODER -static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - return color_tree_get(tree, r, g, b, a) >= 0; -} -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/*color is not allowed to already exist. -Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ -static void color_tree_add(ColorTree* tree, - unsigned char r, unsigned char g, unsigned char b, unsigned char a, int index) -{ - int bit; - for(bit = 0; bit < 8; bit++) - { - int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); - if(!tree->children[i]) - { - tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); - color_tree_init(tree->children[i]); - } - tree = tree->children[i]; - } - tree->index = index; -} - -/*put a pixel, given its RGBA color, into image of any color type*/ -static unsigned rgba8ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, - unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - if(mode->colortype == LCT_GREY) - { - unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; - if(mode->bitdepth == 8) out[i] = grey; - else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey; - else - { - /*take the most significant bits of grey*/ - grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1); - addColorBits(out, i, mode->bitdepth, grey); - } - } - else if(mode->colortype == LCT_RGB) - { - if(mode->bitdepth == 8) - { - out[i * 3 + 0] = r; - out[i * 3 + 1] = g; - out[i * 3 + 2] = b; - } - else - { - out[i * 6 + 0] = out[i * 6 + 1] = r; - out[i * 6 + 2] = out[i * 6 + 3] = g; - out[i * 6 + 4] = out[i * 6 + 5] = b; - } - } - else if(mode->colortype == LCT_PALETTE) - { - int index = color_tree_get(tree, r, g, b, a); - if(index < 0) return 82; /*color not in palette*/ - if(mode->bitdepth == 8) out[i] = index; - else addColorBits(out, i, mode->bitdepth, index); - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; - if(mode->bitdepth == 8) - { - out[i * 2 + 0] = grey; - out[i * 2 + 1] = a; - } - else if(mode->bitdepth == 16) - { - out[i * 4 + 0] = out[i * 4 + 1] = grey; - out[i * 4 + 2] = out[i * 4 + 3] = a; - } - } - else if(mode->colortype == LCT_RGBA) - { - if(mode->bitdepth == 8) - { - out[i * 4 + 0] = r; - out[i * 4 + 1] = g; - out[i * 4 + 2] = b; - out[i * 4 + 3] = a; - } - else - { - out[i * 8 + 0] = out[i * 8 + 1] = r; - out[i * 8 + 2] = out[i * 8 + 3] = g; - out[i * 8 + 4] = out[i * 8 + 5] = b; - out[i * 8 + 6] = out[i * 8 + 7] = a; - } - } - - return 0; /*no error*/ -} - -/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ -static unsigned rgba16ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, - unsigned short r, unsigned short g, unsigned short b, unsigned short a) -{ - if(mode->bitdepth != 16) return 85; /*must be 16 for this function*/ - if(mode->colortype == LCT_GREY) - { - unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; - out[i * 2 + 0] = (grey >> 8) & 255; - out[i * 2 + 1] = grey & 255; - } - else if(mode->colortype == LCT_RGB) - { - out[i * 6 + 0] = (r >> 8) & 255; - out[i * 6 + 1] = r & 255; - out[i * 6 + 2] = (g >> 8) & 255; - out[i * 6 + 3] = g & 255; - out[i * 6 + 4] = (b >> 8) & 255; - out[i * 6 + 5] = b & 255; - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; - out[i * 4 + 0] = (grey >> 8) & 255; - out[i * 4 + 1] = grey & 255; - out[i * 4 + 2] = (a >> 8) & 255; - out[i * 4 + 3] = a & 255; - } - else if(mode->colortype == LCT_RGBA) - { - out[i * 8 + 0] = (r >> 8) & 255; - out[i * 8 + 1] = r & 255; - out[i * 8 + 2] = (g >> 8) & 255; - out[i * 8 + 3] = g & 255; - out[i * 8 + 4] = (b >> 8) & 255; - out[i * 8 + 5] = b & 255; - out[i * 8 + 6] = (a >> 8) & 255; - out[i * 8 + 7] = a & 255; - } - - return 0; /*no error*/ -} - -/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ -static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g, - unsigned char* b, unsigned char* a, - const unsigned char* in, size_t i, - const LodePNGColorMode* mode, - unsigned fix_png) -{ - if(mode->colortype == LCT_GREY) - { - if(mode->bitdepth == 8) - { - *r = *g = *b = in[i]; - if(mode->key_defined && *r == mode->key_r) *a = 0; - else *a = 255; - } - else if(mode->bitdepth == 16) - { - *r = *g = *b = in[i * 2 + 0]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 255; - } - else - { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = i * mode->bitdepth; - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - *r = *g = *b = (value * 255) / highest; - if(mode->key_defined && value == mode->key_r) *a = 0; - else *a = 255; - } - } - else if(mode->colortype == LCT_RGB) - { - if(mode->bitdepth == 8) - { - *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; - if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; - else *a = 255; - } - else - { - *r = in[i * 6 + 0]; - *g = in[i * 6 + 2]; - *b = in[i * 6 + 4]; - if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 255; - } - } - else if(mode->colortype == LCT_PALETTE) - { - unsigned index; - if(mode->bitdepth == 8) index = in[i]; - else - { - size_t j = i * mode->bitdepth; - index = readBitsFromReversedStream(&j, in, mode->bitdepth); - } - - if(index >= mode->palettesize) - { - /*This is an error according to the PNG spec, but fix_png can ignore it*/ - if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ - *r = *g = *b = 0; - *a = 255; - } - else - { - *r = mode->palette[index * 4 + 0]; - *g = mode->palette[index * 4 + 1]; - *b = mode->palette[index * 4 + 2]; - *a = mode->palette[index * 4 + 3]; - } - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - if(mode->bitdepth == 8) - { - *r = *g = *b = in[i * 2 + 0]; - *a = in[i * 2 + 1]; - } - else - { - *r = *g = *b = in[i * 4 + 0]; - *a = in[i * 4 + 2]; - } - } - else if(mode->colortype == LCT_RGBA) - { - if(mode->bitdepth == 8) - { - *r = in[i * 4 + 0]; - *g = in[i * 4 + 1]; - *b = in[i * 4 + 2]; - *a = in[i * 4 + 3]; - } - else - { - *r = in[i * 8 + 0]; - *g = in[i * 8 + 2]; - *b = in[i * 8 + 4]; - *a = in[i * 8 + 6]; - } - } - - return 0; /*no error*/ -} - -/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color -mode test cases, optimized to convert the colors much faster, when converting -to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with -enough memory, if has_alpha is true the output is RGBA. mode has the color mode -of the input buffer.*/ -static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, - unsigned has_alpha, const unsigned char* in, - const LodePNGColorMode* mode, - unsigned fix_png) -{ - unsigned num_channels = has_alpha ? 4 : 3; - size_t i; - if(mode->colortype == LCT_GREY) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i]; - if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255; - } - } - else if(mode->bitdepth == 16) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i * 2]; - if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; - } - } - else - { - unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ - size_t j = 0; - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); - buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; - if(has_alpha) buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; - } - } - } - else if(mode->colortype == LCT_RGB) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 3 + 0]; - buffer[1] = in[i * 3 + 1]; - buffer[2] = in[i * 3 + 2]; - if(has_alpha) buffer[3] = mode->key_defined && buffer[0] == mode->key_r - && buffer[1]== mode->key_g && buffer[2] == mode->key_b ? 0 : 255; - } - } - else - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 6 + 0]; - buffer[1] = in[i * 6 + 2]; - buffer[2] = in[i * 6 + 4]; - if(has_alpha) buffer[3] = mode->key_defined - && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; - } - } - } - else if(mode->colortype == LCT_PALETTE) - { - unsigned index; - size_t j = 0; - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - if(mode->bitdepth == 8) index = in[i]; - else index = readBitsFromReversedStream(&j, in, mode->bitdepth); - - if(index >= mode->palettesize) - { - /*This is an error according to the PNG spec, but fix_png can ignore it*/ - if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ - buffer[0] = buffer[1] = buffer[2] = 0; - if(has_alpha) buffer[3] = 255; - } - else - { - buffer[0] = mode->palette[index * 4 + 0]; - buffer[1] = mode->palette[index * 4 + 1]; - buffer[2] = mode->palette[index * 4 + 2]; - if(has_alpha) buffer[3] = mode->palette[index * 4 + 3]; - } - } - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; - if(has_alpha) buffer[3] = in[i * 2 + 1]; - } - } - else - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; - if(has_alpha) buffer[3] = in[i * 4 + 2]; - } - } - } - else if(mode->colortype == LCT_RGBA) - { - if(mode->bitdepth == 8) - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 4 + 0]; - buffer[1] = in[i * 4 + 1]; - buffer[2] = in[i * 4 + 2]; - if(has_alpha) buffer[3] = in[i * 4 + 3]; - } - } - else - { - for(i = 0; i < numpixels; i++, buffer += num_channels) - { - buffer[0] = in[i * 8 + 0]; - buffer[1] = in[i * 8 + 2]; - buffer[2] = in[i * 8 + 4]; - if(has_alpha) buffer[3] = in[i * 8 + 6]; - } - } - } - - return 0; /*no error*/ -} - -/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with -given color type, but the given color type must be 16-bit itself.*/ -static unsigned getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, - const unsigned char* in, size_t i, const LodePNGColorMode* mode) -{ - if(mode->bitdepth != 16) return 85; /*error: this function only supports 16-bit input*/ - - if(mode->colortype == LCT_GREY) - { - *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; - if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; - else *a = 65535; - } - else if(mode->colortype == LCT_RGB) - { - *r = 256 * in[i * 6 + 0] + in[i * 6 + 1]; - *g = 256 * in[i * 6 + 2] + in[i * 6 + 3]; - *b = 256 * in[i * 6 + 4] + in[i * 6 + 5]; - if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r - && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g - && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; - else *a = 65535; - } - else if(mode->colortype == LCT_GREY_ALPHA) - { - *r = *g = *b = 256 * in[i * 4 + 0] + in[i * 4 + 1]; - *a = 256 * in[i * 4 + 2] + in[i * 4 + 3]; - } - else if(mode->colortype == LCT_RGBA) - { - *r = 256 * in[i * 8 + 0] + in[i * 8 + 1]; - *g = 256 * in[i * 8 + 2] + in[i * 8 + 3]; - *b = 256 * in[i * 8 + 4] + in[i * 8 + 5]; - *a = 256 * in[i * 8 + 6] + in[i * 8 + 7]; - } - else return 85; /*error: this function only supports 16-bit input, not palettes*/ - - return 0; /*no error*/ -} - -/* -converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code -the out buffer must have (w * h * bpp + 7) / 8 bytes, where bpp is the bits per pixel of the output color type -(lodepng_get_bpp) for < 8 bpp images, there may _not_ be padding bits at the end of scanlines. -*/ -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - LodePNGColorMode* mode_out, LodePNGColorMode* mode_in, - unsigned w, unsigned h, unsigned fix_png) -{ - unsigned error = 0; - size_t i; - ColorTree tree; - size_t numpixels = w * h; - - if(lodepng_color_mode_equal(mode_out, mode_in)) - { - size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - for(i = 0; i < numbytes; i++) out[i] = in[i]; - return error; - } - - if(mode_out->colortype == LCT_PALETTE) - { - size_t palsize = 1 << mode_out->bitdepth; - if(mode_out->palettesize < palsize) palsize = mode_out->palettesize; - color_tree_init(&tree); - for(i = 0; i < palsize; i++) - { - unsigned char* p = &mode_out->palette[i * 4]; - color_tree_add(&tree, p[0], p[1], p[2], p[3], i); - } - } - - if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) - { - for(i = 0; i < numpixels; i++) - { - unsigned short r = 0, g = 0, b = 0, a = 0; - error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if(error) break; - error = rgba16ToPixel(out, i, mode_out, r, g, b, a); - if(error) break; - } - } - else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) - { - error = getPixelColorsRGBA8(out, numpixels, 1, in, mode_in, fix_png); - } - else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) - { - error = getPixelColorsRGBA8(out, numpixels, 0, in, mode_in, fix_png); - } - else - { - unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i < numpixels; i++) - { - error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in, fix_png); - if(error) break; - error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); - if(error) break; - } - } - - if(mode_out->colortype == LCT_PALETTE) - { - color_tree_cleanup(&tree); - } - - return error; -} - -#ifdef LODEPNG_COMPILE_ENCODER - -typedef struct ColorProfile -{ - unsigned char sixteenbit; /*needs more than 8 bits per channel*/ - unsigned char sixteenbit_done; - - - unsigned char colored; /*not greyscale*/ - unsigned char colored_done; - - unsigned char key; /*a color key is required, or more*/ - unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/ - unsigned short key_g; - unsigned short key_b; - unsigned char alpha; /*alpha channel, or alpha palette, required*/ - unsigned char alpha_done; - - unsigned numcolors; - ColorTree tree; /*for listing the counted colors, up to 256*/ - unsigned char* palette; /*size 1024. Remember up to the first 256 RGBA colors*/ - unsigned maxnumcolors; /*if more than that amount counted*/ - unsigned char numcolors_done; - - unsigned greybits; /*amount of bits required for greyscale (1, 2, 4, 8). Does not take 16 bit into account.*/ - unsigned char greybits_done; - -} ColorProfile; - -static void color_profile_init(ColorProfile* profile, LodePNGColorMode* mode) -{ - profile->sixteenbit = 0; - profile->sixteenbit_done = mode->bitdepth == 16 ? 0 : 1; - - profile->colored = 0; - profile->colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; - - profile->key = 0; - profile->alpha = 0; - profile->alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; - - profile->numcolors = 0; - color_tree_init(&profile->tree); - profile->palette = (unsigned char*)lodepng_malloc(1024); - profile->maxnumcolors = 257; - if(lodepng_get_bpp(mode) <= 8) - { - int bpp = lodepng_get_bpp(mode); - profile->maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); - } - profile->numcolors_done = 0; - - profile->greybits = 1; - profile->greybits_done = lodepng_get_bpp(mode) == 1 ? 1 : 0; -} - -static void color_profile_cleanup(ColorProfile* profile) -{ - color_tree_cleanup(&profile->tree); - lodepng_free(profile->palette); -} - -/*function used for debug purposes with C++*/ -/*void printColorProfile(ColorProfile* p) -{ - std::cout << "sixteenbit: " << (int)p->sixteenbit << std::endl; - std::cout << "sixteenbit_done: " << (int)p->sixteenbit_done << std::endl; - std::cout << "colored: " << (int)p->colored << std::endl; - std::cout << "colored_done: " << (int)p->colored_done << std::endl; - std::cout << "key: " << (int)p->key << std::endl; - std::cout << "key_r: " << (int)p->key_r << std::endl; - std::cout << "key_g: " << (int)p->key_g << std::endl; - std::cout << "key_b: " << (int)p->key_b << std::endl; - std::cout << "alpha: " << (int)p->alpha << std::endl; - std::cout << "alpha_done: " << (int)p->alpha_done << std::endl; - std::cout << "numcolors: " << (int)p->numcolors << std::endl; - std::cout << "maxnumcolors: " << (int)p->maxnumcolors << std::endl; - std::cout << "numcolors_done: " << (int)p->numcolors_done << std::endl; - std::cout << "greybits: " << (int)p->greybits << std::endl; - std::cout << "greybits_done: " << (int)p->greybits_done << std::endl; -}*/ - -/*Returns how many bits needed to represent given value (max 8 bit)*/ -unsigned getValueRequiredBits(unsigned short value) -{ - if(value == 0 || value == 255) return 1; - /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ - if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; - return 8; -} - -/*profile must already have been inited with mode. -It's ok to set some parameters of profile to done already.*/ -static unsigned get_color_profile(ColorProfile* profile, - const unsigned char* in, size_t numpixels, - LodePNGColorMode* mode, - unsigned fix_png) -{ - unsigned error = 0; - size_t i; - - if(mode->bitdepth == 16) - { - for(i = 0; i < numpixels; i++) - { - unsigned short r, g, b, a; - error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); - if(error) break; - - /*a color is considered good for 8-bit if the first byte and the second byte are equal, - (so if it's divisible through 257), NOT necessarily if the second byte is 0*/ - if(!profile->sixteenbit_done - && (((r & 255) != ((r >> 8) & 255)) - || ((g & 255) != ((g >> 8) & 255)) - || ((b & 255) != ((b >> 8) & 255)))) - { - profile->sixteenbit = 1; - profile->sixteenbit_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore at 16-bit*/ - profile->numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ - } - - if(!profile->colored_done && (r != g || r != b)) - { - profile->colored = 1; - profile->colored_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->alpha_done && a != 65535) - { - if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) - { - if(!profile->key) - { - profile->key = 1; - profile->key_r = r; - profile->key_g = g; - profile->key_b = b; - } - } - else - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - } - - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - if(!profile->alpha_done && a == 65535 && profile->key - && r == profile->key_r && g == profile->key_g && b == profile->key_b) - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->greybits_done) - { - /*assuming 8-bit r, this test does not care about 16-bit*/ - unsigned bits = getValueRequiredBits(r); - if(bits > profile->greybits) profile->greybits = bits; - if(profile->greybits >= 8) profile->greybits_done = 1; - } - - if(!profile->numcolors_done) - { - /*assuming 8-bit rgba, this test does not care about 16-bit*/ - if(!color_tree_has(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a)) - { - color_tree_add(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a, - profile->numcolors); - if(profile->numcolors < 256) - { - unsigned char* p = profile->palette; - unsigned i = profile->numcolors; - p[i * 4 + 0] = (unsigned char)r; - p[i * 4 + 1] = (unsigned char)g; - p[i * 4 + 2] = (unsigned char)b; - p[i * 4 + 3] = (unsigned char)a; - } - profile->numcolors++; - if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; - } - } - - if(profile->alpha_done && profile->numcolors_done - && profile->colored_done && profile->sixteenbit_done && profile->greybits_done) - { - break; - } - }; - } - else /* < 16-bit */ - { - for(i = 0; i < numpixels; i++) - { - unsigned char r = 0, g = 0, b = 0, a = 0; - error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode, fix_png); - if(error) break; - - if(!profile->colored_done && (r != g || r != b)) - { - profile->colored = 1; - profile->colored_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->alpha_done && a != 255) - { - if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) - { - if(!profile->key) - { - profile->key = 1; - profile->key_r = r; - profile->key_g = g; - profile->key_b = b; - } - } - else - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - } - - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - if(!profile->alpha_done && a == 255 && profile->key - && r == profile->key_r && g == profile->key_g && b == profile->key_b) - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->greybits_done) - { - unsigned bits = getValueRequiredBits(r); - if(bits > profile->greybits) profile->greybits = bits; - if(profile->greybits >= 8) profile->greybits_done = 1; - } - - if(!profile->numcolors_done) - { - if(!color_tree_has(&profile->tree, r, g, b, a)) - { - - color_tree_add(&profile->tree, r, g, b, a, profile->numcolors); - if(profile->numcolors < 256) - { - unsigned char* p = profile->palette; - unsigned i = profile->numcolors; - p[i * 4 + 0] = r; - p[i * 4 + 1] = g; - p[i * 4 + 2] = b; - p[i * 4 + 3] = a; - } - profile->numcolors++; - if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; - } - } - - if(profile->alpha_done && profile->numcolors_done && profile->colored_done && profile->greybits_done) - { - break; - } - }; - } - - /*make the profile's key always 16-bit for consistency*/ - if(mode->bitdepth < 16) - { - /*repeat each byte twice*/ - profile->key_r *= 257; - profile->key_g *= 257; - profile->key_b *= 257; - } - - return error; -} - -/*updates values of mode with a potentially smaller color model. mode_out should -contain the user chosen color model, but will be overwritten with the new chosen one.*/ -static unsigned doAutoChooseColor(LodePNGColorMode* mode_out, - const unsigned char* image, unsigned w, unsigned h, LodePNGColorMode* mode_in, - LodePNGAutoConvert auto_convert) -{ - ColorProfile profile; - unsigned error = 0; - int no_nibbles = auto_convert == LAC_AUTO_NO_NIBBLES || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; - int no_palette = auto_convert == LAC_AUTO_NO_PALETTE || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; - - if(auto_convert == LAC_ALPHA) - { - if(mode_out->colortype != LCT_RGBA && mode_out->colortype != LCT_GREY_ALPHA) return 0; - } - - color_profile_init(&profile, mode_in); - if(auto_convert == LAC_ALPHA) - { - profile.colored_done = 1; - profile.greybits_done = 1; - profile.numcolors_done = 1; - profile.sixteenbit_done = 1; - } - error = get_color_profile(&profile, image, w * h, mode_in, 0 /*fix_png*/); - - if(!error && auto_convert == LAC_ALPHA) - { - if(!profile.alpha) - { - mode_out->colortype = (mode_out->colortype == LCT_RGBA ? LCT_RGB : LCT_GREY); - } - } - else if(!error && auto_convert != LAC_ALPHA) - { - mode_out->key_defined = 0; - - if(profile.sixteenbit) - { - mode_out->bitdepth = 16; - if(profile.alpha) - { - mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; - } - else - { - mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY; - if(profile.key) - { - mode_out->key_defined = 1; - mode_out->key_r = profile.key_r; - mode_out->key_g = profile.key_g; - mode_out->key_b = profile.key_b; - } - } - } - else /*less than 16 bits per channel*/ - { - /*don't add palette overhead if image hasn't got a lot of pixels*/ - unsigned n = profile.numcolors; - int palette_ok = !no_palette && n <= 256 && (n * 2 < w * h); - unsigned palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); - int grey_ok = !profile.colored && !profile.alpha; /*grey without alpha, with potentially low bits*/ - if(palette_ok || grey_ok) - { - if(!palette_ok || (grey_ok && profile.greybits <= palettebits)) - { - mode_out->colortype = LCT_GREY; - mode_out->bitdepth = profile.greybits; - if(profile.key) - { - unsigned keyval = profile.key_r; - keyval &= (profile.greybits - 1); /*same subgroup of bits repeated, so taking right bits is fine*/ - mode_out->key_defined = 1; - mode_out->key_r = keyval; - mode_out->key_g = keyval; - mode_out->key_b = keyval; - } - } - else - { - /*fill in the palette*/ - unsigned i; - unsigned char* p = profile.palette; - for(i = 0; i < profile.numcolors; i++) - { - error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); - if(error) break; - } - - mode_out->colortype = LCT_PALETTE; - mode_out->bitdepth = palettebits; - } - } - else /*8-bit per channel*/ - { - mode_out->bitdepth = 8; - if(profile.alpha) - { - mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; - } - else - { - mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY /*LCT_GREY normally won't occur, already done earlier*/; - if(profile.key) - { - mode_out->key_defined = 1; - mode_out->key_r = profile.key_r % 256; - mode_out->key_g = profile.key_g % 256; - mode_out->key_b = profile.key_b % 256; - } - } - } - } - } - - color_profile_cleanup(&profile); - - if(mode_out->colortype == LCT_PALETTE && mode_in->palettesize == mode_out->palettesize) - { - /*In this case keep the palette order of the input, so that the user can choose an optimal one*/ - size_t i; - for(i = 0; i < mode_in->palettesize * 4; i++) - { - mode_out->palette[i] = mode_in->palette[i]; - } - } - - if(no_nibbles && mode_out->bitdepth < 8) - { - /*palette can keep its small amount of colors, as long as no indices use it*/ - mode_out->bitdepth = 8; - } - - return error; -} - -#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ - -/* -Paeth predicter, used by PNG filter type 4 -The parameters are of type short, but should come from unsigned chars, the shorts -are only needed to make the paeth calculation correct. -*/ -static unsigned char paethPredictor(short a, short b, short c) -{ - short pa = abs(b - c); - short pb = abs(a - c); - short pc = abs(a + b - c - c); - - if(pc < pa && pc < pb) return (unsigned char)c; - else if(pb < pa) return (unsigned char)b; - else return (unsigned char)a; -} - -/*shared values used by multiple Adam7 related functions*/ - -static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ -static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ -static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ -static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ - -/* -Outputs various dimensions and positions in the image related to the Adam7 reduced images. -passw: output containing the width of the 7 passes -passh: output containing the height of the 7 passes -filter_passstart: output containing the index of the start and end of each - reduced image with filter bytes -padded_passstart output containing the index of the start and end of each - reduced image when without filter bytes but with padded scanlines -passstart: output containing the index of the start and end of each reduced - image without padding between scanlines, but still padding between the images -w, h: width and height of non-interlaced image -bpp: bits per pixel -"padded" is only relevant if bpp is less than 8 and a scanline or image does not - end at a full byte -*/ -static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], - size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) -{ - /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ - unsigned i; - - /*calculate width and height in pixels of each pass*/ - for(i = 0; i < 7; i++) - { - passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; - passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; - if(passw[i] == 0) passh[i] = 0; - if(passh[i] == 0) passw[i] = 0; - } - - filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; - for(i = 0; i < 7; i++) - { - /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ - filter_passstart[i + 1] = filter_passstart[i] - + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); - /*bits padded if needed to fill full byte at end of each scanline*/ - padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); - /*only padded at end of reduced image*/ - passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; - } -} - -#ifdef LODEPNG_COMPILE_DECODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Decoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*read the information from the header and store it in the LodePNGInfo. return value is error*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, - const unsigned char* in, size_t insize) -{ - LodePNGInfo* info = &state->info_png; - if(insize == 0 || in == 0) - { - CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ - } - if(insize < 29) - { - CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ - } - - /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ - lodepng_info_cleanup(info); - lodepng_info_init(info); - - if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 - || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) - { - CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ - } - if(in[12] != 'I' || in[13] != 'H' || in[14] != 'D' || in[15] != 'R') - { - CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ - } - - /*read the values given in the header*/ - *w = lodepng_read32bitInt(&in[16]); - *h = lodepng_read32bitInt(&in[20]); - info->color.bitdepth = in[24]; - info->color.colortype = (LodePNGColorType)in[25]; - info->compression_method = in[26]; - info->filter_method = in[27]; - info->interlace_method = in[28]; - - if(!state->decoder.ignore_crc) - { - unsigned CRC = lodepng_read32bitInt(&in[29]); - unsigned checksum = lodepng_crc32(&in[12], 17); - if(CRC != checksum) - { - CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ - } - } - - /*error: only compression method 0 is allowed in the specification*/ - if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); - /*error: only filter method 0 is allowed in the specification*/ - if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); - /*error: only interlace methods 0 and 1 exist in the specification*/ - if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); - - state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); - return state->error; -} - -static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, - size_t bytewidth, unsigned char filterType, size_t length) -{ - /* - For PNG filter method 0 - unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, - the filter works byte per byte (bytewidth = 1) - precon is the previous unfiltered scanline, recon the result, scanline the current one - the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead - recon and scanline MAY be the same memory address! precon must be disjoint. - */ - - size_t i; - switch(filterType) - { - case 0: - for(i = 0; i < length; i++) recon[i] = scanline[i]; - break; - case 1: - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth]; - break; - case 2: - if(precon) - { - for(i = 0; i < length; i++) recon[i] = scanline[i] + precon[i]; - } - else - { - for(i = 0; i < length; i++) recon[i] = scanline[i]; - } - break; - case 3: - if(precon) - { - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i] + precon[i] / 2; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2); - } - else - { - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth] / 2; - } - break; - case 4: - if(precon) - { - for(i = 0; i < bytewidth; i++) - { - recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ - } - for(i = bytewidth; i < length; i++) - { - recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); - } - } - else - { - for(i = 0; i < bytewidth; i++) - { - recon[i] = scanline[i]; - } - for(i = bytewidth; i < length; i++) - { - /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ - recon[i] = (scanline[i] + recon[i - bytewidth]); - } - } - break; - default: return 36; /*error: unexisting filter type given*/ - } - return 0; -} - -static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) -{ - /* - For PNG filter method 0 - this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) - out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline - w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel - in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) - */ - - unsigned y; - unsigned char* prevline = 0; - - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7) / 8; - size_t linebytes = (w * bpp + 7) / 8; - - for(y = 0; y < h; y++) - { - size_t outindex = linebytes * y; - size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - unsigned char filterType = in[inindex]; - - CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); - - prevline = &out[outindex]; - } - - return 0; -} - -/* -in: Adam7 interlaced image, with no padding bits between scanlines, but between - reduced images so that each reduced image starts at a byte. -out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h -bpp: bits per pixel -out has the following size in bits: w * h * bpp. -in is possibly bigger due to padding bits between reduced images. -out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation -(because that's likely a little bit faster) -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) -{ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - size_t bytewidth = bpp / 8; - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; - size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - for(b = 0; b < bytewidth; b++) - { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } - else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - for(b = 0; b < bpp; b++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ - setBitOfReversedStream0(&obp, out, bit); - } - } - } - } -} - -static void removePaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) -{ - /* - After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need - to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers - for the Adam7 code, the color convert code and the output to the user. - in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must - have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits - also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 - only useful if (ilinebits - olinebits) is a value in the range 1..7 - */ - unsigned y; - size_t diff = ilinebits - olinebits; - size_t ibp = 0, obp = 0; /*input and output bit pointers*/ - for(y = 0; y < h; y++) - { - size_t x; - for(x = 0; x < olinebits; x++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - ibp += diff; - } -} - -/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from -the IDAT chunks (with filter index bytes and possible padding bits) -return value is error*/ -static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, - unsigned w, unsigned h, const LodePNGInfo* info_png) -{ - /* - This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. - Steps: - *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8) - *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace - NOTE: the in buffer will be overwritten with intermediate data! - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - if(bpp == 0) return 31; /*error: invalid colortype*/ - - if(info_png->interlace_method == 0) - { - if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) - { - CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); - removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h); - } - /*we can immediatly filter into the out buffer, no other steps needed*/ - else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); - } - else /*interlace_method is 1 (Adam7)*/ - { - unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - for(i = 0; i < 7; i++) - { - CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); - /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, - move bytes instead of bits or move not at all*/ - if(bpp < 8) - { - /*remove padding bits in scanlines; after this there still may be padding - bits between the different reduced images: each reduced image still starts nicely at a byte*/ - removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, - ((passw[i] * bpp + 7) / 8) * 8, passh[i]); - } - } - - Adam7_deinterlace(out, in, w, h, bpp); - } - - return 0; -} - -static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) -{ - unsigned pos = 0, i; - if(color->palette) lodepng_free(color->palette); - color->palettesize = chunkLength / 3; - color->palette = (unsigned char*)lodepng_malloc(4 * color->palettesize); - if(!color->palette && color->palettesize) - { - color->palettesize = 0; - return 83; /*alloc fail*/ - } - if(color->palettesize > 256) return 38; /*error: palette too big*/ - - for(i = 0; i < color->palettesize; i++) - { - color->palette[4 * i + 0] = data[pos++]; /*R*/ - color->palette[4 * i + 1] = data[pos++]; /*G*/ - color->palette[4 * i + 2] = data[pos++]; /*B*/ - color->palette[4 * i + 3] = 255; /*alpha*/ - } - - return 0; /* OK */ -} - -static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) -{ - unsigned i; - if(color->colortype == LCT_PALETTE) - { - /*error: more alpha values given than there are palette entries*/ - if(chunkLength > color->palettesize) return 38; - - for(i = 0; i < chunkLength; i++) color->palette[4 * i + 3] = data[i]; - } - else if(color->colortype == LCT_GREY) - { - /*error: this chunk must be 2 bytes for greyscale image*/ - if(chunkLength != 2) return 30; - - color->key_defined = 1; - color->key_r = color->key_g = color->key_b = 256 * data[0] + data[1]; - } - else if(color->colortype == LCT_RGB) - { - /*error: this chunk must be 6 bytes for RGB image*/ - if(chunkLength != 6) return 41; - - color->key_defined = 1; - color->key_r = 256 * data[0] + data[1]; - color->key_g = 256 * data[2] + data[3]; - color->key_b = 256 * data[4] + data[5]; - } - else return 42; /*error: tRNS chunk not allowed for other color models*/ - - return 0; /* OK */ -} - - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*background color chunk (bKGD)*/ -static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - if(info->color.colortype == LCT_PALETTE) - { - /*error: this chunk must be 1 byte for indexed color image*/ - if(chunkLength != 1) return 43; - - info->background_defined = 1; - info->background_r = info->background_g = info->background_b = data[0]; - } - else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) - { - /*error: this chunk must be 2 bytes for greyscale image*/ - if(chunkLength != 2) return 44; - - info->background_defined = 1; - info->background_r = info->background_g = info->background_b - = 256 * data[0] + data[1]; - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) - { - /*error: this chunk must be 6 bytes for greyscale image*/ - if(chunkLength != 6) return 45; - - info->background_defined = 1; - info->background_r = 256 * data[0] + data[1]; - info->background_g = 256 * data[2] + data[3]; - info->background_b = 256 * data[4] + data[5]; - } - - return 0; /* OK */ -} - -/*text chunk (tEXt)*/ -static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - unsigned error = 0; - char *key = 0, *str = 0; - unsigned i; - - while(!error) /*not really a while loop, only used to break on error*/ - { - unsigned length, string2_begin; - - length = 0; - while(length < chunkLength && data[length] != 0) length++; - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; - - string2_begin = length + 1; /*skip keyword null terminator*/ - - length = chunkLength < string2_begin ? 0 : chunkLength - string2_begin; - str = (char*)lodepng_malloc(length + 1); - if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ - - str[length] = 0; - for(i = 0; i < length; i++) str[i] = data[string2_begin + i]; - - error = lodepng_add_text(info, key, str); - - break; - } - - lodepng_free(key); - lodepng_free(str); - - return error; -} - -/*compressed text chunk (zTXt)*/ -static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, - const unsigned char* data, size_t chunkLength) -{ - unsigned error = 0; - unsigned i; - - unsigned length, string2_begin; - char *key = 0; - ucvector decoded; - - ucvector_init(&decoded); - - while(!error) /*not really a while loop, only used to break on error*/ - { - for(length = 0; length < chunkLength && data[length] != 0; length++) ; - if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; - - if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - string2_begin = length + 2; - if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ - - length = chunkLength - string2_begin; - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&decoded.data, &decoded.size, - (unsigned char*)(&data[string2_begin]), - length, zlibsettings); - if(error) break; - ucvector_push_back(&decoded, 0); - - error = lodepng_add_text(info, key, (char*)decoded.data); - - break; - } - - lodepng_free(key); - ucvector_cleanup(&decoded); - - return error; -} - -/*international text chunk (iTXt)*/ -static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, - const unsigned char* data, size_t chunkLength) -{ - unsigned error = 0; - unsigned i; - - unsigned length, begin, compressed; - char *key = 0, *langtag = 0, *transkey = 0; - ucvector decoded; - ucvector_init(&decoded); - - while(!error) /*not really a while loop, only used to break on error*/ - { - /*Quick check if the chunk length isn't too small. Even without check - it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ - if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ - - /*read the key*/ - for(length = 0; length < chunkLength && data[length] != 0; length++) ; - if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ - if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ - - key = (char*)lodepng_malloc(length + 1); - if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ - - key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; - - /*read the compression method*/ - compressed = data[length + 1]; - if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ - - /*even though it's not allowed by the standard, no error is thrown if - there's no null termination char, if the text is empty for the next 3 texts*/ - - /*read the langtag*/ - begin = length + 3; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; i++) length++; - - langtag = (char*)lodepng_malloc(length + 1); - if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ - - langtag[length] = 0; - for(i = 0; i < length; i++) langtag[i] = data[begin + i]; - - /*read the transkey*/ - begin += length + 1; - length = 0; - for(i = begin; i < chunkLength && data[i] != 0; i++) length++; - - transkey = (char*)lodepng_malloc(length + 1); - if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ - - transkey[length] = 0; - for(i = 0; i < length; i++) transkey[i] = data[begin + i]; - - /*read the actual text*/ - begin += length + 1; - - length = chunkLength < begin ? 0 : chunkLength - begin; - - if(compressed) - { - /*will fail if zlib error, e.g. if length is too small*/ - error = zlib_decompress(&decoded.data, &decoded.size, - (unsigned char*)(&data[begin]), - length, zlibsettings); - if(error) break; - if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size; - ucvector_push_back(&decoded, 0); - } - else - { - if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/); - - decoded.data[length] = 0; - for(i = 0; i < length; i++) decoded.data[i] = data[begin + i]; - } - - error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data); - - break; - } - - lodepng_free(key); - lodepng_free(langtag); - lodepng_free(transkey); - ucvector_cleanup(&decoded); - - return error; -} - -static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ - - info->time_defined = 1; - info->time.year = 256 * data[0] + data[+ 1]; - info->time.month = data[2]; - info->time.day = data[3]; - info->time.hour = data[4]; - info->time.minute = data[5]; - info->time.second = data[6]; - - return 0; /* OK */ -} - -static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) -{ - if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ - - info->phys_defined = 1; - info->phys_x = 16777216 * data[0] + 65536 * data[1] + 256 * data[2] + data[3]; - info->phys_y = 16777216 * data[4] + 65536 * data[5] + 256 * data[6] + data[7]; - info->phys_unit = data[8]; - - return 0; /* OK */ -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ -static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) -{ - unsigned char IEND = 0; - const unsigned char* chunk; - size_t i; - ucvector idat; /*the data from idat chunks*/ - - /*for unknown chunk order*/ - unsigned unknown = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - - /*provide some proper output values if error will happen*/ - *out = 0; - - state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ - if(state->error) return; - - ucvector_init(&idat); - chunk = &in[33]; /*first byte of the first chunk after the header*/ - - /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. - IDAT data is put at the start of the in buffer*/ - while(!IEND && !state->error) - { - unsigned chunkLength; - const unsigned char* data; /*the data in the chunk*/ - - /*error: size of the in buffer too small to contain next chunk*/ - if((size_t)((chunk - in) + 12) > insize || chunk < in) CERROR_BREAK(state->error, 30); - - /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ - chunkLength = lodepng_chunk_length(chunk); - /*error: chunk length larger than the max PNG chunk size*/ - if(chunkLength > 2147483647) CERROR_BREAK(state->error, 63); - - if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) - { - CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ - } - - data = lodepng_chunk_data_const(chunk); - - /*IDAT chunk, containing compressed image data*/ - if(lodepng_chunk_type_equals(chunk, "IDAT")) - { - size_t oldsize = idat.size; - if(!ucvector_resize(&idat, oldsize + chunkLength)) CERROR_BREAK(state->error, 83 /*alloc fail*/); - for(i = 0; i < chunkLength; i++) idat.data[oldsize + i] = data[i]; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 3; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - /*IEND chunk*/ - else if(lodepng_chunk_type_equals(chunk, "IEND")) - { - IEND = 1; - } - /*palette chunk (PLTE)*/ - else if(lodepng_chunk_type_equals(chunk, "PLTE")) - { - state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - critical_pos = 2; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - /*palette transparency chunk (tRNS)*/ - else if(lodepng_chunk_type_equals(chunk, "tRNS")) - { - state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); - if(state->error) break; - } -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*background color chunk (bKGD)*/ - else if(lodepng_chunk_type_equals(chunk, "bKGD")) - { - state->error = readChunk_bKGD(&state->info_png, data, chunkLength); - if(state->error) break; - } - /*text chunk (tEXt)*/ - else if(lodepng_chunk_type_equals(chunk, "tEXt")) - { - if(state->decoder.read_text_chunks) - { - state->error = readChunk_tEXt(&state->info_png, data, chunkLength); - if(state->error) break; - } - } - /*compressed text chunk (zTXt)*/ - else if(lodepng_chunk_type_equals(chunk, "zTXt")) - { - if(state->decoder.read_text_chunks) - { - state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - if(state->error) break; - } - } - /*international text chunk (iTXt)*/ - else if(lodepng_chunk_type_equals(chunk, "iTXt")) - { - if(state->decoder.read_text_chunks) - { - state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); - if(state->error) break; - } - } - else if(lodepng_chunk_type_equals(chunk, "tIME")) - { - state->error = readChunk_tIME(&state->info_png, data, chunkLength); - if(state->error) break; - } - else if(lodepng_chunk_type_equals(chunk, "pHYs")) - { - state->error = readChunk_pHYs(&state->info_png, data, chunkLength); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - else /*it's not an implemented chunk type, so ignore it: skip over the data*/ - { - /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ - if(!lodepng_chunk_ancillary(chunk)) CERROR_BREAK(state->error, 69); - - unknown = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - if(state->decoder.remember_unknown_chunks) - { - state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], - &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - } - - if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ - { - if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ - } - - if(!IEND) chunk = lodepng_chunk_next_const(chunk); - } - - if(!state->error) - { - ucvector scanlines; - ucvector_init(&scanlines); - - /*maximum final image length is already reserved in the vector's length - this is not really necessary*/ - if(!ucvector_resize(&scanlines, lodepng_get_raw_size(*w, *h, &state->info_png.color) + *h)) - { - state->error = 83; /*alloc fail*/ - } - if(!state->error) - { - /*decompress with the Zlib decompressor*/ - state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data, - idat.size, &state->decoder.zlibsettings); - } - - if(!state->error) - { - ucvector outv; - ucvector_init(&outv); - if(!ucvector_resizev(&outv, - lodepng_get_raw_size(*w, *h, &state->info_png.color), 0)) state->error = 83; /*alloc fail*/ - if(!state->error) state->error = postProcessScanlines(outv.data, scanlines.data, *w, *h, &state->info_png); - *out = outv.data; - } - ucvector_cleanup(&scanlines); - } - - ucvector_cleanup(&idat); -} - -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize) -{ - *out = 0; - decodeGeneric(out, w, h, state, in, insize); - if(state->error) return state->error; - if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) - { - /*same color type, no copying or converting of data needed*/ - /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype - the raw image has to the end user*/ - if(!state->decoder.color_convert) - { - state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); - if(state->error) return state->error; - } - } - else - { - /*color conversion needed; sort of copy of the data*/ - unsigned char* data = *out; - size_t outsize; - - /*TODO: check if this works according to the statement in the documentation: "The converter can convert - from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/ - if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) - && !(state->info_raw.bitdepth == 8)) - { - return 56; /*unsupported color mode conversion*/ - } - - outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); - *out = (unsigned char*)lodepng_malloc(outsize); - if(!(*out)) - { - state->error = 83; /*alloc fail*/ - } - else state->error = lodepng_convert(*out, data, &state->info_raw, &state->info_png.color, *w, *h, state->decoder.fix_png); - lodepng_free(data); - } - return state->error; -} - -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - error = lodepng_decode(out, w, h, &state, in, insize); - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) -{ - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); -} - -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) -{ - return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error; - error = lodepng_load_file(&buffer, &buffersize, filename); - if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) -{ - return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); -} - -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) -{ - return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) -{ - settings->color_convert = 1; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->read_text_chunks = 1; - settings->remember_unknown_chunks = 0; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - settings->ignore_crc = 0; - settings->fix_png = 0; - lodepng_decompress_settings_init(&settings->zlibsettings); -} - -#endif /*LODEPNG_COMPILE_DECODER*/ - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) - -void lodepng_state_init(LodePNGState* state) -{ -#ifdef LODEPNG_COMPILE_DECODER - lodepng_decoder_settings_init(&state->decoder); -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - lodepng_encoder_settings_init(&state->encoder); -#endif /*LODEPNG_COMPILE_ENCODER*/ - lodepng_color_mode_init(&state->info_raw); - lodepng_info_init(&state->info_png); - state->error = 1; -} - -void lodepng_state_cleanup(LodePNGState* state) -{ - lodepng_color_mode_cleanup(&state->info_raw); - lodepng_info_cleanup(&state->info_png); -} - -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) -{ - lodepng_state_cleanup(dest); - *dest = *source; - lodepng_color_mode_init(&dest->info_raw); - lodepng_info_init(&dest->info_png); - dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; - dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; -} - -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_ENCODER - -/* ////////////////////////////////////////////////////////////////////////// */ -/* / PNG Encoder / */ -/* ////////////////////////////////////////////////////////////////////////// */ - -/*chunkName must be string of 4 characters*/ -static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length) -{ - CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data)); - out->allocsize = out->size; /*fix the allocsize again*/ - return 0; -} - -static void writeSignature(ucvector* out) -{ - /*8 bytes PNG signature, aka the magic bytes*/ - ucvector_push_back(out, 137); - ucvector_push_back(out, 80); - ucvector_push_back(out, 78); - ucvector_push_back(out, 71); - ucvector_push_back(out, 13); - ucvector_push_back(out, 10); - ucvector_push_back(out, 26); - ucvector_push_back(out, 10); -} - -static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) -{ - unsigned error = 0; - ucvector header; - ucvector_init(&header); - - lodepng_add32bitInt(&header, w); /*width*/ - lodepng_add32bitInt(&header, h); /*height*/ - ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/ - ucvector_push_back(&header, (unsigned char)colortype); /*color type*/ - ucvector_push_back(&header, 0); /*compression method*/ - ucvector_push_back(&header, 0); /*filter method*/ - ucvector_push_back(&header, interlace_method); /*interlace method*/ - - error = addChunk(out, "IHDR", header.data, header.size); - ucvector_cleanup(&header); - - return error; -} - -static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) -{ - unsigned error = 0; - size_t i; - ucvector PLTE; - ucvector_init(&PLTE); - for(i = 0; i < info->palettesize * 4; i++) - { - /*add all channels except alpha channel*/ - if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); - } - error = addChunk(out, "PLTE", PLTE.data, PLTE.size); - ucvector_cleanup(&PLTE); - - return error; -} - -static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) -{ - unsigned error = 0; - size_t i; - ucvector tRNS; - ucvector_init(&tRNS); - if(info->colortype == LCT_PALETTE) - { - size_t amount = info->palettesize; - /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ - for(i = info->palettesize; i > 0; i--) - { - if(info->palette[4 * (i - 1) + 3] == 255) amount--; - else break; - } - /*add only alpha channel*/ - for(i = 0; i < amount; i++) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); - } - else if(info->colortype == LCT_GREY) - { - if(info->key_defined) - { - ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); - } - } - else if(info->colortype == LCT_RGB) - { - if(info->key_defined) - { - ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_g / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_g % 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_b / 256)); - ucvector_push_back(&tRNS, (unsigned char)(info->key_b % 256)); - } - } - - error = addChunk(out, "tRNS", tRNS.data, tRNS.size); - ucvector_cleanup(&tRNS); - - return error; -} - -static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, - LodePNGCompressSettings* zlibsettings) -{ - ucvector zlibdata; - unsigned error = 0; - - /*compress with the Zlib compressor*/ - ucvector_init(&zlibdata); - error = zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings); - if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size); - ucvector_cleanup(&zlibdata); - - return error; -} - -static unsigned addChunk_IEND(ucvector* out) -{ - unsigned error = 0; - error = addChunk(out, "IEND", 0, 0); - return error; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - -static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) -{ - unsigned error = 0; - size_t i; - ucvector text; - ucvector_init(&text); - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&text, (unsigned char)keyword[i]); - if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ - ucvector_push_back(&text, 0); /*0 termination char*/ - for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&text, (unsigned char)textstring[i]); - error = addChunk(out, "tEXt", text.data, text.size); - ucvector_cleanup(&text); - - return error; -} - -static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, - LodePNGCompressSettings* zlibsettings) -{ - unsigned error = 0; - ucvector data, compressed; - size_t i, textsize = strlen(textstring); - - ucvector_init(&data); - ucvector_init(&compressed); - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); - if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ - ucvector_push_back(&data, 0); /*0 termination char*/ - ucvector_push_back(&data, 0); /*compression method: 0*/ - - error = zlib_compress(&compressed.data, &compressed.size, - (unsigned char*)textstring, textsize, zlibsettings); - if(!error) - { - for(i = 0; i < compressed.size; i++) ucvector_push_back(&data, compressed.data[i]); - error = addChunk(out, "zTXt", data.data, data.size); - } - - ucvector_cleanup(&compressed); - ucvector_cleanup(&data); - return error; -} - -static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, - const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) -{ - unsigned error = 0; - ucvector data; - size_t i, textsize = strlen(textstring); - - ucvector_init(&data); - - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); - if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ - ucvector_push_back(&data, 0); /*null termination char*/ - ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ - ucvector_push_back(&data, 0); /*compression method*/ - for(i = 0; langtag[i] != 0; i++) ucvector_push_back(&data, (unsigned char)langtag[i]); - ucvector_push_back(&data, 0); /*null termination char*/ - for(i = 0; transkey[i] != 0; i++) ucvector_push_back(&data, (unsigned char)transkey[i]); - ucvector_push_back(&data, 0); /*null termination char*/ - - if(compressed) - { - ucvector compressed_data; - ucvector_init(&compressed_data); - error = zlib_compress(&compressed_data.data, &compressed_data.size, - (unsigned char*)textstring, textsize, zlibsettings); - if(!error) - { - for(i = 0; i < compressed_data.size; i++) ucvector_push_back(&data, compressed_data.data[i]); - } - ucvector_cleanup(&compressed_data); - } - else /*not compressed*/ - { - for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]); - } - - if(!error) error = addChunk(out, "iTXt", data.data, data.size); - ucvector_cleanup(&data); - return error; -} - -static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) -{ - unsigned error = 0; - ucvector bKGD; - ucvector_init(&bKGD); - if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) - { - ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); - } - else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) - { - ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_g / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_g % 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_b / 256)); - ucvector_push_back(&bKGD, (unsigned char)(info->background_b % 256)); - } - else if(info->color.colortype == LCT_PALETTE) - { - ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); /*palette index*/ - } - - error = addChunk(out, "bKGD", bKGD.data, bKGD.size); - ucvector_cleanup(&bKGD); - - return error; -} - -static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) -{ - unsigned error = 0; - unsigned char* data = (unsigned char*)lodepng_malloc(7); - if(!data) return 83; /*alloc fail*/ - data[0] = (unsigned char)(time->year / 256); - data[1] = (unsigned char)(time->year % 256); - data[2] = time->month; - data[3] = time->day; - data[4] = time->hour; - data[5] = time->minute; - data[6] = time->second; - error = addChunk(out, "tIME", data, 7); - lodepng_free(data); - return error; -} - -static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) -{ - unsigned error = 0; - ucvector data; - ucvector_init(&data); - - lodepng_add32bitInt(&data, info->phys_x); - lodepng_add32bitInt(&data, info->phys_y); - ucvector_push_back(&data, info->phys_unit); - - error = addChunk(out, "pHYs", data.data, data.size); - ucvector_cleanup(&data); - - return error; -} - -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, - size_t length, size_t bytewidth, unsigned char filterType) -{ - size_t i; - switch(filterType) - { - case 0: /*None*/ - for(i = 0; i < length; i++) out[i] = scanline[i]; - break; - case 1: /*Sub*/ - if(prevline) - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; - } - else - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; - } - break; - case 2: /*Up*/ - if(prevline) - { - for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i]; - } - else - { - for(i = 0; i < length; i++) out[i] = scanline[i]; - } - break; - case 3: /*Average*/ - if(prevline) - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); - } - else - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2; - } - break; - case 4: /*Paeth*/ - if(prevline) - { - /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ - for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]); - for(i = bytewidth; i < length; i++) - { - out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); - } - } - else - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ - for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]); - } - break; - default: return; /*unexisting filter type given*/ - } -} - -/* log2 approximation. A slight bit faster than std::log. */ -static float flog2(float f) -{ - float result = 0; - while(f > 32) { result += 4; f /= 16; } - while(f > 2) { result++; f /= 2; } - return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f); -} - -static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, - const LodePNGColorMode* info, const LodePNGEncoderSettings* settings) -{ - /* - For PNG filter method 0 - out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are - the scanlines with 1 extra byte per scanline - */ - - unsigned bpp = lodepng_get_bpp(info); - /*the width of a scanline in bytes, not including the filter type*/ - size_t linebytes = (w * bpp + 7) / 8; - /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ - size_t bytewidth = (bpp + 7) / 8; - const unsigned char* prevline = 0; - unsigned x, y; - unsigned error = 0; - LodePNGFilterStrategy strategy = settings->filter_strategy; - - /* - There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: - * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. - use fixed filtering, with the filter None). - * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is - not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply - all five filters and select the filter that produces the smallest sum of absolute values per row. - This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. - - If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, - but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum - heuristic is used. - */ - if(settings->filter_palette_zero && - (info->colortype == LCT_PALETTE || info->bitdepth < 8)) strategy = LFS_ZERO; - - if(bpp == 0) return 31; /*error: invalid color type*/ - - if(strategy == LFS_ZERO) - { - for(y = 0; y < h; y++) - { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - out[outindex] = 0; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, 0); - prevline = &in[inindex]; - } - } - else if(strategy == LFS_MINSUM) - { - /*adaptive filtering*/ - size_t sum[5]; - ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned type, bestType = 0; - - for(type = 0; type < 5; type++) - { - ucvector_init(&attempt[type]); - if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ - } - - if(!error) - { - for(y = 0; y < h; y++) - { - /*try the 5 filter types*/ - for(type = 0; type < 5; type++) - { - filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); - - /*calculate the sum of the result*/ - sum[type] = 0; - if(type == 0) - { - for(x = 0; x < linebytes; x++) sum[type] += (unsigned char)(attempt[type].data[x]); - } - else - { - for(x = 0; x < linebytes; x++) - { - /*For differences, each byte should be treated as signed, values above 127 are negative - (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. - This means filtertype 0 is almost never chosen, but that is justified.*/ - signed char s = (signed char)(attempt[type].data[x]); - sum[type] += s < 0 ? -s : s; - } - } - - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum[type] < smallest) - { - bestType = type; - smallest = sum[type]; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; - } - } - - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); - } - else if(strategy == LFS_ENTROPY) - { - float sum[5]; - ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ - float smallest = 0; - unsigned type, bestType = 0; - unsigned count[256]; - - for(type = 0; type < 5; type++) - { - ucvector_init(&attempt[type]); - if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ - } - - for(y = 0; y < h; y++) - { - /*try the 5 filter types*/ - for(type = 0; type < 5; type++) - { - filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); - for(x = 0; x < 256; x++) count[x] = 0; - for(x = 0; x < linebytes; x++) count[attempt[type].data[x]]++; - count[type]++; /*the filter type itself is part of the scanline*/ - sum[type] = 0; - for(x = 0; x < 256; x++) - { - float p = count[x] / (float)(linebytes + 1); - sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p; - } - /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || sum[type] < smallest) - { - bestType = type; - smallest = sum[type]; - } - } - - prevline = &in[y * linebytes]; - - /*now fill the out values*/ - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; - } - - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); - } - else if(strategy == LFS_PREDEFINED) - { - for(y = 0; y < h; y++) - { - size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ - size_t inindex = linebytes * y; - unsigned type = settings->predefined_filters[y]; - out[outindex] = type; /*filter type byte*/ - filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); - prevline = &in[inindex]; - } - } - else if(strategy == LFS_BRUTE_FORCE) - { - /*brute force filter chooser. - deflate the scanline after every filter attempt to see which one deflates best. - This is very slow and gives only slightly smaller, sometimes even larger, result*/ - size_t size[5]; - ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ - size_t smallest = 0; - unsigned type = 0, bestType = 0; - unsigned char* dummy; - LodePNGCompressSettings zlibsettings = settings->zlibsettings; - /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, - to simulate the true case where the tree is the same for the whole image. Sometimes it gives - better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare - cases better compression. It does make this a bit less slow, so it's worth doing this.*/ - zlibsettings.btype = 1; - /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG - images only, so disable it*/ - zlibsettings.custom_zlib = 0; - zlibsettings.custom_deflate = 0; - for(type = 0; type < 5; type++) - { - ucvector_init(&attempt[type]); - ucvector_resize(&attempt[type], linebytes); /*todo: give error if resize failed*/ - } - for(y = 0; y < h; y++) /*try the 5 filter types*/ - { - for(type = 0; type < 5; type++) - { - unsigned testsize = attempt[type].size; - /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ - - filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); - size[type] = 0; - dummy = 0; - zlib_compress(&dummy, &size[type], attempt[type].data, testsize, &zlibsettings); - lodepng_free(dummy); - /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ - if(type == 0 || size[type] < smallest) - { - bestType = type; - smallest = size[type]; - } - } - prevline = &in[y * linebytes]; - out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; - } - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); - } - else return 88; /* unknown filter strategy */ - - return error; -} - -static void addPaddingBits(unsigned char* out, const unsigned char* in, - size_t olinebits, size_t ilinebits, unsigned h) -{ - /*The opposite of the removePaddingBits function - olinebits must be >= ilinebits*/ - unsigned y; - size_t diff = olinebits - ilinebits; - size_t obp = 0, ibp = 0; /*bit pointers*/ - for(y = 0; y < h; y++) - { - size_t x; - for(x = 0; x < ilinebits; x++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - /*obp += diff; --> no, fill in some value in the padding bits too, to avoid - "Use of uninitialised value of size ###" warning from valgrind*/ - for(x = 0; x < diff; x++) setBitOfReversedStream(&obp, out, 0); - } -} - -/* -in: non-interlaced image with size w*h -out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with - no padding bits between scanlines, but between reduced images so that each - reduced image starts at a byte. -bpp: bits per pixel -there are no padding bits, not between scanlines, not between reduced images -in has the following size in bits: w * h * bpp. -out is possibly bigger due to padding bits between reduced images -NOTE: comments about padding bits are only relevant if bpp < 8 -*/ -static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) -{ - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned i; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - if(bpp >= 8) - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - size_t bytewidth = bpp / 8; - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; - for(b = 0; b < bytewidth; b++) - { - out[pixeloutstart + b] = in[pixelinstart + b]; - } - } - } - } - else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ - { - for(i = 0; i < 7; i++) - { - unsigned x, y, b; - unsigned ilinebits = bpp * passw[i]; - unsigned olinebits = bpp * w; - size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) - { - ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - for(b = 0; b < bpp; b++) - { - unsigned char bit = readBitFromReversedStream(&ibp, in); - setBitOfReversedStream(&obp, out, bit); - } - } - } - } -} - -/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. -return value is error**/ -static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, - unsigned w, unsigned h, - const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) -{ - /* - This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: - *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter - *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter - */ - unsigned bpp = lodepng_get_bpp(&info_png->color); - unsigned error = 0; - - if(info_png->interlace_method == 0) - { - *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ - - if(!error) - { - /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ - if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) - { - unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7) / 8)); - if(!padded) error = 83; /*alloc fail*/ - if(!error) - { - addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h); - error = filter(*out, padded, w, h, &info_png->color, settings); - } - lodepng_free(padded); - } - else - { - /*we can immediatly filter into the out buffer, no other steps needed*/ - error = filter(*out, in, w, h, &info_png->color, settings); - } - } - } - else /*interlace_method is 1 (Adam7)*/ - { - unsigned passw[7], passh[7]; - size_t filter_passstart[8], padded_passstart[8], passstart[8]; - unsigned char* adam7; - - Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - - *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ - *out = (unsigned char*)lodepng_malloc(*outsize); - if(!(*out)) error = 83; /*alloc fail*/ - - adam7 = (unsigned char*)lodepng_malloc(passstart[7]); - if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ - - if(!error) - { - unsigned i; - - Adam7_interlace(adam7, in, w, h, bpp); - for(i = 0; i < 7; i++) - { - if(bpp < 8) - { - unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); - if(!padded) ERROR_BREAK(83); /*alloc fail*/ - addPaddingBits(padded, &adam7[passstart[i]], - ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]); - error = filter(&(*out)[filter_passstart[i]], padded, - passw[i], passh[i], &info_png->color, settings); - lodepng_free(padded); - } - else - { - error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], - passw[i], passh[i], &info_png->color, settings); - } - - if(error) break; - } - } - - lodepng_free(adam7); - } - - return error; -} - -/* -palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA... -returns 0 if the palette is opaque, -returns 1 if the palette has a single color with alpha 0 ==> color key -returns 2 if the palette is semi-translucent. -*/ -static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) -{ - size_t i, key = 0; - unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/ - for(i = 0; i < palettesize; i++) - { - if(!key && palette[4 * i + 3] == 0) - { - r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2]; - key = 1; - i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/ - } - else if(palette[4 * i + 3] != 255) return 2; - /*when key, no opaque RGB may have key's RGB*/ - else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2; - } - return key; -} - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) -{ - unsigned char* inchunk = data; - while((size_t)(inchunk - data) < datasize) - { - CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); - out->allocsize = out->size; /*fix the allocsize again*/ - inchunk = lodepng_chunk_next(inchunk); - } - return 0; -} -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state) -{ - LodePNGInfo info; - ucvector outv; - unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ - size_t datasize = 0; - - /*provide some proper output values if error will happen*/ - *out = 0; - *outsize = 0; - state->error = 0; - - lodepng_info_init(&info); - lodepng_info_copy(&info, &state->info_png); - - if((info.color.colortype == LCT_PALETTE || state->encoder.force_palette) - && (info.color.palettesize == 0 || info.color.palettesize > 256)) - { - state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ - return state->error; - } - - if(state->encoder.auto_convert != LAC_NO) - { - state->error = doAutoChooseColor(&info.color, image, w, h, &state->info_raw, - state->encoder.auto_convert); - } - if(state->error) return state->error; - - if(state->encoder.zlibsettings.windowsize > 32768) - { - CERROR_RETURN_ERROR(state->error, 60); /*error: windowsize larger than allowed*/ - } - if(state->encoder.zlibsettings.btype > 2) - { - CERROR_RETURN_ERROR(state->error, 61); /*error: unexisting btype*/ - } - if(state->info_png.interlace_method > 1) - { - CERROR_RETURN_ERROR(state->error, 71); /*error: unexisting interlace mode*/ - } - - state->error = checkColorValidity(info.color.colortype, info.color.bitdepth); - if(state->error) return state->error; /*error: unexisting color type given*/ - state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); - if(state->error) return state->error; /*error: unexisting color type given*/ - - if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) - { - unsigned char* converted; - size_t size = (w * h * lodepng_get_bpp(&info.color) + 7) / 8; - - converted = (unsigned char*)lodepng_malloc(size); - if(!converted && size) state->error = 83; /*alloc fail*/ - if(!state->error) - { - state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h, 0 /*fix_png*/); - } - if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); - lodepng_free(converted); - } - else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); - - ucvector_init(&outv); - while(!state->error) /*while only executed once, to break on error*/ - { -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - size_t i; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*write signature and chunks*/ - writeSignature(&outv); - /*IHDR*/ - addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*unknown chunks between IHDR and PLTE*/ - if(info.unknown_chunks_data[0]) - { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*PLTE*/ - if(info.color.colortype == LCT_PALETTE) - { - addChunk_PLTE(&outv, &info.color); - } - if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) - { - addChunk_PLTE(&outv, &info.color); - } - /*tRNS*/ - if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0) - { - addChunk_tRNS(&outv, &info.color); - } - if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined) - { - addChunk_tRNS(&outv, &info.color); - } -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*bKGD (must come between PLTE and the IDAt chunks*/ - if(info.background_defined) addChunk_bKGD(&outv, &info); - /*pHYs (must come before the IDAT chunks)*/ - if(info.phys_defined) addChunk_pHYs(&outv, &info); - - /*unknown chunks between PLTE and IDAT*/ - if(info.unknown_chunks_data[1]) - { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*IDAT (multiple IDAT chunks must be consecutive)*/ - state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); - if(state->error) break; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*tIME*/ - if(info.time_defined) addChunk_tIME(&outv, &info.time); - /*tEXt and/or zTXt*/ - for(i = 0; i < info.text_num; i++) - { - if(strlen(info.text_keys[i]) > 79) - { - state->error = 66; /*text chunk too large*/ - break; - } - if(strlen(info.text_keys[i]) < 1) - { - state->error = 67; /*text chunk too small*/ - break; - } - if(state->encoder.text_compression) - addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); - else - addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); - } - /*LodePNG version id in text chunk*/ - if(state->encoder.add_id) - { - unsigned alread_added_id_text = 0; - for(i = 0; i < info.text_num; i++) - { - if(!strcmp(info.text_keys[i], "LodePNG")) - { - alread_added_id_text = 1; - break; - } - } - if(alread_added_id_text == 0) - addChunk_tEXt(&outv, "LodePNG", VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ - } - /*iTXt*/ - for(i = 0; i < info.itext_num; i++) - { - if(strlen(info.itext_keys[i]) > 79) - { - state->error = 66; /*text chunk too large*/ - break; - } - if(strlen(info.itext_keys[i]) < 1) - { - state->error = 67; /*text chunk too small*/ - break; - } - addChunk_iTXt(&outv, state->encoder.text_compression, - info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], - &state->encoder.zlibsettings); - } - - /*unknown chunks between IDAT and IEND*/ - if(info.unknown_chunks_data[2]) - { - state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); - if(state->error) break; - } -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - /*IEND*/ - addChunk_IEND(&outv); - - break; /*this isn't really a while loop; no error happened so break out now!*/ - } - - lodepng_info_cleanup(&info); - lodepng_free(data); - /*instead of cleaning the vector up, give it to the output*/ - *out = outv.data; - *outsize = outv.size; - - return state->error; -} - -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, - unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned error; - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - state.info_png.color.colortype = colortype; - state.info_png.color.bitdepth = bitdepth; - lodepng_encode(out, outsize, image, w, h, &state); - error = state.error; - lodepng_state_cleanup(&state); - return error; -} - -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); - if(!error) error = lodepng_save_file(buffer, buffersize, filename); - lodepng_free(buffer); - return error; -} - -unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); -} - -unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) -{ - return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); -} -#endif /*LODEPNG_COMPILE_DISK*/ - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) -{ - lodepng_compress_settings_init(&settings->zlibsettings); - settings->filter_palette_zero = 1; - settings->filter_strategy = LFS_MINSUM; - settings->auto_convert = LAC_AUTO; - settings->force_palette = 0; - settings->predefined_filters = 0; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - settings->add_id = 0; - settings->text_compression = 1; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/* -This returns the description of a numerical error code in English. This is also -the documentation of all the error codes. -*/ -const char* lodepng_error_text(unsigned code) -{ - switch(code) - { - case 0: return "no error, everything went ok"; - case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ - case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ - case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ - case 13: return "problem while processing dynamic deflate block"; - case 14: return "problem while processing dynamic deflate block"; - case 15: return "problem while processing dynamic deflate block"; - case 16: return "unexisting code while processing dynamic deflate block"; - case 17: return "end of out buffer memory reached while inflating"; - case 18: return "invalid distance code while inflating"; - case 19: return "end of out buffer memory reached while inflating"; - case 20: return "invalid deflate block BTYPE encountered while decoding"; - case 21: return "NLEN is not ones complement of LEN in a deflate block"; - /*end of out buffer memory reached while inflating: - This can happen if the inflated deflate data is longer than the amount of bytes required to fill up - all the pixels of the image, given the color depth and image dimensions. Something that doesn't - happen in a normal, well encoded, PNG image.*/ - case 22: return "end of out buffer memory reached while inflating"; - case 23: return "end of in buffer memory reached while inflating"; - case 24: return "invalid FCHECK in zlib header"; - case 25: return "invalid compression method in zlib header"; - case 26: return "FDICT encountered in zlib header while it's not used for PNG"; - case 27: return "PNG file is smaller than a PNG header"; - /*Checks the magic file header, the first 8 bytes of the PNG file*/ - case 28: return "incorrect PNG signature, it's no PNG or corrupted"; - case 29: return "first chunk is not the header chunk"; - case 30: return "chunk length too large, chunk broken off at end of file"; - case 31: return "illegal PNG color type or bpp"; - case 32: return "illegal PNG compression method"; - case 33: return "illegal PNG filter method"; - case 34: return "illegal PNG interlace method"; - case 35: return "chunk length of a chunk is too large or the chunk too small"; - case 36: return "illegal PNG filter type encountered"; - case 37: return "illegal bit depth for this color type given"; - case 38: return "the palette is too big"; /*more than 256 colors*/ - case 39: return "more palette alpha values given in tRNS chunk than there are colors in the palette"; - case 40: return "tRNS chunk has wrong size for greyscale image"; - case 41: return "tRNS chunk has wrong size for RGB image"; - case 42: return "tRNS chunk appeared while it was not allowed for this color type"; - case 43: return "bKGD chunk has wrong size for palette image"; - case 44: return "bKGD chunk has wrong size for greyscale image"; - case 45: return "bKGD chunk has wrong size for RGB image"; - /*Is the palette too small?*/ - case 46: return "a value in indexed image is larger than the palette size (bitdepth = 8)"; - /*Is the palette too small?*/ - case 47: return "a value in indexed image is larger than the palette size (bitdepth < 8)"; - /*the input data is empty, maybe a PNG file doesn't exist or is in the wrong path*/ - case 48: return "empty input or file doesn't exist"; - case 49: return "jumped past memory while generating dynamic huffman tree"; - case 50: return "jumped past memory while generating dynamic huffman tree"; - case 51: return "jumped past memory while inflating huffman block"; - case 52: return "jumped past memory while inflating"; - case 53: return "size of zlib data too small"; - case 54: return "repeat symbol in tree while there was no value symbol yet"; - /*jumped past tree while generating huffman tree, this could be when the - tree will have more leaves than symbols after generating it out of the - given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ - case 55: return "jumped past tree while generating huffman tree"; - case 56: return "given output image colortype or bitdepth not supported for color conversion"; - case 57: return "invalid CRC encountered (checking CRC can be disabled)"; - case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; - case 59: return "requested color conversion not supported"; - case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; - case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; - /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/ - case 62: return "conversion from color to greyscale not supported"; - case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/ - /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ - case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; - case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; - case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; - case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; - case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; - case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)"; - case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)"; - case 73: return "invalid tIME chunk size"; - case 74: return "invalid pHYs chunk size"; - /*length could be wrong, or data chopped off*/ - case 75: return "no null termination char found while decoding text chunk"; - case 76: return "iTXt chunk too short to contain required bytes"; - case 77: return "integer overflow in buffer size"; - case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ - case 79: return "failed to open file for writing"; - case 80: return "tried creating a tree of 0 symbols"; - case 81: return "lazy matching at pos 0 is impossible"; - case 82: return "color conversion to palette requested while a color isn't in palette"; - case 83: return "memory allocation failed"; - case 84: return "given image too small to contain all pixels to be encoded"; - case 85: return "internal color conversion bug"; - case 86: return "impossible offset in lz77 encoding (internal bug)"; - case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; - case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; - case 89: return "text chunk keyword too short or long: must have size 1-79"; - } - return "unknown error code"; -} -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* // C++ Wrapper // */ -/* ////////////////////////////////////////////////////////////////////////// */ -/* ////////////////////////////////////////////////////////////////////////// */ - - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng -{ - -#ifdef LODEPNG_COMPILE_DISK -void load_file(std::vector& buffer, const std::string& filename) -{ - std::ifstream file(filename.c_str(), std::ios::in|std::ios::binary|std::ios::ate); - - /*get filesize*/ - std::streamsize size = 0; - if(file.seekg(0, std::ios::end).good()) size = file.tellg(); - if(file.seekg(0, std::ios::beg).good()) size -= file.tellg(); - - /*read contents of the file into the vector*/ - buffer.resize(size_t(size)); - if(size > 0) file.read((char*)(&buffer[0]), size); -} - -/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -void save_file(const std::vector& buffer, const std::string& filename) -{ - std::ofstream file(filename.c_str(), std::ios::out|std::ios::binary); - file.write(buffer.empty() ? 0 : (char*)&buffer[0], std::streamsize(buffer.size())); -} -#endif //LODEPNG_COMPILE_DISK - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings) -{ - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_decompress(&buffer, &buffersize, in, insize, &settings); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings) -{ - return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif //LODEPNG_COMPILE_DECODER - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings) -{ - unsigned char* buffer = 0; - size_t buffersize = 0; - unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings) -{ - return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); -} -#endif //LODEPNG_COMPILE_ENCODER -#endif //LODEPNG_COMPILE_ZLIB - - -#ifdef LODEPNG_COMPILE_PNG - -State::State() -{ - lodepng_state_init(this); -} - -State::State(const State& other) : LodePNGState() -{ - lodepng_state_init(this); - lodepng_state_copy(this, &other); -} - -State::~State() -{ - lodepng_state_cleanup(this); -} - -State& State::operator=(const State& other) -{ - lodepng_state_copy(this, &other); - return *this; -} - -#ifdef LODEPNG_COMPILE_DECODER - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, - size_t insize, LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); - if(buffer && !error) - { - State state; - state.info_raw.colortype = colortype; - state.info_raw.bitdepth = bitdepth; - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) -{ - return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize) -{ - unsigned char* buffer; - unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); - if(buffer && !error) - { - size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in) -{ - return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, - LodePNGColorType colortype, unsigned bitdepth) -{ - std::vector buffer; - load_file(buffer, filename); - return decode(out, w, h, buffer, colortype, bitdepth); -} -#endif //LODEPNG_COMPILE_DECODER -#endif //LODEPNG_COMPILE_DISK - -#ifdef LODEPNG_COMPILE_ENCODER -unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} - -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state) -{ - unsigned char* buffer; - size_t buffersize; - unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); - if(buffer) - { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); - lodepng_free(buffer); - } - return error; -} - -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state) -{ - if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; - return encode(out, in.empty() ? 0 : &in[0], w, h, state); -} - -#ifdef LODEPNG_COMPILE_DISK -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - std::vector buffer; - unsigned error = encode(buffer, in, w, h, colortype, bitdepth); - if(!error) save_file(buffer, filename); - return error; -} - -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth) -{ - if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; - return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); -} -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_ENCODER -#endif //LODEPNG_COMPILE_PNG -} //namespace lodepng -#endif /*LODEPNG_COMPILE_CPP*/ diff --git a/cpp/cli/src/lodepng.h b/cpp/cli/src/lodepng.h deleted file mode 100644 index 6d5b5b5f8..000000000 --- a/cpp/cli/src/lodepng.h +++ /dev/null @@ -1,1695 +0,0 @@ -/* -LodePNG version 20130325 - -Copyright (c) 2005-2013 Lode Vandevenne - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. -*/ - -#ifndef LODEPNG_H -#define LODEPNG_H - -#include /*for size_t*/ - -#ifdef __cplusplus -#include -#include -#endif /*__cplusplus*/ - -/* -The following #defines are used to create code sections. They can be disabled -to disable code sections, which can give faster compile time and smaller binary. -The "NO_COMPILE" defines are designed to be used to pass as defines to the -compiler command to disable them without modifying this header, e.g. --DLODEPNG_NO_COMPILE_ZLIB for gcc. -*/ -/*deflate & zlib. If disabled, you must specify alternative zlib functions in -the custom_zlib field of the compress and decompress settings*/ -#ifndef LODEPNG_NO_COMPILE_ZLIB -#define LODEPNG_COMPILE_ZLIB -#endif -/*png encoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_PNG -#define LODEPNG_COMPILE_PNG -#endif -/*deflate&zlib decoder and png decoder*/ -#ifndef LODEPNG_NO_COMPILE_DECODER -#define LODEPNG_COMPILE_DECODER -#endif -/*deflate&zlib encoder and png encoder*/ -#ifndef LODEPNG_NO_COMPILE_ENCODER -#define LODEPNG_COMPILE_ENCODER -#endif -/*the optional built in harddisk file loading and saving functions*/ -#ifndef LODEPNG_NO_COMPILE_DISK -#define LODEPNG_COMPILE_DISK -#endif -/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ -#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS -#define LODEPNG_COMPILE_ANCILLARY_CHUNKS -#endif -/*ability to convert error numerical codes to English text string*/ -#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT -#define LODEPNG_COMPILE_ERROR_TEXT -#endif -/*Compile the default allocators (C's free, malloc and realloc). If you disable this, -you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your -source files with custom allocators.*/ -#ifndef LODEPNG_NO_COMPILE_ALLOCATORS -#define LODEPNG_COMPILE_ALLOCATORS -#endif -/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ -#ifdef __cplusplus -#ifndef LODEPNG_NO_COMPILE_CPP -#define LODEPNG_COMPILE_CPP -#endif -#endif - -#ifdef LODEPNG_COMPILE_PNG -/*The PNG color types (also used for raw).*/ -typedef enum LodePNGColorType -{ - LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/ - LCT_RGB = 2, /*RGB: 8,16 bit*/ - LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ - LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/ - LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/ -} LodePNGColorType; - -#ifdef LODEPNG_COMPILE_DECODER -/* -Converts PNG data in memory to raw pixel data. -out: Output parameter. Pointer to buffer that will contain the raw pixel data. - After decoding, its size is w * h * (bytes per pixel) bytes larger than - initially. Bytes per pixel depends on colortype and bitdepth. - Must be freed after usage with free(*out). - Note: for 16-bit per channel colors, uses big endian format like PNG does. -w: Output parameter. Pointer to width of pixel data. -h: Output parameter. Pointer to height of pixel data. -in: Memory buffer with the PNG file. -insize: size of the in buffer. -colortype: the desired color type for the raw output image. See explanation on PNG color types. -bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); - -#ifdef LODEPNG_COMPILE_DISK -/* -Load PNG from disk, from file with given name. -Same as the other decode functions, but instead takes a filename as input. -*/ -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); - -/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, - const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_DECODER*/ - - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Converts raw pixel data into a PNG image in memory. The colortype and bitdepth - of the output PNG image cannot be chosen, they are automatically determined - by the colortype, bitdepth and content of the input pixel data. - Note: for 16-bit per channel colors, needs big endian format like PNG does. -out: Output parameter. Pointer to buffer that will contain the PNG image data. - Must be freed after usage with free(*out). -outsize: Output parameter. Pointer to the size in bytes of the out buffer. -image: The raw pixel data to encode. The size of this buffer should be - w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. -w: width of the raw pixel data in pixels. -h: height of the raw pixel data in pixels. -colortype: the color type of the raw input image. See explanation on PNG color types. -bitdepth: the bit depth of the raw input image. See explanation on PNG color types. -Return value: LodePNG error code (0 means no error). -*/ -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); - -#ifdef LODEPNG_COMPILE_DISK -/* -Converts raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. -NOTE: This overwrites existing files without warning! -*/ -unsigned lodepng_encode_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); - -/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); - -/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); -#endif /*LODEPNG_COMPILE_DISK*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#ifdef LODEPNG_COMPILE_CPP -namespace lodepng -{ -#ifdef LODEPNG_COMPILE_DECODER -/*Same as lodepng_decode_memory, but decodes to an std::vector.*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::vector& in, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts PNG file from disk to raw pixel data in memory. -Same as the other decode functions, but instead takes a filename as input. -*/ -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - const std::string& filename, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_DECODER - -#ifdef LODEPNG_COMPILE_ENCODER -/*Same as lodepng_encode_memory, but encodes to an std::vector.*/ -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#ifdef LODEPNG_COMPILE_DISK -/* -Converts 32-bit RGBA raw pixel data into a PNG file on disk. -Same as the other encode functions, but instead takes a filename as output. -NOTE: This overwrites existing files without warning! -*/ -unsigned encode(const std::string& filename, - const unsigned char* in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -unsigned encode(const std::string& filename, - const std::vector& in, unsigned w, unsigned h, - LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_ENCODER -} //namespace lodepng -#endif /*LODEPNG_COMPILE_CPP*/ -#endif /*LODEPNG_COMPILE_PNG*/ - -#ifdef LODEPNG_COMPILE_ERROR_TEXT -/*Returns an English description of the numerical error code.*/ -const char* lodepng_error_text(unsigned code); -#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Settings for zlib decompression*/ -typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; -struct LodePNGDecompressSettings -{ - unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ - - /*use custom zlib decoder instead of built in one (default: null)*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - /*use custom deflate decoder instead of built in one (default: null) - if custom_zlib is used, custom_deflate is ignored since only the built in - zlib function will call custom_deflate*/ - unsigned (*custom_inflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGDecompressSettings*); - - void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGDecompressSettings lodepng_default_decompress_settings; -void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Settings for zlib compression. Tweaking these settings tweaks the balance -between speed and compression ratio. -*/ -typedef struct LodePNGCompressSettings LodePNGCompressSettings; -struct LodePNGCompressSettings /*deflate = compress*/ -{ - /*LZ77 related settings*/ - unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ - unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ - unsigned windowsize; /*the maximum is 32768, higher gives more compression but is slower. Typical value: 2048.*/ - unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ - unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ - unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ - - /*use custom zlib encoder instead of built in one (default: null)*/ - unsigned (*custom_zlib)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - /*use custom deflate encoder instead of built in one (default: null) - if custom_zlib is used, custom_deflate is ignored since only the built in - zlib function will call custom_deflate*/ - unsigned (*custom_deflate)(unsigned char**, size_t*, - const unsigned char*, size_t, - const LodePNGCompressSettings*); - - void* custom_context; /*optional custom settings for custom functions*/ -}; - -extern const LodePNGCompressSettings lodepng_default_compress_settings; -void lodepng_compress_settings_init(LodePNGCompressSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_PNG -/* -Color mode of an image. Contains all information required to decode the pixel -bits to RGBA colors. This information is the same as used in the PNG file -format, and is used both for PNG and raw image data in LodePNG. -*/ -typedef struct LodePNGColorMode -{ - /*header (IHDR)*/ - LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ - unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ - - /* - palette (PLTE and tRNS) - - Dynamically allocated with the colors of the palette, including alpha. - When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use - lodepng_palette_clear, then for each color use lodepng_palette_add. - If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. - - When decoding, by default you can ignore this palette, since LodePNG already - fills the palette colors in the pixels of the raw RGBA output. - - The palette is only supported for color type 3. - */ - unsigned char* palette; /*palette in RGBARGBA... order*/ - size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ - - /* - transparent color key (tRNS) - - This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. - For greyscale PNGs, r, g and b will all 3 be set to the same. - - When decoding, by default you can ignore this information, since LodePNG sets - pixels with this key to transparent already in the raw RGBA output. - - The color key is only supported for color types 0 and 2. - */ - unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ - unsigned key_r; /*red/greyscale component of color key*/ - unsigned key_g; /*green component of color key*/ - unsigned key_b; /*blue component of color key*/ -} LodePNGColorMode; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_color_mode_init(LodePNGColorMode* info); -void lodepng_color_mode_cleanup(LodePNGColorMode* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); - -void lodepng_palette_clear(LodePNGColorMode* info); -/*add 1 color to the palette*/ -unsigned lodepng_palette_add(LodePNGColorMode* info, - unsigned char r, unsigned char g, unsigned char b, unsigned char a); - -/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ -unsigned lodepng_get_bpp(const LodePNGColorMode* info); -/*get the amount of color channels used, based on colortype in the struct. -If a palette is used, it counts as 1 channel.*/ -unsigned lodepng_get_channels(const LodePNGColorMode* info); -/*is it a greyscale type? (only colortype 0 or 4)*/ -unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); -/*has it got an alpha channel? (only colortype 2 or 6)*/ -unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); -/*has it got a palette? (only colortype 3)*/ -unsigned lodepng_is_palette_type(const LodePNGColorMode* info); -/*only returns true if there is a palette and there is a value in the palette with alpha < 255. -Loops through the palette to check this.*/ -unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); -/* -Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. -Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). -Returns false if the image can only have opaque pixels. -In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, -or if "key_defined" is true. -*/ -unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); -/*Returns the byte size of a raw image buffer with given width, height and color mode*/ -size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -/*The information of a Time chunk in PNG.*/ -typedef struct LodePNGTime -{ - unsigned year; /*2 bytes used (0-65535)*/ - unsigned month; /*1-12*/ - unsigned day; /*1-31*/ - unsigned hour; /*0-23*/ - unsigned minute; /*0-59*/ - unsigned second; /*0-60 (to allow for leap seconds)*/ -} LodePNGTime; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/*Information about the PNG image, except pixels, width and height.*/ -typedef struct LodePNGInfo -{ - /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ - unsigned compression_method;/*compression method of the original file. Always 0.*/ - unsigned filter_method; /*filter method of the original file*/ - unsigned interlace_method; /*interlace method of the original file*/ - LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /* - suggested background color chunk (bKGD) - This color uses the same color mode as the PNG (except alpha channel), which can be 1-bit to 16-bit. - - For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding - the encoder writes the red one. For palette PNGs: When decoding, the RGB value - will be stored, not a palette index. But when encoding, specify the index of - the palette in background_r, the other two are then ignored. - - The decoder does not use this background color to edit the color of pixels. - */ - unsigned background_defined; /*is a suggested background color given?*/ - unsigned background_r; /*red component of suggested background color*/ - unsigned background_g; /*green component of suggested background color*/ - unsigned background_b; /*blue component of suggested background color*/ - - /* - non-international text chunks (tEXt and zTXt) - - The char** arrays each contain num strings. The actual messages are in - text_strings, while text_keys are keywords that give a short description what - the actual text represents, e.g. Title, Author, Description, or anything else. - - A keyword is minimum 1 character and maximum 79 characters long. It's - discouraged to use a single line length longer than 79 characters for texts. - - Don't allocate these text buffers yourself. Use the init/cleanup functions - correctly and use lodepng_add_text and lodepng_clear_text. - */ - size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ - char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ - char** text_strings; /*the actual text*/ - - /* - international text chunks (iTXt) - Similar to the non-international text chunks, but with additional strings - "langtags" and "transkeys". - */ - size_t itext_num; /*the amount of international texts in this PNG*/ - char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ - char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ - char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ - char** itext_strings; /*the actual international text - UTF-8 string*/ - - /*time chunk (tIME)*/ - unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ - LodePNGTime time; - - /*phys chunk (pHYs)*/ - unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ - unsigned phys_x; /*pixels per unit in x direction*/ - unsigned phys_y; /*pixels per unit in y direction*/ - unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ - - /* - unknown chunks - There are 3 buffers, one for each position in the PNG where unknown chunks can appear - each buffer contains all unknown chunks for that position consecutively - The 3 buffers are the unknown chunks between certain critical chunks: - 0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND - Do not allocate or traverse this data yourself. Use the chunk traversing functions declared - later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. - */ - unsigned char* unknown_chunks_data[3]; - size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGInfo; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_info_init(LodePNGInfo* info); -void lodepng_info_cleanup(LodePNGInfo* info); -/*return value is error code (0 means no error)*/ -unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ -unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ - -void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ -unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, - const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ - -/* -Converts raw buffer from one color type to another color type, based on -LodePNGColorMode structs to describe the input and output color type. -See the reference manual at the end of this header file to see which color conversions are supported. -return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) -The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel -of the output color type (lodepng_get_bpp) -The fix_png value makes it ignore out of bound palette indices. -Note: for 16-bit per channel colors, uses big endian format like PNG does. -*/ -unsigned lodepng_convert(unsigned char* out, const unsigned char* in, - LodePNGColorMode* mode_out, LodePNGColorMode* mode_in, - unsigned w, unsigned h, unsigned fix_png); - - -#ifdef LODEPNG_COMPILE_DECODER -/* -Settings for the decoder. This contains settings for the PNG and the Zlib -decoder, but not the Info settings from the Info structs. -*/ -typedef struct LodePNGDecoderSettings -{ - LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ - - unsigned ignore_crc; /*ignore CRC checksums*/ - unsigned fix_png; /*if 1, try to parse some broken PNG images, e.g. with out of bound palette.*/ - unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ - -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ - /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ - unsigned remember_unknown_chunks; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGDecoderSettings; - -void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ -typedef enum LodePNGFilterStrategy -{ - /*every filter at zero*/ - LFS_ZERO, - /*Use filter that gives minumum sum, as described in the official PNG filter heuristic.*/ - LFS_MINSUM, - /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending - on the image, this is better or worse than minsum.*/ - LFS_ENTROPY, - /* - Brute-force-search PNG filters by compressing each filter for each scanline. - Experimental, very slow, and only rarely gives better compression than MINSUM. - */ - LFS_BRUTE_FORCE, - /*use predefined_filters buffer: you specify the filter type for each scanline*/ - LFS_PREDEFINED -} LodePNGFilterStrategy; - -/*automatically use color type with less bits per pixel if losslessly possible. Default: LAC_AUTO*/ -typedef enum LodePNGAutoConvert -{ - LAC_NO, /*use color type user requested*/ - LAC_ALPHA, /*use color type user requested, but if only opaque pixels and RGBA or grey+alpha, use RGB or grey*/ - LAC_AUTO, /*use PNG color type that can losslessly represent the uncompressed image the smallest possible*/ - /* - like AUTO, but do not choose 1, 2 or 4 bit per pixel types. - sometimes a PNG image compresses worse if less than 8 bits per pixels. - */ - LAC_AUTO_NO_NIBBLES, - /* - like AUTO, but never choose palette color type. For small images, encoding - the palette may take more bytes than what is gained. Note that AUTO also - already prevents encoding the palette for extremely small images, but that may - not be sufficient because due to the compression it cannot predict when to - switch. - */ - LAC_AUTO_NO_PALETTE, - LAC_AUTO_NO_NIBBLES_NO_PALETTE -} LodePNGAutoConvert; - - -/*Settings for the encoder.*/ -typedef struct LodePNGEncoderSettings -{ - LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ - - LodePNGAutoConvert auto_convert; /*how to automatically choose output PNG color type, if at all*/ - - /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than - 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to - completely follow the official PNG heuristic, filter_palette_zero must be true and - filter_strategy must be LFS_MINSUM*/ - unsigned filter_palette_zero; - /*Which filter strategy to use when not using zeroes due to filter_palette_zero. - Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ - LodePNGFilterStrategy filter_strategy; - /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with - the same length as the amount of scanlines in the image, and each value must <= 5. You - have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero - must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ - unsigned char* predefined_filters; - - /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). - If colortype is 3, PLTE is _always_ created.*/ - unsigned force_palette; -#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*add LodePNG identifier and version as a text chunk, for debugging*/ - unsigned add_id; - /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ - unsigned text_compression; -#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -} LodePNGEncoderSettings; - -void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); -#endif /*LODEPNG_COMPILE_ENCODER*/ - - -#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) -/*The settings, state and information for extended encoding and decoding.*/ -typedef struct LodePNGState -{ -#ifdef LODEPNG_COMPILE_DECODER - LodePNGDecoderSettings decoder; /*the decoding settings*/ -#endif /*LODEPNG_COMPILE_DECODER*/ -#ifdef LODEPNG_COMPILE_ENCODER - LodePNGEncoderSettings encoder; /*the encoding settings*/ -#endif /*LODEPNG_COMPILE_ENCODER*/ - LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ - LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ - unsigned error; -#ifdef LODEPNG_COMPILE_CPP - //For the lodepng::State subclass. - virtual ~LodePNGState(){} -#endif -} LodePNGState; - -/*init, cleanup and copy functions to use with this struct*/ -void lodepng_state_init(LodePNGState* state); -void lodepng_state_cleanup(LodePNGState* state); -void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); -#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ - -#ifdef LODEPNG_COMPILE_DECODER -/* -Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and -getting much more information about the PNG image and color mode. -*/ -unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); - -/* -Read the PNG header, but not the actual data. This returns only the information -that is in the header chunk of the PNG, such as width, height and color type. The -information is placed in the info_png field of the LodePNGState. -*/ -unsigned lodepng_inspect(unsigned* w, unsigned* h, - LodePNGState* state, - const unsigned char* in, size_t insize); -#endif /*LODEPNG_COMPILE_DECODER*/ - - -#ifdef LODEPNG_COMPILE_ENCODER -/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ -unsigned lodepng_encode(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGState* state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -/* -The lodepng_chunk functions are normally not needed, except to traverse the -unknown chunks stored in the LodePNGInfo struct, or add new ones to it. -It also allows traversing the chunks of an encoded PNG file yourself. - -PNG standard chunk naming conventions: -First byte: uppercase = critical, lowercase = ancillary -Second byte: uppercase = public, lowercase = private -Third byte: must be uppercase -Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy -*/ - -/*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/ -unsigned lodepng_chunk_length(const unsigned char* chunk); - -/*puts the 4-byte type in null terminated string*/ -void lodepng_chunk_type(char type[5], const unsigned char* chunk); - -/*check if the type is the given type*/ -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); - -/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ -unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); - -/*0: public, 1: private (see PNG standard)*/ -unsigned char lodepng_chunk_private(const unsigned char* chunk); - -/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); - -/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ -unsigned char* lodepng_chunk_data(unsigned char* chunk); -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); - -/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ -unsigned lodepng_chunk_check_crc(const unsigned char* chunk); - -/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ -void lodepng_chunk_generate_crc(unsigned char* chunk); - -/*iterate to next chunks. don't use on IEND chunk, as there is no next chunk then*/ -unsigned char* lodepng_chunk_next(unsigned char* chunk); -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); - -/* -Appends chunk to the data in out. The given chunk should already have its chunk header. -The out variable and outlength are updated to reflect the new reallocated buffer. -Returns error code (0 if it went ok) -*/ -unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); - -/* -Appends new chunk to out. The chunk to append is given by giving its length, type -and data separately. The type is a 4-letter string. -The out variable and outlength are updated to reflect the new reallocated buffer. -Returne error code (0 if it went ok) -*/ -unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, - const char* type, const unsigned char* data); - - -/*Calculate CRC32 of buffer*/ -unsigned lodepng_crc32(const unsigned char* buf, size_t len); -#endif /*LODEPNG_COMPILE_PNG*/ - - -#ifdef LODEPNG_COMPILE_ZLIB -/* -This zlib part can be used independently to zlib compress and decompress a -buffer. It cannot be used to create gzip files however, and it only supports the -part of zlib that is required for PNG, it does not support dictionaries. -*/ - -#ifdef LODEPNG_COMPILE_DECODER -/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ -unsigned lodepng_inflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); - -/* -Decompresses Zlib data. Reallocates the out buffer and appends the data. The -data must be according to the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGDecompressSettings* settings); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -/* -Compresses data with Zlib. Reallocates the out buffer and appends the data. -Zlib adds a small header and trailer around the deflate data. -The data is output in the format of the zlib specification. -Either, *out must be NULL and *outsize must be 0, or, *out must be a valid -buffer and *outsize its size in bytes. out must be freed by user after usage. -*/ -unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -/* -Find length-limited Huffman code for given frequencies. This function is in the -public interface only for tests, it's used internally by lodepng_deflate. -*/ -unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, - size_t numcodes, unsigned maxbitlen); - -/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ -unsigned lodepng_deflate(unsigned char** out, size_t* outsize, - const unsigned char* in, size_t insize, - const LodePNGCompressSettings* settings); - -#endif /*LODEPNG_COMPILE_ENCODER*/ -#endif /*LODEPNG_COMPILE_ZLIB*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into buffer. The function allocates the out buffer, and -after usage you should free it. -out: output parameter, contains pointer to loaded buffer. -outsize: output parameter, size of the allocated out buffer -filename: the path to the file to load -return value: error code (0 means ok) -*/ -unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); - -/* -Save a file from buffer to disk. Warning, if it exists, this function overwrites -the file without warning! -buffer: the buffer to write -buffersize: size of the buffer to write -filename: the path to the file to save to -return value: error code (0 means ok) -*/ -unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); -#endif /*LODEPNG_COMPILE_DISK*/ - -#ifdef LODEPNG_COMPILE_CPP -//The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. -namespace lodepng -{ -#ifdef LODEPNG_COMPILE_PNG -class State : public LodePNGState -{ - public: - State(); - State(const State& other); - virtual ~State(); - State& operator=(const State& other); -}; - -#ifdef LODEPNG_COMPILE_DECODER -//Same as other lodepng::decode, but using a State for more settings and information. -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const unsigned char* in, size_t insize); -unsigned decode(std::vector& out, unsigned& w, unsigned& h, - State& state, - const std::vector& in); -#endif /*LODEPNG_COMPILE_DECODER*/ - -#ifdef LODEPNG_COMPILE_ENCODER -//Same as other lodepng::encode, but using a State for more settings and information. -unsigned encode(std::vector& out, - const unsigned char* in, unsigned w, unsigned h, - State& state); -unsigned encode(std::vector& out, - const std::vector& in, unsigned w, unsigned h, - State& state); -#endif /*LODEPNG_COMPILE_ENCODER*/ - -#ifdef LODEPNG_COMPILE_DISK -/* -Load a file from disk into an std::vector. If the vector is empty, then either -the file doesn't exist or is an empty file. -*/ -void load_file(std::vector& buffer, const std::string& filename); - -/* -Save the binary data in an std::vector to a file on disk. The file is overwritten -without warning. -*/ -void save_file(const std::vector& buffer, const std::string& filename); -#endif //LODEPNG_COMPILE_DISK -#endif //LODEPNG_COMPILE_PNG - -#ifdef LODEPNG_COMPILE_ZLIB -#ifdef LODEPNG_COMPILE_DECODER -//Zlib-decompress an unsigned char buffer -unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); - -//Zlib-decompress an std::vector -unsigned decompress(std::vector& out, const std::vector& in, - const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); -#endif //LODEPNG_COMPILE_DECODER - -#ifdef LODEPNG_COMPILE_ENCODER -//Zlib-compress an unsigned char buffer -unsigned compress(std::vector& out, const unsigned char* in, size_t insize, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); - -//Zlib-compress an std::vector -unsigned compress(std::vector& out, const std::vector& in, - const LodePNGCompressSettings& settings = lodepng_default_compress_settings); -#endif //LODEPNG_COMPILE_ENCODER -#endif //LODEPNG_COMPILE_ZLIB -} //namespace lodepng -#endif /*LODEPNG_COMPILE_CPP*/ - -/* -TODO: -[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often -[.] check compatibility with vareous compilers - done but needs to be redone for every newer version -[X] converting color to 16-bit per channel types -[ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values) -[ ] make sure encoder generates no chunks with size > (2^31)-1 -[ ] partial decoding (stream processing) -[X] let the "isFullyOpaque" function check color keys and transparent palettes too -[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" -[ ] don't stop decoding on errors like 69, 57, 58 (make warnings) -[ ] make option to choose if the raw image with non multiple of 8 bits per scanline should have padding bits or not -[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes -*/ - -#endif /*LODEPNG_H inclusion guard*/ - -/* -LodePNG Documentation ---------------------- - -0. table of contents --------------------- - - 1. about - 1.1. supported features - 1.2. features not supported - 2. C and C++ version - 3. security - 4. decoding - 5. encoding - 6. color conversions - 6.1. PNG color types - 6.2. color conversions - 6.3. padding bits - 6.4. A note about 16-bits per channel and endianness - 7. error values - 8. chunks and PNG editing - 9. compiler support - 10. examples - 10.1. decoder C++ example - 10.2. decoder C example - 11. changes - 12. contact information - - -1. about --------- - -PNG is a file format to store raster images losslessly with good compression, -supporting different color types and alpha channel. - -LodePNG is a PNG codec according to the Portable Network Graphics (PNG) -Specification (Second Edition) - W3C Recommendation 10 November 2003. - -The specifications used are: - -*) Portable Network Graphics (PNG) Specification (Second Edition): - http://www.w3.org/TR/2003/REC-PNG-20031110 -*) RFC 1950 ZLIB Compressed Data Format version 3.3: - http://www.gzip.org/zlib/rfc-zlib.html -*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: - http://www.gzip.org/zlib/rfc-deflate.html - -The most recent version of LodePNG can currently be found at -http://lodev.org/lodepng/ - -LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds -extra functionality. - -LodePNG exists out of two files: --lodepng.h: the header file for both C and C++ --lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage - -If you want to start using LodePNG right away without reading this doc, get the -examples from the LodePNG website to see how to use it in code, or check the -smaller examples in chapter 13 here. - -LodePNG is simple but only supports the basic requirements. To achieve -simplicity, the following design choices were made: There are no dependencies -on any external library. There are functions to decode and encode a PNG with -a single function call, and extended versions of these functions taking a -LodePNGState struct allowing to specify or get more information. By default -the colors of the raw image are always RGB or RGBA, no matter what color type -the PNG file uses. To read and write files, there are simple functions to -convert the files to/from buffers in memory. - -This all makes LodePNG suitable for loading textures in games, demos and small -programs, ... It's less suitable for full fledged image editors, loading PNGs -over network (it requires all the image data to be available before decoding can -begin), life-critical systems, ... - -1.1. supported features ------------------------ - -The following features are supported by the decoder: - -*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, - or the same color type as the PNG -*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image -*) Adam7 interlace and deinterlace for any color type -*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk -*) support for alpha channels, including RGBA color model, translucent palettes and color keying -*) zlib decompression (inflate) -*) zlib compression (deflate) -*) CRC32 and ADLER32 checksums -*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. -*) the following chunks are supported (generated/interpreted) by both encoder and decoder: - IHDR: header information - PLTE: color palette - IDAT: pixel data - IEND: the final chunk - tRNS: transparency for palettized images - tEXt: textual information - zTXt: compressed textual information - iTXt: international textual information - bKGD: suggested background color - pHYs: physical dimensions - tIME: modification time - -1.2. features not supported ---------------------------- - -The following features are _not_ supported: - -*) some features needed to make a conformant PNG-Editor might be still missing. -*) partial loading/stream processing. All data must be available and is processed in one call. -*) The following public chunks are not supported but treated as unknown chunks by LodePNG - cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT - Some of these are not supported on purpose: LodePNG wants to provide the RGB values - stored in the pixels, not values modified by system dependent gamma or color models. - - -2. C and C++ version --------------------- - -The C version uses buffers allocated with alloc that you need to free() -yourself. You need to use init and cleanup functions for each struct whenever -using a struct from the C version to avoid exploits and memory leaks. - -The C++ version has extra functions with std::vectors in the interface and the -lodepng::State class which is a LodePNGState with constructor and destructor. - -These files work without modification for both C and C++ compilers because all -the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers -ignore it, and the C code is made to compile both with strict ISO C90 and C++. - -To use the C++ version, you need to rename the source file to lodepng.cpp -(instead of lodepng.c), and compile it with a C++ compiler. - -To use the C version, you need to rename the source file to lodepng.c (instead -of lodepng.cpp), and compile it with a C compiler. - - -3. Security ------------ - -Even if carefully designed, it's always possible that LodePNG contains possible -exploits. If you discover one, please let me know, and it will be fixed. - -When using LodePNG, care has to be taken with the C version of LodePNG, as well -as the C-style structs when working with C++. The following conventions are used -for all C-style structs: - --if a struct has a corresponding init function, always call the init function when making a new one --if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks --if a struct has a corresponding copy function, use the copy function instead of "=". - The destination must also be inited already. - - -4. Decoding ------------ - -Decoding converts a PNG compressed image to a raw pixel buffer. - -Most documentation on using the decoder is at its declarations in the header -above. For C, simple decoding can be done with functions such as -lodepng_decode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_decode. For C++, all decoding can be done with the -various lodepng::decode functions, and lodepng::State can be used for advanced -features. - -When using the LodePNGState, it uses the following fields for decoding: -*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here -*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get -*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use - -LodePNGInfo info_png --------------------- - -After decoding, this contains extra information of the PNG image, except the actual -pixels, width and height because these are already gotten directly from the decoder -functions. - -It contains for example the original color type of the PNG image, text comments, -suggested background color, etc... More details about the LodePNGInfo struct are -at its declaration documentation. - -LodePNGColorMode info_raw -------------------------- - -When decoding, here you can specify which color type you want -the resulting raw image to be. If this is different from the colortype of the -PNG, then the decoder will automatically convert the result. This conversion -always works, except if you want it to convert a color PNG to greyscale or to -a palette with missing colors. - -By default, 32-bit color is used for the result. - -LodePNGDecoderSettings decoder ------------------------------- - -The settings can be used to ignore the errors created by invalid CRC and Adler32 -chunks, and to disable the decoding of tEXt chunks. - -There's also a setting color_convert, true by default. If false, no conversion -is done, the resulting data will be as it was in the PNG (after decompression) -and you'll have to puzzle the colors of the pixels together yourself using the -color type information in the LodePNGInfo. - - -5. Encoding ------------ - -Encoding converts a raw pixel buffer to a PNG compressed image. - -Most documentation on using the encoder is at its declarations in the header -above. For C, simple encoding can be done with functions such as -lodepng_encode32, and more advanced decoding can be done with the struct -LodePNGState and lodepng_encode. For C++, all encoding can be done with the -various lodepng::encode functions, and lodepng::State can be used for advanced -features. - -Like the decoder, the encoder can also give errors. However it gives less errors -since the encoder input is trusted, the decoder input (a PNG image that could -be forged by anyone) is not trusted. - -When using the LodePNGState, it uses the following fields for encoding: -*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. -*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has -*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use - -LodePNGInfo info_png --------------------- - -When encoding, you use this the opposite way as when decoding: for encoding, -you fill in the values you want the PNG to have before encoding. By default it's -not needed to specify a color type for the PNG since it's automatically chosen, -but it's possible to choose it yourself given the right settings. - -The encoder will not always exactly match the LodePNGInfo struct you give, -it tries as close as possible. Some things are ignored by the encoder. The -encoder uses, for example, the following settings from it when applicable: -colortype and bitdepth, text chunks, time chunk, the color key, the palette, the -background color, the interlace method, unknown chunks, ... - -When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. -If the palette contains any colors for which the alpha channel is not 255 (so -there are translucent colors in the palette), it'll add a tRNS chunk. - -LodePNGColorMode info_raw -------------------------- - -You specify the color type of the raw image that you give to the input here, -including a possible transparent color key and palette you happen to be using in -your raw image data. - -By default, 32-bit color is assumed, meaning your input has to be in RGBA -format with 4 bytes (unsigned chars) per pixel. - -LodePNGEncoderSettings encoder ------------------------------- - -The following settings are supported (some are in sub-structs): -*) auto_convert: when this option is enabled, the encoder will -automatically choose the smallest possible color mode (including color key) that -can encode the colors of all pixels without information loss. -*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, - 2 = dynamic huffman tree (best compression). Should be 2 for proper - compression. -*) use_lz77: whether or not to use LZ77 for compressed block types. Should be - true for proper compression. -*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value - 2048 by default, but can be set to 32768 for better, but slow, compression. -*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE - chunk if force_palette is true. This can used as suggested palette to convert - to by viewers that don't support more than 256 colors (if those still exist) -*) add_id: add text chunk "Encoder: LodePNG " to the image. -*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. - zTXt chunks use zlib compression on the text. This gives a smaller result on - large texts but a larger result on small texts (such as a single program name). - It's all tEXt or all zTXt though, there's no separate setting per text yet. - - -6. color conversions --------------------- - -An important thing to note about LodePNG, is that the color type of the PNG, and -the color type of the raw image, are completely independent. By default, when -you decode a PNG, you get the result as a raw image in the color type you want, -no matter whether the PNG was encoded with a palette, greyscale or RGBA color. -And if you encode an image, by default LodePNG will automatically choose the PNG -color type that gives good compression based on the values of colors and amount -of colors in the image. It can be configured to let you control it instead as -well, though. - -To be able to do this, LodePNG does conversions from one color mode to another. -It can convert from almost any color type to any other color type, except the -following conversions: RGB to greyscale is not supported, and converting to a -palette when the palette doesn't have a required color is not supported. This is -not supported on purpose: this is information loss which requires a color -reduction algorithm that is beyong the scope of a PNG encoder (yes, RGB to grey -is easy, but there are multiple ways if you want to give some channels more -weight). - -By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB -color, no matter what color type the PNG has. And by default when encoding, -LodePNG automatically picks the best color model for the output PNG, and expects -the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control -the color format of the images yourself, you can skip this chapter. - -6.1. PNG color types --------------------- - -A PNG image can have many color types, ranging from 1-bit color to 64-bit color, -as well as palettized color modes. After the zlib decompression and unfiltering -in the PNG image is done, the raw pixel data will have that color type and thus -a certain amount of bits per pixel. If you want the output raw image after -decoding to have another color type, a conversion is done by LodePNG. - -The PNG specification gives the following color types: - -0: greyscale, bit depths 1, 2, 4, 8, 16 -2: RGB, bit depths 8 and 16 -3: palette, bit depths 1, 2, 4 and 8 -4: greyscale with alpha, bit depths 8 and 16 -6: RGBA, bit depths 8 and 16 - -Bit depth is the amount of bits per pixel per color channel. So the total amount -of bits per pixel is: amount of channels * bitdepth. - -6.2. color conversions ----------------------- - -As explained in the sections about the encoder and decoder, you can specify -color types and bit depths in info_png and info_raw to change the default -behaviour. - -If, when decoding, you want the raw image to be something else than the default, -you need to set the color type and bit depth you want in the LodePNGColorMode, -or the parameters of the simple function of LodePNG you're using. - -If, when encoding, you use another color type than the default in the input -image, you need to specify its color type and bit depth in the LodePNGColorMode -of the raw image, or use the parameters of the simplefunction of LodePNG you're -using. - -If, when encoding, you don't want LodePNG to choose the output PNG color type -but control it yourself, you need to set auto_convert in the encoder settings -to LAC_NONE, and specify the color type you want in the LodePNGInfo of the -encoder. - -If you do any of the above, LodePNG may need to do a color conversion, which -follows the rules below, and may sometimes not be allowed. - -To avoid some confusion: --the decoder converts from PNG to raw image --the encoder converts from raw image to PNG --the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image --the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG --when encoding, the color type in LodePNGInfo is ignored if auto_convert - is enabled, it is automatically generated instead --when decoding, the color type in LodePNGInfo is set by the decoder to that of the original - PNG image, but it can be ignored since the raw image has the color type you requested instead --if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion - between the color types is done if the color types are supported. If it is not - supported, an error is returned. If the types are the same, no conversion is done. --even though some conversions aren't supported, LodePNG supports loading PNGs from any - colortype and saving PNGs to any colortype, sometimes it just requires preparing - the raw image correctly before encoding. --both encoder and decoder use the same color converter. - -Non supported color conversions: --color to greyscale: no error is thrown, but the result will look ugly because -only the red channel is taken --anything, to palette when that palette does not have that color in it: in this -case an error is thrown - -Supported color conversions: --anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA --any grey or grey+alpha, to grey or grey+alpha --anything to a palette, as long as the palette has the requested colors in it --removing alpha channel --higher to smaller bitdepth, and vice versa - -If you want no color conversion to be done: --In the encoder, you can make it save a PNG with any color type by giving the -raw color mode and LodePNGInfo the same color mode, and setting auto_convert to -LAC_NO. --In the decoder, you can make it store the pixel data in the same color type -as the PNG has, by setting the color_convert setting to false. Settings in -info_raw are then ignored. - -The function lodepng_convert does the color conversion. It is available in the -interface but normally isn't needed since the encoder and decoder already call -it. - -6.3. padding bits ------------------ - -In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines -have a bit amount that isn't a multiple of 8, then padding bits are used so that each -scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. -The raw input image you give to the encoder, and the raw output image you get from the decoder -will NOT have these padding bits, e.g. in the case of a 1-bit image with a width -of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte, -not the first bit of a new byte. - -6.4. A note about 16-bits per channel and endianness ----------------------------------------------------- - -LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like -for any other color format. The 16-bit values are stored in big endian (most -significant byte first) in these arrays. This is the opposite order of the -little endian used by x86 CPU's. - -LodePNG always uses big endian because the PNG file format does so internally. -Conversions to other formats than PNG uses internally are not supported by -LodePNG on purpose, there are myriads of formats, including endianness of 16-bit -colors, the order in which you store R, G, B and A, and so on. Supporting and -converting to/from all that is outside the scope of LodePNG. - -This may mean that, depending on your use case, you may want to convert the big -endian output of LodePNG to little endian with a for loop. This is certainly not -always needed, many applications and libraries support big endian 16-bit colors -anyway, but it means you cannot simply cast the unsigned char* buffer to an -unsigned short* buffer on x86 CPUs. - - -7. error values ---------------- - -All functions in LodePNG that return an error code, return 0 if everything went -OK, or a non-zero code if there was an error. - -The meaning of the LodePNG error values can be retrieved with the function -lodepng_error_text: given the numerical error code, it returns a description -of the error in English as a string. - -Check the implementation of lodepng_error_text to see the meaning of each code. - - -8. chunks and PNG editing -------------------------- - -If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG -editor that should follow the rules about handling of unknown chunks, or if your -program is able to read other types of chunks than the ones handled by LodePNG, -then that's possible with the chunk functions of LodePNG. - -A PNG chunk has the following layout: - -4 bytes length -4 bytes type name -length bytes data -4 bytes CRC - -8.1. iterating through chunks ------------------------------ - -If you have a buffer containing the PNG image data, then the first chunk (the -IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the -signature of the PNG and are not part of a chunk. But if you start at byte 8 -then you have a chunk, and can check the following things of it. - -NOTE: none of these functions check for memory buffer boundaries. To avoid -exploits, always make sure the buffer contains all the data of the chunks. -When using lodepng_chunk_next, make sure the returned value is within the -allocated memory. - -unsigned lodepng_chunk_length(const unsigned char* chunk): - -Get the length of the chunk's data. The total chunk length is this length + 12. - -void lodepng_chunk_type(char type[5], const unsigned char* chunk): -unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): - -Get the type of the chunk or compare if it's a certain type - -unsigned char lodepng_chunk_critical(const unsigned char* chunk): -unsigned char lodepng_chunk_private(const unsigned char* chunk): -unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): - -Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). -Check if the chunk is private (public chunks are part of the standard, private ones not). -Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical -chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your -program doesn't handle that type of unknown chunk. - -unsigned char* lodepng_chunk_data(unsigned char* chunk): -const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): - -Get a pointer to the start of the data of the chunk. - -unsigned lodepng_chunk_check_crc(const unsigned char* chunk): -void lodepng_chunk_generate_crc(unsigned char* chunk): - -Check if the crc is correct or generate a correct one. - -unsigned char* lodepng_chunk_next(unsigned char* chunk): -const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): - -Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these -functions do no boundary checking of the allocated data whatsoever, so make sure there is enough -data available in the buffer to be able to go to the next chunk. - -unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): -unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, - const char* type, const unsigned char* data): - -These functions are used to create new chunks that are appended to the data in *out that has -length *outlength. The append function appends an existing chunk to the new data. The create -function creates a new chunk with the given parameters and appends it. Type is the 4-letter -name of the chunk. - -8.2. chunks in info_png ------------------------ - -The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 -buffers (each with size) to contain 3 types of unknown chunks: -the ones that come before the PLTE chunk, the ones that come between the PLTE -and the IDAT chunks, and the ones that come after the IDAT chunks. -It's necessary to make the distionction between these 3 cases because the PNG -standard forces to keep the ordering of unknown chunks compared to the critical -chunks, but does not force any other ordering rules. - -info_png.unknown_chunks_data[0] is the chunks before PLTE -info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT -info_png.unknown_chunks_data[2] is the chunks after IDAT - -The chunks in these 3 buffers can be iterated through and read by using the same -way described in the previous subchapter. - -When using the decoder to decode a PNG, you can make it store all unknown chunks -if you set the option settings.remember_unknown_chunks to 1. By default, this -option is off (0). - -The encoder will always encode unknown chunks that are stored in the info_png. -If you need it to add a particular chunk that isn't known by LodePNG, you can -use lodepng_chunk_append or lodepng_chunk_create to the chunk data in -info_png.unknown_chunks_data[x]. - -Chunks that are known by LodePNG should not be added in that way. E.g. to make -LodePNG add a bKGD chunk, set background_defined to true and add the correct -parameters there instead. - - -9. compiler support -------------------- - -No libraries other than the current standard C library are needed to compile -LodePNG. For the C++ version, only the standard C++ library is needed on top. -Add the files lodepng.c(pp) and lodepng.h to your project, include -lodepng.h where needed, and your program can read/write PNG files. - -If performance is important, use optimization when compiling! For both the -encoder and decoder, this makes a large difference. - -Make sure that LodePNG is compiled with the same compiler of the same version -and with the same settings as the rest of the program, or the interfaces with -std::vectors and std::strings in C++ can be incompatible. - -CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. - -*) gcc and g++ - -LodePNG is developed in gcc so this compiler is natively supported. It gives no -warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ -version 4.7.1 on Linux, 32-bit and 64-bit. - -*) Mingw - -The Mingw compiler (a port of gcc) for Windows is fully supported by LodePNG. - -*) Visual Studio 2005 and up, Visual C++ Express Edition 2005 and up - -Visual Studio may give warnings about 'fopen' being deprecated. A multiplatform library -can't support the proposed Visual Studio alternative however, so LodePNG keeps using -fopen. If you don't want to see the deprecated warnings, put this on top of lodepng.h -before the inclusions: -#define _CRT_SECURE_NO_DEPRECATE - -Other than the above warnings, LodePNG should be warning-free with warning -level 3 (W3). Warning level 4 (W4) will give warnings about integer conversions. -I'm not planning to resolve these warnings. To get rid of them, let Visual -Studio use warning level W3 for lodepng.cpp only: right click lodepng.cpp, -Properties, C/C++, General, Warning Level: Level 3 (/W3). - -Visual Studio may want "stdafx.h" files to be included in each source file and -give an error "unexpected end of file while looking for precompiled header". -That is not standard C++ and will not be added to the stock LodePNG. You can -disable it for lodepng.cpp only by right clicking it, Properties, C/C++, -Precompiled Headers, and set it to Not Using Precompiled Headers there. - -*) Visual Studio 6.0 - -LodePNG support for Visual Studio 6.0 is not guaranteed because VS6 doesn't -follow the C++ standard correctly. - -*) Comeau C/C++ - -Vesion 20070107 compiles without problems on the Comeau C/C++ Online Test Drive -at http://www.comeaucomputing.com/tryitout in both C90 and C++ mode. - -*) Compilers on Macintosh - -LodePNG has been reported to work both with the gcc and LLVM for Macintosh, both -for C and C++. - -*) Other Compilers - -If you encounter problems on other compilers, feel free to let me know and I may -try to fix it if the compiler is modern standards complient. - - -10. examples ------------- - -This decoder example shows the most basic usage of LodePNG. More complex -examples can be found on the LodePNG website. - -10.1. decoder C++ example -------------------------- - -#include "lodepng.h" -#include - -int main(int argc, char *argv[]) -{ - const char* filename = argc > 1 ? argv[1] : "test.png"; - - //load and decode - std::vector image; - unsigned width, height; - unsigned error = lodepng::decode(image, width, height, filename); - - //if there's an error, display it - if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; - - //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... -} - -10.2. decoder C example ------------------------ - -#include "lodepng.h" - -int main(int argc, char *argv[]) -{ - unsigned error; - unsigned char* image; - size_t width, height; - const char* filename = argc > 1 ? argv[1] : "test.png"; - - error = lodepng_decode32_file(&image, &width, &height, filename); - - if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); - - / * use image here * / - - free(image); - return 0; -} - - -11. changes ------------ - -The version number of LodePNG is the date of the change given in the format -yyyymmdd. - -Some changes aren't backwards compatible. Those are indicated with a (!) -symbol. - -*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). -*) 11 mar 2013 (!): Bugfix with custom free. Changed from "my" to "lodepng_" - prefix for the custom allocators and made it possible with a new #define to - use custom ones in your project without needing to change lodepng's code. -*) 28 jan 2013: Bugfix with color key. -*) 27 okt 2012: Tweaks in text chunk keyword length error handling. -*) 8 okt 2012 (!): Added new filter strategy (entropy) and new auto color mode. - (no palette). Better deflate tree encoding. New compression tweak settings. - Faster color conversions while decoding. Some internal cleanups. -*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. -*) 1 sep 2012 (!): Removed #define's for giving custom (de)compression functions - and made it work with function pointers instead. -*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc - and free functions and toggle #defines from compiler flags. Small fixes. -*) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. -*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed - redundant C++ codec classes. Reduced amount of structs. Everything changed, - but it is cleaner now imho and functionality remains the same. Also fixed - several bugs and shrinked the implementation code. Made new samples. -*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best - PNG color model and bit depth, based on the amount and type of colors of the - raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. -*) 9 okt 2011: simpler hash chain implementation for the encoder. -*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. -*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. - A bug with the PNG filtertype heuristic was fixed, so that it chooses much - better ones (it's quite significant). A setting to do an experimental, slow, - brute force search for PNG filter types is added. -*) 17 aug 2011 (!): changed some C zlib related function names. -*) 16 aug 2011: made the code less wide (max 120 characters per line). -*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. -*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. -*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman - to optimize long sequences of zeros. -*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and - LodePNG_InfoColor_canHaveAlpha functions for convenience. -*) 7 nov 2010: added LodePNG_error_text function to get error code description. -*) 30 okt 2010: made decoding slightly faster -*) 26 okt 2010: (!) changed some C function and struct names (more consistent). - Reorganized the documentation and the declaration order in the header. -*) 08 aug 2010: only changed some comments and external samples. -*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. -*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. -*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could - read by ignoring the problem but windows apps couldn't. -*) 06 jun 2008: added more error checks for out of memory cases. -*) 26 apr 2008: added a few more checks here and there to ensure more safety. -*) 06 mar 2008: crash with encoding of strings fixed -*) 02 feb 2008: support for international text chunks added (iTXt) -*) 23 jan 2008: small cleanups, and #defines to divide code in sections -*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. -*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. -*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added - Also vareous fixes, such as in the deflate and the padding bits code. -*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved - filtering code of encoder. -*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A - C++ wrapper around this provides an interface almost identical to before. - Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code - are together in these files but it works both for C and C++ compilers. -*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks -*) 30 aug 2007: bug fixed which makes this Borland C++ compatible -*) 09 aug 2007: some VS2005 warnings removed again -*) 21 jul 2007: deflate code placed in new namespace separate from zlib code -*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images -*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing - invalid std::vector element [0] fixed, and level 3 and 4 warnings removed -*) 02 jun 2007: made the encoder add a tag with version by default -*) 27 may 2007: zlib and png code separated (but still in the same file), - simple encoder/decoder functions added for more simple usage cases -*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), - moved some examples from here to lodepng_examples.cpp -*) 12 may 2007: palette decoding bug fixed -*) 24 apr 2007: changed the license from BSD to the zlib license -*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. -*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding - palettized PNG images. Plus little interface change with palette and texts. -*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. - Fixed a bug where the end code of a block had length 0 in the Huffman tree. -*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented - and supported by the encoder, resulting in smaller PNGs at the output. -*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. -*) 24 jan 2007: gave encoder an error interface. Added color conversion from any - greyscale type to 8-bit greyscale with or without alpha. -*) 21 jan 2007: (!) Totally changed the interface. It allows more color types - to convert to and is more uniform. See the manual for how it works now. -*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: - encode/decode custom tEXt chunks, separate classes for zlib & deflate, and - at last made the decoder give errors for incorrect Adler32 or Crc. -*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. -*) 29 dec 2006: Added support for encoding images without alpha channel, and - cleaned out code as well as making certain parts faster. -*) 28 dec 2006: Added "Settings" to the encoder. -*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. - Removed some code duplication in the decoder. Fixed little bug in an example. -*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. - Fixed a bug of the decoder with 16-bit per color. -*) 15 okt 2006: Changed documentation structure -*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the - given image buffer, however for now it's not compressed. -*) 08 sep 2006: (!) Changed to interface with a Decoder class -*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different - way. Renamed decodePNG to decodePNGGeneric. -*) 29 jul 2006: (!) Changed the interface: image info is now returned as a - struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. -*) 28 jul 2006: Cleaned the code and added new error checks. - Corrected terminology "deflate" into "inflate". -*) 23 jun 2006: Added SDL example in the documentation in the header, this - example allows easy debugging by displaying the PNG and its transparency. -*) 22 jun 2006: (!) Changed way to obtain error value. Added - loadFile function for convenience. Made decodePNG32 faster. -*) 21 jun 2006: (!) Changed type of info vector to unsigned. - Changed position of palette in info vector. Fixed an important bug that - happened on PNGs with an uncompressed block. -*) 16 jun 2006: Internally changed unsigned into unsigned where - needed, and performed some optimizations. -*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them - in LodePNG namespace. Changed the order of the parameters. Rewrote the - documentation in the header. Renamed files to lodepng.cpp and lodepng.h -*) 22 apr 2006: Optimized and improved some code -*) 07 sep 2005: (!) Changed to std::vector interface -*) 12 aug 2005: Initial release (C++, decoder only) - - -12. contact information ------------------------ - -Feel free to contact me with suggestions, problems, comments, ... concerning -LodePNG. If you encounter a PNG image that doesn't work properly with this -decoder, feel free to send it and I'll use it to find and fix the problem. - -My email address is (puzzle the account and domain together with an @ symbol): -Domain: gmail dot com. -Account: lode dot vandevenne. - - -Copyright (c) 2005-2012 Lode Vandevenne -*/ diff --git a/cpp/cli/src/main.cpp b/cpp/cli/src/main.cpp deleted file mode 100644 index cc436434f..000000000 --- a/cpp/cli/src/main.cpp +++ /dev/null @@ -1,297 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010-2011 ZXing authors - * - * 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 -#include -#include -#include "ImageReaderSource.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -using namespace std; -using namespace zxing; -using namespace zxing::multi; -using namespace zxing::qrcode; - -namespace { - -bool more = false; -bool test_mode = false; -bool try_harder = false; -bool search_multi = false; -bool use_hybrid = false; -bool use_global = false; -bool verbose = false; - -} - -vector > decode(Ref image, DecodeHints hints) { - Ref reader(new MultiFormatReader); - return vector >(1, reader->decode(image, hints)); -} - -vector > decode_multi(Ref image, DecodeHints hints) { - MultiFormatReader delegate; - GenericMultipleBarcodeReader reader(delegate); - return reader.decodeMultiple(image, hints); -} - -int read_image(Ref source, bool hybrid, string expected) { - vector > results; - string cell_result; - int res = -1; - - try { - Ref binarizer; - if (hybrid) { - binarizer = new HybridBinarizer(source); - } else { - binarizer = new GlobalHistogramBinarizer(source); - } - DecodeHints hints(DecodeHints::DEFAULT_HINT); - hints.setTryHarder(try_harder); - Ref binary(new BinaryBitmap(binarizer)); - if (search_multi) { - results = decode_multi(binary, hints); - } else { - results = decode(binary, hints); - } - res = 0; - } catch (const ReaderException& e) { - cell_result = "zxing::ReaderException: " + string(e.what()); - res = -2; - } catch (const zxing::IllegalArgumentException& e) { - cell_result = "zxing::IllegalArgumentException: " + string(e.what()); - res = -3; - } catch (const zxing::Exception& e) { - cell_result = "zxing::Exception: " + string(e.what()); - res = -4; - } catch (const std::exception& e) { - cell_result = "std::exception: " + string(e.what()); - res = -5; - } - - if (test_mode && results.size() == 1) { - std::string result = results[0]->getText()->getText(); - if (expected.empty()) { - cout << " Expected text or binary data for image missing." << endl - << " Detected: " << result << endl; - res = -6; - } else { - if (expected.compare(result) != 0) { - cout << " Expected: " << expected << endl - << " Detected: " << result << endl; - cell_result = "data did not match"; - res = -6; - } - } - } - - if (res != 0 && (verbose || (use_global ^ use_hybrid))) { - cout << (hybrid ? "Hybrid" : "Global") - << " binarizer failed: " << cell_result << endl; - } else if (!test_mode) { - if (verbose) { - cout << (hybrid ? "Hybrid" : "Global") - << " binarizer succeeded: " << endl; - } - for (size_t i = 0; i < results.size(); i++) { - if (more) { - cout << " Format: " - << BarcodeFormat::barcodeFormatNames[results[i]->getBarcodeFormat()] - << endl; - for (int j = 0; j < results[i]->getResultPoints()->size(); j++) { - cout << " Point[" << j << "]: " - << results[i]->getResultPoints()[j]->getX() << " " - << results[i]->getResultPoints()[j]->getY() << endl; - } - } - if (verbose) { - cout << " "; - } - cout << results[i]->getText()->getText() << endl; - } - } - - return res; -} - -string read_expected(string imagefilename) { - string textfilename = imagefilename; - string::size_type dotpos = textfilename.rfind("."); - - textfilename.replace(dotpos + 1, textfilename.length() - dotpos - 1, "txt"); - ifstream textfile(textfilename.c_str(), ios::binary); - textfilename.replace(dotpos + 1, textfilename.length() - dotpos - 1, "bin"); - ifstream binfile(textfilename.c_str(), ios::binary); - ifstream *file = 0; - if (textfile.is_open()) { - file = &textfile; - } else if (binfile.is_open()) { - file = &binfile; - } else { - return std::string(); - } - file->seekg(0, ios_base::end); - size_t size = size_t(file->tellg()); - file->seekg(0, ios_base::beg); - - if (size == 0) { - return std::string(); - } - - char* data = new char[size + 1]; - file->read(data, size); - data[size] = '\0'; - string expected(data); - delete[] data; - - return expected; -} - -int main(int argc, char** argv) { - if (argc <= 1) { - cout << "Usage: " << argv[0] << " [OPTION]... ..." << endl - << "Read barcodes from each IMAGE file." << endl - << endl - << "Options:" << endl - << " (-h|--hybrid) use the hybrid binarizer (default)" << endl - << " (-g|--global) use the global binarizer" << endl - << " (-v|--verbose) chattier results printing" << endl - << " --more display more information about the barcode" << endl - << " --test-mode compare IMAGEs against text files" << endl - << " --try-harder spend more time to try to find a barcode" << endl - << " --search-multi search for more than one bar code" << endl - << endl - << "Example usage:" << endl - << " zxing --test-mode *.jpg" << endl - << endl; - return 1; - } - - int total = 0; - int gonly = 0; - int honly = 0; - int both = 0; - int neither = 0; - - for (int i = 1; i < argc; i++) { - string filename = argv[i]; - if (filename.compare("--verbose") == 0 || - filename.compare("-v") == 0) { - verbose = true; - continue; - } - if (filename.compare("--hybrid") == 0 || - filename.compare("-h") == 0) { - use_hybrid = true; - continue; - } - if (filename.compare("--global") == 0 || - filename.compare("-g") == 0) { - use_global = true; - continue; - } - if (filename.compare("--more") == 0) { - more = true; - continue; - } - if (filename.compare("--test-mode") == 0) { - test_mode = true; - continue; - } - if (filename.compare("--try-harder") == 0) { - try_harder = true; - continue; - } - if (filename.compare("--search-multi") == 0){ - search_multi = true; - continue; - } - - if (filename.length() > 3 && - (filename.substr(filename.length() - 3, 3).compare("txt") == 0 || - filename.substr(filename.length() - 3, 3).compare("bin") == 0)) { - continue; - } - - if (!use_global && !use_hybrid) { - use_global = use_hybrid = true; - } - - if (test_mode) { - cerr << "Testing: " << filename << endl; - } - - Ref source; - try { - source = ImageReaderSource::create(filename); - } catch (const zxing::IllegalArgumentException &e) { - cerr << e.what() << " (ignoring)" << endl; - continue; - } - - string expected = read_expected(filename); - - int gresult = 1; - int hresult = 1; - if (use_hybrid) { - hresult = read_image(source, true, expected); - } - if (use_global && (verbose || hresult != 0)) { - gresult = read_image(source, false, expected); - if (!verbose && gresult != 0) { - cout << "decoding failed" << endl; - } - } - gresult = gresult == 0; - hresult = hresult == 0; - gonly += gresult && !hresult; - honly += hresult && !gresult; - both += gresult && hresult; - neither += !gresult && !hresult; - total = total + 1; - } - - if (test_mode) { - cout << endl - << "Summary:" << endl - << " " << total << " images tested total," << endl - << " " << (honly + both) << " passed hybrid, " << (gonly + both) - << " passed global, " << both << " pass both, " << endl - << " " << honly << " passed only hybrid, " << gonly - << " passed only global, " << neither << " pass neither." << endl; - } - - return 0; -} diff --git a/cpp/cmake/FindCPPUNIT.cmake b/cpp/cmake/FindCPPUNIT.cmake deleted file mode 100644 index 4ee00940d..000000000 --- a/cpp/cmake/FindCPPUNIT.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# -# Find the CppUnit includes and library -# -# This module defines -# CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc. -# CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit. -# CPPUNIT_FOUND, If false, do not try to use CppUnit. - -# also defined, but not for general use are -# CPPUNIT_LIBRARY, where to find the CppUnit library. -# CPPUNIT_DEBUG_LIBRARY, where to find the CppUnit library in debug -# mode. - -SET(CPPUNIT_FOUND "NO") - -FIND_PATH(CPPUNIT_INCLUDE_DIR cppunit/TestCase.h /usr/local/include /usr/include) - -# With Win32, important to have both -IF(WIN32) - FIND_LIBRARY(CPPUNIT_LIBRARY cppunit - ${CPPUNIT_INCLUDE_DIR}/../lib - /usr/local/lib - /usr/lib) - FIND_LIBRARY(CPPUNIT_DEBUG_LIBRARY cppunitd - ${CPPUNIT_INCLUDE_DIR}/../lib - /usr/local/lib - /usr/lib) -ELSE(WIN32) - # On unix system, debug and release have the same name - FIND_LIBRARY(CPPUNIT_LIBRARY cppunit - ${CPPUNIT_INCLUDE_DIR}/../lib - /usr/local/lib - /usr/lib) - FIND_LIBRARY(CPPUNIT_DEBUG_LIBRARY cppunit - ${CPPUNIT_INCLUDE_DIR}/../lib - /usr/local/lib - /usr/lib) -ENDIF(WIN32) - -IF(CPPUNIT_INCLUDE_DIR) - IF(CPPUNIT_LIBRARY) - SET(CPPUNIT_FOUND "YES") - SET(CPPUNIT_LIBRARIES ${CPPUNIT_LIBRARY} ${CMAKE_DL_LIBS}) - SET(CPPUNIT_DEBUG_LIBRARIES ${CPPUNIT_DEBUG_LIBRARY} ${CMAKE_DL_LIBS}) - ELSE (CPPUNIT_LIBRARY) - IF (CPPUNIT_FIND_REQUIRED) - MESSAGE(SEND_ERROR "Could not find library CppUnit.") - ENDIF (CPPUNIT_FIND_REQUIRED) - ENDIF(CPPUNIT_LIBRARY) -ELSE(CPPUNIT_INCLUDE_DIR) - IF (CPPUNIT_FIND_REQUIRED) - MESSAGE(SEND_ERROR "Could not find library CppUnit.") - ENDIF(CPPUNIT_FIND_REQUIRED) -ENDIF(CPPUNIT_INCLUDE_DIR) diff --git a/cpp/cmake/FindIconv.cmake b/cpp/cmake/FindIconv.cmake deleted file mode 100644 index f2cc0df2e..000000000 --- a/cpp/cmake/FindIconv.cmake +++ /dev/null @@ -1,57 +0,0 @@ -# - Try to find Iconv -# Once done this will define -# -# ICONV_FOUND - system has Iconv -# ICONV_INCLUDE_DIR - the Iconv include directory -# ICONV_LIBRARIES - Link these to use Iconv -# ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const -# -include(CheckCXXSourceCompiles) - -IF (ICONV_INCLUDE_DIR) - # Already in cache, be silent - SET(ICONV_FIND_QUIETLY TRUE) -ENDIF (ICONV_INCLUDE_DIR) - -FIND_PATH(ICONV_INCLUDE_DIR iconv.h) - -FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) - -IF(ICONV_INCLUDE_DIR) - SET(ICONV_FOUND TRUE) -ENDIF(ICONV_INCLUDE_DIR) - -set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) -set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) -IF(ICONV_FOUND) - check_cxx_source_compiles(" - #include - int main(){ - iconv_t conv = 0; - char* in = 0; - size_t ilen = 0; - char* out = 0; - size_t olen = 0; - iconv(conv, &in, &ilen, &out, &olen); - return 0; - } -" ICONV_SECOND_ARGUMENT_IS_CONST ) -ENDIF(ICONV_FOUND) -set(CMAKE_REQUIRED_INCLUDES) -set(CMAKE_REQUIRED_LIBRARIES) - -IF(ICONV_FOUND) - IF(NOT ICONV_FIND_QUIETLY) - MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}") - ENDIF(NOT ICONV_FIND_QUIETLY) -ELSE(ICONV_FOUND) - IF(Iconv_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find Iconv") - ENDIF(Iconv_FIND_REQUIRED) -ENDIF(ICONV_FOUND) - -MARK_AS_ADVANCED( - ICONV_INCLUDE_DIR - ICONV_LIBRARIES - ICONV_SECOND_ARGUMENT_IS_CONST -) diff --git a/cpp/core/src/bigint/.gitignore b/cpp/core/src/bigint/.gitignore deleted file mode 100644 index 4467edcf5..000000000 --- a/cpp/core/src/bigint/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -*.o -sample -testsuite -testsuite.expected -testsuite.out -testsuite.err diff --git a/cpp/core/src/bigint/BigInteger.cc b/cpp/core/src/bigint/BigInteger.cc deleted file mode 100644 index 3b23aa1e7..000000000 --- a/cpp/core/src/bigint/BigInteger.cc +++ /dev/null @@ -1,405 +0,0 @@ -#include "BigInteger.hh" - -void BigInteger::operator =(const BigInteger &x) { - // Calls like a = a have no effect - if (this == &x) - return; - // Copy sign - sign = x.sign; - // Copy the rest - mag = x.mag; -} - -BigInteger::BigInteger(const Blk *b, Index blen, Sign s) : mag(b, blen) { - switch (s) { - case zero: - if (!mag.isZero()) - throw "BigInteger::BigInteger(const Blk *, Index, Sign): Cannot use a sign of zero with a nonzero magnitude"; - sign = zero; - break; - case positive: - case negative: - // If the magnitude is zero, force the sign to zero. - sign = mag.isZero() ? zero : s; - break; - default: - /* g++ seems to be optimizing out this case on the assumption - * that the sign is a valid member of the enumeration. Oh well. */ - throw "BigInteger::BigInteger(const Blk *, Index, Sign): Invalid sign"; - } -} - -BigInteger::BigInteger(const BigUnsigned &x, Sign s) : mag(x) { - switch (s) { - case zero: - if (!mag.isZero()) - throw "BigInteger::BigInteger(const BigUnsigned &, Sign): Cannot use a sign of zero with a nonzero magnitude"; - sign = zero; - break; - case positive: - case negative: - // If the magnitude is zero, force the sign to zero. - sign = mag.isZero() ? zero : s; - break; - default: - /* g++ seems to be optimizing out this case on the assumption - * that the sign is a valid member of the enumeration. Oh well. */ - throw "BigInteger::BigInteger(const BigUnsigned &, Sign): Invalid sign"; - } -} - -/* CONSTRUCTION FROM PRIMITIVE INTEGERS - * Same idea as in BigUnsigned.cc, except that negative input results in a - * negative BigInteger instead of an exception. */ - -// Done longhand to let us use initialization. -BigInteger::BigInteger(unsigned long x) : mag(x) { sign = mag.isZero() ? zero : positive; } -BigInteger::BigInteger(unsigned int x) : mag(x) { sign = mag.isZero() ? zero : positive; } -BigInteger::BigInteger(unsigned short x) : mag(x) { sign = mag.isZero() ? zero : positive; } - -// For signed input, determine the desired magnitude and sign separately. - -namespace { - template - BigInteger::Blk magOf(X x) { - /* UX(...) cast needed to stop short(-2^15), which negates to - * itself, from sign-extending in the conversion to Blk. */ - return BigInteger::Blk(x < 0 ? UX(-x) : x); - } - template - BigInteger::Sign signOf(X x) { - return (x == 0) ? BigInteger::zero - : (x > 0) ? BigInteger::positive - : BigInteger::negative; - } -} - -BigInteger::BigInteger(long x) : sign(signOf(x)), mag(magOf(x)) {} -BigInteger::BigInteger(int x) : sign(signOf(x)), mag(magOf(x)) {} -BigInteger::BigInteger(short x) : sign(signOf(x)), mag(magOf(x)) {} - -// CONVERSION TO PRIMITIVE INTEGERS - -/* Reuse BigUnsigned's conversion to an unsigned primitive integer. - * The friend is a separate function rather than - * BigInteger::convertToUnsignedPrimitive to avoid requiring BigUnsigned to - * declare BigInteger. */ -template -inline X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a) { - return a.convertToPrimitive(); -} - -template -X BigInteger::convertToUnsignedPrimitive() const { - if (sign == negative) - throw "BigInteger::to: " - "Cannot convert a negative integer to an unsigned type"; - else - return convertBigUnsignedToPrimitiveAccess(mag); -} - -/* Similar to BigUnsigned::convertToPrimitive, but split into two cases for - * nonnegative and negative numbers. */ -template -X BigInteger::convertToSignedPrimitive() const { - if (sign == zero) - return 0; - else if (mag.getLength() == 1) { - // The single block might fit in an X. Try the conversion. - Blk b = mag.getBlock(0); - if (sign == positive) { - X x = X(b); - if (x >= 0 && Blk(x) == b) - return x; - } else { - X x = -X(b); - /* UX(...) needed to avoid rejecting conversion of - * -2^15 to a short. */ - if (x < 0 && Blk(UX(-x)) == b) - return x; - } - // Otherwise fall through. - } - throw "BigInteger::to: " - "Value is too big to fit in the requested type"; -} - -unsigned long BigInteger::toUnsignedLong () const { return convertToUnsignedPrimitive (); } -unsigned int BigInteger::toUnsignedInt () const { return convertToUnsignedPrimitive (); } -unsigned short BigInteger::toUnsignedShort() const { return convertToUnsignedPrimitive (); } -long BigInteger::toLong () const { return convertToSignedPrimitive (); } -int BigInteger::toInt () const { return convertToSignedPrimitive (); } -short BigInteger::toShort () const { return convertToSignedPrimitive (); } - -// COMPARISON -BigInteger::CmpRes BigInteger::compareTo(const BigInteger &x) const { - // A greater sign implies a greater number - if (sign < x.sign) - return less; - else if (sign > x.sign) - return greater; - else switch (sign) { - // If the signs are the same... - case zero: - return equal; // Two zeros are equal - case positive: - // Compare the magnitudes - return mag.compareTo(x.mag); - case negative: - // Compare the magnitudes, but return the opposite result - return CmpRes(-mag.compareTo(x.mag)); - default: - throw "BigInteger internal error"; - } -} - -/* COPY-LESS OPERATIONS - * These do some messing around to determine the sign of the result, - * then call one of BigUnsigned's copy-less operations. */ - -// See remarks about aliased calls in BigUnsigned.cc . -#define DTRT_ALIASED(cond, op) \ - if (cond) { \ - BigInteger tmpThis; \ - tmpThis.op; \ - *this = tmpThis; \ - return; \ - } - -void BigInteger::add(const BigInteger &a, const BigInteger &b) { - DTRT_ALIASED(this == &a || this == &b, add(a, b)); - // If one argument is zero, copy the other. - if (a.sign == zero) - operator =(b); - else if (b.sign == zero) - operator =(a); - // If the arguments have the same sign, take the - // common sign and add their magnitudes. - else if (a.sign == b.sign) { - sign = a.sign; - mag.add(a.mag, b.mag); - } else { - // Otherwise, their magnitudes must be compared. - switch (a.mag.compareTo(b.mag)) { - case equal: - // If their magnitudes are the same, copy zero. - mag = 0; - sign = zero; - break; - // Otherwise, take the sign of the greater, and subtract - // the lesser magnitude from the greater magnitude. - case greater: - sign = a.sign; - mag.subtract(a.mag, b.mag); - break; - case less: - sign = b.sign; - mag.subtract(b.mag, a.mag); - break; - } - } -} - -void BigInteger::subtract(const BigInteger &a, const BigInteger &b) { - // Notice that this routine is identical to BigInteger::add, - // if one replaces b.sign by its opposite. - DTRT_ALIASED(this == &a || this == &b, subtract(a, b)); - // If a is zero, copy b and flip its sign. If b is zero, copy a. - if (a.sign == zero) { - mag = b.mag; - // Take the negative of _b_'s, sign, not ours. - // Bug pointed out by Sam Larkin on 2005.03.30. - sign = Sign(-b.sign); - } else if (b.sign == zero) - operator =(a); - // If their signs differ, take a.sign and add the magnitudes. - else if (a.sign != b.sign) { - sign = a.sign; - mag.add(a.mag, b.mag); - } else { - // Otherwise, their magnitudes must be compared. - switch (a.mag.compareTo(b.mag)) { - // If their magnitudes are the same, copy zero. - case equal: - mag = 0; - sign = zero; - break; - // If a's magnitude is greater, take a.sign and - // subtract a from b. - case greater: - sign = a.sign; - mag.subtract(a.mag, b.mag); - break; - // If b's magnitude is greater, take the opposite - // of b.sign and subtract b from a. - case less: - sign = Sign(-b.sign); - mag.subtract(b.mag, a.mag); - break; - } - } -} - -void BigInteger::multiply(const BigInteger &a, const BigInteger &b) { - DTRT_ALIASED(this == &a || this == &b, multiply(a, b)); - // If one object is zero, copy zero and return. - if (a.sign == zero || b.sign == zero) { - sign = zero; - mag = 0; - return; - } - // If the signs of the arguments are the same, the result - // is positive, otherwise it is negative. - sign = (a.sign == b.sign) ? positive : negative; - // Multiply the magnitudes. - mag.multiply(a.mag, b.mag); -} - -/* - * DIVISION WITH REMAINDER - * Please read the comments before the definition of - * `BigUnsigned::divideWithRemainder' in `BigUnsigned.cc' for lots of - * information you should know before reading this function. - * - * Following Knuth, I decree that x / y is to be - * 0 if y==0 and floor(real-number x / y) if y!=0. - * Then x % y shall be x - y*(integer x / y). - * - * Note that x = y * (x / y) + (x % y) always holds. - * In addition, (x % y) is from 0 to y - 1 if y > 0, - * and from -(|y| - 1) to 0 if y < 0. (x % y) = x if y = 0. - * - * Examples: (q = a / b, r = a % b) - * a b q r - * === === === === - * 4 3 1 1 - * -4 3 -2 2 - * 4 -3 -2 -2 - * -4 -3 1 -1 - */ -void BigInteger::divideWithRemainder(const BigInteger &b, BigInteger &q) { - // Defend against aliased calls; - // same idea as in BigUnsigned::divideWithRemainder . - if (this == &q) - throw "BigInteger::divideWithRemainder: Cannot write quotient and remainder into the same variable"; - if (this == &b || &q == &b) { - BigInteger tmpB(b); - divideWithRemainder(tmpB, q); - return; - } - - // Division by zero gives quotient 0 and remainder *this - if (b.sign == zero) { - q.mag = 0; - q.sign = zero; - return; - } - // 0 / b gives quotient 0 and remainder 0 - if (sign == zero) { - q.mag = 0; - q.sign = zero; - return; - } - - // Here *this != 0, b != 0. - - // Do the operands have the same sign? - if (sign == b.sign) { - // Yes: easy case. Quotient is zero or positive. - q.sign = positive; - } else { - // No: harder case. Quotient is negative. - q.sign = negative; - // Decrease the magnitude of the dividend by one. - mag--; - /* - * We tinker with the dividend before and with the - * quotient and remainder after so that the result - * comes out right. To see why it works, consider the following - * list of examples, where A is the magnitude-decreased - * a, Q and R are the results of BigUnsigned division - * with remainder on A and |b|, and q and r are the - * final results we want: - * - * a A b Q R q r - * -3 -2 3 0 2 -1 0 - * -4 -3 3 1 0 -2 2 - * -5 -4 3 1 1 -2 1 - * -6 -5 3 1 2 -2 0 - * - * It appears that we need a total of 3 corrections: - * Decrease the magnitude of a to get A. Increase the - * magnitude of Q to get q (and make it negative). - * Find r = (b - 1) - R and give it the desired sign. - */ - } - - // Divide the magnitudes. - mag.divideWithRemainder(b.mag, q.mag); - - if (sign != b.sign) { - // More for the harder case (as described): - // Increase the magnitude of the quotient by one. - q.mag++; - // Modify the remainder. - mag.subtract(b.mag, mag); - mag--; - } - - // Sign of the remainder is always the sign of the divisor b. - sign = b.sign; - - // Set signs to zero as necessary. (Thanks David Allen!) - if (mag.isZero()) - sign = zero; - if (q.mag.isZero()) - q.sign = zero; - - // WHEW!!! -} - -// Negation -void BigInteger::negate(const BigInteger &a) { - DTRT_ALIASED(this == &a, negate(a)); - // Copy a's magnitude - mag = a.mag; - // Copy the opposite of a.sign - sign = Sign(-a.sign); -} - -// INCREMENT/DECREMENT OPERATORS - -// Prefix increment -void BigInteger::operator ++() { - if (sign == negative) { - mag--; - if (mag == 0) - sign = zero; - } else { - mag++; - sign = positive; // if not already - } -} - -// Postfix increment: same as prefix -void BigInteger::operator ++(int) { - operator ++(); -} - -// Prefix decrement -void BigInteger::operator --() { - if (sign == positive) { - mag--; - if (mag == 0) - sign = zero; - } else { - mag++; - sign = negative; - } -} - -// Postfix decrement: same as prefix -void BigInteger::operator --(int) { - operator --(); -} - diff --git a/cpp/core/src/bigint/BigInteger.hh b/cpp/core/src/bigint/BigInteger.hh deleted file mode 100644 index cf6e91056..000000000 --- a/cpp/core/src/bigint/BigInteger.hh +++ /dev/null @@ -1,215 +0,0 @@ -#ifndef BIGINTEGER_H -#define BIGINTEGER_H - -#include "BigUnsigned.hh" - -/* A BigInteger object represents a signed integer of size limited only by - * available memory. BigUnsigneds support most mathematical operators and can - * be converted to and from most primitive integer types. - * - * A BigInteger is just an aggregate of a BigUnsigned and a sign. (It is no - * longer derived from BigUnsigned because that led to harmful implicit - * conversions.) */ -class BigInteger { - -public: - typedef BigUnsigned::Blk Blk; - typedef BigUnsigned::Index Index; - typedef BigUnsigned::CmpRes CmpRes; - static const CmpRes - less = BigUnsigned::less , - equal = BigUnsigned::equal , - greater = BigUnsigned::greater; - // Enumeration for the sign of a BigInteger. - enum Sign { negative = -1, zero = 0, positive = 1 }; - -protected: - Sign sign; - BigUnsigned mag; - -public: - // Constructs zero. - BigInteger() : sign(zero), mag() {} - - // Copy constructor - BigInteger(const BigInteger &x) : sign(x.sign), mag(x.mag) {}; - - // Assignment operator - void operator=(const BigInteger &x); - - // Constructor that copies from a given array of blocks with a sign. - BigInteger(const Blk *b, Index blen, Sign s); - - // Nonnegative constructor that copies from a given array of blocks. - BigInteger(const Blk *b, Index blen) : mag(b, blen) { - sign = mag.isZero() ? zero : positive; - } - - // Constructor from a BigUnsigned and a sign - BigInteger(const BigUnsigned &x, Sign s); - - // Nonnegative constructor from a BigUnsigned - BigInteger(const BigUnsigned &x) : mag(x) { - sign = mag.isZero() ? zero : positive; - } - - // Constructors from primitive integer types - BigInteger(unsigned long x); - BigInteger( long x); - BigInteger(unsigned int x); - BigInteger( int x); - BigInteger(unsigned short x); - BigInteger( short x); - - /* Converters to primitive integer types - * The implicit conversion operators caused trouble, so these are now - * named. */ - unsigned long toUnsignedLong () const; - long toLong () const; - unsigned int toUnsignedInt () const; - int toInt () const; - unsigned short toUnsignedShort() const; - short toShort () const; -protected: - // Helper - template X convertToUnsignedPrimitive() const; - template X convertToSignedPrimitive() const; -public: - - // ACCESSORS - Sign getSign() const { return sign; } - /* The client can't do any harm by holding a read-only reference to the - * magnitude. */ - const BigUnsigned &getMagnitude() const { return mag; } - - // Some accessors that go through to the magnitude - Index getLength() const { return mag.getLength(); } - Index getCapacity() const { return mag.getCapacity(); } - Blk getBlock(Index i) const { return mag.getBlock(i); } - bool isZero() const { return sign == zero; } // A bit special - - // COMPARISONS - - // Compares this to x like Perl's <=> - CmpRes compareTo(const BigInteger &x) const; - - // Ordinary comparison operators - bool operator ==(const BigInteger &x) const { - return sign == x.sign && mag == x.mag; - } - bool operator !=(const BigInteger &x) const { return !operator ==(x); }; - bool operator < (const BigInteger &x) const { return compareTo(x) == less ; } - bool operator <=(const BigInteger &x) const { return compareTo(x) != greater; } - bool operator >=(const BigInteger &x) const { return compareTo(x) != less ; } - bool operator > (const BigInteger &x) const { return compareTo(x) == greater; } - - // OPERATORS -- See the discussion in BigUnsigned.hh. - void add (const BigInteger &a, const BigInteger &b); - void subtract(const BigInteger &a, const BigInteger &b); - void multiply(const BigInteger &a, const BigInteger &b); - /* See the comment on BigUnsigned::divideWithRemainder. Semantics - * differ from those of primitive integers when negatives and/or zeros - * are involved. */ - void divideWithRemainder(const BigInteger &b, BigInteger &q); - void negate(const BigInteger &a); - - /* Bitwise operators are not provided for BigIntegers. Use - * getMagnitude to get the magnitude and operate on that instead. */ - - BigInteger operator +(const BigInteger &x) const; - BigInteger operator -(const BigInteger &x) const; - BigInteger operator *(const BigInteger &x) const; - BigInteger operator /(const BigInteger &x) const; - BigInteger operator %(const BigInteger &x) const; - BigInteger operator -() const; - - void operator +=(const BigInteger &x); - void operator -=(const BigInteger &x); - void operator *=(const BigInteger &x); - void operator /=(const BigInteger &x); - void operator %=(const BigInteger &x); - void flipSign(); - - // INCREMENT/DECREMENT OPERATORS - void operator ++( ); - void operator ++(int); - void operator --( ); - void operator --(int); -}; - -// NORMAL OPERATORS -/* These create an object to hold the result and invoke - * the appropriate put-here operation on it, passing - * this and x. The new object is then returned. */ -inline BigInteger BigInteger::operator +(const BigInteger &x) const { - BigInteger ans; - ans.add(*this, x); - return ans; -} -inline BigInteger BigInteger::operator -(const BigInteger &x) const { - BigInteger ans; - ans.subtract(*this, x); - return ans; -} -inline BigInteger BigInteger::operator *(const BigInteger &x) const { - BigInteger ans; - ans.multiply(*this, x); - return ans; -} -inline BigInteger BigInteger::operator /(const BigInteger &x) const { - if (x.isZero()) throw "BigInteger::operator /: division by zero"; - BigInteger q, r; - r = *this; - r.divideWithRemainder(x, q); - return q; -} -inline BigInteger BigInteger::operator %(const BigInteger &x) const { - if (x.isZero()) throw "BigInteger::operator %: division by zero"; - BigInteger q, r; - r = *this; - r.divideWithRemainder(x, q); - return r; -} -inline BigInteger BigInteger::operator -() const { - BigInteger ans; - ans.negate(*this); - return ans; -} - -/* - * ASSIGNMENT OPERATORS - * - * Now the responsibility for making a temporary copy if necessary - * belongs to the put-here operations. See Assignment Operators in - * BigUnsigned.hh. - */ -inline void BigInteger::operator +=(const BigInteger &x) { - add(*this, x); -} -inline void BigInteger::operator -=(const BigInteger &x) { - subtract(*this, x); -} -inline void BigInteger::operator *=(const BigInteger &x) { - multiply(*this, x); -} -inline void BigInteger::operator /=(const BigInteger &x) { - if (x.isZero()) throw "BigInteger::operator /=: division by zero"; - /* The following technique is slightly faster than copying *this first - * when x is large. */ - BigInteger q; - divideWithRemainder(x, q); - // *this contains the remainder, but we overwrite it with the quotient. - *this = q; -} -inline void BigInteger::operator %=(const BigInteger &x) { - if (x.isZero()) throw "BigInteger::operator %=: division by zero"; - BigInteger q; - // Mods *this by x. Don't care about quotient left in q. - divideWithRemainder(x, q); -} -// This one is trivial -inline void BigInteger::flipSign() { - sign = Sign(-sign); -} - -#endif diff --git a/cpp/core/src/bigint/BigIntegerAlgorithms.cc b/cpp/core/src/bigint/BigIntegerAlgorithms.cc deleted file mode 100644 index 7edebda76..000000000 --- a/cpp/core/src/bigint/BigIntegerAlgorithms.cc +++ /dev/null @@ -1,70 +0,0 @@ -#include "BigIntegerAlgorithms.hh" - -BigUnsigned gcd(BigUnsigned a, BigUnsigned b) { - BigUnsigned trash; - // Neat in-place alternating technique. - for (;;) { - if (b.isZero()) - return a; - a.divideWithRemainder(b, trash); - if (a.isZero()) - return b; - b.divideWithRemainder(a, trash); - } -} - -void extendedEuclidean(BigInteger m, BigInteger n, - BigInteger &g, BigInteger &r, BigInteger &s) { - if (&g == &r || &g == &s || &r == &s) - throw "BigInteger extendedEuclidean: Outputs are aliased"; - BigInteger r1(1), s1(0), r2(0), s2(1), q; - /* Invariants: - * r1*m(orig) + s1*n(orig) == m(current) - * r2*m(orig) + s2*n(orig) == n(current) */ - for (;;) { - if (n.isZero()) { - r = r1; s = s1; g = m; - return; - } - // Subtract q times the second invariant from the first invariant. - m.divideWithRemainder(n, q); - r1 -= q*r2; s1 -= q*s2; - - if (m.isZero()) { - r = r2; s = s2; g = n; - return; - } - // Subtract q times the first invariant from the second invariant. - n.divideWithRemainder(m, q); - r2 -= q*r1; s2 -= q*s1; - } -} - -BigUnsigned modinv(const BigInteger &x, const BigUnsigned &n) { - BigInteger g, r, s; - extendedEuclidean(x, n, g, r, s); - if (g == 1) - // r*x + s*n == 1, so r*x === 1 (mod n), so r is the answer. - return (r % n).getMagnitude(); // (r % n) will be nonnegative - else - throw "BigInteger modinv: x and n have a common factor"; -} - -BigUnsigned modexp(const BigInteger &base, const BigUnsigned &exponent, - const BigUnsigned &modulus) { - BigUnsigned ans = 1, base2 = (base % modulus).getMagnitude(); - BigUnsigned::Index i = exponent.bitLength(); - // For each bit of the exponent, most to least significant... - while (i > 0) { - i--; - // Square. - ans *= ans; - ans %= modulus; - // And multiply if the bit is a 1. - if (exponent.getBit(i)) { - ans *= base2; - ans %= modulus; - } - } - return ans; -} diff --git a/cpp/core/src/bigint/BigIntegerAlgorithms.hh b/cpp/core/src/bigint/BigIntegerAlgorithms.hh deleted file mode 100644 index b1dd94322..000000000 --- a/cpp/core/src/bigint/BigIntegerAlgorithms.hh +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef BIGINTEGERALGORITHMS_H -#define BIGINTEGERALGORITHMS_H - -#include "BigInteger.hh" - -/* Some mathematical algorithms for big integers. - * This code is new and, as such, experimental. */ - -// Returns the greatest common divisor of a and b. -BigUnsigned gcd(BigUnsigned a, BigUnsigned b); - -/* Extended Euclidean algorithm. - * Given m and n, finds gcd g and numbers r, s such that r*m + s*n == g. */ -void extendedEuclidean(BigInteger m, BigInteger n, - BigInteger &g, BigInteger &r, BigInteger &s); - -/* Returns the multiplicative inverse of x modulo n, or throws an exception if - * they have a common factor. */ -BigUnsigned modinv(const BigInteger &x, const BigUnsigned &n); - -// Returns (base ^ exponent) % modulus. -BigUnsigned modexp(const BigInteger &base, const BigUnsigned &exponent, - const BigUnsigned &modulus); - -#endif diff --git a/cpp/core/src/bigint/BigIntegerLibrary.hh b/cpp/core/src/bigint/BigIntegerLibrary.hh deleted file mode 100644 index 2a0ebee6a..000000000 --- a/cpp/core/src/bigint/BigIntegerLibrary.hh +++ /dev/null @@ -1,8 +0,0 @@ -// This header file includes all of the library header files. - -#include "NumberlikeArray.hh" -#include "BigUnsigned.hh" -#include "BigInteger.hh" -#include "BigIntegerAlgorithms.hh" -#include "BigUnsignedInABase.hh" -#include "BigIntegerUtils.hh" diff --git a/cpp/core/src/bigint/BigIntegerUtils.cc b/cpp/core/src/bigint/BigIntegerUtils.cc deleted file mode 100644 index 44073af65..000000000 --- a/cpp/core/src/bigint/BigIntegerUtils.cc +++ /dev/null @@ -1,50 +0,0 @@ -#include "BigIntegerUtils.hh" -#include "BigUnsignedInABase.hh" - -std::string bigUnsignedToString(const BigUnsigned &x) { - return std::string(BigUnsignedInABase(x, 10)); -} - -std::string bigIntegerToString(const BigInteger &x) { - return (x.getSign() == BigInteger::negative) - ? (std::string("-") + bigUnsignedToString(x.getMagnitude())) - : (bigUnsignedToString(x.getMagnitude())); -} - -BigUnsigned stringToBigUnsigned(const std::string &s) { - return BigUnsigned(BigUnsignedInABase(s, 10)); -} - -BigInteger stringToBigInteger(const std::string &s) { - // Recognize a sign followed by a BigUnsigned. - return (s[0] == '-') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1)), BigInteger::negative) - : (s[0] == '+') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1))) - : BigInteger(stringToBigUnsigned(s)); -} - -std::ostream &operator <<(std::ostream &os, const BigUnsigned &x) { - BigUnsignedInABase::Base base; - long osFlags = os.flags(); - if (osFlags & os.dec) - base = 10; - else if (osFlags & os.hex) { - base = 16; - if (osFlags & os.showbase) - os << "0x"; - } else if (osFlags & os.oct) { - base = 8; - if (osFlags & os.showbase) - os << '0'; - } else - throw "std::ostream << BigUnsigned: Could not determine the desired base from output-stream flags"; - std::string s = std::string(BigUnsignedInABase(x, base)); - os << s; - return os; -} - -std::ostream &operator <<(std::ostream &os, const BigInteger &x) { - if (x.getSign() == BigInteger::negative) - os << '-'; - os << x.getMagnitude(); - return os; -} diff --git a/cpp/core/src/bigint/BigIntegerUtils.hh b/cpp/core/src/bigint/BigIntegerUtils.hh deleted file mode 100644 index c815b5d7c..000000000 --- a/cpp/core/src/bigint/BigIntegerUtils.hh +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef BIGINTEGERUTILS_H -#define BIGINTEGERUTILS_H - -#include "BigInteger.hh" -#include -#include - -/* This file provides: - * - Convenient std::string <-> BigUnsigned/BigInteger conversion routines - * - std::ostream << operators for BigUnsigned/BigInteger */ - -// std::string conversion routines. Base 10 only. -std::string bigUnsignedToString(const BigUnsigned &x); -std::string bigIntegerToString(const BigInteger &x); -BigUnsigned stringToBigUnsigned(const std::string &s); -BigInteger stringToBigInteger(const std::string &s); - -// Creates a BigInteger from data such as `char's; read below for details. -template -BigInteger dataToBigInteger(const T* data, BigInteger::Index length, BigInteger::Sign sign); - -// Outputs x to os, obeying the flags `dec', `hex', `bin', and `showbase'. -std::ostream &operator <<(std::ostream &os, const BigUnsigned &x); - -// Outputs x to os, obeying the flags `dec', `hex', `bin', and `showbase'. -// My somewhat arbitrary policy: a negative sign comes before a base indicator (like -0xFF). -std::ostream &operator <<(std::ostream &os, const BigInteger &x); - -// BEGIN TEMPLATE DEFINITIONS. - -/* - * Converts binary data to a BigInteger. - * Pass an array `data', its length, and the desired sign. - * - * Elements of `data' may be of any type `T' that has the following - * two properties (this includes almost all integral types): - * - * (1) `sizeof(T)' correctly gives the amount of binary data in one - * value of `T' and is a factor of `sizeof(Blk)'. - * - * (2) When a value of `T' is casted to a `Blk', the low bytes of - * the result contain the desired binary data. - */ -template -BigInteger dataToBigInteger(const T* data, BigInteger::Index length, BigInteger::Sign sign) { - // really ceiling(numBytes / sizeof(BigInteger::Blk)) - unsigned int pieceSizeInBits = 8 * sizeof(T); - unsigned int piecesPerBlock = sizeof(BigInteger::Blk) / sizeof(T); - unsigned int numBlocks = (length + piecesPerBlock - 1) / piecesPerBlock; - - // Allocate our block array - BigInteger::Blk *blocks = new BigInteger::Blk[numBlocks]; - - BigInteger::Index blockNum, pieceNum, pieceNumHere; - - // Convert - for (blockNum = 0, pieceNum = 0; blockNum < numBlocks; blockNum++) { - BigInteger::Blk curBlock = 0; - for (pieceNumHere = 0; pieceNumHere < piecesPerBlock && pieceNum < length; - pieceNumHere++, pieceNum++) - curBlock |= (BigInteger::Blk(data[pieceNum]) << (pieceSizeInBits * pieceNumHere)); - blocks[blockNum] = curBlock; - } - - // Create the BigInteger. - BigInteger x(blocks, numBlocks, sign); - - delete [] blocks; - return x; -} - -#endif diff --git a/cpp/core/src/bigint/BigUnsigned.cc b/cpp/core/src/bigint/BigUnsigned.cc deleted file mode 100644 index d7f9889cc..000000000 --- a/cpp/core/src/bigint/BigUnsigned.cc +++ /dev/null @@ -1,697 +0,0 @@ -#include "BigUnsigned.hh" - -// Memory management definitions have moved to the bottom of NumberlikeArray.hh. - -// The templates used by these constructors and converters are at the bottom of -// BigUnsigned.hh. - -BigUnsigned::BigUnsigned(unsigned long x) { initFromPrimitive (x); } -BigUnsigned::BigUnsigned(unsigned int x) { initFromPrimitive (x); } -BigUnsigned::BigUnsigned(unsigned short x) { initFromPrimitive (x); } -BigUnsigned::BigUnsigned( long x) { initFromSignedPrimitive(x); } -BigUnsigned::BigUnsigned( int x) { initFromSignedPrimitive(x); } -BigUnsigned::BigUnsigned( short x) { initFromSignedPrimitive(x); } - -unsigned long BigUnsigned::toUnsignedLong () const { return convertToPrimitive (); } -unsigned int BigUnsigned::toUnsignedInt () const { return convertToPrimitive (); } -unsigned short BigUnsigned::toUnsignedShort() const { return convertToPrimitive (); } -long BigUnsigned::toLong () const { return convertToSignedPrimitive< long >(); } -int BigUnsigned::toInt () const { return convertToSignedPrimitive< int >(); } -short BigUnsigned::toShort () const { return convertToSignedPrimitive< short>(); } - -// BIT/BLOCK ACCESSORS - -void BigUnsigned::setBlock(Index i, Blk newBlock) { - if (newBlock == 0) { - if (i < len) { - blk[i] = 0; - zapLeadingZeros(); - } - // If i >= len, no effect. - } else { - if (i >= len) { - // The nonzero block extends the number. - allocateAndCopy(i+1); - // Zero any added blocks that we aren't setting. - for (Index j = len; j < i; j++) - blk[j] = 0; - len = i+1; - } - blk[i] = newBlock; - } -} - -/* Evidently the compiler wants BigUnsigned:: on the return type because, at - * that point, it hasn't yet parsed the BigUnsigned:: on the name to get the - * proper scope. */ -BigUnsigned::Index BigUnsigned::bitLength() const { - if (isZero()) - return 0; - else { - Blk leftmostBlock = getBlock(len - 1); - Index leftmostBlockLen = 0; - while (leftmostBlock != 0) { - leftmostBlock >>= 1; - leftmostBlockLen++; - } - return leftmostBlockLen + (len - 1) * N; - } -} - -void BigUnsigned::setBit(Index bi, bool newBit) { - Index blockI = bi / N; - Blk block = getBlock(blockI), mask = Blk(1) << (bi % N); - block = newBit ? (block | mask) : (block & ~mask); - setBlock(blockI, block); -} - -// COMPARISON -BigUnsigned::CmpRes BigUnsigned::compareTo(const BigUnsigned &x) const { - // A bigger length implies a bigger number. - if (len < x.len) - return less; - else if (len > x.len) - return greater; - else { - // Compare blocks one by one from left to right. - Index i = len; - while (i > 0) { - i--; - if (blk[i] == x.blk[i]) - continue; - else if (blk[i] > x.blk[i]) - return greater; - else - return less; - } - // If no blocks differed, the numbers are equal. - return equal; - } -} - -// COPY-LESS OPERATIONS - -/* - * On most calls to copy-less operations, it's safe to read the inputs little by - * little and write the outputs little by little. However, if one of the - * inputs is coming from the same variable into which the output is to be - * stored (an "aliased" call), we risk overwriting the input before we read it. - * In this case, we first compute the result into a temporary BigUnsigned - * variable and then copy it into the requested output variable *this. - * Each put-here operation uses the DTRT_ALIASED macro (Do The Right Thing on - * aliased calls) to generate code for this check. - * - * I adopted this approach on 2007.02.13 (see Assignment Operators in - * BigUnsigned.hh). Before then, put-here operations rejected aliased calls - * with an exception. I think doing the right thing is better. - * - * Some of the put-here operations can probably handle aliased calls safely - * without the extra copy because (for example) they process blocks strictly - * right-to-left. At some point I might determine which ones don't need the - * copy, but my reasoning would need to be verified very carefully. For now - * I'll leave in the copy. - */ -#define DTRT_ALIASED(cond, op) \ - if (cond) { \ - BigUnsigned tmpThis; \ - tmpThis.op; \ - *this = tmpThis; \ - return; \ - } - - - -void BigUnsigned::add(const BigUnsigned &a, const BigUnsigned &b) { - DTRT_ALIASED(this == &a || this == &b, add(a, b)); - // If one argument is zero, copy the other. - if (a.len == 0) { - operator =(b); - return; - } else if (b.len == 0) { - operator =(a); - return; - } - // Some variables... - // Carries in and out of an addition stage - bool carryIn, carryOut; - Blk temp; - Index i; - // a2 points to the longer input, b2 points to the shorter - const BigUnsigned *a2, *b2; - if (a.len >= b.len) { - a2 = &a; - b2 = &b; - } else { - a2 = &b; - b2 = &a; - } - // Set prelimiary length and make room in this BigUnsigned - len = a2->len + 1; - allocate(len); - // For each block index that is present in both inputs... - for (i = 0, carryIn = false; i < b2->len; i++) { - // Add input blocks - temp = a2->blk[i] + b2->blk[i]; - // If a rollover occurred, the result is less than either input. - // This test is used many times in the BigUnsigned code. - carryOut = (temp < a2->blk[i]); - // If a carry was input, handle it - if (carryIn) { - temp++; - carryOut |= (temp == 0); - } - blk[i] = temp; // Save the addition result - carryIn = carryOut; // Pass the carry along - } - // If there is a carry left over, increase blocks until - // one does not roll over. - for (; i < a2->len && carryIn; i++) { - temp = a2->blk[i] + 1; - carryIn = (temp == 0); - blk[i] = temp; - } - // If the carry was resolved but the larger number - // still has blocks, copy them over. - for (; i < a2->len; i++) - blk[i] = a2->blk[i]; - // Set the extra block if there's still a carry, decrease length otherwise - if (carryIn) - blk[i] = 1; - else - len--; -} - -void BigUnsigned::subtract(const BigUnsigned &a, const BigUnsigned &b) { - DTRT_ALIASED(this == &a || this == &b, subtract(a, b)); - if (b.len == 0) { - // If b is zero, copy a. - operator =(a); - return; - } else if (a.len < b.len) - // If a is shorter than b, the result is negative. - throw "BigUnsigned::subtract: " - "Negative result in unsigned calculation"; - // Some variables... - bool borrowIn, borrowOut; - Blk temp; - Index i; - // Set preliminary length and make room - len = a.len; - allocate(len); - // For each block index that is present in both inputs... - for (i = 0, borrowIn = false; i < b.len; i++) { - temp = a.blk[i] - b.blk[i]; - // If a reverse rollover occurred, - // the result is greater than the block from a. - borrowOut = (temp > a.blk[i]); - // Handle an incoming borrow - if (borrowIn) { - borrowOut |= (temp == 0); - temp--; - } - blk[i] = temp; // Save the subtraction result - borrowIn = borrowOut; // Pass the borrow along - } - // If there is a borrow left over, decrease blocks until - // one does not reverse rollover. - for (; i < a.len && borrowIn; i++) { - borrowIn = (a.blk[i] == 0); - blk[i] = a.blk[i] - 1; - } - /* If there's still a borrow, the result is negative. - * Throw an exception, but zero out this object so as to leave it in a - * predictable state. */ - if (borrowIn) { - len = 0; - throw "BigUnsigned::subtract: Negative result in unsigned calculation"; - } else - // Copy over the rest of the blocks - for (; i < a.len; i++) - blk[i] = a.blk[i]; - // Zap leading zeros - zapLeadingZeros(); -} - -/* - * About the multiplication and division algorithms: - * - * I searched unsucessfully for fast C++ built-in operations like the `b_0' - * and `c_0' Knuth describes in Section 4.3.1 of ``The Art of Computer - * Programming'' (replace `place' by `Blk'): - * - * ``b_0[:] multiplication of a one-place integer by another one-place - * integer, giving a two-place answer; - * - * ``c_0[:] division of a two-place integer by a one-place integer, - * provided that the quotient is a one-place integer, and yielding - * also a one-place remainder.'' - * - * I also missed his note that ``[b]y adjusting the word size, if - * necessary, nearly all computers will have these three operations - * available'', so I gave up on trying to use algorithms similar to his. - * A future version of the library might include such algorithms; I - * would welcome contributions from others for this. - * - * I eventually decided to use bit-shifting algorithms. To multiply `a' - * and `b', we zero out the result. Then, for each `1' bit in `a', we - * shift `b' left the appropriate amount and add it to the result. - * Similarly, to divide `a' by `b', we shift `b' left varying amounts, - * repeatedly trying to subtract it from `a'. When we succeed, we note - * the fact by setting a bit in the quotient. While these algorithms - * have the same O(n^2) time complexity as Knuth's, the ``constant factor'' - * is likely to be larger. - * - * Because I used these algorithms, which require single-block addition - * and subtraction rather than single-block multiplication and division, - * the innermost loops of all four routines are very similar. Study one - * of them and all will become clear. - */ - -/* - * This is a little inline function used by both the multiplication - * routine and the division routine. - * - * `getShiftedBlock' returns the `x'th block of `num << y'. - * `y' may be anything from 0 to N - 1, and `x' may be anything from - * 0 to `num.len'. - * - * Two things contribute to this block: - * - * (1) The `N - y' low bits of `num.blk[x]', shifted `y' bits left. - * - * (2) The `y' high bits of `num.blk[x-1]', shifted `N - y' bits right. - * - * But we must be careful if `x == 0' or `x == num.len', in - * which case we should use 0 instead of (2) or (1), respectively. - * - * If `y == 0', then (2) contributes 0, as it should. However, - * in some computer environments, for a reason I cannot understand, - * `a >> b' means `a >> (b % N)'. This means `num.blk[x-1] >> (N - y)' - * will return `num.blk[x-1]' instead of the desired 0 when `y == 0'; - * the test `y == 0' handles this case specially. - */ -inline BigUnsigned::Blk getShiftedBlock(const BigUnsigned &num, - BigUnsigned::Index x, unsigned int y) { - BigUnsigned::Blk part1 = (x == 0 || y == 0) ? 0 : (num.blk[x - 1] >> (BigUnsigned::N - y)); - BigUnsigned::Blk part2 = (x == num.len) ? 0 : (num.blk[x] << y); - return part1 | part2; -} - -void BigUnsigned::multiply(const BigUnsigned &a, const BigUnsigned &b) { - DTRT_ALIASED(this == &a || this == &b, multiply(a, b)); - // If either a or b is zero, set to zero. - if (a.len == 0 || b.len == 0) { - len = 0; - return; - } - /* - * Overall method: - * - * Set this = 0. - * For each 1-bit of `a' (say the `i2'th bit of block `i'): - * Add `b << (i blocks and i2 bits)' to *this. - */ - // Variables for the calculation - Index i, j, k; - unsigned int i2; - Blk temp; - bool carryIn, carryOut; - // Set preliminary length and make room - len = a.len + b.len; - allocate(len); - // Zero out this object - for (i = 0; i < len; i++) - blk[i] = 0; - // For each block of the first number... - for (i = 0; i < a.len; i++) { - // For each 1-bit of that block... - for (i2 = 0; i2 < N; i2++) { - if ((a.blk[i] & (Blk(1) << i2)) == 0) - continue; - /* - * Add b to this, shifted left i blocks and i2 bits. - * j is the index in b, and k = i + j is the index in this. - * - * `getShiftedBlock', a short inline function defined above, - * is now used for the bit handling. It replaces the more - * complex `bHigh' code, in which each run of the loop dealt - * immediately with the low bits and saved the high bits to - * be picked up next time. The last run of the loop used to - * leave leftover high bits, which were handled separately. - * Instead, this loop runs an additional time with j == b.len. - * These changes were made on 2005.01.11. - */ - for (j = 0, k = i, carryIn = false; j <= b.len; j++, k++) { - /* - * The body of this loop is very similar to the body of the first loop - * in `add', except that this loop does a `+=' instead of a `+'. - */ - temp = blk[k] + getShiftedBlock(b, j, i2); - carryOut = (temp < blk[k]); - if (carryIn) { - temp++; - carryOut |= (temp == 0); - } - blk[k] = temp; - carryIn = carryOut; - } - // No more extra iteration to deal with `bHigh'. - // Roll-over a carry as necessary. - for (; carryIn; k++) { - blk[k]++; - carryIn = (blk[k] == 0); - } - } - } - // Zap possible leading zero - if (blk[len - 1] == 0) - len--; -} - -/* - * DIVISION WITH REMAINDER - * This monstrous function mods *this by the given divisor b while storing the - * quotient in the given object q; at the end, *this contains the remainder. - * The seemingly bizarre pattern of inputs and outputs was chosen so that the - * function copies as little as possible (since it is implemented by repeated - * subtraction of multiples of b from *this). - * - * "modWithQuotient" might be a better name for this function, but I would - * rather not change the name now. - */ -void BigUnsigned::divideWithRemainder(const BigUnsigned &b, BigUnsigned &q) { - /* Defending against aliased calls is more complex than usual because we - * are writing to both *this and q. - * - * It would be silly to try to write quotient and remainder to the - * same variable. Rule that out right away. */ - if (this == &q) - throw "BigUnsigned::divideWithRemainder: Cannot write quotient and remainder into the same variable"; - /* Now *this and q are separate, so the only concern is that b might be - * aliased to one of them. If so, use a temporary copy of b. */ - if (this == &b || &q == &b) { - BigUnsigned tmpB(b); - divideWithRemainder(tmpB, q); - return; - } - - /* - * Knuth's definition of mod (which this function uses) is somewhat - * different from the C++ definition of % in case of division by 0. - * - * We let a / 0 == 0 (it doesn't matter much) and a % 0 == a, no - * exceptions thrown. This allows us to preserve both Knuth's demand - * that a mod 0 == a and the useful property that - * (a / b) * b + (a % b) == a. - */ - if (b.len == 0) { - q.len = 0; - return; - } - - /* - * If *this.len < b.len, then *this < b, and we can be sure that b doesn't go into - * *this at all. The quotient is 0 and *this is already the remainder (so leave it alone). - */ - if (len < b.len) { - q.len = 0; - return; - } - - // At this point we know (*this).len >= b.len > 0. (Whew!) - - /* - * Overall method: - * - * For each appropriate i and i2, decreasing: - * Subtract (b << (i blocks and i2 bits)) from *this, storing the - * result in subtractBuf. - * If the subtraction succeeds with a nonnegative result: - * Turn on bit i2 of block i of the quotient q. - * Copy subtractBuf back into *this. - * Otherwise bit i2 of block i remains off, and *this is unchanged. - * - * Eventually q will contain the entire quotient, and *this will - * be left with the remainder. - * - * subtractBuf[x] corresponds to blk[x], not blk[x+i], since 2005.01.11. - * But on a single iteration, we don't touch the i lowest blocks of blk - * (and don't use those of subtractBuf) because these blocks are - * unaffected by the subtraction: we are subtracting - * (b << (i blocks and i2 bits)), which ends in at least `i' zero - * blocks. */ - // Variables for the calculation - Index i, j, k; - unsigned int i2; - Blk temp; - bool borrowIn, borrowOut; - - /* - * Make sure we have an extra zero block just past the value. - * - * When we attempt a subtraction, we might shift `b' so - * its first block begins a few bits left of the dividend, - * and then we'll try to compare these extra bits with - * a nonexistent block to the left of the dividend. The - * extra zero block ensures sensible behavior; we need - * an extra block in `subtractBuf' for exactly the same reason. - */ - Index origLen = len; // Save real length. - /* To avoid an out-of-bounds access in case of reallocation, allocate - * first and then increment the logical length. */ - allocateAndCopy(len + 1); - len++; - blk[origLen] = 0; // Zero the added block. - - // subtractBuf holds part of the result of a subtraction; see above. - Blk *subtractBuf = new Blk[len]; - - // Set preliminary length for quotient and make room - q.len = origLen - b.len + 1; - q.allocate(q.len); - // Zero out the quotient - for (i = 0; i < q.len; i++) - q.blk[i] = 0; - - // For each possible left-shift of b in blocks... - i = q.len; - while (i > 0) { - i--; - // For each possible left-shift of b in bits... - // (Remember, N is the number of bits in a Blk.) - q.blk[i] = 0; - i2 = N; - while (i2 > 0) { - i2--; - /* - * Subtract b, shifted left i blocks and i2 bits, from *this, - * and store the answer in subtractBuf. In the for loop, `k == i + j'. - * - * Compare this to the middle section of `multiply'. They - * are in many ways analogous. See especially the discussion - * of `getShiftedBlock'. - */ - for (j = 0, k = i, borrowIn = false; j <= b.len; j++, k++) { - temp = blk[k] - getShiftedBlock(b, j, i2); - borrowOut = (temp > blk[k]); - if (borrowIn) { - borrowOut |= (temp == 0); - temp--; - } - // Since 2005.01.11, indices of `subtractBuf' directly match those of `blk', so use `k'. - subtractBuf[k] = temp; - borrowIn = borrowOut; - } - // No more extra iteration to deal with `bHigh'. - // Roll-over a borrow as necessary. - for (; k < origLen && borrowIn; k++) { - borrowIn = (blk[k] == 0); - subtractBuf[k] = blk[k] - 1; - } - /* - * If the subtraction was performed successfully (!borrowIn), - * set bit i2 in block i of the quotient. - * - * Then, copy the portion of subtractBuf filled by the subtraction - * back to *this. This portion starts with block i and ends-- - * where? Not necessarily at block `i + b.len'! Well, we - * increased k every time we saved a block into subtractBuf, so - * the region of subtractBuf we copy is just [i, k). - */ - if (!borrowIn) { - q.blk[i] |= (Blk(1) << i2); - while (k > i) { - k--; - blk[k] = subtractBuf[k]; - } - } - } - } - // Zap possible leading zero in quotient - if (q.blk[q.len - 1] == 0) - q.len--; - // Zap any/all leading zeros in remainder - zapLeadingZeros(); - // Deallocate subtractBuf. - // (Thanks to Brad Spencer for noticing my accidental omission of this!) - delete [] subtractBuf; -} - -/* BITWISE OPERATORS - * These are straightforward blockwise operations except that they differ in - * the output length and the necessity of zapLeadingZeros. */ - -void BigUnsigned::bitAnd(const BigUnsigned &a, const BigUnsigned &b) { - DTRT_ALIASED(this == &a || this == &b, bitAnd(a, b)); - // The bitwise & can't be longer than either operand. - len = (a.len >= b.len) ? b.len : a.len; - allocate(len); - Index i; - for (i = 0; i < len; i++) - blk[i] = a.blk[i] & b.blk[i]; - zapLeadingZeros(); -} - -void BigUnsigned::bitOr(const BigUnsigned &a, const BigUnsigned &b) { - DTRT_ALIASED(this == &a || this == &b, bitOr(a, b)); - Index i; - const BigUnsigned *a2, *b2; - if (a.len >= b.len) { - a2 = &a; - b2 = &b; - } else { - a2 = &b; - b2 = &a; - } - allocate(a2->len); - for (i = 0; i < b2->len; i++) - blk[i] = a2->blk[i] | b2->blk[i]; - for (; i < a2->len; i++) - blk[i] = a2->blk[i]; - len = a2->len; - // Doesn't need zapLeadingZeros. -} - -void BigUnsigned::bitXor(const BigUnsigned &a, const BigUnsigned &b) { - DTRT_ALIASED(this == &a || this == &b, bitXor(a, b)); - Index i; - const BigUnsigned *a2, *b2; - if (a.len >= b.len) { - a2 = &a; - b2 = &b; - } else { - a2 = &b; - b2 = &a; - } - allocate(a2->len); - for (i = 0; i < b2->len; i++) - blk[i] = a2->blk[i] ^ b2->blk[i]; - for (; i < a2->len; i++) - blk[i] = a2->blk[i]; - len = a2->len; - zapLeadingZeros(); -} - -void BigUnsigned::bitShiftLeft(const BigUnsigned &a, int b) { - DTRT_ALIASED(this == &a, bitShiftLeft(a, b)); - if (b < 0) { - if (b << 1 == 0) - throw "BigUnsigned::bitShiftLeft: " - "Pathological shift amount not implemented"; - else { - bitShiftRight(a, -b); - return; - } - } - Index shiftBlocks = b / N; - unsigned int shiftBits = b % N; - // + 1: room for high bits nudged left into another block - len = a.len + shiftBlocks + 1; - allocate(len); - Index i, j; - for (i = 0; i < shiftBlocks; i++) - blk[i] = 0; - for (j = 0, i = shiftBlocks; j <= a.len; j++, i++) - blk[i] = getShiftedBlock(a, j, shiftBits); - // Zap possible leading zero - if (blk[len - 1] == 0) - len--; -} - -void BigUnsigned::bitShiftRight(const BigUnsigned &a, int b) { - DTRT_ALIASED(this == &a, bitShiftRight(a, b)); - if (b < 0) { - if (b << 1 == 0) - throw "BigUnsigned::bitShiftRight: " - "Pathological shift amount not implemented"; - else { - bitShiftLeft(a, -b); - return; - } - } - // This calculation is wacky, but expressing the shift as a left bit shift - // within each block lets us use getShiftedBlock. - Index rightShiftBlocks = (b + N - 1) / N; - unsigned int leftShiftBits = N * rightShiftBlocks - b; - // Now (N * rightShiftBlocks - leftShiftBits) == b - // and 0 <= leftShiftBits < N. - if (rightShiftBlocks >= a.len + 1) { - // All of a is guaranteed to be shifted off, even considering the left - // bit shift. - len = 0; - return; - } - // Now we're allocating a positive amount. - // + 1: room for high bits nudged left into another block - len = a.len + 1 - rightShiftBlocks; - allocate(len); - Index i, j; - for (j = rightShiftBlocks, i = 0; j <= a.len; j++, i++) - blk[i] = getShiftedBlock(a, j, leftShiftBits); - // Zap possible leading zero - if (blk[len - 1] == 0) - len--; -} - -// INCREMENT/DECREMENT OPERATORS - -// Prefix increment -void BigUnsigned::operator ++() { - Index i; - bool carry = true; - for (i = 0; i < len && carry; i++) { - blk[i]++; - carry = (blk[i] == 0); - } - if (carry) { - // Allocate and then increase length, as in divideWithRemainder - allocateAndCopy(len + 1); - len++; - blk[i] = 1; - } -} - -// Postfix increment: same as prefix -void BigUnsigned::operator ++(int) { - operator ++(); -} - -// Prefix decrement -void BigUnsigned::operator --() { - if (len == 0) - throw "BigUnsigned::operator --(): Cannot decrement an unsigned zero"; - Index i; - bool borrow = true; - for (i = 0; borrow; i++) { - borrow = (blk[i] == 0); - blk[i]--; - } - // Zap possible leading zero (there can only be one) - if (blk[len - 1] == 0) - len--; -} - -// Postfix decrement: same as prefix -void BigUnsigned::operator --(int) { - operator --(); -} diff --git a/cpp/core/src/bigint/BigUnsigned.hh b/cpp/core/src/bigint/BigUnsigned.hh deleted file mode 100644 index 9228753c8..000000000 --- a/cpp/core/src/bigint/BigUnsigned.hh +++ /dev/null @@ -1,418 +0,0 @@ -#ifndef BIGUNSIGNED_H -#define BIGUNSIGNED_H - -#include "NumberlikeArray.hh" - -/* A BigUnsigned object represents a nonnegative integer of size limited only by - * available memory. BigUnsigneds support most mathematical operators and can - * be converted to and from most primitive integer types. - * - * The number is stored as a NumberlikeArray of unsigned longs as if it were - * written in base 256^sizeof(unsigned long). The least significant block is - * first, and the length is such that the most significant block is nonzero. */ -class BigUnsigned : protected NumberlikeArray { - -public: - // Enumeration for the result of a comparison. - enum CmpRes { less = -1, equal = 0, greater = 1 }; - - // BigUnsigneds are built with a Blk type of unsigned long. - typedef unsigned long Blk; - - typedef NumberlikeArray::Index Index; - using NumberlikeArray::N; - -protected: - // Creates a BigUnsigned with a capacity; for internal use. - BigUnsigned(int, Index c) : NumberlikeArray(0, c) {} - - // Decreases len to eliminate any leading zero blocks. - void zapLeadingZeros() { - while (len > 0 && blk[len - 1] == 0) - len--; - } - -public: - // Constructs zero. - BigUnsigned() : NumberlikeArray() {} - - // Copy constructor - BigUnsigned(const BigUnsigned &x) : NumberlikeArray(x) {} - - // Assignment operator - void operator=(const BigUnsigned &x) { - NumberlikeArray::operator =(x); - } - - // Constructor that copies from a given array of blocks. - BigUnsigned(const Blk *b, Index blen) : NumberlikeArray(b, blen) { - // Eliminate any leading zeros we may have been passed. - zapLeadingZeros(); - } - - // Destructor. NumberlikeArray does the delete for us. - ~BigUnsigned() {} - - // Constructors from primitive integer types - BigUnsigned(unsigned long x); - BigUnsigned( long x); - BigUnsigned(unsigned int x); - BigUnsigned( int x); - BigUnsigned(unsigned short x); - BigUnsigned( short x); -protected: - // Helpers - template void initFromPrimitive (X x); - template void initFromSignedPrimitive(X x); -public: - - /* Converters to primitive integer types - * The implicit conversion operators caused trouble, so these are now - * named. */ - unsigned long toUnsignedLong () const; - long toLong () const; - unsigned int toUnsignedInt () const; - int toInt () const; - unsigned short toUnsignedShort() const; - short toShort () const; -protected: - // Helpers - template X convertToSignedPrimitive() const; - template X convertToPrimitive () const; -public: - - // BIT/BLOCK ACCESSORS - - // Expose these from NumberlikeArray directly. - using NumberlikeArray::getCapacity; - using NumberlikeArray::getLength; - - /* Returns the requested block, or 0 if it is beyond the length (as if - * the number had 0s infinitely to the left). */ - Blk getBlock(Index i) const { return i >= len ? 0 : blk[i]; } - /* Sets the requested block. The number grows or shrinks as necessary. */ - void setBlock(Index i, Blk newBlock); - - // The number is zero if and only if the canonical length is zero. - bool isZero() const { return NumberlikeArray::isEmpty(); } - - /* Returns the length of the number in bits, i.e., zero if the number - * is zero and otherwise one more than the largest value of bi for - * which getBit(bi) returns true. */ - Index bitLength() const; - /* Get the state of bit bi, which has value 2^bi. Bits beyond the - * number's length are considered to be 0. */ - bool getBit(Index bi) const { - return (getBlock(bi / N) & (Blk(1) << (bi % N))) != 0; - } - /* Sets the state of bit bi to newBit. The number grows or shrinks as - * necessary. */ - void setBit(Index bi, bool newBit); - - // COMPARISONS - - // Compares this to x like Perl's <=> - CmpRes compareTo(const BigUnsigned &x) const; - - // Ordinary comparison operators - bool operator ==(const BigUnsigned &x) const { - return NumberlikeArray::operator ==(x); - } - bool operator !=(const BigUnsigned &x) const { - return NumberlikeArray::operator !=(x); - } - bool operator < (const BigUnsigned &x) const { return compareTo(x) == less ; } - bool operator <=(const BigUnsigned &x) const { return compareTo(x) != greater; } - bool operator >=(const BigUnsigned &x) const { return compareTo(x) != less ; } - bool operator > (const BigUnsigned &x) const { return compareTo(x) == greater; } - - /* - * BigUnsigned and BigInteger both provide three kinds of operators. - * Here ``big-integer'' refers to BigInteger or BigUnsigned. - * - * (1) Overloaded ``return-by-value'' operators: - * +, -, *, /, %, unary -, &, |, ^, <<, >>. - * Big-integer code using these operators looks identical to code using - * the primitive integer types. These operators take one or two - * big-integer inputs and return a big-integer result, which can then - * be assigned to a BigInteger variable or used in an expression. - * Example: - * BigInteger a(1), b = 1; - * BigInteger c = a + b; - * - * (2) Overloaded assignment operators: - * +=, -=, *=, /=, %=, flipSign, &=, |=, ^=, <<=, >>=, ++, --. - * Again, these are used on big integers just like on ints. They take - * one writable big integer that both provides an operand and receives a - * result. Most also take a second read-only operand. - * Example: - * BigInteger a(1), b(1); - * a += b; - * - * (3) Copy-less operations: `add', `subtract', etc. - * These named methods take operands as arguments and store the result - * in the receiver (*this), avoiding unnecessary copies and allocations. - * `divideWithRemainder' is special: it both takes the dividend from and - * stores the remainder into the receiver, and it takes a separate - * object in which to store the quotient. NOTE: If you are wondering - * why these don't return a value, you probably mean to use the - * overloaded return-by-value operators instead. - * - * Examples: - * BigInteger a(43), b(7), c, d; - * - * c = a + b; // Now c == 50. - * c.add(a, b); // Same effect but without the two copies. - * - * c.divideWithRemainder(b, d); - * // 50 / 7; now d == 7 (quotient) and c == 1 (remainder). - * - * // ``Aliased'' calls now do the right thing using a temporary - * // copy, but see note on `divideWithRemainder'. - * a.add(a, b); - */ - - // COPY-LESS OPERATIONS - - // These 8: Arguments are read-only operands, result is saved in *this. - void add(const BigUnsigned &a, const BigUnsigned &b); - void subtract(const BigUnsigned &a, const BigUnsigned &b); - void multiply(const BigUnsigned &a, const BigUnsigned &b); - void bitAnd(const BigUnsigned &a, const BigUnsigned &b); - void bitOr(const BigUnsigned &a, const BigUnsigned &b); - void bitXor(const BigUnsigned &a, const BigUnsigned &b); - /* Negative shift amounts translate to opposite-direction shifts, - * except for -2^(8*sizeof(int)-1) which is unimplemented. */ - void bitShiftLeft(const BigUnsigned &a, int b); - void bitShiftRight(const BigUnsigned &a, int b); - - /* `a.divideWithRemainder(b, q)' is like `q = a / b, a %= b'. - * / and % use semantics similar to Knuth's, which differ from the - * primitive integer semantics under division by zero. See the - * implementation in BigUnsigned.cc for details. - * `a.divideWithRemainder(b, a)' throws an exception: it doesn't make - * sense to write quotient and remainder into the same variable. */ - void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q); - - /* `divide' and `modulo' are no longer offered. Use - * `divideWithRemainder' instead. */ - - // OVERLOADED RETURN-BY-VALUE OPERATORS - BigUnsigned operator +(const BigUnsigned &x) const; - BigUnsigned operator -(const BigUnsigned &x) const; - BigUnsigned operator *(const BigUnsigned &x) const; - BigUnsigned operator /(const BigUnsigned &x) const; - BigUnsigned operator %(const BigUnsigned &x) const; - /* OK, maybe unary minus could succeed in one case, but it really - * shouldn't be used, so it isn't provided. */ - BigUnsigned operator &(const BigUnsigned &x) const; - BigUnsigned operator |(const BigUnsigned &x) const; - BigUnsigned operator ^(const BigUnsigned &x) const; - BigUnsigned operator <<(int b) const; - BigUnsigned operator >>(int b) const; - - // OVERLOADED ASSIGNMENT OPERATORS - void operator +=(const BigUnsigned &x); - void operator -=(const BigUnsigned &x); - void operator *=(const BigUnsigned &x); - void operator /=(const BigUnsigned &x); - void operator %=(const BigUnsigned &x); - void operator &=(const BigUnsigned &x); - void operator |=(const BigUnsigned &x); - void operator ^=(const BigUnsigned &x); - void operator <<=(int b); - void operator >>=(int b); - - /* INCREMENT/DECREMENT OPERATORS - * To discourage messy coding, these do not return *this, so prefix - * and postfix behave the same. */ - void operator ++( ); - void operator ++(int); - void operator --( ); - void operator --(int); - - // Helper function that needs access to BigUnsigned internals - friend Blk getShiftedBlock(const BigUnsigned &num, Index x, - unsigned int y); - - // See BigInteger.cc. - template - friend X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a); -}; - -/* Implementing the return-by-value and assignment operators in terms of the - * copy-less operations. The copy-less operations are responsible for making - * any necessary temporary copies to work around aliasing. */ - -inline BigUnsigned BigUnsigned::operator +(const BigUnsigned &x) const { - BigUnsigned ans; - ans.add(*this, x); - return ans; -} -inline BigUnsigned BigUnsigned::operator -(const BigUnsigned &x) const { - BigUnsigned ans; - ans.subtract(*this, x); - return ans; -} -inline BigUnsigned BigUnsigned::operator *(const BigUnsigned &x) const { - BigUnsigned ans; - ans.multiply(*this, x); - return ans; -} -inline BigUnsigned BigUnsigned::operator /(const BigUnsigned &x) const { - if (x.isZero()) throw "BigUnsigned::operator /: division by zero"; - BigUnsigned q, r; - r = *this; - r.divideWithRemainder(x, q); - return q; -} -inline BigUnsigned BigUnsigned::operator %(const BigUnsigned &x) const { - if (x.isZero()) throw "BigUnsigned::operator %: division by zero"; - BigUnsigned q, r; - r = *this; - r.divideWithRemainder(x, q); - return r; -} -inline BigUnsigned BigUnsigned::operator &(const BigUnsigned &x) const { - BigUnsigned ans; - ans.bitAnd(*this, x); - return ans; -} -inline BigUnsigned BigUnsigned::operator |(const BigUnsigned &x) const { - BigUnsigned ans; - ans.bitOr(*this, x); - return ans; -} -inline BigUnsigned BigUnsigned::operator ^(const BigUnsigned &x) const { - BigUnsigned ans; - ans.bitXor(*this, x); - return ans; -} -inline BigUnsigned BigUnsigned::operator <<(int b) const { - BigUnsigned ans; - ans.bitShiftLeft(*this, b); - return ans; -} -inline BigUnsigned BigUnsigned::operator >>(int b) const { - BigUnsigned ans; - ans.bitShiftRight(*this, b); - return ans; -} - -inline void BigUnsigned::operator +=(const BigUnsigned &x) { - add(*this, x); -} -inline void BigUnsigned::operator -=(const BigUnsigned &x) { - subtract(*this, x); -} -inline void BigUnsigned::operator *=(const BigUnsigned &x) { - multiply(*this, x); -} -inline void BigUnsigned::operator /=(const BigUnsigned &x) { - if (x.isZero()) throw "BigUnsigned::operator /=: division by zero"; - /* The following technique is slightly faster than copying *this first - * when x is large. */ - BigUnsigned q; - divideWithRemainder(x, q); - // *this contains the remainder, but we overwrite it with the quotient. - *this = q; -} -inline void BigUnsigned::operator %=(const BigUnsigned &x) { - if (x.isZero()) throw "BigUnsigned::operator %=: division by zero"; - BigUnsigned q; - // Mods *this by x. Don't care about quotient left in q. - divideWithRemainder(x, q); -} -inline void BigUnsigned::operator &=(const BigUnsigned &x) { - bitAnd(*this, x); -} -inline void BigUnsigned::operator |=(const BigUnsigned &x) { - bitOr(*this, x); -} -inline void BigUnsigned::operator ^=(const BigUnsigned &x) { - bitXor(*this, x); -} -inline void BigUnsigned::operator <<=(int b) { - bitShiftLeft(*this, b); -} -inline void BigUnsigned::operator >>=(int b) { - bitShiftRight(*this, b); -} - -/* Templates for conversions of BigUnsigned to and from primitive integers. - * BigInteger.cc needs to instantiate convertToPrimitive, and the uses in - * BigUnsigned.cc didn't do the trick; I think g++ inlined convertToPrimitive - * instead of generating linkable instantiations. So for consistency, I put - * all the templates here. */ - -// CONSTRUCTION FROM PRIMITIVE INTEGERS - -/* Initialize this BigUnsigned from the given primitive integer. The same - * pattern works for all primitive integer types, so I put it into a template to - * reduce code duplication. (Don't worry: this is protected and we instantiate - * it only with primitive integer types.) Type X could be signed, but x is - * known to be nonnegative. */ -template -void BigUnsigned::initFromPrimitive(X x) { - if (x == 0) - ; // NumberlikeArray already initialized us to zero. - else { - // Create a single block. blk is NULL; no need to delete it. - cap = 1; - blk = new Blk[1]; - len = 1; - blk[0] = Blk(x); - } -} - -/* Ditto, but first check that x is nonnegative. I could have put the check in - * initFromPrimitive and let the compiler optimize it out for unsigned-type - * instantiations, but I wanted to avoid the warning stupidly issued by g++ for - * a condition that is constant in *any* instantiation, even if not in all. */ -template -void BigUnsigned::initFromSignedPrimitive(X x) { - if (x < 0) - throw "BigUnsigned constructor: " - "Cannot construct a BigUnsigned from a negative number"; - else - initFromPrimitive(x); -} - -// CONVERSION TO PRIMITIVE INTEGERS - -/* Template with the same idea as initFromPrimitive. This might be slightly - * slower than the previous version with the masks, but it's much shorter and - * clearer, which is the library's stated goal. */ -template -X BigUnsigned::convertToPrimitive() const { - if (len == 0) - // The number is zero; return zero. - return 0; - else if (len == 1) { - // The single block might fit in an X. Try the conversion. - X x = X(blk[0]); - // Make sure the result accurately represents the block. - if (Blk(x) == blk[0]) - // Successful conversion. - return x; - // Otherwise fall through. - } - throw "BigUnsigned::to: " - "Value is too big to fit in the requested type"; -} - -/* Wrap the above in an x >= 0 test to make sure we got a nonnegative result, - * not a negative one that happened to convert back into the correct nonnegative - * one. (E.g., catch incorrect conversion of 2^31 to the long -2^31.) Again, - * separated to avoid a g++ warning. */ -template -X BigUnsigned::convertToSignedPrimitive() const { - X x = convertToPrimitive(); - if (x >= 0) - return x; - else - throw "BigUnsigned::to(Primitive): " - "Value is too big to fit in the requested type"; -} - -#endif diff --git a/cpp/core/src/bigint/BigUnsignedInABase.cc b/cpp/core/src/bigint/BigUnsignedInABase.cc deleted file mode 100644 index 999faaf2d..000000000 --- a/cpp/core/src/bigint/BigUnsignedInABase.cc +++ /dev/null @@ -1,125 +0,0 @@ -#include "BigUnsignedInABase.hh" - -BigUnsignedInABase::BigUnsignedInABase(const Digit *d, Index l, Base base) - : NumberlikeArray(d, l), base(base) { - // Check the base - if (base < 2) - throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): The base must be at least 2"; - - // Validate the digits. - for (Index i = 0; i < l; i++) - if (blk[i] >= base) - throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): A digit is too large for the specified base"; - - // Eliminate any leading zeros we may have been passed. - zapLeadingZeros(); -} - -namespace { - unsigned int bitLen(unsigned int x) { - unsigned int len = 0; - while (x > 0) { - x >>= 1; - len++; - } - return len; - } - unsigned int ceilingDiv(unsigned int a, unsigned int b) { - return (a + b - 1) / b; - } -} - -BigUnsignedInABase::BigUnsignedInABase(const BigUnsigned &x, Base base) { - // Check the base - if (base < 2) - throw "BigUnsignedInABase(BigUnsigned, Base): The base must be at least 2"; - this->base = base; - - // Get an upper bound on how much space we need - int maxBitLenOfX = x.getLength() * BigUnsigned::N; - int minBitsPerDigit = bitLen(base) - 1; - int maxDigitLenOfX = ceilingDiv(maxBitLenOfX, minBitsPerDigit); - len = maxDigitLenOfX; // Another change to comply with `staying in bounds'. - allocate(len); // Get the space - - BigUnsigned x2(x), buBase(base); - Index digitNum = 0; - - while (!x2.isZero()) { - // Get last digit. This is like `lastDigit = x2 % buBase, x2 /= buBase'. - BigUnsigned lastDigit(x2); - lastDigit.divideWithRemainder(buBase, x2); - // Save the digit. - blk[digitNum] = lastDigit.toUnsignedShort(); - // Move on. We can't run out of room: we figured it out above. - digitNum++; - } - - // Save the actual length. - len = digitNum; -} - -BigUnsignedInABase::operator BigUnsigned() const { - BigUnsigned ans(0), buBase(base), temp; - Index digitNum = len; - while (digitNum > 0) { - digitNum--; - temp.multiply(ans, buBase); - ans.add(temp, BigUnsigned(blk[digitNum])); - } - return ans; -} - -BigUnsignedInABase::BigUnsignedInABase(const std::string &s, Base base) { - // Check the base. - if (base > 36) - throw "BigUnsignedInABase(std::string, Base): The default string conversion routines use the symbol set 0-9, A-Z and therefore support only up to base 36. You tried a conversion with a base over 36; write your own string conversion routine."; - // Save the base. - // This pattern is seldom seen in C++, but the analogous ``this.'' is common in Java. - this->base = base; - - // `s.length()' is a `size_t', while `len' is a `NumberlikeArray::Index', - // also known as an `unsigned int'. Some compilers warn without this cast. - len = Index(s.length()); - allocate(len); - - Index digitNum, symbolNumInString; - for (digitNum = 0; digitNum < len; digitNum++) { - symbolNumInString = len - 1 - digitNum; - char theSymbol = s[symbolNumInString]; - if (theSymbol >= '0' && theSymbol <= '9') - blk[digitNum] = theSymbol - '0'; - else if (theSymbol >= 'A' && theSymbol <= 'Z') - blk[digitNum] = theSymbol - 'A' + 10; - else if (theSymbol >= 'a' && theSymbol <= 'z') - blk[digitNum] = theSymbol - 'a' + 10; - else - throw "BigUnsignedInABase(std::string, Base): Bad symbol in input. Only 0-9, A-Z, a-z are accepted."; - - if (blk[digitNum] >= base) - throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): A digit is too large for the specified base"; - } - zapLeadingZeros(); -} - -BigUnsignedInABase::operator std::string() const { - if (base > 36) - throw "BigUnsignedInABase ==> std::string: The default string conversion routines use the symbol set 0-9, A-Z and therefore support only up to base 36. You tried a conversion with a base over 36; write your own string conversion routine."; - if (len == 0) - return std::string("0"); - // Some compilers don't have push_back, so use a char * buffer instead. - char *s = new char[len + 1]; - s[len] = '\0'; - Index digitNum, symbolNumInString; - for (symbolNumInString = 0; symbolNumInString < len; symbolNumInString++) { - digitNum = len - 1 - symbolNumInString; - Digit theDigit = blk[digitNum]; - if (theDigit < 10) - s[symbolNumInString] = char('0' + theDigit); - else - s[symbolNumInString] = char('A' + theDigit - 10); - } - std::string s2(s); - delete [] s; - return s2; -} diff --git a/cpp/core/src/bigint/BigUnsignedInABase.hh b/cpp/core/src/bigint/BigUnsignedInABase.hh deleted file mode 100644 index 0ea89c6ef..000000000 --- a/cpp/core/src/bigint/BigUnsignedInABase.hh +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef BIGUNSIGNEDINABASE_H -#define BIGUNSIGNEDINABASE_H - -#include "NumberlikeArray.hh" -#include "BigUnsigned.hh" -#include - -/* - * A BigUnsignedInABase object represents a nonnegative integer of size limited - * only by available memory, represented in a user-specified base that can fit - * in an `unsigned short' (most can, and this saves memory). - * - * BigUnsignedInABase is intended as an intermediary class with little - * functionality of its own. BigUnsignedInABase objects can be constructed - * from, and converted to, BigUnsigneds (requiring multiplication, mods, etc.) - * and `std::string's (by switching digit values for appropriate characters). - * - * BigUnsignedInABase is similar to BigUnsigned. Note the following: - * - * (1) They represent the number in exactly the same way, except that - * BigUnsignedInABase uses ``digits'' (or Digit) where BigUnsigned uses - * ``blocks'' (or Blk). - * - * (2) Both use the management features of NumberlikeArray. (In fact, my desire - * to add a BigUnsignedInABase class without duplicating a lot of code led me to - * introduce NumberlikeArray.) - * - * (3) The only arithmetic operation supported by BigUnsignedInABase is an - * equality test. Use BigUnsigned for arithmetic. - */ - -class BigUnsignedInABase : protected NumberlikeArray { - -public: - // The digits of a BigUnsignedInABase are unsigned shorts. - typedef unsigned short Digit; - // That's also the type of a base. - typedef Digit Base; - -protected: - // The base in which this BigUnsignedInABase is expressed - Base base; - - // Creates a BigUnsignedInABase with a capacity; for internal use. - BigUnsignedInABase(int, Index c) : NumberlikeArray(0, c) {} - - // Decreases len to eliminate any leading zero digits. - void zapLeadingZeros() { - while (len > 0 && blk[len - 1] == 0) - len--; - } - -public: - // Constructs zero in base 2. - BigUnsignedInABase() : NumberlikeArray(), base(2) {} - - // Copy constructor - BigUnsignedInABase(const BigUnsignedInABase &x) : NumberlikeArray(x), base(x.base) {} - - // Assignment operator - void operator =(const BigUnsignedInABase &x) { - NumberlikeArray::operator =(x); - base = x.base; - } - - // Constructor that copies from a given array of digits. - BigUnsignedInABase(const Digit *d, Index l, Base base); - - // Destructor. NumberlikeArray does the delete for us. - ~BigUnsignedInABase() {} - - // LINKS TO BIGUNSIGNED - BigUnsignedInABase(const BigUnsigned &x, Base base); - operator BigUnsigned() const; - - /* LINKS TO STRINGS - * - * These use the symbols ``0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'' to - * represent digits of 0 through 35. When parsing strings, lowercase is - * also accepted. - * - * All string representations are big-endian (big-place-value digits - * first). (Computer scientists have adopted zero-based counting; why - * can't they tolerate little-endian numbers?) - * - * No string representation has a ``base indicator'' like ``0x''. - * - * An exception is made for zero: it is converted to ``0'' and not the - * empty string. - * - * If you want different conventions, write your own routines to go - * between BigUnsignedInABase and strings. It's not hard. - */ - operator std::string() const; - BigUnsignedInABase(const std::string &s, Base base); - -public: - - // ACCESSORS - Base getBase() const { return base; } - - // Expose these from NumberlikeArray directly. - using NumberlikeArray::getCapacity; - using NumberlikeArray::getLength; - - /* Returns the requested digit, or 0 if it is beyond the length (as if - * the number had 0s infinitely to the left). */ - Digit getDigit(Index i) const { return i >= len ? 0 : blk[i]; } - - // The number is zero if and only if the canonical length is zero. - bool isZero() const { return NumberlikeArray::isEmpty(); } - - /* Equality test. For the purposes of this test, two BigUnsignedInABase - * values must have the same base to be equal. */ - bool operator ==(const BigUnsignedInABase &x) const { - return base == x.base && NumberlikeArray::operator ==(x); - } - bool operator !=(const BigUnsignedInABase &x) const { return !operator ==(x); } - -}; - -#endif diff --git a/cpp/core/src/bigint/ChangeLog b/cpp/core/src/bigint/ChangeLog deleted file mode 100644 index ac6927c40..000000000 --- a/cpp/core/src/bigint/ChangeLog +++ /dev/null @@ -1,146 +0,0 @@ - Change Log - -These entries tell you what was added, fixed, or improved in each version as -compared to the previous one. In case you haven't noticed, a version number -roughly corresponds to the release date of that version in `YYYY.MM.DD[.N]' -format, where `.N' goes `.2', `.3', etc. if there are multiple versions on the -same day. The topmost version listed is the one you have. - -2010.04.30 ----------- -- Strengthen the advice about build/IDE configuration in the README. - -2009.05.03 ----------- -- BigUnsigned::{get,set}Bit: Change two remaining `1 <<' to `Blk(1) <<' to work - on systems where sizeof(unsigned int) != sizeof(Blk). Bug reported by Brad - Spencer. -- dataToBigInteger: Change a `delete' to `delete []' to avoid leaking memory. - Bug reported by Nicolás Carrasco. - -2009.03.26 ----------- -- BigUnsignedInABase(std::string) Reject digits too big for the base. - Bug reported by Niakam Kazemi. - -2008.07.20 ----------- -Dennis Yew pointed out serious problems with ambiguities and unwanted -conversions when mixing BigInteger/BigUnsigned and primitive integers. To fix -these, I removed the implicit conversions from BigInteger/BigUnsigned to -primitive integers and from BigInteger to BigUnsigned. Removing the -BigInteger-to-BigUnsigned conversion required changing BigInteger to have a -BigUnsigned field instead of inheriting from it; this was a complex task but -ultimately gave a saner design. At the same time, I went through the entire -codebase, making the formatting and comments prettier and reworking anything I -thought was unclear. I also added a testsuite (currently for 32-bit systems -only); it doesn't yet cover the entire library but should help to ensure that -things work the way they should. - -A number of changes from version 2007.07.07 break compatibility with existing -code that uses the library, but updating that code should be pretty easy: -- BigInteger can no longer be implicitly converted to BigUnsigned. Use - getMagnitude() instead. -- BigUnsigned and BigInteger can no longer be implicitly converted to primitive - integers. Use the toInt() family of functions instead. -- The easy* functions have been renamed to more mature names: - bigUnsignedToString, bigIntegerToString, stringToBigUnsigned, - stringToBigInteger, dataToBigInteger. -- BigInteger no longer supports bitwise operations. Get the magnitude with - getMagnitude() and operate on that instead. -- The old {BigUnsigned,BigInteger}::{divide,modulo} copy-less options have been - removed. Use divideWithRemainder instead. -- Added a base argument to BigUnsignedInABase's digit-array constructor. I - ope no one used that constructor in its broken state anyway. - -Other notable changes: -- Added BigUnsigned functions setBlock, bitLength, getBit, setBit. -- The bit-shifting operations now support negative shift amounts, which shift in - the other direction. -- Added some big-integer algorithms in BigIntegerAlgorithms.hh: gcd, - extendedEuclidean, modinv, modexp. - -2007.07.07 ----------- -Update the "Running the sample program produces this output:" comment in -sample.cc for the bitwise operators. - -2007.06.14 ----------- -- Implement << and >> for BigUnsigned in response to email from Marco Schulze. -- Fix name: DOTR_ALIASED -> DTRT_ALIASED. -- Demonstrate all bitwise operators (&, |, ^, <<, >>) in sample.cc. - -2007.02.16 ----------- -Boris Dessy pointed out that the library threw an exception on "a *= a", so I changed all the put-here operations to handle aliased calls correctly using a temporary copy instead of throwing exceptions. - -2006.08.14 ----------- -In BigUnsigned::bitXor, change allocate(b2->len) to allocate(a2->len): we should allocate enough space for the longer number, not the shorter one! Thanks to Sriram Sankararaman for pointing this out. - -2006.05.03 ----------- -I ran the sample program using valgrind and discovered a `delete s' that should be `delete [] s' and a `len++' before an `allocateAndCopy(len)' that should have been after an `allocateAndCopy(len + 1)'. I fixed both. Yay for valgrind! - -2006.05.01 ----------- -I fixed incorrect results reported by Mohand Mezmaz and related memory corruption on platforms where Blk is bigger than int. I replaced (1 << x) with (Blk(1) << x) in two places in BigUnsigned.cc. - -2006.04.24 ----------- -Two bug fixes: BigUnsigned "++x" no longer segfaults when x grows in length, and BigUnsigned == and != are now redeclared so as to be usable. I redid the Makefile: I removed the *.tag mechanism and hard-coded the library's header dependencies, I added comments, and I made the Makefile more useful for building one's own programs instead of just the sample. - -2006.02.26 ----------- -A few tweaks in preparation for a group to distribute the library. The project Web site has moved; I updated the references. I fixed a typo and added a missing function in NumberlikeArray.hh. I'm using Eclipse now, so you get Eclipse project files. - -2005.03.30 ----------- -Sam Larkin found a bug in `BigInteger::subtract'; I fixed it. - -2005.01.18 ----------- -I fixed some problems with `easyDataToBI'. Due to some multiply declared variables, this function would not compile. However, it is a template function, so the compiler parses it and doesn't compile the parsed representation until something uses the function; this is how I missed the problems. I also removed debugging output from this function. - -2005.01.17 ----------- -A fix to some out-of-bounds accesses reported by Milan Tomic (see the comment under `BigUnsigned::divideWithRemainder'). `BigUnsigned::multiply' and `BigUnsigned::divideWithRemainder' implementations neatened up a bit with the help of a function `getShiftedBlock'. I (finally!) introduced a constant `BigUnsigned::N', the number of bits in a `BigUnsigned::Blk', which varies depending on machine word size. In both code and comments, it replaces the much clunkier `8*sizeof(Blk)'. Numerous other small changes. There's a new conversion routine `easyDataToBI' that will convert almost any format of binary data to a `BigInteger'. - -I have inserted a significant number of new comments. Most explain unobvious aspects of the code. - -2005.01.06 ----------- -Some changes to the way zero-length arrays are handled by `NumberlikeArray', which fixed a memory leak reported by Milan Tomic. - -2004.12.24.2 ------------- -I tied down a couple of loose ends involving division/modulo. I added an explanation of put-here vs. overloaded operators in the sample program; this has confused too many people. Miscellaneous other improvements. - -I believe that, at this point, the Big Integer Library makes no assumptions about the word size of the machine it is using. `BigUnsigned::Blk' is always an `unsigned long', whatever that may be, and its size is computed with `sizeof' when necessary. However, just in case, I would be interested to have someone test the library on a non-32-bit machine to see if it works. - -2004.12.24 ----------- -This is a _major_ upgrade to the library. Among the things that have changed: - -I wrote the original version of the library, particularly the four ``classical algorithms'' in `BigUnsigned.cc', using array indexing. Then I rewrote it to use pointers because I thought that would be faster. But recently, I revisited the code in `BigUnsigned.cc' and found that I could not begin to understand what it was doing. - -I have decided that the drawbacks of pointers, increased coding difficulty and reduced code readability, far outweigh their speed benefits. Plus, any modern optimizing compiler should produce fast code either way. Therefore, I rewrote the library to use array indexing again. (Thank goodness for regular-expression find-and-replace. It saved me a lot of time.) - -The put-here operations `divide' and `modulo' of each of `BigUnsigned' and `BigInteger' have been supplanted by a single operation `divideWithRemainder'. Read the profuse comments for more information on its exact behavior. - -There is a new class `BigUnsignedInABase' that is like `BigUnsigned' but uses a user-specified, small base instead of `256 ^ sizeof(unsigned long)'. Much of the code common to the two has been factored out into `NumberlikeArray'. - -`BigUnsignedInABase' facilitates conversion between `BigUnsigned's and digit-by-digit string representations using `std::string'. Convenience routines to do this conversion are in `BigIntegerUtils.hh'. `iostream' compatibility has been improved. - -I would like to thank Chris Morbitzer for the e-mail message that catalyzed this major upgrade. He wanted a way to convert a string to a BigInteger. One thing just led to another, roughly in reverse order from how they are listed here. - -2004.1216 ---------- -Brad Spencer pointed out a memory leak in `BigUnsigned::divide'. It is fixed in the December 16, 2004 version. - -2004.1205 ---------- -After months of inactivity, I fixed a bug in the `BigInteger' division routine; thanks to David Allen for reporting the bug. I also added simple routines for decimal output to `std::ostream's, and there is a demo that prints out powers of 3. - -~~~~ diff --git a/cpp/core/src/bigint/Makefile b/cpp/core/src/bigint/Makefile deleted file mode 100644 index 3018e98e6..000000000 --- a/cpp/core/src/bigint/Makefile +++ /dev/null @@ -1,73 +0,0 @@ -# Mention default target. -all: - -# Implicit rule to compile C++ files. Modify to your taste. -%.o: %.cc - g++ -c -O2 -Wall -Wextra -pedantic $< - -# Components of the library. -library-objects = \ - BigUnsigned.o \ - BigInteger.o \ - BigIntegerAlgorithms.o \ - BigUnsignedInABase.o \ - BigIntegerUtils.o \ - -library-headers = \ - NumberlikeArray.hh \ - BigUnsigned.hh \ - BigInteger.hh \ - BigIntegerAlgorithms.hh \ - BigUnsignedInABase.hh \ - BigIntegerLibrary.hh \ - -# To ``make the library'', make all its objects using the implicit rule. -library: $(library-objects) - -# Conservatively assume that all the objects depend on all the headers. -$(library-objects): $(library-headers) - -# TESTSUITE (NOTE: Currently expects a 32-bit system) -# Compiling the testsuite. -testsuite.o: $(library-headers) -testsuite: testsuite.o $(library-objects) - g++ $^ -o $@ -# Extract the expected output from the testsuite source. -testsuite.expected: testsuite.cc - nl -ba -p -s: $< | sed -nre 's,^ +([0-9]+):.*//([^ ]),Line \1: \2,p' >$@ -# Run the testsuite. -.PHONY: test -test: testsuite testsuite.expected - ./run-testsuite -testsuite-cleanfiles = \ - testsuite.o testsuite testsuite.expected \ - testsuite.out testsuite.err - -# The rules below build a program that uses the library. They are preset to -# build ``sample'' from ``sample.cc''. You can change the name(s) of the -# source file(s) and program file to build your own program, or you can write -# your own Makefile. - -# Components of the program. -program = sample -program-objects = sample.o - -# Conservatively assume all the program source files depend on all the library -# headers. You can change this if it is not the case. -$(program-objects) : $(library-headers) - -# How to link the program. The implicit rule covers individual objects. -$(program) : $(program-objects) $(library-objects) - g++ $^ -o $@ - -# Delete all generated files we know about. -clean : - rm -f $(library-objects) $(testsuite-cleanfiles) $(program-objects) $(program) - -# I removed the *.tag dependency tracking system because it had few advantages -# over manually entering all the dependencies. If there were a portable, -# reliable dependency tracking system, I'd use it, but I know of no such; -# cons and depcomp are almost good enough. - -# Come back and define default target. -all : library $(program) diff --git a/cpp/core/src/bigint/NumberlikeArray.hh b/cpp/core/src/bigint/NumberlikeArray.hh deleted file mode 100644 index 53c8e5be8..000000000 --- a/cpp/core/src/bigint/NumberlikeArray.hh +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef NUMBERLIKEARRAY_H -#define NUMBERLIKEARRAY_H - -// Make sure we have NULL. -#ifndef NULL -#define NULL 0 -#endif - -/* A NumberlikeArray object holds a heap-allocated array of Blk with a - * length and a capacity and provides basic memory management features. - * BigUnsigned and BigUnsignedInABase both subclass it. - * - * NumberlikeArray provides no information hiding. Subclasses should use - * nonpublic inheritance and manually expose members as desired using - * declarations like this: - * - * public: - * NumberlikeArray< the-type-argument >::getLength; - */ -template -class NumberlikeArray { -public: - - // Type for the index of a block in the array - typedef unsigned int Index; - // The number of bits in a block, defined below. - static const unsigned int N; - - // The current allocated capacity of this NumberlikeArray (in blocks) - Index cap; - // The actual length of the value stored in this NumberlikeArray (in blocks) - Index len; - // Heap-allocated array of the blocks (can be NULL if len == 0) - Blk *blk; - - // Constructs a ``zero'' NumberlikeArray with the given capacity. - NumberlikeArray(Index c) : cap(c), len(0) { - blk = (cap > 0) ? (new Blk[cap]) : NULL; - } - - /* Constructs a zero NumberlikeArray without allocating a backing array. - * A subclass that doesn't know the needed capacity at initialization - * time can use this constructor and then overwrite blk without first - * deleting it. */ - NumberlikeArray() : cap(0), len(0) { - blk = NULL; - } - - // Destructor. Note that `delete NULL' is a no-op. - ~NumberlikeArray() { - delete [] blk; - } - - /* Ensures that the array has at least the requested capacity; may - * destroy the contents. */ - void allocate(Index c); - - /* Ensures that the array has at least the requested capacity; does not - * destroy the contents. */ - void allocateAndCopy(Index c); - - // Copy constructor - NumberlikeArray(const NumberlikeArray &x); - - // Assignment operator - void operator=(const NumberlikeArray &x); - - // Constructor that copies from a given array of blocks - NumberlikeArray(const Blk *b, Index blen); - - // ACCESSORS - Index getCapacity() const { return cap; } - Index getLength() const { return len; } - Blk getBlock(Index i) const { return blk[i]; } - bool isEmpty() const { return len == 0; } - - /* Equality comparison: checks if both objects have the same length and - * equal (==) array elements to that length. Subclasses may wish to - * override. */ - bool operator ==(const NumberlikeArray &x) const; - - bool operator !=(const NumberlikeArray &x) const { - return !operator ==(x); - } -}; - -/* BEGIN TEMPLATE DEFINITIONS. They are present here so that source files that - * include this header file can generate the necessary real definitions. */ - -template -const unsigned int NumberlikeArray::N = 8 * sizeof(Blk); - -template -void NumberlikeArray::allocate(Index c) { - // If the requested capacity is more than the current capacity... - if (c > cap) { - // Delete the old number array - delete [] blk; - // Allocate the new array - cap = c; - blk = new Blk[cap]; - } -} - -template -void NumberlikeArray::allocateAndCopy(Index c) { - // If the requested capacity is more than the current capacity... - if (c > cap) { - Blk *oldBlk = blk; - // Allocate the new number array - cap = c; - blk = new Blk[cap]; - // Copy number blocks - Index i; - for (i = 0; i < len; i++) - blk[i] = oldBlk[i]; - // Delete the old array - delete [] oldBlk; - } -} - -template -NumberlikeArray::NumberlikeArray(const NumberlikeArray &x) - : len(x.len) { - // Create array - cap = len; - blk = new Blk[cap]; - // Copy blocks - Index i; - for (i = 0; i < len; i++) - blk[i] = x.blk[i]; -} - -template -void NumberlikeArray::operator=(const NumberlikeArray &x) { - /* Calls like a = a have no effect; catch them before the aliasing - * causes a problem */ - if (this == &x) - return; - // Copy length - len = x.len; - // Expand array if necessary - allocate(len); - // Copy number blocks - Index i; - for (i = 0; i < len; i++) - blk[i] = x.blk[i]; -} - -template -NumberlikeArray::NumberlikeArray(const Blk *b, Index blen) - : cap(blen), len(blen) { - // Create array - blk = new Blk[cap]; - // Copy blocks - Index i; - for (i = 0; i < len; i++) - blk[i] = b[i]; -} - -template -bool NumberlikeArray::operator ==(const NumberlikeArray &x) const { - if (len != x.len) - // Definitely unequal. - return false; - else { - // Compare corresponding blocks one by one. - Index i; - for (i = 0; i < len; i++) - if (blk[i] != x.blk[i]) - return false; - // No blocks differed, so the objects are equal. - return true; - } -} - -#endif diff --git a/cpp/core/src/bigint/README b/cpp/core/src/bigint/README deleted file mode 100644 index ae9d3dac5..000000000 --- a/cpp/core/src/bigint/README +++ /dev/null @@ -1,71 +0,0 @@ - - C++ Big Integer Library - (see ChangeLog for version) - - http://mattmccutchen.net/bigint/ - - Written and maintained by Matt McCutchen - -You can use this library in a C++ program to do arithmetic on integers of size -limited only by your computer's memory. The library provides BigUnsigned and -BigInteger classes that represent nonnegative integers and signed integers, -respectively. Most of the C++ arithmetic operators are overloaded for these -classes, so big-integer calculations are as easy as: - - #include "BigIntegerLibrary.hh" - - BigInteger a = 65536; - cout << (a * a * a * a * a * a * a * a); - - (prints 340282366920938463463374607431768211456) - -The code in `sample.cc' demonstrates the most important features of the library. -To get started quickly, read the code and explanations in that file and run it. -If you want more detail or a feature not shown in `sample.cc', consult the -consult the actual header and source files, which are thoroughly commented. - -This library emphasizes ease of use and clarity of implementation over speed; -some users will prefer GMP (http://swox.com/gmp/), which is faster. The code is -intended to be reasonably portable across computers and modern C++ compilers; in -particular, it uses whatever word size the computer provides (32-bit, 64-bit, or -otherwise). - -Compiling programs that use the library ---------------------------------------- -The library consists of a folder full of C++ header files (`.hh') and source -files (`.cc'). Your own programs should `#include' the necessary header files -and link with the source files. A makefile that builds the sample program -(`sample.cc') is included; you can adapt it to replace the sample with your own -program. - -Alternatively, you can use your own build system or IDE. In that case, you must -put the library header files where the compiler will find them and arrange to -have your program linked with the library source files; otherwise, you will get -errors about missing header files or "undefined references". To learn how to do -this, consult the documentation for the build system or IDE; don't bother asking -me. Adding all the library files to your project will work in many IDEs but may -not be the most desirable approach. - -Resources ---------- -The library's Web site (above) provides links to released versions, the current -development version, and a mailing list for release announcements, questions, -bug reports, and other discussion of the library. I would be delighted to hear -from you if you like this library and/or find a good use for it. - -Bugs and enhancements ---------------------- -The library has been tested by me and others but is by no means bug-free. If -you find a bug, please report it, whether it comes in the form of compiling -trouble, a mathematically inaccurate result, or a memory-management blooper -(since I use Java, these are altogether too common in my C++). I generally fix -all reported bugs. You are also welcome to request enhancements, but I am -unlikely to do substantial amounts of work on enhancements at this point. - -Legal ------ -I, Matt McCutchen, the sole author of the original Big Integer Library, waive my -copyright to it, placing it in the public domain. The library comes with -absolutely no warranty. - -~~~~ diff --git a/cpp/core/src/win32/zxing/iconv.h b/cpp/core/src/win32/zxing/iconv.h deleted file mode 100644 index d354f53bd..000000000 --- a/cpp/core/src/win32/zxing/iconv.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _LIBICONV_H -#define _LIBICONV_H -#include -#ifdef __cplusplus -extern "C" { -#endif -typedef void* iconv_t; -iconv_t iconv_open(const char *tocode, const char *fromcode); -int iconv_close(iconv_t cd); -size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); -#ifdef __cplusplus -} -#endif -#endif//_LIBICONV_H \ No newline at end of file diff --git a/cpp/core/src/win32/zxing/stdint.h b/cpp/core/src/win32/zxing/stdint.h deleted file mode 100644 index d02608a59..000000000 --- a/cpp/core/src/win32/zxing/stdint.h +++ /dev/null @@ -1,247 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/cpp/core/src/win32/zxing/win_iconv.c b/cpp/core/src/win32/zxing/win_iconv.c deleted file mode 100644 index 17f6773a2..000000000 --- a/cpp/core/src/win32/zxing/win_iconv.c +++ /dev/null @@ -1,2035 +0,0 @@ -/* - * iconv implementation using Win32 API to convert. - * - * This file is placed in the public domain. - */ - -/* for WC_NO_BEST_FIT_CHARS */ -#ifndef WINVER -# define WINVER 0x0500 -#endif - -#define STRICT -#include -#include -#include -#include - -/* WORKAROUND: */ -#ifndef UNDER_CE -#define GetProcAddressA GetProcAddress -#endif - -#if 0 -# define MAKE_EXE -# define MAKE_DLL -# define USE_LIBICONV_DLL -#endif - -#if !defined(DEFAULT_LIBICONV_DLL) -# define DEFAULT_LIBICONV_DLL "" -#endif - -#define MB_CHAR_MAX 16 - -#define UNICODE_MODE_BOM_DONE 1 -#define UNICODE_MODE_SWAPPED 2 - -#define FLAG_USE_BOM 1 -#define FLAG_TRANSLIT 2 /* //TRANSLIT */ -#define FLAG_IGNORE 4 /* //IGNORE */ - -typedef unsigned char uchar; -typedef unsigned short ushort; -typedef unsigned int uint; - -typedef void* iconv_t; - -iconv_t iconv_open(const char *tocode, const char *fromcode); -int iconv_close(iconv_t cd); -size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); - -/* libiconv interface for vim */ -#if defined(MAKE_DLL) -int -iconvctl (iconv_t cd, int request, void* argument) -{ - /* not supported */ - return 0; -} -#endif - -typedef struct compat_t compat_t; -typedef struct csconv_t csconv_t; -typedef struct rec_iconv_t rec_iconv_t; - -typedef iconv_t (*f_iconv_open)(const char *tocode, const char *fromcode); -typedef int (*f_iconv_close)(iconv_t cd); -typedef size_t (*f_iconv)(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); -typedef int* (*f_errno)(void); -typedef int (*f_mbtowc)(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); -typedef int (*f_wctomb)(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); -typedef int (*f_mblen)(csconv_t *cv, const uchar *buf, int bufsize); -typedef int (*f_flush)(csconv_t *cv, uchar *buf, int bufsize); - -#define COMPAT_IN 1 -#define COMPAT_OUT 2 - -/* unicode mapping for compatibility with other conversion table. */ -struct compat_t { - uint in; - uint out; - uint flag; -}; - -struct csconv_t { - int codepage; - int flags; - f_mbtowc mbtowc; - f_wctomb wctomb; - f_mblen mblen; - f_flush flush; - DWORD mode; - compat_t *compat; -}; - -struct rec_iconv_t { - iconv_t cd; - f_iconv_close iconv_close; - f_iconv iconv; - f_errno _errno; - csconv_t from; - csconv_t to; -#if defined(USE_LIBICONV_DLL) - HMODULE hlibiconv; -#endif -}; - -static int win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode); -static int win_iconv_close(iconv_t cd); -static size_t win_iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); - -static int load_mlang(); -static int make_csconv(const char *name, csconv_t *cv); -static int name_to_codepage(const char *name); -static uint utf16_to_ucs4(const ushort *wbuf); -static void ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize); -static int mbtowc_flags(int codepage); -static int must_use_null_useddefaultchar(int codepage); -static char *strrstr(const char *str, const char *token); -static char *xstrndup(const char *s, size_t n); -static int seterror(int err); - -#if defined(USE_LIBICONV_DLL) -static int libiconv_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode); -static PVOID MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size); -static HMODULE find_imported_module_by_funcname(HMODULE hModule, const char *funcname); - -static HMODULE hwiniconv; -#endif - -static int sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); -static int dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); -static int mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); -static int utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize); -static int eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize); - -static int kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); -static int kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); -static int mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); -static int mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); -static int utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); -static int utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); -static int utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); -static int utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); -static int iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); -static int iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); -static int iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize); - -static struct { - int codepage; - const char *name; -} codepage_alias[] = { - {65001, "CP65001"}, - {65001, "UTF8"}, - {65001, "UTF-8"}, - - {1200, "CP1200"}, - {1200, "UTF16LE"}, - {1200, "UTF-16LE"}, - {1200, "UCS2LE"}, - {1200, "UCS-2LE"}, - - {1201, "CP1201"}, - {1201, "UTF16BE"}, - {1201, "UTF-16BE"}, - {1201, "UCS2BE"}, - {1201, "UCS-2BE"}, - {1201, "unicodeFFFE"}, - - {12000, "CP12000"}, - {12000, "UTF32LE"}, - {12000, "UTF-32LE"}, - {12000, "UCS4LE"}, - {12000, "UCS-4LE"}, - - {12001, "CP12001"}, - {12001, "UTF32BE"}, - {12001, "UTF-32BE"}, - {12001, "UCS4BE"}, - {12001, "UCS-4BE"}, - -#ifndef GLIB_COMPILATION - /* - * Default is big endian. - * See rfc2781 4.3 Interpreting text labelled as UTF-16. - */ - {1201, "UTF16"}, - {1201, "UTF-16"}, - {1201, "UCS2"}, - {1201, "UCS-2"}, - {12001, "UTF32"}, - {12001, "UTF-32"}, - {12001, "UCS-4"}, - {12001, "UCS4"}, -#else - /* Default is little endian, because the platform is */ - {1200, "UTF16"}, - {1200, "UTF-16"}, - {1200, "UCS2"}, - {1200, "UCS-2"}, - {12000, "UTF32"}, - {12000, "UTF-32"}, - {12000, "UCS4"}, - {12000, "UCS-4"}, -#endif - - /* copy from libiconv `iconv -l` */ - /* !IsValidCodePage(367) */ - {20127, "ANSI_X3.4-1968"}, - {20127, "ANSI_X3.4-1986"}, - {20127, "ASCII"}, - {20127, "CP367"}, - {20127, "IBM367"}, - {20127, "ISO-IR-6"}, - {20127, "ISO646-US"}, - {20127, "ISO_646.IRV:1991"}, - {20127, "US"}, - {20127, "US-ASCII"}, - {20127, "CSASCII"}, - - /* !IsValidCodePage(819) */ - {1252, "CP819"}, - {1252, "IBM819"}, - {28591, "ISO-8859-1"}, - {28591, "ISO-IR-100"}, - {28591, "ISO8859-1"}, - {28591, "ISO_8859-1"}, - {28591, "ISO_8859-1:1987"}, - {28591, "L1"}, - {28591, "LATIN1"}, - {28591, "CSISOLATIN1"}, - - {1250, "CP1250"}, - {1250, "MS-EE"}, - {1250, "WINDOWS-1250"}, - - {1251, "CP1251"}, - {1251, "MS-CYRL"}, - {1251, "WINDOWS-1251"}, - - {1252, "CP1252"}, - {1252, "MS-ANSI"}, - {1252, "WINDOWS-1252"}, - - {1253, "CP1253"}, - {1253, "MS-GREEK"}, - {1253, "WINDOWS-1253"}, - - {1254, "CP1254"}, - {1254, "MS-TURK"}, - {1254, "WINDOWS-1254"}, - - {1255, "CP1255"}, - {1255, "MS-HEBR"}, - {1255, "WINDOWS-1255"}, - - {1256, "CP1256"}, - {1256, "MS-ARAB"}, - {1256, "WINDOWS-1256"}, - - {1257, "CP1257"}, - {1257, "WINBALTRIM"}, - {1257, "WINDOWS-1257"}, - - {1258, "CP1258"}, - {1258, "WINDOWS-1258"}, - - {850, "850"}, - {850, "CP850"}, - {850, "IBM850"}, - {850, "CSPC850MULTILINGUAL"}, - - /* !IsValidCodePage(862) */ - {862, "862"}, - {862, "CP862"}, - {862, "IBM862"}, - {862, "CSPC862LATINHEBREW"}, - - {866, "866"}, - {866, "CP866"}, - {866, "IBM866"}, - {866, "CSIBM866"}, - - /* !IsValidCodePage(154) */ - {154, "CP154"}, - {154, "CYRILLIC-ASIAN"}, - {154, "PT154"}, - {154, "PTCP154"}, - {154, "CSPTCP154"}, - - /* !IsValidCodePage(1133) */ - {1133, "CP1133"}, - {1133, "IBM-CP1133"}, - - {874, "CP874"}, - {874, "WINDOWS-874"}, - - /* !IsValidCodePage(51932) */ - {51932, "CP51932"}, - {51932, "MS51932"}, - {51932, "WINDOWS-51932"}, - {51932, "EUC-JP"}, - - {932, "CP932"}, - {932, "MS932"}, - {932, "SHIFFT_JIS"}, - {932, "SHIFFT_JIS-MS"}, - {932, "SJIS"}, - {932, "SJIS-MS"}, - {932, "SJIS-OPEN"}, - {932, "SJIS-WIN"}, - {932, "WINDOWS-31J"}, - {932, "WINDOWS-932"}, - {932, "CSWINDOWS31J"}, - - {50221, "CP50221"}, - {50221, "ISO-2022-JP"}, - {50221, "ISO-2022-JP-MS"}, - {50221, "ISO2022-JP"}, - {50221, "ISO2022-JP-MS"}, - {50221, "MS50221"}, - {50221, "WINDOWS-50221"}, - - {936, "CP936"}, - {936, "GBK"}, - {936, "MS936"}, - {936, "WINDOWS-936"}, - - {950, "CP950"}, - {950, "BIG5"}, - {950, "BIG5HKSCS"}, - {950, "BIG5-HKSCS"}, - - {949, "CP949"}, - {949, "UHC"}, - {949, "EUC-KR"}, - - {1361, "CP1361"}, - {1361, "JOHAB"}, - - {437, "437"}, - {437, "CP437"}, - {437, "IBM437"}, - {437, "CSPC8CODEPAGE437"}, - - {737, "CP737"}, - - {775, "CP775"}, - {775, "IBM775"}, - {775, "CSPC775BALTIC"}, - - {852, "852"}, - {852, "CP852"}, - {852, "IBM852"}, - {852, "CSPCP852"}, - - /* !IsValidCodePage(853) */ - {853, "CP853"}, - - {855, "855"}, - {855, "CP855"}, - {855, "IBM855"}, - {855, "CSIBM855"}, - - {857, "857"}, - {857, "CP857"}, - {857, "IBM857"}, - {857, "CSIBM857"}, - - /* !IsValidCodePage(858) */ - {858, "CP858"}, - - {860, "860"}, - {860, "CP860"}, - {860, "IBM860"}, - {860, "CSIBM860"}, - - {861, "861"}, - {861, "CP-IS"}, - {861, "CP861"}, - {861, "IBM861"}, - {861, "CSIBM861"}, - - {863, "863"}, - {863, "CP863"}, - {863, "IBM863"}, - {863, "CSIBM863"}, - - {864, "CP864"}, - {864, "IBM864"}, - {864, "CSIBM864"}, - - {865, "865"}, - {865, "CP865"}, - {865, "IBM865"}, - {865, "CSIBM865"}, - - {869, "869"}, - {869, "CP-GR"}, - {869, "CP869"}, - {869, "IBM869"}, - {869, "CSIBM869"}, - - /* !IsValidCodePage(1152) */ - {1125, "CP1125"}, - - /* - * Code Page Identifiers - * http://msdn2.microsoft.com/en-us/library/ms776446.aspx - */ - {37, "IBM037"}, /* IBM EBCDIC US-Canada */ - {437, "IBM437"}, /* OEM United States */ - {500, "IBM500"}, /* IBM EBCDIC International */ - {708, "ASMO-708"}, /* Arabic (ASMO 708) */ - /* 709 Arabic (ASMO-449+, BCON V4) */ - /* 710 Arabic - Transparent Arabic */ - {720, "DOS-720"}, /* Arabic (Transparent ASMO); Arabic (DOS) */ - {737, "ibm737"}, /* OEM Greek (formerly 437G); Greek (DOS) */ - {775, "ibm775"}, /* OEM Baltic; Baltic (DOS) */ - {850, "ibm850"}, /* OEM Multilingual Latin 1; Western European (DOS) */ - {852, "ibm852"}, /* OEM Latin 2; Central European (DOS) */ - {855, "IBM855"}, /* OEM Cyrillic (primarily Russian) */ - {857, "ibm857"}, /* OEM Turkish; Turkish (DOS) */ - {858, "IBM00858"}, /* OEM Multilingual Latin 1 + Euro symbol */ - {860, "IBM860"}, /* OEM Portuguese; Portuguese (DOS) */ - {861, "ibm861"}, /* OEM Icelandic; Icelandic (DOS) */ - {862, "DOS-862"}, /* OEM Hebrew; Hebrew (DOS) */ - {863, "IBM863"}, /* OEM French Canadian; French Canadian (DOS) */ - {864, "IBM864"}, /* OEM Arabic; Arabic (864) */ - {865, "IBM865"}, /* OEM Nordic; Nordic (DOS) */ - {866, "cp866"}, /* OEM Russian; Cyrillic (DOS) */ - {869, "ibm869"}, /* OEM Modern Greek; Greek, Modern (DOS) */ - {870, "IBM870"}, /* IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2 */ - {874, "windows-874"}, /* ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows) */ - {875, "cp875"}, /* IBM EBCDIC Greek Modern */ - {932, "shift_jis"}, /* ANSI/OEM Japanese; Japanese (Shift-JIS) */ - {932, "shift-jis"}, /* alternative name for it */ - {936, "gb2312"}, /* ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312) */ - {949, "ks_c_5601-1987"}, /* ANSI/OEM Korean (Unified Hangul Code) */ - {950, "big5"}, /* ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5) */ - {950, "big5hkscs"}, /* ANSI/OEM Traditional Chinese (Hong Kong SAR); Chinese Traditional (Big5-HKSCS) */ - {950, "big5-hkscs"}, /* alternative name for it */ - {1026, "IBM1026"}, /* IBM EBCDIC Turkish (Latin 5) */ - {1047, "IBM01047"}, /* IBM EBCDIC Latin 1/Open System */ - {1140, "IBM01140"}, /* IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro) */ - {1141, "IBM01141"}, /* IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro) */ - {1142, "IBM01142"}, /* IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro) */ - {1143, "IBM01143"}, /* IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro) */ - {1144, "IBM01144"}, /* IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro) */ - {1145, "IBM01145"}, /* IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro) */ - {1146, "IBM01146"}, /* IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro) */ - {1147, "IBM01147"}, /* IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro) */ - {1148, "IBM01148"}, /* IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro) */ - {1149, "IBM01149"}, /* IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro) */ - {1250, "windows-1250"}, /* ANSI Central European; Central European (Windows) */ - {1251, "windows-1251"}, /* ANSI Cyrillic; Cyrillic (Windows) */ - {1252, "windows-1252"}, /* ANSI Latin 1; Western European (Windows) */ - {1253, "windows-1253"}, /* ANSI Greek; Greek (Windows) */ - {1254, "windows-1254"}, /* ANSI Turkish; Turkish (Windows) */ - {1255, "windows-1255"}, /* ANSI Hebrew; Hebrew (Windows) */ - {1256, "windows-1256"}, /* ANSI Arabic; Arabic (Windows) */ - {1257, "windows-1257"}, /* ANSI Baltic; Baltic (Windows) */ - {1258, "windows-1258"}, /* ANSI/OEM Vietnamese; Vietnamese (Windows) */ - {1361, "Johab"}, /* Korean (Johab) */ - {10000, "macintosh"}, /* MAC Roman; Western European (Mac) */ - {10001, "x-mac-japanese"}, /* Japanese (Mac) */ - {10002, "x-mac-chinesetrad"}, /* MAC Traditional Chinese (Big5); Chinese Traditional (Mac) */ - {10003, "x-mac-korean"}, /* Korean (Mac) */ - {10004, "x-mac-arabic"}, /* Arabic (Mac) */ - {10005, "x-mac-hebrew"}, /* Hebrew (Mac) */ - {10006, "x-mac-greek"}, /* Greek (Mac) */ - {10007, "x-mac-cyrillic"}, /* Cyrillic (Mac) */ - {10008, "x-mac-chinesesimp"}, /* MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac) */ - {10010, "x-mac-romanian"}, /* Romanian (Mac) */ - {10017, "x-mac-ukrainian"}, /* Ukrainian (Mac) */ - {10021, "x-mac-thai"}, /* Thai (Mac) */ - {10029, "x-mac-ce"}, /* MAC Latin 2; Central European (Mac) */ - {10079, "x-mac-icelandic"}, /* Icelandic (Mac) */ - {10081, "x-mac-turkish"}, /* Turkish (Mac) */ - {10082, "x-mac-croatian"}, /* Croatian (Mac) */ - {20000, "x-Chinese_CNS"}, /* CNS Taiwan; Chinese Traditional (CNS) */ - {20001, "x-cp20001"}, /* TCA Taiwan */ - {20002, "x_Chinese-Eten"}, /* Eten Taiwan; Chinese Traditional (Eten) */ - {20003, "x-cp20003"}, /* IBM5550 Taiwan */ - {20004, "x-cp20004"}, /* TeleText Taiwan */ - {20005, "x-cp20005"}, /* Wang Taiwan */ - {20105, "x-IA5"}, /* IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5) */ - {20106, "x-IA5-German"}, /* IA5 German (7-bit) */ - {20107, "x-IA5-Swedish"}, /* IA5 Swedish (7-bit) */ - {20108, "x-IA5-Norwegian"}, /* IA5 Norwegian (7-bit) */ - {20127, "us-ascii"}, /* US-ASCII (7-bit) */ - {20261, "x-cp20261"}, /* T.61 */ - {20269, "x-cp20269"}, /* ISO 6937 Non-Spacing Accent */ - {20273, "IBM273"}, /* IBM EBCDIC Germany */ - {20277, "IBM277"}, /* IBM EBCDIC Denmark-Norway */ - {20278, "IBM278"}, /* IBM EBCDIC Finland-Sweden */ - {20280, "IBM280"}, /* IBM EBCDIC Italy */ - {20284, "IBM284"}, /* IBM EBCDIC Latin America-Spain */ - {20285, "IBM285"}, /* IBM EBCDIC United Kingdom */ - {20290, "IBM290"}, /* IBM EBCDIC Japanese Katakana Extended */ - {20297, "IBM297"}, /* IBM EBCDIC France */ - {20420, "IBM420"}, /* IBM EBCDIC Arabic */ - {20423, "IBM423"}, /* IBM EBCDIC Greek */ - {20424, "IBM424"}, /* IBM EBCDIC Hebrew */ - {20833, "x-EBCDIC-KoreanExtended"}, /* IBM EBCDIC Korean Extended */ - {20838, "IBM-Thai"}, /* IBM EBCDIC Thai */ - {20866, "koi8-r"}, /* Russian (KOI8-R); Cyrillic (KOI8-R) */ - {20871, "IBM871"}, /* IBM EBCDIC Icelandic */ - {20880, "IBM880"}, /* IBM EBCDIC Cyrillic Russian */ - {20905, "IBM905"}, /* IBM EBCDIC Turkish */ - {20924, "IBM00924"}, /* IBM EBCDIC Latin 1/Open System (1047 + Euro symbol) */ - {20932, "EUC-JP"}, /* Japanese (JIS 0208-1990 and 0121-1990) */ - {20936, "x-cp20936"}, /* Simplified Chinese (GB2312); Chinese Simplified (GB2312-80) */ - {20949, "x-cp20949"}, /* Korean Wansung */ - {21025, "cp1025"}, /* IBM EBCDIC Cyrillic Serbian-Bulgarian */ - /* 21027 (deprecated) */ - {21866, "koi8-u"}, /* Ukrainian (KOI8-U); Cyrillic (KOI8-U) */ - {28591, "iso-8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */ - {28591, "iso8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */ - {28592, "iso-8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */ - {28592, "iso8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */ - {28593, "iso-8859-3"}, /* ISO 8859-3 Latin 3 */ - {28593, "iso8859-3"}, /* ISO 8859-3 Latin 3 */ - {28594, "iso-8859-4"}, /* ISO 8859-4 Baltic */ - {28594, "iso8859-4"}, /* ISO 8859-4 Baltic */ - {28595, "iso-8859-5"}, /* ISO 8859-5 Cyrillic */ - {28595, "iso8859-5"}, /* ISO 8859-5 Cyrillic */ - {28596, "iso-8859-6"}, /* ISO 8859-6 Arabic */ - {28596, "iso8859-6"}, /* ISO 8859-6 Arabic */ - {28597, "iso-8859-7"}, /* ISO 8859-7 Greek */ - {28597, "iso8859-7"}, /* ISO 8859-7 Greek */ - {28598, "iso-8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */ - {28598, "iso8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */ - {28599, "iso-8859-9"}, /* ISO 8859-9 Turkish */ - {28599, "iso8859-9"}, /* ISO 8859-9 Turkish */ - {28603, "iso-8859-13"}, /* ISO 8859-13 Estonian */ - {28603, "iso8859-13"}, /* ISO 8859-13 Estonian */ - {28605, "iso-8859-15"}, /* ISO 8859-15 Latin 9 */ - {28605, "iso8859-15"}, /* ISO 8859-15 Latin 9 */ - {29001, "x-Europa"}, /* Europa 3 */ - {38598, "iso-8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */ - {38598, "iso8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */ - {50220, "iso-2022-jp"}, /* ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) */ - {50221, "csISO2022JP"}, /* ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana) */ - {50222, "iso-2022-jp"}, /* ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI) */ - {50225, "iso-2022-kr"}, /* ISO 2022 Korean */ - {50225, "iso2022-kr"}, /* ISO 2022 Korean */ - {50227, "x-cp50227"}, /* ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022) */ - /* 50229 ISO 2022 Traditional Chinese */ - /* 50930 EBCDIC Japanese (Katakana) Extended */ - /* 50931 EBCDIC US-Canada and Japanese */ - /* 50933 EBCDIC Korean Extended and Korean */ - /* 50935 EBCDIC Simplified Chinese Extended and Simplified Chinese */ - /* 50936 EBCDIC Simplified Chinese */ - /* 50937 EBCDIC US-Canada and Traditional Chinese */ - /* 50939 EBCDIC Japanese (Latin) Extended and Japanese */ - {51932, "euc-jp"}, /* EUC Japanese */ - {51936, "EUC-CN"}, /* EUC Simplified Chinese; Chinese Simplified (EUC) */ - {51949, "euc-kr"}, /* EUC Korean */ - /* 51950 EUC Traditional Chinese */ - {52936, "hz-gb-2312"}, /* HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ) */ - {54936, "GB18030"}, /* Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030) */ - {57002, "x-iscii-de"}, /* ISCII Devanagari */ - {57003, "x-iscii-be"}, /* ISCII Bengali */ - {57004, "x-iscii-ta"}, /* ISCII Tamil */ - {57005, "x-iscii-te"}, /* ISCII Telugu */ - {57006, "x-iscii-as"}, /* ISCII Assamese */ - {57007, "x-iscii-or"}, /* ISCII Oriya */ - {57008, "x-iscii-ka"}, /* ISCII Kannada */ - {57009, "x-iscii-ma"}, /* ISCII Malayalam */ - {57010, "x-iscii-gu"}, /* ISCII Gujarati */ - {57011, "x-iscii-pa"}, /* ISCII Punjabi */ - - {0, NULL} -}; - -/* - * SJIS SHIFTJIS table CP932 table - * ---- --------------------------- -------------------------------- - * 5C U+00A5 YEN SIGN U+005C REVERSE SOLIDUS - * 7E U+203E OVERLINE U+007E TILDE - * 815C U+2014 EM DASH U+2015 HORIZONTAL BAR - * 815F U+005C REVERSE SOLIDUS U+FF3C FULLWIDTH REVERSE SOLIDUS - * 8160 U+301C WAVE DASH U+FF5E FULLWIDTH TILDE - * 8161 U+2016 DOUBLE VERTICAL LINE U+2225 PARALLEL TO - * 817C U+2212 MINUS SIGN U+FF0D FULLWIDTH HYPHEN-MINUS - * 8191 U+00A2 CENT SIGN U+FFE0 FULLWIDTH CENT SIGN - * 8192 U+00A3 POUND SIGN U+FFE1 FULLWIDTH POUND SIGN - * 81CA U+00AC NOT SIGN U+FFE2 FULLWIDTH NOT SIGN - * - * EUC-JP and ISO-2022-JP should be compatible with CP932. - * - * Kernel and MLang have different Unicode mapping table. Make sure - * which API is used. - */ -static compat_t cp932_compat[] = { - {0x00A5, 0x005C, COMPAT_OUT}, - {0x203E, 0x007E, COMPAT_OUT}, - {0x2014, 0x2015, COMPAT_OUT}, - {0x301C, 0xFF5E, COMPAT_OUT}, - {0x2016, 0x2225, COMPAT_OUT}, - {0x2212, 0xFF0D, COMPAT_OUT}, - {0x00A2, 0xFFE0, COMPAT_OUT}, - {0x00A3, 0xFFE1, COMPAT_OUT}, - {0x00AC, 0xFFE2, COMPAT_OUT}, - {0, 0, 0} -}; - -static compat_t cp20932_compat[] = { - {0x00A5, 0x005C, COMPAT_OUT}, - {0x203E, 0x007E, COMPAT_OUT}, - {0x2014, 0x2015, COMPAT_OUT}, - {0xFF5E, 0x301C, COMPAT_OUT|COMPAT_IN}, - {0x2225, 0x2016, COMPAT_OUT|COMPAT_IN}, - {0xFF0D, 0x2212, COMPAT_OUT|COMPAT_IN}, - {0xFFE0, 0x00A2, COMPAT_OUT|COMPAT_IN}, - {0xFFE1, 0x00A3, COMPAT_OUT|COMPAT_IN}, - {0xFFE2, 0x00AC, COMPAT_OUT|COMPAT_IN}, - {0, 0, 0} -}; - -static compat_t *cp51932_compat = cp932_compat; - -/* cp20932_compat for kernel. cp932_compat for mlang. */ -static compat_t *cp5022x_compat = cp932_compat; - -typedef HRESULT (WINAPI *CONVERTINETSTRING)( - LPDWORD lpdwMode, - DWORD dwSrcEncoding, - DWORD dwDstEncoding, - LPCSTR lpSrcStr, - LPINT lpnSrcSize, - LPBYTE lpDstStr, - LPINT lpnDstSize -); -typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)( - LPDWORD lpdwMode, - DWORD dwSrcEncoding, - LPCSTR lpSrcStr, - LPINT lpnMultiCharCount, - LPWSTR lpDstStr, - LPINT lpnWideCharCount -); -typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)( - LPDWORD lpdwMode, - DWORD dwEncoding, - LPCWSTR lpSrcStr, - LPINT lpnWideCharCount, - LPSTR lpDstStr, - LPINT lpnMultiCharCount -); -typedef HRESULT (WINAPI *ISCONVERTINETSTRINGAVAILABLE)( - DWORD dwSrcEncoding, - DWORD dwDstEncoding -); -typedef HRESULT (WINAPI *LCIDTORFC1766A)( - LCID Locale, - LPSTR pszRfc1766, - int nChar -); -typedef HRESULT (WINAPI *LCIDTORFC1766W)( - LCID Locale, - LPWSTR pszRfc1766, - int nChar -); -typedef HRESULT (WINAPI *RFC1766TOLCIDA)( - LCID *pLocale, - LPSTR pszRfc1766 -); -typedef HRESULT (WINAPI *RFC1766TOLCIDW)( - LCID *pLocale, - LPWSTR pszRfc1766 -); -static CONVERTINETSTRING ConvertINetString; -static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode; -static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte; -static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable; -static LCIDTORFC1766A LcidToRfc1766A; -static RFC1766TOLCIDA Rfc1766ToLcidA; - -static int -load_mlang() -{ - HMODULE h; - if (ConvertINetString != NULL) - return TRUE; - h = LoadLibrary(TEXT("mlang.dll")); - if (!h) - return FALSE; - ConvertINetString = (CONVERTINETSTRING)GetProcAddressA(h, "ConvertINetString"); - ConvertINetMultiByteToUnicode = (CONVERTINETMULTIBYTETOUNICODE)GetProcAddressA(h, "ConvertINetMultiByteToUnicode"); - ConvertINetUnicodeToMultiByte = (CONVERTINETUNICODETOMULTIBYTE)GetProcAddressA(h, "ConvertINetUnicodeToMultiByte"); - IsConvertINetStringAvailable = (ISCONVERTINETSTRINGAVAILABLE)GetProcAddressA(h, "IsConvertINetStringAvailable"); - LcidToRfc1766A = (LCIDTORFC1766A)GetProcAddressA(h, "LcidToRfc1766A"); - Rfc1766ToLcidA = (RFC1766TOLCIDA)GetProcAddressA(h, "Rfc1766ToLcidA"); - return TRUE; -} - -iconv_t -iconv_open(const char *tocode, const char *fromcode) -{ - rec_iconv_t *cd; - - cd = (rec_iconv_t *)calloc(1, sizeof(rec_iconv_t)); - if (cd == NULL) - return (iconv_t)(-1); - -#if defined(USE_LIBICONV_DLL) - errno = 0; - if (libiconv_iconv_open(cd, tocode, fromcode)) - return (iconv_t)cd; -#endif - - /* reset the errno to prevent reporting wrong error code. - * 0 for unsorted error. */ - errno = 0; - if (win_iconv_open(cd, tocode, fromcode)) - return (iconv_t)cd; - - free(cd); - - return (iconv_t)(-1); -} - -int -iconv_close(iconv_t _cd) -{ - rec_iconv_t *cd = (rec_iconv_t *)_cd; - int r = cd->iconv_close(cd->cd); - int e = *(cd->_errno()); -#if defined(USE_LIBICONV_DLL) - if (cd->hlibiconv != NULL) - FreeLibrary(cd->hlibiconv); -#endif - free(cd); - errno = e; - return r; -} - -size_t -iconv(iconv_t _cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) -{ - rec_iconv_t *cd = (rec_iconv_t *)_cd; - size_t r = cd->iconv(cd->cd, inbuf, inbytesleft, outbuf, outbytesleft); - errno = *(cd->_errno()); - return r; -} - -static int -win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode) -{ - if (!make_csconv(fromcode, &cd->from) || !make_csconv(tocode, &cd->to)) - return FALSE; - cd->iconv_close = win_iconv_close; - cd->iconv = win_iconv; - cd->_errno = _errno; - cd->cd = (iconv_t)cd; - return TRUE; -} - -static int -win_iconv_close(iconv_t cd) -{ - return 0; -} - -static size_t -win_iconv(iconv_t _cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) -{ - rec_iconv_t *cd = (rec_iconv_t *)_cd; - ushort wbuf[MB_CHAR_MAX]; /* enough room for one character */ - int insize; - int outsize; - int wsize; - DWORD frommode; - DWORD tomode; - uint wc; - compat_t *cp; - int i; - - if (inbuf == NULL || *inbuf == NULL) - { - if (outbuf != NULL && *outbuf != NULL && cd->to.flush != NULL) - { - tomode = cd->to.mode; - outsize = cd->to.flush(&cd->to, (uchar *)*outbuf, *outbytesleft); - if (outsize == -1) - { - if ((cd->to.flags & FLAG_IGNORE) && errno != E2BIG) - { - outsize = 0; - } - else - { - cd->to.mode = tomode; - return (size_t)(-1); - } - } - *outbuf += outsize; - *outbytesleft -= outsize; - } - cd->from.mode = 0; - cd->to.mode = 0; - return 0; - } - - while (*inbytesleft != 0) - { - frommode = cd->from.mode; - tomode = cd->to.mode; - wsize = MB_CHAR_MAX; - - insize = cd->from.mbtowc(&cd->from, (const uchar *)*inbuf, *inbytesleft, wbuf, &wsize); - if (insize == -1) - { - if (cd->to.flags & FLAG_IGNORE) - { - cd->from.mode = frommode; - insize = 1; - wsize = 0; - } - else - { - cd->from.mode = frommode; - return (size_t)(-1); - } - } - - if (wsize == 0) - { - *inbuf += insize; - *inbytesleft -= insize; - continue; - } - - if (cd->from.compat != NULL) - { - wc = utf16_to_ucs4(wbuf); - cp = cd->from.compat; - for (i = 0; cp[i].in != 0; ++i) - { - if ((cp[i].flag & COMPAT_IN) && cp[i].out == wc) - { - ucs4_to_utf16(cp[i].in, wbuf, &wsize); - break; - } - } - } - - if (cd->to.compat != NULL) - { - wc = utf16_to_ucs4(wbuf); - cp = cd->to.compat; - for (i = 0; cp[i].in != 0; ++i) - { - if ((cp[i].flag & COMPAT_OUT) && cp[i].in == wc) - { - ucs4_to_utf16(cp[i].out, wbuf, &wsize); - break; - } - } - } - - outsize = cd->to.wctomb(&cd->to, wbuf, wsize, (uchar *)*outbuf, *outbytesleft); - if (outsize == -1) - { - if ((cd->to.flags & FLAG_IGNORE) && errno != E2BIG) - { - cd->to.mode = tomode; - outsize = 0; - } - else - { - cd->from.mode = frommode; - cd->to.mode = tomode; - return (size_t)(-1); - } - } - - *inbuf += insize; - *outbuf += outsize; - *inbytesleft -= insize; - *outbytesleft -= outsize; - } - - return 0; -} - -static int -make_csconv(const char *_name, csconv_t *cv) -{ - CPINFO cpinfo; - int use_compat = TRUE; - int flag = 0; - char *name; - char *p; - - name = xstrndup(_name, strlen(_name)); - if (name == NULL) - return FALSE; - - /* check for option "enc_name//opt1//opt2" */ - while ((p = strrstr(name, "//")) != NULL) - { - if (_stricmp(p + 2, "nocompat") == 0) - use_compat = FALSE; - else if (_stricmp(p + 2, "translit") == 0) - flag |= FLAG_TRANSLIT; - else if (_stricmp(p + 2, "ignore") == 0) - flag |= FLAG_IGNORE; - *p = 0; - } - - cv->mode = 0; - cv->flags = flag; - cv->mblen = NULL; - cv->flush = NULL; - cv->compat = NULL; - cv->codepage = name_to_codepage(name); - if (cv->codepage == 1200 || cv->codepage == 1201) - { - cv->mbtowc = utf16_mbtowc; - cv->wctomb = utf16_wctomb; - if (_stricmp(name, "UTF-16") == 0 || _stricmp(name, "UTF16") == 0 || - _stricmp(name, "UCS-2") == 0 || _stricmp(name, "UCS2") == 0) - cv->flags |= FLAG_USE_BOM; - } - else if (cv->codepage == 12000 || cv->codepage == 12001) - { - cv->mbtowc = utf32_mbtowc; - cv->wctomb = utf32_wctomb; - if (_stricmp(name, "UTF-32") == 0 || _stricmp(name, "UTF32") == 0 || - _stricmp(name, "UCS-4") == 0 || _stricmp(name, "UCS4") == 0) - cv->flags |= FLAG_USE_BOM; - } - else if (cv->codepage == 65001) - { - cv->mbtowc = kernel_mbtowc; - cv->wctomb = kernel_wctomb; - cv->mblen = utf8_mblen; - } - else if ((cv->codepage == 50220 || cv->codepage == 50221 || cv->codepage == 50222) && load_mlang()) - { - cv->mbtowc = iso2022jp_mbtowc; - cv->wctomb = iso2022jp_wctomb; - cv->flush = iso2022jp_flush; - } - else if (cv->codepage == 51932 && load_mlang()) - { - cv->mbtowc = mlang_mbtowc; - cv->wctomb = mlang_wctomb; - cv->mblen = eucjp_mblen; - } - else if (IsValidCodePage(cv->codepage) - && GetCPInfo(cv->codepage, &cpinfo) != 0) - { - cv->mbtowc = kernel_mbtowc; - cv->wctomb = kernel_wctomb; - if (cpinfo.MaxCharSize == 1) - cv->mblen = sbcs_mblen; - else if (cpinfo.MaxCharSize == 2) - cv->mblen = dbcs_mblen; - else - cv->mblen = mbcs_mblen; - } - else - { - /* not supported */ - free(name); - errno = EINVAL; - return FALSE; - } - - if (use_compat) - { - switch (cv->codepage) - { - case 932: cv->compat = cp932_compat; break; - case 20932: cv->compat = cp20932_compat; break; - case 51932: cv->compat = cp51932_compat; break; - case 50220: case 50221: case 50222: cv->compat = cp5022x_compat; break; - } - } - - free(name); - - return TRUE; -} - -static int -name_to_codepage(const char *name) -{ - int i; - - if (*name == '\0' || - strcmp(name, "char") == 0) - return GetACP(); - else if (strcmp(name, "wchar_t") == 0) - return 1200; - else if (_strnicmp(name, "cp", 2) == 0) - return atoi(name + 2); /* CP123 */ - else if ('0' <= name[0] && name[0] <= '9') - return atoi(name); /* 123 */ - else if (_strnicmp(name, "xx", 2) == 0) - return atoi(name + 2); /* XX123 for debug */ - - for (i = 0; codepage_alias[i].name != NULL; ++i) - if (_stricmp(name, codepage_alias[i].name) == 0) - return codepage_alias[i].codepage; - return -1; -} - -/* - * http://www.faqs.org/rfcs/rfc2781.html - */ -static uint -utf16_to_ucs4(const ushort *wbuf) -{ - uint wc = wbuf[0]; - if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) - wc = ((wbuf[0] & 0x3FF) << 10) + (wbuf[1] & 0x3FF) + 0x10000; - return wc; -} - -static void -ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize) -{ - if (wc < 0x10000) - { - wbuf[0] = wc; - *wbufsize = 1; - } - else - { - wc -= 0x10000; - wbuf[0] = 0xD800 | ((wc >> 10) & 0x3FF); - wbuf[1] = 0xDC00 | (wc & 0x3FF); - *wbufsize = 2; - } -} - -/* - * Check if codepage is one of those for which the dwFlags parameter - * to MultiByteToWideChar() must be zero. Return zero or - * MB_ERR_INVALID_CHARS. The docs in Platform SDK for for Windows - * Server 2003 R2 claims that also codepage 65001 is one of these, but - * that doesn't seem to be the case. The MSDN docs for MSVS2008 leave - * out 65001 (UTF-8), and that indeed seems to be the case on XP, it - * works fine to pass MB_ERR_INVALID_CHARS in dwFlags when converting - * from UTF-8. - */ -static int -mbtowc_flags(int codepage) -{ - return (codepage == 50220 || codepage == 50221 || - codepage == 50222 || codepage == 50225 || - codepage == 50227 || codepage == 50229 || - codepage == 52936 || codepage == 54936 || - (codepage >= 57002 && codepage <= 57011) || - codepage == 65000 || codepage == 42) ? 0 : MB_ERR_INVALID_CHARS; -} - -/* - * Check if codepage is one those for which the lpUsedDefaultChar - * parameter to WideCharToMultiByte() must be NULL. The docs in - * Platform SDK for for Windows Server 2003 R2 claims that this is the - * list below, while the MSDN docs for MSVS2008 claim that it is only - * for 65000 (UTF-7) and 65001 (UTF-8). This time the earlier Platform - * SDK seems to be correct, at least for XP. - */ -static int -must_use_null_useddefaultchar(int codepage) -{ - return (codepage == 65000 || codepage == 65001 || - codepage == 50220 || codepage == 50221 || - codepage == 50222 || codepage == 50225 || - codepage == 50227 || codepage == 50229 || - codepage == 52936 || codepage == 54936 || - (codepage >= 57002 && codepage <= 57011) || - codepage == 42); -} - -static char * -strrstr(const char *str, const char *token) -{ - int len = strlen(token); - const char *p = str + strlen(str); - - while (str <= --p) - if (p[0] == token[0] && strncmp(p, token, len) == 0) - return (char *)p; - return NULL; -} - -static char * -xstrndup(const char *s, size_t n) -{ - char *p; - - p = (char *)malloc(n + 1); - if (p == NULL) - return NULL; - memcpy(p, s, n); - p[n] = '\0'; - return p; -} - -static int -seterror(int err) -{ - errno = err; - return -1; -} - -#if defined(USE_LIBICONV_DLL) -static int -libiconv_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode) -{ - HMODULE hlibiconv = NULL; - HMODULE hmsvcrt = NULL; - char *dllname; - const char *p; - const char *e; - f_iconv_open _iconv_open; - - /* - * always try to load dll, so that we can switch dll in runtime. - */ - - /* XXX: getenv() can't get variable set by SetEnvironmentVariable() */ - p = getenv("WINICONV_LIBICONV_DLL"); - if (p == NULL) - p = DEFAULT_LIBICONV_DLL; - /* parse comma separated value */ - for ( ; *p != 0; p = (*e == ',') ? e + 1 : e) - { - e = strchr(p, ','); - if (p == e) - continue; - else if (e == NULL) - e = p + strlen(p); - dllname = xstrndup(p, e - p); - if (dllname == NULL) - return FALSE; - hlibiconv = LoadLibraryA(dllname); - free(dllname); - if (hlibiconv != NULL) - { - if (hlibiconv == hwiniconv) - { - FreeLibrary(hlibiconv); - hlibiconv = NULL; - continue; - } - break; - } - } - - if (hlibiconv == NULL) - goto failed; - - hmsvcrt = find_imported_module_by_funcname(hlibiconv, "_errno"); - if (hmsvcrt == NULL) - goto failed; - - _iconv_open = (f_iconv_open)GetProcAddressA(hlibiconv, "libiconv_open"); - if (_iconv_open == NULL) - _iconv_open = (f_iconv_open)GetProcAddressA(hlibiconv, "iconv_open"); - cd->iconv_close = (f_iconv_close)GetProcAddressA(hlibiconv, "libiconv_close"); - if (cd->iconv_close == NULL) - cd->iconv_close = (f_iconv_close)GetProcAddressA(hlibiconv, "iconv_close"); - cd->iconv = (f_iconv)GetProcAddressA(hlibiconv, "libiconv"); - if (cd->iconv == NULL) - cd->iconv = (f_iconv)GetProcAddressA(hlibiconv, "iconv"); - cd->_errno = (f_errno)GetProcAddressA(hmsvcrt, "_errno"); - if (_iconv_open == NULL || cd->iconv_close == NULL - || cd->iconv == NULL || cd->_errno == NULL) - goto failed; - - cd->cd = _iconv_open(tocode, fromcode); - if (cd->cd == (iconv_t)(-1)) - goto failed; - - cd->hlibiconv = hlibiconv; - return TRUE; - -failed: - if (hlibiconv != NULL) - FreeLibrary(hlibiconv); - /* do not free hmsvcrt which is obtained by GetModuleHandle() */ - return FALSE; -} - -/* - * Reference: - * http://forums.belution.com/ja/vc/000/234/78s.shtml - * http://nienie.com/~masapico/api_ImageDirectoryEntryToData.html - * - * The formal way is - * imagehlp.h or dbghelp.h - * imagehlp.lib or dbghelp.lib - * ImageDirectoryEntryToData() - */ -#define TO_DOS_HEADER(base) ((PIMAGE_DOS_HEADER)(base)) -#define TO_NT_HEADERS(base) ((PIMAGE_NT_HEADERS)((LPBYTE)(base) + TO_DOS_HEADER(base)->e_lfanew)) -static PVOID -MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size) -{ - /* TODO: MappedAsImage? */ - PIMAGE_DATA_DIRECTORY p; - p = TO_NT_HEADERS(Base)->OptionalHeader.DataDirectory + DirectoryEntry; - if (p->VirtualAddress == 0) { - *Size = 0; - return NULL; - } - *Size = p->Size; - return (PVOID)((LPBYTE)Base + p->VirtualAddress); -} - -static HMODULE -find_imported_module_by_funcname(HMODULE hModule, const char *funcname) -{ - DWORD_PTR Base; - ULONG Size; - PIMAGE_IMPORT_DESCRIPTOR Imp; - PIMAGE_THUNK_DATA Name; /* Import Name Table */ - PIMAGE_IMPORT_BY_NAME ImpName; - - Base = (DWORD_PTR)hModule; - Imp = (PIMAGE_IMPORT_DESCRIPTOR)MyImageDirectoryEntryToData( - (LPVOID)Base, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - &Size); - if (Imp == NULL) - return NULL; - for ( ; Imp->OriginalFirstThunk != 0; ++Imp) - { - Name = (PIMAGE_THUNK_DATA)(Base + Imp->OriginalFirstThunk); - for ( ; Name->u1.Ordinal != 0; ++Name) - { - if (!IMAGE_SNAP_BY_ORDINAL(Name->u1.Ordinal)) - { - ImpName = (PIMAGE_IMPORT_BY_NAME) - (Base + (DWORD_PTR)Name->u1.AddressOfData); - if (strcmp((char *)ImpName->Name, funcname) == 0) - return GetModuleHandleA((char *)(Base + Imp->Name)); - } - } - } - return NULL; -} -#endif - -static int -sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) -{ - return 1; -} - -static int -dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) -{ - int len = IsDBCSLeadByteEx(cv->codepage, buf[0]) ? 2 : 1; - if (bufsize < len) - return seterror(EINVAL); - return len; -} - -static int -mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) -{ - int len = 0; - - if (cv->codepage == 54936) { - if (buf[0] <= 0x7F) len = 1; - else if (buf[0] >= 0x81 && buf[0] <= 0xFE && - bufsize >= 2 && - ((buf[1] >= 0x40 && buf[1] <= 0x7E) || - (buf[1] >= 0x80 && buf[1] <= 0xFE))) len = 2; - else if (buf[0] >= 0x81 && buf[0] <= 0xFE && - bufsize >= 4 && - buf[1] >= 0x30 && buf[1] <= 0x39) len = 4; - else - return seterror(EINVAL); - return len; - } - else - return seterror(EINVAL); -} - -static int -utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize) -{ - int len = 0; - - if (buf[0] < 0x80) len = 1; - else if ((buf[0] & 0xE0) == 0xC0) len = 2; - else if ((buf[0] & 0xF0) == 0xE0) len = 3; - else if ((buf[0] & 0xF8) == 0xF0) len = 4; - else if ((buf[0] & 0xFC) == 0xF8) len = 5; - else if ((buf[0] & 0xFE) == 0xFC) len = 6; - - if (len == 0) - return seterror(EILSEQ); - else if (bufsize < len) - return seterror(EINVAL); - return len; -} - -static int -eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize) -{ - if (buf[0] < 0x80) /* ASCII */ - return 1; - else if (buf[0] == 0x8E) /* JIS X 0201 */ - { - if (bufsize < 2) - return seterror(EINVAL); - else if (!(0xA1 <= buf[1] && buf[1] <= 0xDF)) - return seterror(EILSEQ); - return 2; - } - else if (buf[0] == 0x8F) /* JIS X 0212 */ - { - if (bufsize < 3) - return seterror(EINVAL); - else if (!(0xA1 <= buf[1] && buf[1] <= 0xFE) - || !(0xA1 <= buf[2] && buf[2] <= 0xFE)) - return seterror(EILSEQ); - return 3; - } - else /* JIS X 0208 */ - { - if (bufsize < 2) - return seterror(EINVAL); - else if (!(0xA1 <= buf[0] && buf[0] <= 0xFE) - || !(0xA1 <= buf[1] && buf[1] <= 0xFE)) - return seterror(EILSEQ); - return 2; - } -} - -static int -kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) -{ - int len; - - len = cv->mblen(cv, buf, bufsize); - if (len == -1) - return -1; - *wbufsize = MultiByteToWideChar(cv->codepage, mbtowc_flags (cv->codepage), - (const char *)buf, len, (wchar_t *)wbuf, *wbufsize); - if (*wbufsize == 0) - return seterror(EILSEQ); - return len; -} - -static int -kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) -{ - BOOL usedDefaultChar = 0; - BOOL *p = NULL; - int flags = 0; - int len; - - if (bufsize == 0) - return seterror(E2BIG); - if (!must_use_null_useddefaultchar(cv->codepage)) - { - p = &usedDefaultChar; -#ifdef WC_NO_BEST_FIT_CHARS - if (!(cv->flags & FLAG_TRANSLIT)) - flags |= WC_NO_BEST_FIT_CHARS; -#endif - } - len = WideCharToMultiByte(cv->codepage, flags, - (const wchar_t *)wbuf, wbufsize, (char *)buf, bufsize, NULL, p); - if (len == 0) - { - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - return seterror(E2BIG); - return seterror(EILSEQ); - } - else if (usedDefaultChar && !(cv->flags & FLAG_TRANSLIT)) - return seterror(EILSEQ); - else if (cv->mblen(cv, buf, len) != len) /* validate result */ - return seterror(EILSEQ); - return len; -} - -/* - * It seems that the mode (cv->mode) is fixnum. - * For example, when converting iso-2022-jp(cp50221) to unicode: - * in ascii sequence: mode=0xC42C0000 - * in jisx0208 sequence: mode=0xC42C0001 - * "C42C" is same for each convert session. - * It should be: ((codepage-1)<<16)|state - */ -static int -mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) -{ - int len; - int insize; - HRESULT hr; - - len = cv->mblen(cv, buf, bufsize); - if (len == -1) - return -1; - insize = len; - hr = ConvertINetMultiByteToUnicode(&cv->mode, cv->codepage, - (const char *)buf, &insize, (wchar_t *)wbuf, wbufsize); - if (hr != S_OK || insize != len) - return seterror(EILSEQ); - return len; -} - -static int -mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) -{ - char tmpbuf[MB_CHAR_MAX]; /* enough room for one character */ - int tmpsize = MB_CHAR_MAX; - int insize = wbufsize; - HRESULT hr; - - hr = ConvertINetUnicodeToMultiByte(&cv->mode, cv->codepage, - (const wchar_t *)wbuf, &wbufsize, tmpbuf, &tmpsize); - if (hr != S_OK || insize != wbufsize) - return seterror(EILSEQ); - else if (bufsize < tmpsize) - return seterror(E2BIG); - else if (cv->mblen(cv, (uchar *)tmpbuf, tmpsize) != tmpsize) - return seterror(EILSEQ); - memcpy(buf, tmpbuf, tmpsize); - return tmpsize; -} - -static int -utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) -{ - int codepage = cv->codepage; - - /* swap endian: 1200 <-> 1201 */ - if (cv->mode & UNICODE_MODE_SWAPPED) - codepage ^= 1; - - if (bufsize < 2) - return seterror(EINVAL); - if (codepage == 1200) /* little endian */ - wbuf[0] = (buf[1] << 8) | buf[0]; - else if (codepage == 1201) /* big endian */ - wbuf[0] = (buf[0] << 8) | buf[1]; - - if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE)) - { - cv->mode |= UNICODE_MODE_BOM_DONE; - if (wbuf[0] == 0xFFFE) - { - cv->mode |= UNICODE_MODE_SWAPPED; - *wbufsize = 0; - return 2; - } - else if (wbuf[0] == 0xFEFF) - { - *wbufsize = 0; - return 2; - } - } - - if (0xDC00 <= wbuf[0] && wbuf[0] <= 0xDFFF) - return seterror(EILSEQ); - if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) - { - if (bufsize < 4) - return seterror(EINVAL); - if (codepage == 1200) /* little endian */ - wbuf[1] = (buf[3] << 8) | buf[2]; - else if (codepage == 1201) /* big endian */ - wbuf[1] = (buf[2] << 8) | buf[3]; - if (!(0xDC00 <= wbuf[1] && wbuf[1] <= 0xDFFF)) - return seterror(EILSEQ); - *wbufsize = 2; - return 4; - } - *wbufsize = 1; - return 2; -} - -static int -utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) -{ - if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE)) - { - int r; - - cv->mode |= UNICODE_MODE_BOM_DONE; - if (bufsize < 2) - return seterror(E2BIG); - if (cv->codepage == 1200) /* little endian */ - memcpy(buf, "\xFF\xFE", 2); - else if (cv->codepage == 1201) /* big endian */ - memcpy(buf, "\xFE\xFF", 2); - - r = utf16_wctomb(cv, wbuf, wbufsize, buf + 2, bufsize - 2); - if (r == -1) - return -1; - return r + 2; - } - - if (bufsize < 2) - return seterror(E2BIG); - if (cv->codepage == 1200) /* little endian */ - { - buf[0] = (wbuf[0] & 0x00FF); - buf[1] = (wbuf[0] & 0xFF00) >> 8; - } - else if (cv->codepage == 1201) /* big endian */ - { - buf[0] = (wbuf[0] & 0xFF00) >> 8; - buf[1] = (wbuf[0] & 0x00FF); - } - if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) - { - if (bufsize < 4) - return seterror(E2BIG); - if (cv->codepage == 1200) /* little endian */ - { - buf[2] = (wbuf[1] & 0x00FF); - buf[3] = (wbuf[1] & 0xFF00) >> 8; - } - else if (cv->codepage == 1201) /* big endian */ - { - buf[2] = (wbuf[1] & 0xFF00) >> 8; - buf[3] = (wbuf[1] & 0x00FF); - } - return 4; - } - return 2; -} - -static int -utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) -{ - int codepage = cv->codepage; - uint wc; - - /* swap endian: 12000 <-> 12001 */ - if (cv->mode & UNICODE_MODE_SWAPPED) - codepage ^= 1; - - if (bufsize < 4) - return seterror(EINVAL); - if (codepage == 12000) /* little endian */ - wc = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; - else if (codepage == 12001) /* big endian */ - wc = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; - - if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE)) - { - cv->mode |= UNICODE_MODE_BOM_DONE; - if (wc == 0xFFFE0000) - { - cv->mode |= UNICODE_MODE_SWAPPED; - *wbufsize = 0; - return 4; - } - else if (wc == 0x0000FEFF) - { - *wbufsize = 0; - return 4; - } - } - - if ((0xD800 <= wc && wc <= 0xDFFF) || 0x10FFFF < wc) - return seterror(EILSEQ); - ucs4_to_utf16(wc, wbuf, wbufsize); - return 4; -} - -static int -utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) -{ - uint wc; - - if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE)) - { - int r; - - cv->mode |= UNICODE_MODE_BOM_DONE; - if (bufsize < 4) - return seterror(E2BIG); - if (cv->codepage == 12000) /* little endian */ - memcpy(buf, "\xFF\xFE\x00\x00", 4); - else if (cv->codepage == 12001) /* big endian */ - memcpy(buf, "\x00\x00\xFE\xFF", 4); - - r = utf32_wctomb(cv, wbuf, wbufsize, buf + 4, bufsize - 4); - if (r == -1) - return -1; - return r + 4; - } - - if (bufsize < 4) - return seterror(E2BIG); - wc = utf16_to_ucs4(wbuf); - if (cv->codepage == 12000) /* little endian */ - { - buf[0] = wc & 0x000000FF; - buf[1] = (wc & 0x0000FF00) >> 8; - buf[2] = (wc & 0x00FF0000) >> 16; - buf[3] = (wc & 0xFF000000) >> 24; - } - else if (cv->codepage == 12001) /* big endian */ - { - buf[0] = (wc & 0xFF000000) >> 24; - buf[1] = (wc & 0x00FF0000) >> 16; - buf[2] = (wc & 0x0000FF00) >> 8; - buf[3] = wc & 0x000000FF; - } - return 4; -} - -/* - * 50220: ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) - * 50221: ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow - * 1 byte Kana) - * 50222: ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte - * Kana - SO/SI) - * - * MultiByteToWideChar() and WideCharToMultiByte() behave differently - * depending on Windows version. On XP, WideCharToMultiByte() doesn't - * terminate result sequence with ascii escape. But Vista does. - * Use MLang instead. - */ - -#define ISO2022_MODE(cs, shift) (((cs) << 8) | (shift)) -#define ISO2022_MODE_CS(mode) (((mode) >> 8) & 0xFF) -#define ISO2022_MODE_SHIFT(mode) ((mode) & 0xFF) - -#define ISO2022_SI 0 -#define ISO2022_SO 1 - -/* shift in */ -static const char iso2022_SI_seq[] = "\x0F"; -/* shift out */ -static const char iso2022_SO_seq[] = "\x0E"; - -typedef struct iso2022_esc_t iso2022_esc_t; -struct iso2022_esc_t { - const char *esc; - int esc_len; - int len; - int cs; -}; - -#define ISO2022JP_CS_ASCII 0 -#define ISO2022JP_CS_JISX0201_ROMAN 1 -#define ISO2022JP_CS_JISX0201_KANA 2 -#define ISO2022JP_CS_JISX0208_1978 3 -#define ISO2022JP_CS_JISX0208_1983 4 -#define ISO2022JP_CS_JISX0212 5 - -static iso2022_esc_t iso2022jp_esc[] = { - {"\x1B\x28\x42", 3, 1, ISO2022JP_CS_ASCII}, - {"\x1B\x28\x4A", 3, 1, ISO2022JP_CS_JISX0201_ROMAN}, - {"\x1B\x28\x49", 3, 1, ISO2022JP_CS_JISX0201_KANA}, - {"\x1B\x24\x40", 3, 2, ISO2022JP_CS_JISX0208_1983}, /* unify 1978 with 1983 */ - {"\x1B\x24\x42", 3, 2, ISO2022JP_CS_JISX0208_1983}, - {"\x1B\x24\x28\x44", 4, 2, ISO2022JP_CS_JISX0212}, - {NULL, 0, 0, 0} -}; - -static int -iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) -{ - iso2022_esc_t *iesc = iso2022jp_esc; - char tmp[MB_CHAR_MAX]; - int insize; - HRESULT hr; - DWORD dummy = 0; - int len; - int esc_len; - int cs; - int shift; - int i; - - if (buf[0] == 0x1B) - { - for (i = 0; iesc[i].esc != NULL; ++i) - { - esc_len = iesc[i].esc_len; - if (bufsize < esc_len) - { - if (strncmp((char *)buf, iesc[i].esc, bufsize) == 0) - return seterror(EINVAL); - } - else - { - if (strncmp((char *)buf, iesc[i].esc, esc_len) == 0) - { - cv->mode = ISO2022_MODE(iesc[i].cs, ISO2022_SI); - *wbufsize = 0; - return esc_len; - } - } - } - /* not supported escape sequence */ - return seterror(EILSEQ); - } - else if (buf[0] == iso2022_SO_seq[0]) - { - cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SO); - *wbufsize = 0; - return 1; - } - else if (buf[0] == iso2022_SI_seq[0]) - { - cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SI); - *wbufsize = 0; - return 1; - } - - cs = ISO2022_MODE_CS(cv->mode); - shift = ISO2022_MODE_SHIFT(cv->mode); - - /* reset the mode for informal sequence */ - if (buf[0] < 0x20) - { - cs = ISO2022JP_CS_ASCII; - shift = ISO2022_SI; - } - - len = iesc[cs].len; - if (bufsize < len) - return seterror(EINVAL); - for (i = 0; i < len; ++i) - if (!(buf[i] < 0x80)) - return seterror(EILSEQ); - esc_len = iesc[cs].esc_len; - memcpy(tmp, iesc[cs].esc, esc_len); - if (shift == ISO2022_SO) - { - memcpy(tmp + esc_len, iso2022_SO_seq, 1); - esc_len += 1; - } - memcpy(tmp + esc_len, buf, len); - - if ((cv->codepage == 50220 || cv->codepage == 50221 - || cv->codepage == 50222) && shift == ISO2022_SO) - { - /* XXX: shift-out cannot be used for mbtowc (both kernel and - * mlang) */ - esc_len = iesc[ISO2022JP_CS_JISX0201_KANA].esc_len; - memcpy(tmp, iesc[ISO2022JP_CS_JISX0201_KANA].esc, esc_len); - memcpy(tmp + esc_len, buf, len); - } - - insize = len + esc_len; - hr = ConvertINetMultiByteToUnicode(&dummy, cv->codepage, - (const char *)tmp, &insize, (wchar_t *)wbuf, wbufsize); - if (hr != S_OK || insize != len + esc_len) - return seterror(EILSEQ); - - /* Check for conversion error. Assuming defaultChar is 0x3F. */ - /* ascii should be converted from ascii */ - if (wbuf[0] == buf[0] - && cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI)) - return seterror(EILSEQ); - - /* reset the mode for informal sequence */ - if (cv->mode != ISO2022_MODE(cs, shift)) - cv->mode = ISO2022_MODE(cs, shift); - - return len; -} - -static int -iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) -{ - iso2022_esc_t *iesc = iso2022jp_esc; - char tmp[MB_CHAR_MAX]; - int tmpsize = MB_CHAR_MAX; - int insize = wbufsize; - HRESULT hr; - DWORD dummy = 0; - int len; - int esc_len; - int cs; - int shift; - int i; - - /* - * MultiByte = [escape sequence] + character + [escape sequence] - * - * Whether trailing escape sequence is added depends on which API is - * used (kernel or MLang, and its version). - */ - hr = ConvertINetUnicodeToMultiByte(&dummy, cv->codepage, - (const wchar_t *)wbuf, &wbufsize, tmp, &tmpsize); - if (hr != S_OK || insize != wbufsize) - return seterror(EILSEQ); - else if (bufsize < tmpsize) - return seterror(E2BIG); - - if (tmpsize == 1) - { - cs = ISO2022JP_CS_ASCII; - esc_len = 0; - } - else - { - for (i = 1; iesc[i].esc != NULL; ++i) - { - esc_len = iesc[i].esc_len; - if (strncmp(tmp, iesc[i].esc, esc_len) == 0) - { - cs = iesc[i].cs; - break; - } - } - if (iesc[i].esc == NULL) - /* not supported escape sequence */ - return seterror(EILSEQ); - } - - shift = ISO2022_SI; - if (tmp[esc_len] == iso2022_SO_seq[0]) - { - shift = ISO2022_SO; - esc_len += 1; - } - - len = iesc[cs].len; - - /* Check for converting error. Assuming defaultChar is 0x3F. */ - /* ascii should be converted from ascii */ - if (cs == ISO2022JP_CS_ASCII && !(wbuf[0] < 0x80)) - return seterror(EILSEQ); - else if (tmpsize < esc_len + len) - return seterror(EILSEQ); - - if (cv->mode == ISO2022_MODE(cs, shift)) - { - /* remove escape sequence */ - if (esc_len != 0) - memmove(tmp, tmp + esc_len, len); - esc_len = 0; - } - else - { - if (cs == ISO2022JP_CS_ASCII) - { - esc_len = iesc[ISO2022JP_CS_ASCII].esc_len; - memmove(tmp + esc_len, tmp, len); - memcpy(tmp, iesc[ISO2022JP_CS_ASCII].esc, esc_len); - } - if (ISO2022_MODE_SHIFT(cv->mode) == ISO2022_SO) - { - /* shift-in before changing to other mode */ - memmove(tmp + 1, tmp, len + esc_len); - memcpy(tmp, iso2022_SI_seq, 1); - esc_len += 1; - } - } - - if (bufsize < len + esc_len) - return seterror(E2BIG); - memcpy(buf, tmp, len + esc_len); - cv->mode = ISO2022_MODE(cs, shift); - return len + esc_len; -} - -static int -iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize) -{ - iso2022_esc_t *iesc = iso2022jp_esc; - int esc_len; - - if (cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI)) - { - esc_len = 0; - if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI) - esc_len += 1; - if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII) - esc_len += iesc[ISO2022JP_CS_ASCII].esc_len; - if (bufsize < esc_len) - return seterror(E2BIG); - - esc_len = 0; - if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI) - { - memcpy(buf, iso2022_SI_seq, 1); - esc_len += 1; - } - if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII) - { - memcpy(buf + esc_len, iesc[ISO2022JP_CS_ASCII].esc, - iesc[ISO2022JP_CS_ASCII].esc_len); - esc_len += iesc[ISO2022JP_CS_ASCII].esc_len; - } - return esc_len; - } - return 0; -} - -#if defined(MAKE_DLL) && defined(USE_LIBICONV_DLL) -BOOL WINAPI -DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) -{ - switch( fdwReason ) - { - case DLL_PROCESS_ATTACH: - hwiniconv = (HMODULE)hinstDLL; - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} -#endif - -#if defined(MAKE_EXE) -#include -#include -#include -int -main(int argc, char **argv) -{ - char *fromcode = NULL; - char *tocode = NULL; - int i; - char inbuf[BUFSIZ]; - char outbuf[BUFSIZ]; - char *pin; - char *pout; - size_t inbytesleft; - size_t outbytesleft; - size_t rest = 0; - iconv_t cd; - size_t r; - FILE *in = stdin; - int ignore = 0; - char *p; - - _setmode(_fileno(stdin), _O_BINARY); - _setmode(_fileno(stdout), _O_BINARY); - - for (i = 1; i < argc; ++i) - { - if (strcmp(argv[i], "-l") == 0) - { - for (i = 0; codepage_alias[i].name != NULL; ++i) - printf("%s\n", codepage_alias[i].name); - return 0; - } - - if (strcmp(argv[i], "-f") == 0) - fromcode = argv[++i]; - else if (strcmp(argv[i], "-t") == 0) - tocode = argv[++i]; - else if (strcmp(argv[i], "-c") == 0) - ignore = 1; - else - { - in = fopen(argv[i], "rb"); - if (in == NULL) - { - fprintf(stderr, "cannot open %s\n", argv[i]); - return 1; - } - break; - } - } - - if (fromcode == NULL || tocode == NULL) - { - printf("usage: %s [-c] -f from-enc -t to-enc [file]\n", argv[0]); - return 0; - } - - if (ignore) - { - p = tocode; - tocode = (char *)malloc(strlen(p) + strlen("//IGNORE") + 1); - if (tocode == NULL) - { - perror("fatal error"); - return 1; - } - strcpy(tocode, p); - strcat(tocode, "//IGNORE"); - } - - cd = iconv_open(tocode, fromcode); - if (cd == (iconv_t)(-1)) - { - perror("iconv_open error"); - return 1; - } - - while ((inbytesleft = fread(inbuf + rest, 1, sizeof(inbuf) - rest, in)) != 0 - || rest != 0) - { - inbytesleft += rest; - pin = inbuf; - pout = outbuf; - outbytesleft = sizeof(outbuf); - r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); - fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, stdout); - if (r == (size_t)(-1) && errno != E2BIG && (errno != EINVAL || feof(in))) - { - perror("conversion error"); - return 1; - } - memmove(inbuf, pin, inbytesleft); - rest = inbytesleft; - } - pout = outbuf; - outbytesleft = sizeof(outbuf); - r = iconv(cd, NULL, NULL, &pout, &outbytesleft); - fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, stdout); - if (r == (size_t)(-1)) - { - perror("conversion error"); - return 1; - } - - iconv_close(cd); - - return 0; -} -#endif - diff --git a/cpp/core/src/zxing/BarcodeFormat.cpp b/cpp/core/src/zxing/BarcodeFormat.cpp deleted file mode 100644 index 8b023ea6f..000000000 --- a/cpp/core/src/zxing/BarcodeFormat.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -const char* zxing::BarcodeFormat::barcodeFormatNames[] = { - 0, - "AZTEC", - "CODABAR", - "CODE_39", - "CODE_93", - "CODE_128", - "DATA_MATRIX", - "EAN_8", - "EAN_13", - "ITF", - "MAXICODE", - "PDF_417", - "QR_CODE", - "RSS_14", - "RSS_EXPANDED", - "UPC_A", - "UPC_E", - "UPC_EAN_EXTENSION" -}; diff --git a/cpp/core/src/zxing/BarcodeFormat.h b/cpp/core/src/zxing/BarcodeFormat.h deleted file mode 100644 index f9d123dd9..000000000 --- a/cpp/core/src/zxing/BarcodeFormat.h +++ /dev/null @@ -1,60 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __BARCODE_FORMAT_H__ -#define __BARCODE_FORMAT_H__ - -/* - * BarcodeFormat.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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. - */ - -namespace zxing { - -class BarcodeFormat { -public: - // if you update the enum, update BarcodeFormat.cpp - - enum Value { - NONE, - AZTEC, - CODABAR, - CODE_39, - CODE_93, - CODE_128, - DATA_MATRIX, - EAN_8, - EAN_13, - ITF, - MAXICODE, - PDF_417, - QR_CODE, - RSS_14, - RSS_EXPANDED, - UPC_A, - UPC_E, - UPC_EAN_EXTENSION - }; - - BarcodeFormat(Value v) : value(v) {} - const Value value; - operator Value () const {return value;} - - static char const* barcodeFormatNames[]; -}; - -} - -#endif // __BARCODE_FORMAT_H__ diff --git a/cpp/core/src/zxing/Binarizer.cpp b/cpp/core/src/zxing/Binarizer.cpp deleted file mode 100644 index 954b74073..000000000 --- a/cpp/core/src/zxing/Binarizer.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Binarizer.cpp - * zxing - * - * Created by Ralf Kistner on 16/10/2009. - * Copyright 2008 ZXing authors All rights reserved. - * Modified by Lukasz Warchol on 02/02/2010. - * - * 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 - -namespace zxing { - - Binarizer::Binarizer(Ref source) : source_(source) { - } - - Binarizer::~Binarizer() { - } - - Ref Binarizer::getLuminanceSource() const { - return source_; - } - - int Binarizer::getWidth() const { - return source_->getWidth(); - } - - int Binarizer::getHeight() const { - return source_->getHeight(); - } - -} diff --git a/cpp/core/src/zxing/Binarizer.h b/cpp/core/src/zxing/Binarizer.h deleted file mode 100644 index 238c12ace..000000000 --- a/cpp/core/src/zxing/Binarizer.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef BINARIZER_H_ -#define BINARIZER_H_ - -/* - * Binarizer.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { - -class Binarizer : public Counted { - private: - Ref source_; - - public: - Binarizer(Ref source); - virtual ~Binarizer(); - - virtual Ref getBlackRow(int y, Ref row) = 0; - virtual Ref getBlackMatrix() = 0; - - Ref getLuminanceSource() const ; - virtual Ref createBinarizer(Ref source) = 0; - - int getWidth() const; - int getHeight() const; - -}; - -} -#endif /* BINARIZER_H_ */ diff --git a/cpp/core/src/zxing/BinaryBitmap.cpp b/cpp/core/src/zxing/BinaryBitmap.cpp deleted file mode 100644 index bb67a932f..000000000 --- a/cpp/core/src/zxing/BinaryBitmap.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -using zxing::Ref; -using zxing::BitArray; -using zxing::BitMatrix; -using zxing::LuminanceSource; -using zxing::BinaryBitmap; - -// VC++ -using zxing::Binarizer; - -BinaryBitmap::BinaryBitmap(Ref binarizer) : binarizer_(binarizer) { -} - -BinaryBitmap::~BinaryBitmap() { -} - -Ref BinaryBitmap::getBlackRow(int y, Ref row) { - return binarizer_->getBlackRow(y, row); -} - -Ref BinaryBitmap::getBlackMatrix() { - return binarizer_->getBlackMatrix(); -} - -int BinaryBitmap::getWidth() const { - return getLuminanceSource()->getWidth(); -} - -int BinaryBitmap::getHeight() const { - return getLuminanceSource()->getHeight(); -} - -Ref BinaryBitmap::getLuminanceSource() const { - return binarizer_->getLuminanceSource(); -} - - -bool BinaryBitmap::isCropSupported() const { - return getLuminanceSource()->isCropSupported(); -} - -Ref BinaryBitmap::crop(int left, int top, int width, int height) { - return Ref (new BinaryBitmap(binarizer_->createBinarizer(getLuminanceSource()->crop(left, top, width, height)))); -} - -bool BinaryBitmap::isRotateSupported() const { - return getLuminanceSource()->isRotateSupported(); -} - -Ref BinaryBitmap::rotateCounterClockwise() { - return Ref (new BinaryBitmap(binarizer_->createBinarizer(getLuminanceSource()->rotateCounterClockwise()))); -} diff --git a/cpp/core/src/zxing/BinaryBitmap.h b/cpp/core/src/zxing/BinaryBitmap.h deleted file mode 100644 index 41efa3981..000000000 --- a/cpp/core/src/zxing/BinaryBitmap.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __BINARYBITMAP_H__ -#define __BINARYBITMAP_H__ - -/* - * BinaryBitmap.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { - - class BinaryBitmap : public Counted { - private: - Ref binarizer_; - - public: - BinaryBitmap(Ref binarizer); - virtual ~BinaryBitmap(); - - Ref getBlackRow(int y, Ref row); - Ref getBlackMatrix(); - - Ref getLuminanceSource() const; - - int getWidth() const; - int getHeight() const; - - bool isRotateSupported() const; - Ref rotateCounterClockwise(); - - bool isCropSupported() const; - Ref crop(int left, int top, int width, int height); - - }; - -} - -#endif /* BINARYBITMAP_H_ */ diff --git a/cpp/core/src/zxing/ChecksumException.cpp b/cpp/core/src/zxing/ChecksumException.cpp deleted file mode 100644 index 473818582..000000000 --- a/cpp/core/src/zxing/ChecksumException.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * ChecksumException.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -using zxing::ChecksumException; - -ChecksumException::ChecksumException() throw() {} -ChecksumException::ChecksumException(const char *msg) throw() : ReaderException(msg) {} -ChecksumException::~ChecksumException() throw() {} diff --git a/cpp/core/src/zxing/ChecksumException.h b/cpp/core/src/zxing/ChecksumException.h deleted file mode 100644 index 77f4dfdbb..000000000 --- a/cpp/core/src/zxing/ChecksumException.h +++ /dev/null @@ -1,34 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __CHECKSUM_EXCEPTION_H__ -#define __NOT_FOUND_EXCEPTION_H__ - -/* - * Copyright 20011 ZXing authors - * - * 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 - -namespace zxing { - class ChecksumException : public ReaderException { - typedef ReaderException Base; - public: - ChecksumException() throw(); - ChecksumException(const char *msg) throw(); - ~ChecksumException() throw(); - }; -} - -#endif // __CHECKSUM_EXCEPTION_H__ diff --git a/cpp/core/src/zxing/DecodeHints.cpp b/cpp/core/src/zxing/DecodeHints.cpp deleted file mode 100644 index a3ea73cbc..000000000 --- a/cpp/core/src/zxing/DecodeHints.cpp +++ /dev/null @@ -1,142 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * DecodeHintType.cpp - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -using zxing::Ref; -using zxing::ResultPointCallback; -using zxing::DecodeHintType; -using zxing::DecodeHints; - -// VC++ -using zxing::BarcodeFormat; - -const DecodeHintType DecodeHints::CHARACTER_SET; - -const DecodeHints DecodeHints::PRODUCT_HINT( - UPC_A_HINT | - UPC_E_HINT | - EAN_13_HINT | - EAN_8_HINT | - RSS_14_HINT - ); - -const DecodeHints DecodeHints::ONED_HINT( - CODE_39_HINT | - CODE_93_HINT | - CODE_128_HINT | - ITF_HINT | - CODABAR_HINT | - DecodeHints::PRODUCT_HINT - ); - -const DecodeHints DecodeHints::DEFAULT_HINT( - ONED_HINT | - QR_CODE_HINT | - DATA_MATRIX_HINT | - AZTEC_HINT | - PDF_417_HINT - ); - -DecodeHints::DecodeHints() { - hints = 0; -} - -DecodeHints::DecodeHints(DecodeHintType init) { - hints = init; -} - -void DecodeHints::addFormat(BarcodeFormat toadd) { - switch (toadd) { - case BarcodeFormat::AZTEC: hints |= AZTEC_HINT; break; - case BarcodeFormat::CODABAR: hints |= CODABAR_HINT; break; - case BarcodeFormat::CODE_39: hints |= CODE_39_HINT; break; - case BarcodeFormat::CODE_93: hints |= CODE_93_HINT; break; - case BarcodeFormat::CODE_128: hints |= CODE_128_HINT; break; - case BarcodeFormat::DATA_MATRIX: hints |= DATA_MATRIX_HINT; break; - case BarcodeFormat::EAN_8: hints |= EAN_8_HINT; break; - case BarcodeFormat::EAN_13: hints |= EAN_13_HINT; break; - case BarcodeFormat::ITF: hints |= ITF_HINT; break; - case BarcodeFormat::MAXICODE: hints |= MAXICODE_HINT; break; - case BarcodeFormat::PDF_417: hints |= PDF_417_HINT; break; - case BarcodeFormat::QR_CODE: hints |= QR_CODE_HINT; break; - case BarcodeFormat::RSS_14: hints |= RSS_14_HINT; break; - case BarcodeFormat::RSS_EXPANDED: hints |= RSS_EXPANDED_HINT; break; - case BarcodeFormat::UPC_A: hints |= UPC_A_HINT; break; - case BarcodeFormat::UPC_E: hints |= UPC_E_HINT; break; - case BarcodeFormat::UPC_EAN_EXTENSION: hints |= UPC_EAN_EXTENSION_HINT; break; - default: throw IllegalArgumentException("Unrecognizd barcode format"); - } -} - -bool DecodeHints::containsFormat(BarcodeFormat tocheck) const { - DecodeHintType checkAgainst = 0; - switch (tocheck) { - case BarcodeFormat::AZTEC: checkAgainst |= AZTEC_HINT; break; - case BarcodeFormat::CODABAR: checkAgainst |= CODABAR_HINT; break; - case BarcodeFormat::CODE_39: checkAgainst |= CODE_39_HINT; break; - case BarcodeFormat::CODE_93: checkAgainst |= CODE_93_HINT; break; - case BarcodeFormat::CODE_128: checkAgainst |= CODE_128_HINT; break; - case BarcodeFormat::DATA_MATRIX: checkAgainst |= DATA_MATRIX_HINT; break; - case BarcodeFormat::EAN_8: checkAgainst |= EAN_8_HINT; break; - case BarcodeFormat::EAN_13: checkAgainst |= EAN_13_HINT; break; - case BarcodeFormat::ITF: checkAgainst |= ITF_HINT; break; - case BarcodeFormat::MAXICODE: checkAgainst |= MAXICODE_HINT; break; - case BarcodeFormat::PDF_417: checkAgainst |= PDF_417_HINT; break; - case BarcodeFormat::QR_CODE: checkAgainst |= QR_CODE_HINT; break; - case BarcodeFormat::RSS_14: checkAgainst |= RSS_14_HINT; break; - case BarcodeFormat::RSS_EXPANDED: checkAgainst |= RSS_EXPANDED_HINT; break; - case BarcodeFormat::UPC_A: checkAgainst |= UPC_A_HINT; break; - case BarcodeFormat::UPC_E: checkAgainst |= UPC_E_HINT; break; - case BarcodeFormat::UPC_EAN_EXTENSION: checkAgainst |= UPC_EAN_EXTENSION_HINT; break; - default: throw IllegalArgumentException("Unrecognizd barcode format"); - } - return (hints & checkAgainst) != 0; -} - -void DecodeHints::setTryHarder(bool toset) { - if (toset) { - hints |= TRYHARDER_HINT; - } else { - hints &= ~TRYHARDER_HINT; - } -} - -bool DecodeHints::getTryHarder() const { - return (hints & TRYHARDER_HINT) != 0; -} - -void DecodeHints::setResultPointCallback(Ref const& _callback) { - callback = _callback; -} - -Ref DecodeHints::getResultPointCallback() const { - return callback; -} - -DecodeHints zxing::operator | (DecodeHints const& l, DecodeHints const& r) { - DecodeHints result (l); - result.hints |= r.hints; - if (!result.callback) { - result.callback = r.callback; - } - return result; -} diff --git a/cpp/core/src/zxing/DecodeHints.h b/cpp/core/src/zxing/DecodeHints.h deleted file mode 100644 index 57b1c65ba..000000000 --- a/cpp/core/src/zxing/DecodeHints.h +++ /dev/null @@ -1,85 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __DECODEHINTS_H_ -#define __DECODEHINTS_H_ -/* - * DecodeHintType.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - -typedef unsigned int DecodeHintType; -class DecodeHints; -DecodeHints operator | (DecodeHints const&, DecodeHints const&); - -class DecodeHints { - private: - DecodeHintType hints; - Ref callback; - - public: - static const DecodeHintType AZTEC_HINT = 1 << BarcodeFormat::AZTEC; - static const DecodeHintType CODABAR_HINT = 1 << BarcodeFormat::CODABAR; - static const DecodeHintType CODE_39_HINT = 1 << BarcodeFormat::CODE_39; - static const DecodeHintType CODE_93_HINT = 1 << BarcodeFormat::CODE_93; - static const DecodeHintType CODE_128_HINT = 1 << BarcodeFormat::CODE_128; - static const DecodeHintType DATA_MATRIX_HINT = 1 << BarcodeFormat::DATA_MATRIX; - static const DecodeHintType EAN_8_HINT = 1 << BarcodeFormat::EAN_8; - static const DecodeHintType EAN_13_HINT = 1 << BarcodeFormat::EAN_13; - static const DecodeHintType ITF_HINT = 1 << BarcodeFormat::ITF; - static const DecodeHintType MAXICODE_HINT = 1 << BarcodeFormat::MAXICODE; - static const DecodeHintType PDF_417_HINT = 1 << BarcodeFormat::PDF_417; - static const DecodeHintType QR_CODE_HINT = 1 << BarcodeFormat::QR_CODE; - static const DecodeHintType RSS_14_HINT = 1 << BarcodeFormat::RSS_14; - static const DecodeHintType RSS_EXPANDED_HINT = 1 << BarcodeFormat::RSS_EXPANDED; - static const DecodeHintType UPC_A_HINT = 1 << BarcodeFormat::UPC_A; - static const DecodeHintType UPC_E_HINT = 1 << BarcodeFormat::UPC_E; - static const DecodeHintType UPC_EAN_EXTENSION_HINT = 1 << BarcodeFormat::UPC_EAN_EXTENSION; - - static const DecodeHintType TRYHARDER_HINT = 1 << 31; - static const DecodeHintType CHARACTER_SET = 1 << 30; - // static const DecodeHintType ALLOWED_LENGTHS = 1 << 29; - // static const DecodeHintType ASSUME_CODE_39_CHECK_DIGIT = 1 << 28; - static const DecodeHintType ASSUME_GS1 = 1 << 27; - // static const DecodeHintType NEED_RESULT_POINT_CALLBACK = 1 << 26; - - static const DecodeHints PRODUCT_HINT; - static const DecodeHints ONED_HINT; - static const DecodeHints DEFAULT_HINT; - - DecodeHints(); - DecodeHints(DecodeHintType init); - - void addFormat(BarcodeFormat toadd); - bool containsFormat(BarcodeFormat tocheck) const; - bool isEmpty() const {return (hints==0);} - void clear() {hints=0;} - void setTryHarder(bool toset); - bool getTryHarder() const; - - void setResultPointCallback(Ref const&); - Ref getResultPointCallback() const; - - friend DecodeHints operator | (DecodeHints const&, DecodeHints const&); -}; - -} - -#endif diff --git a/cpp/core/src/zxing/Exception.cpp b/cpp/core/src/zxing/Exception.cpp deleted file mode 100644 index 2d912a2cf..000000000 --- a/cpp/core/src/zxing/Exception.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Exception.cpp - * ZXing - * - * Created by Christian Brunschen on 03/06/2008. - * Copyright 2008-2011 ZXing authors All rights reserved. - * - * 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 -#include -#include - -using zxing::Exception; - -void Exception::deleteMessage() { - delete [] message; -} - -char const* Exception::copy(char const* msg) { - char* message = 0; - if (msg) { - int l = strlen(msg)+1; - if (l) { - message = new char[l]; - strcpy(message, msg); - } - } - return message; -} diff --git a/cpp/core/src/zxing/Exception.h b/cpp/core/src/zxing/Exception.h deleted file mode 100644 index f0df1e5b4..000000000 --- a/cpp/core/src/zxing/Exception.h +++ /dev/null @@ -1,51 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __EXCEPTION_H__ -#define __EXCEPTION_H__ - -/* - * Exception.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - -class Exception : public std::exception { -private: - char const* const message; - -public: - Exception() throw() : message(0) {} - Exception(const char* msg) throw() : message(copy(msg)) {} - Exception(Exception const& that) throw() : std::exception(that), message(copy(that.message)) {} - ~Exception() throw() { - if(message) { - deleteMessage(); - } - } - char const* what() const throw() {return message ? message : "";} - -private: - static char const* copy(char const*); - void deleteMessage(); -}; - -} - -#endif // __EXCEPTION_H__ diff --git a/cpp/core/src/zxing/FormatException.cpp b/cpp/core/src/zxing/FormatException.cpp deleted file mode 100644 index 488b3d48d..000000000 --- a/cpp/core/src/zxing/FormatException.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * FormatException.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -FormatException::FormatException() {} - -FormatException::FormatException(const char *msg) : - ReaderException(msg) { -} - -FormatException::~FormatException() throw() { -} - -FormatException const& -FormatException::getFormatInstance() { - static FormatException instance; - return instance; -} - -} diff --git a/cpp/core/src/zxing/FormatException.h b/cpp/core/src/zxing/FormatException.h deleted file mode 100644 index 090d79cad..000000000 --- a/cpp/core/src/zxing/FormatException.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef __FORMAT_EXCEPTION_H__ -#define __FORMAT_EXCEPTION_H__ - -/* - * FormatException.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -class FormatException : public ReaderException { -public: - FormatException(); - FormatException(const char *msg); - ~FormatException() throw(); - - static FormatException const& getFormatInstance(); -}; - -} -#endif // __FORMAT_EXCEPTION_H__ diff --git a/cpp/core/src/zxing/IllegalStateException.h b/cpp/core/src/zxing/IllegalStateException.h deleted file mode 100644 index dfaf5f387..000000000 --- a/cpp/core/src/zxing/IllegalStateException.h +++ /dev/null @@ -1,35 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __ILLEGAL_STATE_EXCEPTION_H__ -#define __ILLEGAL_STATE_EXCEPTION_H__ - -/* - * Copyright 20011 ZXing authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may illegal 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 - -namespace zxing { - -class IllegalStateException : public ReaderException { -public: - IllegalStateException() throw() {} - IllegalStateException(const char *msg) throw() : ReaderException(msg) {} - ~IllegalStateException() throw() {} -}; - -} - -#endif // __ILLEGAL_STATE_EXCEPTION_H__ diff --git a/cpp/core/src/zxing/InvertedLuminanceSource.cpp b/cpp/core/src/zxing/InvertedLuminanceSource.cpp deleted file mode 100644 index 1039ce873..000000000 --- a/cpp/core/src/zxing/InvertedLuminanceSource.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2013 ZXing authors All rights reserved. - * - * 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 -#include - -using zxing::boolean; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::LuminanceSource; -using zxing::InvertedLuminanceSource; - -InvertedLuminanceSource::InvertedLuminanceSource(Ref const& delegate_) - : Super(delegate_->getWidth(), delegate_->getHeight()), delegate(delegate_) {} - -ArrayRef InvertedLuminanceSource::getRow(int y, ArrayRef row) const { - row = delegate->getRow(y, row); - int width = getWidth(); - for (int i = 0; i < width; i++) { - row[i] = (byte) (255 - (row[i] & 0xFF)); - } - return row; -} - -ArrayRef InvertedLuminanceSource::getMatrix() const { - ArrayRef matrix = delegate->getMatrix(); - int length = getWidth() * getHeight(); - ArrayRef invertedMatrix(length); - for (int i = 0; i < length; i++) { - invertedMatrix[i] = (byte) (255 - (matrix[i] & 0xFF)); - } - return invertedMatrix; -} - -zxing::boolean InvertedLuminanceSource::isCropSupported() const { - return delegate->isCropSupported(); -} - -Ref InvertedLuminanceSource::crop(int left, int top, int width, int height) const { - return Ref(new InvertedLuminanceSource(delegate->crop(left, top, width, height))); -} - -boolean InvertedLuminanceSource::isRotateSupported() const { - return delegate->isRotateSupported(); -} - -Ref InvertedLuminanceSource::invert() const { - return delegate; -} - -Ref InvertedLuminanceSource::rotateCounterClockwise() const { - return Ref(new InvertedLuminanceSource(delegate->rotateCounterClockwise())); -} - diff --git a/cpp/core/src/zxing/InvertedLuminanceSource.h b/cpp/core/src/zxing/InvertedLuminanceSource.h deleted file mode 100644 index 9f5a7cc44..000000000 --- a/cpp/core/src/zxing/InvertedLuminanceSource.h +++ /dev/null @@ -1,48 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __INVERTEDLUMINANCESOURCE_H__ -#define __INVERTEDLUMINANCESOURCE_H__ -/* - * Copyright 2013 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - -class InvertedLuminanceSource : public LuminanceSource { -private: - typedef LuminanceSource Super; - const Ref delegate; - -public: - InvertedLuminanceSource(Ref const&); - - ArrayRef getRow(int y, ArrayRef row) const; - ArrayRef getMatrix() const; - - boolean isCropSupported() const; - Ref crop(int left, int top, int width, int height) const; - - boolean isRotateSupported() const; - - virtual Ref invert() const; - - Ref rotateCounterClockwise() const; -}; - -} - -#endif /* INVERTEDLUMINANCESOURCE_H_ */ diff --git a/cpp/core/src/zxing/LuminanceSource.cpp b/cpp/core/src/zxing/LuminanceSource.cpp deleted file mode 100644 index 3c92fc454..000000000 --- a/cpp/core/src/zxing/LuminanceSource.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * LuminanceSource.cpp - * zxing - * - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -using zxing::Ref; -using zxing::LuminanceSource; - -LuminanceSource::LuminanceSource(int width_, int height_) :width(width_), height(height_) {} - -LuminanceSource::~LuminanceSource() {} - -bool LuminanceSource::isCropSupported() const { - return false; -} - -Ref LuminanceSource::crop(int, int, int, int) const { - throw IllegalArgumentException("This luminance source does not support cropping."); -} - -bool LuminanceSource::isRotateSupported() const { - return false; -} - -Ref LuminanceSource::rotateCounterClockwise() const { - throw IllegalArgumentException("This luminance source does not support rotation."); -} - -LuminanceSource::operator std::string() const { - ArrayRef row; - std::ostringstream oss; - for (int y = 0; y < getHeight(); y++) { - row = getRow(y, row); - for (int x = 0; x < getWidth(); x++) { - int luminance = row[x] & 0xFF; - char c; - if (luminance < 0x40) { - c = '#'; - } else if (luminance < 0x80) { - c = '+'; - } else if (luminance < 0xC0) { - c = '.'; - } else { - c = ' '; - } - oss << c; - } - oss << '\n'; - } - return oss.str(); -} - -Ref LuminanceSource::invert() const { - - // N.B.: this only works because we use counted objects with the - // count in the object. This is _not_ how things like shared_ptr - // work. They do not allow you to make a smart pointer from a native - // pointer more than once. If we ever switch to (something like) - // shared_ptr's, the luminace source is going to have keep a weak - // pointer to itself from which it can create a strong pointer as - // needed. And, FWIW, that has nasty semantics in the face of - // exceptions during construction. - - return Ref - (new InvertedLuminanceSource(Ref(const_cast(this)))); -} diff --git a/cpp/core/src/zxing/LuminanceSource.h b/cpp/core/src/zxing/LuminanceSource.h deleted file mode 100644 index aec23b0a4..000000000 --- a/cpp/core/src/zxing/LuminanceSource.h +++ /dev/null @@ -1,59 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __LUMINANCESOURCE_H__ -#define __LUMINANCESOURCE_H__ -/* - * LuminanceSource.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { - -class LuminanceSource : public Counted { - private: - const int width; - const int height; - - public: - LuminanceSource(int width, int height); - virtual ~LuminanceSource(); - - int getWidth() const { return width; } - int getHeight() const { return height; } - - // Callers take ownership of the returned memory and must call delete [] on it themselves. - virtual ArrayRef getRow(int y, ArrayRef row) const = 0; - virtual ArrayRef getMatrix() const = 0; - - virtual bool isCropSupported() const; - virtual Ref crop(int left, int top, int width, int height) const; - - virtual bool isRotateSupported() const; - - virtual Ref invert() const; - - virtual Ref rotateCounterClockwise() const; - - operator std::string () const; -}; - -} - -#endif /* LUMINANCESOURCE_H_ */ diff --git a/cpp/core/src/zxing/MultiFormatReader.cpp b/cpp/core/src/zxing/MultiFormatReader.cpp deleted file mode 100644 index fd2137371..000000000 --- a/cpp/core/src/zxing/MultiFormatReader.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include - -using zxing::Ref; -using zxing::Result; -using zxing::MultiFormatReader; - -// VC++ -using zxing::DecodeHints; -using zxing::BinaryBitmap; - -MultiFormatReader::MultiFormatReader() {} - -Ref MultiFormatReader::decode(Ref image) { - setHints(DecodeHints::DEFAULT_HINT); - return decodeInternal(image); -} - -Ref MultiFormatReader::decode(Ref image, DecodeHints hints) { - setHints(hints); - return decodeInternal(image); -} - -Ref MultiFormatReader::decodeWithState(Ref image) { - // Make sure to set up the default state so we don't crash - if (readers_.size() == 0) { - setHints(DecodeHints::DEFAULT_HINT); - } - return decodeInternal(image); -} - -void MultiFormatReader::setHints(DecodeHints hints) { - hints_ = hints; - readers_.clear(); - bool tryHarder = hints.getTryHarder(); - - bool addOneDReader = hints.containsFormat(BarcodeFormat::UPC_E) || - hints.containsFormat(BarcodeFormat::UPC_A) || - hints.containsFormat(BarcodeFormat::UPC_E) || - hints.containsFormat(BarcodeFormat::EAN_13) || - hints.containsFormat(BarcodeFormat::EAN_8) || - hints.containsFormat(BarcodeFormat::CODABAR) || - hints.containsFormat(BarcodeFormat::CODE_39) || - hints.containsFormat(BarcodeFormat::CODE_93) || - hints.containsFormat(BarcodeFormat::CODE_128) || - hints.containsFormat(BarcodeFormat::ITF) || - hints.containsFormat(BarcodeFormat::RSS_14) || - hints.containsFormat(BarcodeFormat::RSS_EXPANDED); - if (addOneDReader && !tryHarder) { - readers_.push_back(Ref(new zxing::oned::MultiFormatOneDReader(hints))); - } - if (hints.containsFormat(BarcodeFormat::QR_CODE)) { - readers_.push_back(Ref(new zxing::qrcode::QRCodeReader())); - } - if (hints.containsFormat(BarcodeFormat::DATA_MATRIX)) { - readers_.push_back(Ref(new zxing::datamatrix::DataMatrixReader())); - } - if (hints.containsFormat(BarcodeFormat::AZTEC)) { - readers_.push_back(Ref(new zxing::aztec::AztecReader())); - } - if (hints.containsFormat(BarcodeFormat::PDF_417)) { - readers_.push_back(Ref(new zxing::pdf417::PDF417Reader())); - } - /* - if (hints.contains(BarcodeFormat.MAXICODE)) { - readers.add(new MaxiCodeReader()); - } - */ - if (addOneDReader && tryHarder) { - readers_.push_back(Ref(new zxing::oned::MultiFormatOneDReader(hints))); - } - if (readers_.size() == 0) { - if (!tryHarder) { - readers_.push_back(Ref(new zxing::oned::MultiFormatOneDReader(hints))); - } - readers_.push_back(Ref(new zxing::qrcode::QRCodeReader())); - readers_.push_back(Ref(new zxing::datamatrix::DataMatrixReader())); - readers_.push_back(Ref(new zxing::aztec::AztecReader())); - readers_.push_back(Ref(new zxing::pdf417::PDF417Reader())); - // readers.add(new MaxiCodeReader()); - - if (tryHarder) { - readers_.push_back(Ref(new zxing::oned::MultiFormatOneDReader(hints))); - } - } -} - -Ref MultiFormatReader::decodeInternal(Ref image) { - for (unsigned int i = 0; i < readers_.size(); i++) { - try { - return readers_[i]->decode(image, hints_); - } catch (ReaderException const& re) { - (void)re; - // continue - } - } - throw ReaderException("No code detected"); -} - -MultiFormatReader::~MultiFormatReader() {} diff --git a/cpp/core/src/zxing/MultiFormatReader.h b/cpp/core/src/zxing/MultiFormatReader.h deleted file mode 100644 index af07899f9..000000000 --- a/cpp/core/src/zxing/MultiFormatReader.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef __MULTI_FORMAT_READER_H__ -#define __MULTI_FORMAT_READER_H__ - -/* - * MultiFormatBarcodeReader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { - class MultiFormatReader : public Reader { - private: - Ref decodeInternal(Ref image); - - std::vector > readers_; - DecodeHints hints_; - - public: - MultiFormatReader(); - - Ref decode(Ref image); - Ref decode(Ref image, DecodeHints hints); - Ref decodeWithState(Ref image); - void setHints(DecodeHints hints); - ~MultiFormatReader(); - }; -} - -#endif diff --git a/cpp/core/src/zxing/NotFoundException.h b/cpp/core/src/zxing/NotFoundException.h deleted file mode 100644 index d44336259..000000000 --- a/cpp/core/src/zxing/NotFoundException.h +++ /dev/null @@ -1,35 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __NOT_FOUND_EXCEPTION_H__ -#define __NOT_FOUND_EXCEPTION_H__ - -/* - * Copyright 20011 ZXing authors - * - * 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 - -namespace zxing { - -class NotFoundException : public ReaderException { -public: - NotFoundException() throw() {} - NotFoundException(const char *msg) throw() : ReaderException(msg) {} - ~NotFoundException() throw() {} -}; - -} - -#endif // __NOT_FOUND_EXCEPTION_H__ diff --git a/cpp/core/src/zxing/Reader.cpp b/cpp/core/src/zxing/Reader.cpp deleted file mode 100644 index d64f8251f..000000000 --- a/cpp/core/src/zxing/Reader.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Reader.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -Reader::~Reader() { } - -Ref Reader::decode(Ref image) { - return decode(image, DecodeHints::DEFAULT_HINT); -} - -} diff --git a/cpp/core/src/zxing/Reader.h b/cpp/core/src/zxing/Reader.h deleted file mode 100644 index 05c741b4e..000000000 --- a/cpp/core/src/zxing/Reader.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef __READER_H__ -#define __READER_H__ - -/* - * Reader.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { - - class Reader : public Counted { - protected: - Reader() {} - public: - virtual Ref decode(Ref image); - virtual Ref decode(Ref image, DecodeHints hints) = 0; - virtual ~Reader(); -}; - -} - -#endif // __READER_H__ diff --git a/cpp/core/src/zxing/ReaderException.h b/cpp/core/src/zxing/ReaderException.h deleted file mode 100644 index b09aea3bd..000000000 --- a/cpp/core/src/zxing/ReaderException.h +++ /dev/null @@ -1,37 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __READER_EXCEPTION_H__ -#define __READER_EXCEPTION_H__ - -/* - * ReaderException.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -class ReaderException : public Exception { - public: - ReaderException() throw() {} - ReaderException(char const* msg) throw() : Exception(msg) {} - ~ReaderException() throw() {} -}; - -} - -#endif // __READER_EXCEPTION_H__ diff --git a/cpp/core/src/zxing/Result.cpp b/cpp/core/src/zxing/Result.cpp deleted file mode 100644 index 17d8700a2..000000000 --- a/cpp/core/src/zxing/Result.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Result.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -using zxing::Result; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::String; -using zxing::ResultPoint; - -// VC++ -using zxing::BarcodeFormat; - -Result::Result(Ref text, - ArrayRef rawBytes, - ArrayRef< Ref > resultPoints, - BarcodeFormat format) : - text_(text), rawBytes_(rawBytes), resultPoints_(resultPoints), format_(format) { -} - -Result::~Result() { -} - -Ref Result::getText() { - return text_; -} - -ArrayRef Result::getRawBytes() { - return rawBytes_; -} - -ArrayRef< Ref > const& Result::getResultPoints() const { - return resultPoints_; -} - -ArrayRef< Ref >& Result::getResultPoints() { - return resultPoints_; -} - -zxing::BarcodeFormat Result::getBarcodeFormat() const { - return format_; -} diff --git a/cpp/core/src/zxing/Result.h b/cpp/core/src/zxing/Result.h deleted file mode 100644 index 1a5da7b8f..000000000 --- a/cpp/core/src/zxing/Result.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef __RESULT_H__ -#define __RESULT_H__ - -/* - * Result.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -namespace zxing { - -class Result : public Counted { -private: - Ref text_; - ArrayRef rawBytes_; - ArrayRef< Ref > resultPoints_; - BarcodeFormat format_; - -public: - Result(Ref text, - ArrayRef rawBytes, - ArrayRef< Ref > resultPoints, - BarcodeFormat format); - ~Result(); - Ref getText(); - ArrayRef getRawBytes(); - ArrayRef< Ref > const& getResultPoints() const; - ArrayRef< Ref >& getResultPoints(); - BarcodeFormat getBarcodeFormat() const; - - friend std::ostream& operator<<(std::ostream &out, Result& result); -}; - -} -#endif // __RESULT_H__ diff --git a/cpp/core/src/zxing/ResultIO.cpp b/cpp/core/src/zxing/ResultIO.cpp deleted file mode 100644 index e682dfab4..000000000 --- a/cpp/core/src/zxing/ResultIO.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * ResultIO.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -using zxing::Result; -using std::ostream; - -ostream& zxing::operator<<(ostream &out, Result& result) { - if (result.text_ != 0) { - out << result.text_->getText(); - } else { - out << "[" << result.rawBytes_->size() << " bytes]"; - } - return out; -} diff --git a/cpp/core/src/zxing/ResultPoint.cpp b/cpp/core/src/zxing/ResultPoint.cpp deleted file mode 100644 index 44bbc4b6c..000000000 --- a/cpp/core/src/zxing/ResultPoint.cpp +++ /dev/null @@ -1,108 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * ResultPoint.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include - -using zxing::common::detector::MathUtils; - -namespace zxing { - -ResultPoint::ResultPoint() : posX_(0), posY_(0) {} - -ResultPoint::ResultPoint(float x, float y) : posX_(x), posY_(y) {} - -ResultPoint::ResultPoint(int x, int y) : posX_(float(x)), posY_(float(y)) {} - -ResultPoint::~ResultPoint() {} - -float ResultPoint::getX() const { - return posX_; -} - -float ResultPoint::getY() const { - return posY_; -} - -bool ResultPoint::equals(Ref other) { - return posX_ == other->getX() && posY_ == other->getY(); -} - -/** - *

Orders an array of three ResultPoints in an order [A,B,C] such that AB < AC and - * BC < AC and the angle between BC and BA is less than 180 degrees. - */ -void ResultPoint::orderBestPatterns(std::vector > &patterns) { - // Find distances between pattern centers - float zeroOneDistance = distance(patterns[0]->getX(), patterns[1]->getX(),patterns[0]->getY(), patterns[1]->getY()); - float oneTwoDistance = distance(patterns[1]->getX(), patterns[2]->getX(),patterns[1]->getY(), patterns[2]->getY()); - float zeroTwoDistance = distance(patterns[0]->getX(), patterns[2]->getX(),patterns[0]->getY(), patterns[2]->getY()); - - Ref pointA, pointB, pointC; - // Assume one closest to other two is B; A and C will just be guesses at first - if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) { - pointB = patterns[0]; - pointA = patterns[1]; - pointC = patterns[2]; - } else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) { - pointB = patterns[1]; - pointA = patterns[0]; - pointC = patterns[2]; - } else { - pointB = patterns[2]; - pointA = patterns[0]; - pointC = patterns[1]; - } - - // Use cross product to figure out whether A and C are correct or flipped. - // This asks whether BC x BA has a positive z component, which is the arrangement - // we want for A, B, C. If it's negative, then we've got it flipped around and - // should swap A and C. - if (crossProductZ(pointA, pointB, pointC) < 0.0f) { - Ref temp = pointA; - pointA = pointC; - pointC = temp; - } - - patterns[0] = pointA; - patterns[1] = pointB; - patterns[2] = pointC; -} - - float ResultPoint::distance(Ref pattern1, Ref pattern2) { - return MathUtils::distance(pattern1->posX_, - pattern1->posY_, - pattern2->posX_, - pattern2->posY_); -} - -float ResultPoint::distance(float x1, float x2, float y1, float y2) { - float xDiff = x1 - x2; - float yDiff = y1 - y2; - return (float) sqrt((double) (xDiff * xDiff + yDiff * yDiff)); -} - -float ResultPoint::crossProductZ(Ref pointA, Ref pointB, Ref pointC) { - float bX = pointB->getX(); - float bY = pointB->getY(); - return ((pointC->getX() - bX) * (pointA->getY() - bY)) - ((pointC->getY() - bY) * (pointA->getX() - bX)); -} -} diff --git a/cpp/core/src/zxing/ResultPoint.h b/cpp/core/src/zxing/ResultPoint.h deleted file mode 100644 index d2d6eae33..000000000 --- a/cpp/core/src/zxing/ResultPoint.h +++ /dev/null @@ -1,55 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __RESULT_POINT_H__ -#define __RESULT_POINT_H__ - -/* - * ResultPoint.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - -class ResultPoint : public Counted { -protected: - const float posX_; - const float posY_; - -public: - ResultPoint(); - ResultPoint(float x, float y); - ResultPoint(int x, int y); - virtual ~ResultPoint(); - - virtual float getX() const; - virtual float getY() const; - - bool equals(Ref other); - - static void orderBestPatterns(std::vector > &patterns); - static float distance(Ref point1, Ref point2); - static float distance(float x1, float x2, float y1, float y2); - -private: - static float crossProductZ(Ref pointA, Ref pointB, Ref pointC); -}; - -} - -#endif // __RESULT_POINT_H__ diff --git a/cpp/core/src/zxing/ResultPointCallback.cpp b/cpp/core/src/zxing/ResultPointCallback.cpp deleted file mode 100644 index 723942aba..000000000 --- a/cpp/core/src/zxing/ResultPointCallback.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * ResultPointCallback.cpp - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -ResultPointCallback::~ResultPointCallback() {} - -} diff --git a/cpp/core/src/zxing/ResultPointCallback.h b/cpp/core/src/zxing/ResultPointCallback.h deleted file mode 100644 index 26876563a..000000000 --- a/cpp/core/src/zxing/ResultPointCallback.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __RESULT_POINT_CALLBACK_H__ -#define __RESULT_POINT_CALLBACK_H__ - -/* - * ResultPointCallback.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -class ResultPoint; - -class ResultPointCallback : public Counted { -protected: - ResultPointCallback() {} -public: - virtual void foundPossibleResultPoint(ResultPoint const& point) = 0; - virtual ~ResultPointCallback(); -}; - -} - -#endif // __RESULT_POINT_CALLBACK_H__ diff --git a/cpp/core/src/zxing/ZXing.h b/cpp/core/src/zxing/ZXing.h deleted file mode 100644 index 0b6918dc8..000000000 --- a/cpp/core/src/zxing/ZXing.h +++ /dev/null @@ -1,133 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2013 ZXing authors All rights reserved. - * - * 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. - */ -#ifndef __ZXING_H_ -#define __ZXING_H_ - -#define ZXING_ARRAY_LEN(v) ((int)(sizeof(v)/sizeof(v[0]))) -#define ZX_LOG_DIGITS(digits) \ - ((digits == 8) ? 3 : \ - ((digits == 16) ? 4 : \ - ((digits == 32) ? 5 : \ - ((digits == 64) ? 6 : \ - ((digits == 128) ? 7 : \ - (-1)))))) - -#ifndef ZXING_DEBUG -#define ZXING_DEBUG 0 -#endif - -namespace zxing { -typedef char byte; -typedef bool boolean; -} - -#include - -#if defined(_WIN32) || defined(_WIN64) - -#include - -namespace zxing { -inline bool isnan(float v) {return _isnan(v) != 0;} -inline bool isnan(double v) {return _isnan(v) != 0;} -inline float nan() {return std::numeric_limits::quiet_NaN();} -} - -#else - -#include - -namespace zxing { -inline bool isnan(float v) {return std::isnan(v);} -inline bool isnan(double v) {return std::isnan(v);} -inline float nan() {return std::numeric_limits::quiet_NaN();} -} - -#endif - -#if ZXING_DEBUG - -#include -#include - -using std::cout; -using std::cerr; -using std::endl; -using std::flush; -using std::string; -using std::ostream; - -#if ZXING_DEBUG_TIMER - -#include - -namespace zxing { - -class DebugTimer { -public: - DebugTimer(char const* string_) : chars(string_) { - gettimeofday(&start, 0); - } - - DebugTimer(std::string const& string_) : chars(0), string(string_) { - gettimeofday(&start, 0); - } - - void mark(char const* string) { - struct timeval end; - gettimeofday(&end, 0); - int diff = - (end.tv_sec - start.tv_sec)*1000*1000+(end.tv_usec - start.tv_usec); - - cerr << diff << " " << string << '\n'; - } - - void mark(std::string string) { - mark(string.c_str()); - } - - ~DebugTimer() { - if (chars) { - mark(chars); - } else { - mark(string.c_str()); - } - } - -private: - char const* const chars; - std::string string; - struct timeval start; -}; - -} - -#define ZXING_TIME(string) DebugTimer __timer__ (string) -#define ZXING_TIME_MARK(string) __timer__.mark(string) - -#endif - -#endif // ZXING_DEBUG - -#ifndef ZXING_TIME -#define ZXING_TIME(string) (void)0 -#endif -#ifndef ZXING_TIME_MARK -#define ZXING_TIME_MARK(string) (void)0 -#endif - -#endif diff --git a/cpp/core/src/zxing/aztec/AztecDetectorResult.cpp b/cpp/core/src/zxing/aztec/AztecDetectorResult.cpp deleted file mode 100644 index eacd3b591..000000000 --- a/cpp/core/src/zxing/aztec/AztecDetectorResult.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * AtztecDetecorResult.cpp - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 - -using zxing::aztec::AztecDetectorResult; - -// VC++ -using zxing::Ref; -using zxing::ArrayRef; -using zxing::BitMatrix; -using zxing::ResultPoint; - - -AztecDetectorResult::AztecDetectorResult(Ref bits, - ArrayRef< Ref > points, - bool compact, - int nbDatablocks, - int nbLayers) - : DetectorResult(bits, points), - compact_(compact), - nbDatablocks_(nbDatablocks), - nbLayers_(nbLayers) { - } - -bool AztecDetectorResult::isCompact() { - return compact_; -} - -int AztecDetectorResult::getNBDatablocks() { - return nbDatablocks_; -} - -int AztecDetectorResult::getNBLayers() { - return nbLayers_; -} diff --git a/cpp/core/src/zxing/aztec/AztecDetectorResult.h b/cpp/core/src/zxing/aztec/AztecDetectorResult.h deleted file mode 100644 index 3e0557980..000000000 --- a/cpp/core/src/zxing/aztec/AztecDetectorResult.h +++ /dev/null @@ -1,48 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * AtztecDetecorResult.h - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 - -#ifndef ZXingWidget_AtztecDetecorResult_h -#define ZXingWidget_AtztecDetecorResult_h - -namespace zxing { -namespace aztec { - -class AztecDetectorResult : public DetectorResult { - private: - bool compact_; - int nbDatablocks_, nbLayers_; - public: - AztecDetectorResult(Ref bits, - ArrayRef< Ref > points, - bool compact, - int nbDatablocks, - int nbLayers); - bool isCompact(); - int getNBDatablocks(); - int getNBLayers(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/aztec/AztecReader.cpp b/cpp/core/src/zxing/aztec/AztecReader.cpp deleted file mode 100644 index 14fb6617e..000000000 --- a/cpp/core/src/zxing/aztec/AztecReader.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * AztecReader.cpp - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -using zxing::Ref; -using zxing::ArrayRef; -using zxing::Result; -using zxing::aztec::AztecReader; - -// VC++ -using zxing::BinaryBitmap; -using zxing::DecodeHints; - -AztecReader::AztecReader() : decoder_() { - // nothing -} - -Ref AztecReader::decode(Ref image) { - Detector detector(image->getBlackMatrix()); - - Ref detectorResult(detector.detect()); - - ArrayRef< Ref > points(detectorResult->getPoints()); - - Ref decoderResult(decoder_.decode(detectorResult)); - - Ref result(new Result(decoderResult->getText(), - decoderResult->getRawBytes(), - points, - BarcodeFormat::AZTEC)); - - return result; -} - -Ref AztecReader::decode(Ref image, DecodeHints) { - //cout << "decoding with hints not supported for aztec" << "\n" << flush; - return this->decode(image); -} - -AztecReader::~AztecReader() { - // nothing -} - -zxing::aztec::Decoder& AztecReader::getDecoder() { - return decoder_; -} diff --git a/cpp/core/src/zxing/aztec/AztecReader.h b/cpp/core/src/zxing/aztec/AztecReader.h deleted file mode 100644 index 97850029c..000000000 --- a/cpp/core/src/zxing/aztec/AztecReader.h +++ /dev/null @@ -1,49 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * AztecReader.h - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 -#include -#include - -#ifndef ZXingWidget_AztecReader_h -#define ZXingWidget_AztecReader_h - -namespace zxing { -namespace aztec { - -class AztecReader : public Reader { - private: - Decoder decoder_; - - protected: - Decoder &getDecoder(); - - public: - AztecReader(); - virtual Ref decode(Ref image); - virtual Ref decode(Ref image, DecodeHints hints); - virtual ~AztecReader(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/aztec/decoder/Decoder.cpp b/cpp/core/src/zxing/aztec/decoder/Decoder.cpp deleted file mode 100644 index 4027c40fb..000000000 --- a/cpp/core/src/zxing/aztec/decoder/Decoder.cpp +++ /dev/null @@ -1,489 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Decoder.cpp - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 -#ifndef NO_ICONV -#include -#endif -#include -#include -#include -#include -#include -#include -#include - -using zxing::aztec::Decoder; -using zxing::DecoderResult; -using zxing::String; -using zxing::BitArray; -using zxing::BitMatrix; -using zxing::Ref; - -using std::string; - -namespace { - void add(string& result, char character) { -#ifndef NO_ICONV - char character2 = character & 0xff; - char s[] = {character2}; - char* ss = s; - size_t sl = sizeof(s); - char d[4]; - char* ds = d; - size_t dl = sizeof(d); - iconv_t ic = iconv_open("UTF-8", "ISO-8859-1"); - iconv(ic, &ss, &sl, &ds, &dl); - iconv_close(ic); - d[sizeof(d)-dl] = 0; - result.append(d); -#else - result.push_back(character); -#endif - } - - const int NB_BITS_COMPACT[] = { - 0, 104, 240, 408, 608 - }; - - const int NB_BITS[] = { - 0, 128, 288, 480, 704, 960, 1248, 1568, 1920, 2304, 2720, 3168, 3648, 4160, 4704, 5280, 5888, 6528, - 7200, 7904, 8640, 9408, 10208, 11040, 11904, 12800, 13728, 14688, 15680, 16704, 17760, 18848, 19968 - }; - - const int NB_DATABLOCK_COMPACT[] = { - 0, 17, 40, 51, 76 - }; - - const int NB_DATABLOCK[] = { - 0, 21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790, 864, - 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664 - }; - - const char* UPPER_TABLE[] = { - "CTRL_PS", " ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", - "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "CTRL_LL", "CTRL_ML", "CTRL_DL", "CTRL_BS" - }; - - const char* LOWER_TABLE[] = { - "CTRL_PS", " ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", - "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "CTRL_US", "CTRL_ML", "CTRL_DL", "CTRL_BS" - }; - - const char* MIXED_TABLE[] = { - "CTRL_PS", " ", "\1", "\2", "\3", "\4", "\5", "\6", "\7", "\b", "\t", "\n", - "\13", "\f", "\r", "\33", "\34", "\35", "\36", "\37", "@", "\\", "^", "_", - "`", "|", "~", "\177", "CTRL_LL", "CTRL_UL", "CTRL_PL", "CTRL_BS" - }; - - const char* PUNCT_TABLE[] = { - "", "\r", "\r\n", ". ", ", ", ": ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", - "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "[", "]", "{", "}", "CTRL_UL" - }; - - const char* DIGIT_TABLE[] = { - "CTRL_PS", " ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ",", ".", "CTRL_UL", "CTRL_US" - }; -} - -Decoder::Table Decoder::getTable(char t) { - switch (t) { - case 'L': - return LOWER; - case 'P': - return PUNCT; - case 'M': - return MIXED; - case 'D': - return DIGIT; - case 'B': - return BINARY; - case 'U': - default: - return UPPER; - } -} - -const char* Decoder::getCharacter(zxing::aztec::Decoder::Table table, int code) { - switch (table) { - case UPPER: - return UPPER_TABLE[code]; - case LOWER: - return LOWER_TABLE[code]; - case MIXED: - return MIXED_TABLE[code]; - case PUNCT: - return PUNCT_TABLE[code]; - case DIGIT: - return DIGIT_TABLE[code]; - default: - return ""; - } -} - -Decoder::Decoder() { - // nothing -} - -Ref Decoder::decode(Ref detectorResult) { - ddata_ = detectorResult; - - // std::printf("getting bits\n"); - - Ref matrix = detectorResult->getBits(); - - if (!ddata_->isCompact()) { - // std::printf("removing lines\n"); - matrix = removeDashedLines(ddata_->getBits()); - } - - // std::printf("extracting bits\n"); - Ref rawbits = extractBits(matrix); - - // std::printf("correcting bits\n"); - Ref aCorrectedBits = correctBits(rawbits); - - // std::printf("decoding bits\n"); - Ref result = getEncodedData(aCorrectedBits); - - // std::printf("constructing array\n"); - ArrayRef arrayOut(aCorrectedBits->getSize()); - for (int i = 0; i < aCorrectedBits->count(); i++) { - arrayOut[i] = (char)aCorrectedBits->get(i); - } - - // std::printf("returning\n"); - - return Ref(new DecoderResult(arrayOut, result)); -} - -Ref Decoder::getEncodedData(Ref correctedBits) { - int endIndex = codewordSize_ * ddata_->getNBDatablocks() - invertedBitCount_; - if (endIndex > (int)correctedBits->getSize()) { - // std::printf("invalid input\n"); - throw FormatException("invalid input data"); - } - - Table lastTable = UPPER; - Table table = UPPER; - int startIndex = 0; - std::string result; - bool end = false; - bool shift = false; - bool switchShift = false; - bool binaryShift = false; - - while (!end) { - // std::printf("decoooooding\n"); - - if (shift) { - switchShift = true; - } else { - lastTable = table; - } - - int code; - if (binaryShift) { - if (endIndex - startIndex < 5) { - break; - } - - int length = readCode(correctedBits, startIndex, 5); - startIndex += 5; - if (length == 0) { - if (endIndex - startIndex < 11) { - break; - } - - length = readCode(correctedBits, startIndex, 11) + 31; - startIndex += 11; - } - for (int charCount = 0; charCount < length; charCount++) { - if (endIndex - startIndex < 8) { - end = true; - break; - } - - code = readCode(correctedBits, startIndex, 8); - add(result, code); - startIndex += 8; - } - binaryShift = false; - } else { - if (table == BINARY) { - if (endIndex - startIndex < 8) { - break; - } - code = readCode(correctedBits, startIndex, 8); - startIndex += 8; - - add(result, code); - } else { - int size = 5; - - if (table == DIGIT) { - size = 4; - } - - if (endIndex - startIndex < size) { - break; - } - - code = readCode(correctedBits, startIndex, size); - startIndex += size; - - const char *str = getCharacter(table, code); - std::string string(str); - if ((int)string.find("CTRL_") != -1) { - table = getTable(str[5]); - - if (str[6] == 'S') { - shift = true; - if (str[5] == 'B') { - binaryShift = true; - } - } - } else { - result.append(string); - } - - } - } - - if (switchShift) { - table = lastTable; - shift = false; - switchShift = false; - } - - - } - - return Ref(new String(result)); - -} - -Ref Decoder::correctBits(Ref rawbits) { - //return rawbits; - // std::printf("decoding stuff:%d datablocks in %d layers\n", ddata_->getNBDatablocks(), ddata_->getNBLayers()); - - Ref gf = GenericGF::AZTEC_DATA_6; - - if (ddata_->getNBLayers() <= 2) { - codewordSize_ = 6; - gf = GenericGF::AZTEC_DATA_6; - } else if (ddata_->getNBLayers() <= 8) { - codewordSize_ = 8; - gf = GenericGF::AZTEC_DATA_8; - } else if (ddata_->getNBLayers() <= 22) { - codewordSize_ = 10; - gf = GenericGF::AZTEC_DATA_10; - } else { - codewordSize_ = 12; - gf = GenericGF::AZTEC_DATA_12; - } - - int numDataCodewords = ddata_->getNBDatablocks(); - int numECCodewords; - int offset; - - if (ddata_->isCompact()) { - offset = NB_BITS_COMPACT[ddata_->getNBLayers()] - numCodewords_ * codewordSize_; - numECCodewords = NB_DATABLOCK_COMPACT[ddata_->getNBLayers()] - numDataCodewords; - } else { - offset = NB_BITS[ddata_->getNBLayers()] - numCodewords_ * codewordSize_; - numECCodewords = NB_DATABLOCK[ddata_->getNBLayers()] - numDataCodewords; - } - - ArrayRef dataWords(numCodewords_); - - for (int i = 0; i < numCodewords_; i++) { - int flag = 1; - for (int j = 1; j <= codewordSize_; j++) { - if (rawbits->get(codewordSize_ * i + codewordSize_ - j + offset)) { - dataWords[i] += flag; - } - flag <<= 1; - } - - // - // - // - } - - try { - ReedSolomonDecoder rsDecoder(gf); - rsDecoder.decode(dataWords, numECCodewords); - } catch (ReedSolomonException const& ignored) { - (void)ignored; - // std::printf("got reed solomon exception:%s, throwing formatexception\n", rse.what()); - throw FormatException("rs decoding failed"); - } catch (IllegalArgumentException const& iae) { - (void)iae; - // std::printf("illegal argument exception: %s", iae.what()); - } - - offset = 0; - invertedBitCount_ = 0; - - Ref correctedBits(new BitArray(numDataCodewords * codewordSize_)); - for (int i = 0; i < numDataCodewords; i++) { - - bool seriesColor = false; - int seriesCount = 0; - int flag = 1 << (codewordSize_ - 1); - - for (int j = 0; j < codewordSize_; j++) { - - bool color = (dataWords[i] & flag) == flag; - - if (seriesCount == codewordSize_ - 1) { - - if (color == seriesColor) { - throw FormatException("bit was not inverted"); - } - - seriesColor = false; - seriesCount = 0; - offset++; - invertedBitCount_++; - - } else { - - if (seriesColor == color) { - seriesCount++; - } else { - seriesCount = 1; - seriesColor = color; - } - - if (color) correctedBits->set(i * codewordSize_ + j - offset); - - } - - flag = ((unsigned int)flag) >> 1; - - } - } - - return correctedBits; -} - -Ref Decoder::extractBits(Ref matrix) { - std::vector rawbits; - - if (ddata_->isCompact()) { - if (ddata_->getNBLayers() > 5) { //NB_BITS_COMPACT length - throw FormatException("data is too long"); - } - rawbits = std::vector(NB_BITS_COMPACT[ddata_->getNBLayers()]); - numCodewords_ = NB_DATABLOCK_COMPACT[ddata_->getNBLayers()]; - } else { - if (ddata_->getNBLayers() > 33) { //NB_BITS length - throw FormatException("data is too long"); - } - rawbits = std::vector(NB_BITS[ddata_->getNBLayers()]); - numCodewords_ = NB_DATABLOCK[ddata_->getNBLayers()]; - } - - int layer = ddata_->getNBLayers(); - int size = matrix->getHeight(); - int rawbitsOffset = 0; - int matrixOffset = 0; - - - while (layer != 0) { - - int flip = 0; - for (int i = 0; i < 2 * size - 4; i++) { - rawbits[rawbitsOffset + i] = matrix->get(matrixOffset + flip, matrixOffset + i / 2); - rawbits[rawbitsOffset + 2 * size - 4 + i] = matrix->get(matrixOffset + i / 2, matrixOffset + size - 1 - flip); - flip = (flip + 1) % 2; - } - - flip = 0; - for (int i = 2 * size + 1; i > 5; i--) { - rawbits[rawbitsOffset + 4 * size - 8 + (2 * size - i) + 1] = - matrix->get(matrixOffset + size - 1 - flip, matrixOffset + i / 2 - 1); - rawbits[rawbitsOffset + 6 * size - 12 + (2 * size - i) + 1] = - matrix->get(matrixOffset + i / 2 - 1, matrixOffset + flip); - flip = (flip + 1) % 2; - } - - matrixOffset += 2; - rawbitsOffset += 8 * size - 16; - layer--; - size -= 4; - - } - - Ref returnValue(new BitArray(rawbits.size())); - for (int i = 0; i < (int)rawbits.size(); i++) { - if (rawbits[i]) returnValue->set(i); - } - - return returnValue; - -} - -Ref Decoder::removeDashedLines(Ref matrix) { - int nbDashed = 1 + 2 * ((matrix->getWidth() - 1) / 2 / 16); - Ref newMatrix(new BitMatrix(matrix->getWidth() - nbDashed, matrix->getHeight() - nbDashed)); - - int nx = 0; - - for (int x = 0; x < (int)matrix->getWidth(); x++) { - - if ((matrix->getWidth() / 2 - x) % 16 == 0) { - continue; - } - - int ny = 0; - for (int y = 0; y < (int)matrix->getHeight(); y++) { - - if ((matrix->getWidth() / 2 - y) % 16 == 0) { - continue; - } - - if (matrix->get(x, y)) { - newMatrix->set(nx, ny); - } - ny++; - - } - nx++; - - } - return newMatrix; -} - -int Decoder::readCode(Ref rawbits, int startIndex, int length) { - int res = 0; - - for (int i = startIndex; i < startIndex + length; i++) { - res <<= 1; - if (rawbits->get(i)) { - res ++; - } - } - - return res; -} diff --git a/cpp/core/src/zxing/aztec/decoder/Decoder.h b/cpp/core/src/zxing/aztec/decoder/Decoder.h deleted file mode 100644 index d9f5cceef..000000000 --- a/cpp/core/src/zxing/aztec/decoder/Decoder.h +++ /dev/null @@ -1,69 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Decoder.h - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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. - */ - -#ifndef __ZXING_AZTEC_DECODER_DECODER_H__ -#define __ZXING_AZTEC_DECODER_DECODER_H__ - -#include -#include -#include - -namespace zxing { - -class DecoderResult; - -namespace aztec { - -class Decoder : public Counted { - private: - enum Table { - UPPER, - LOWER, - MIXED, - DIGIT, - PUNCT, - BINARY - }; - - static Table getTable(char t); - static const char* getCharacter(Table table, int code); - - int numCodewords_; - int codewordSize_; - Ref ddata_; - int invertedBitCount_; - - Ref getEncodedData(Ref correctedBits); - Ref correctBits(Ref rawbits); - Ref extractBits(Ref matrix); - static Ref removeDashedLines(Ref matrix); - static int readCode(Ref rawbits, int startIndex, int length); - - - public: - Decoder(); - Ref decode(Ref detectorResult); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/aztec/detector/Detector.cpp b/cpp/core/src/zxing/aztec/detector/Detector.cpp deleted file mode 100644 index 1b6b12fd0..000000000 --- a/cpp/core/src/zxing/aztec/detector/Detector.cpp +++ /dev/null @@ -1,548 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Detector.cpp - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include - -using std::vector; -using zxing::aztec::Detector; -using zxing::aztec::Point; -using zxing::aztec::AztecDetectorResult; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::ResultPoint; -using zxing::BitArray; -using zxing::BitMatrix; -using zxing::common::detector::MathUtils; - -Detector::Detector(Ref image): - image_(image), - nbLayers_(0), - nbDataBlocks_(0), - nbCenterLayers_(0) { - -} - -Ref Detector::detect() { - Ref pCenter = getMatrixCenter(); - - std::vector > bullEyeCornerPoints = getBullEyeCornerPoints(pCenter); - - extractParameters(bullEyeCornerPoints); - - ArrayRef< Ref > corners = getMatrixCornerPoints(bullEyeCornerPoints); - - Ref bits = - sampleGrid(image_, - corners[shift_%4], - corners[(shift_+3)%4], - corners[(shift_+2)%4], - corners[(shift_+1)%4]); - - // std::printf("------------\ndetected: compact:%s, nbDataBlocks:%d, nbLayers:%d\n------------\n",compact_?"YES":"NO", nbDataBlocks_, nbLayers_); - - return Ref(new AztecDetectorResult(bits, corners, compact_, nbDataBlocks_, nbLayers_)); -} - -void Detector::extractParameters(std::vector > bullEyeCornerPoints) { - int twoCenterLayers = 2 * nbCenterLayers_; - // get the bits around the bull's eye - Ref resab = sampleLine(bullEyeCornerPoints[0], bullEyeCornerPoints[1], twoCenterLayers+1); - Ref resbc = sampleLine(bullEyeCornerPoints[1], bullEyeCornerPoints[2], twoCenterLayers+1); - Ref rescd = sampleLine(bullEyeCornerPoints[2], bullEyeCornerPoints[3], twoCenterLayers+1); - Ref resda = sampleLine(bullEyeCornerPoints[3], bullEyeCornerPoints[0], twoCenterLayers+1); - - // determin the orientation of the matrix - if (resab->get(0) && resab->get(twoCenterLayers)) { - shift_ = 0; - } else if (resbc->get(0) && resbc->get(twoCenterLayers)) { - shift_ = 1; - } else if (rescd->get(0) && rescd->get(twoCenterLayers)) { - shift_ = 2; - } else if (resda->get(0) && resda->get(twoCenterLayers)) { - shift_ = 3; - } else { - // std::printf("could not detemine orientation\n"); - throw ReaderException("could not determine orientation"); - } - - //d a - // - //c b - - //flatten the bits in a single array - Ref parameterData(new BitArray(compact_?28:40)); - Ref shiftedParameterData(new BitArray(compact_?28:40)); - - if (compact_) { - for (int i = 0; i < 7; i++) { - if (resab->get(2+i)) shiftedParameterData->set(i); - if (resbc->get(2+i)) shiftedParameterData->set(i+7); - if (rescd->get(2+i)) shiftedParameterData->set(i+14); - if (resda->get(2+i)) shiftedParameterData->set(i+21); - } - for (int i = 0; i < 28; i++) { - if (shiftedParameterData->get((i+shift_*7)%28)) parameterData->set(i); - } - - } else { - for (int i = 0; i < 11; i++) { - if (i < 5) { - if (resab->get(2+i)) shiftedParameterData->set(i); - if (resbc->get(2+i)) shiftedParameterData->set(i+10); - if (rescd->get(2+i)) shiftedParameterData->set(i+20); - if (resda->get(2+i)) shiftedParameterData->set(i+30); - } - if (i > 5) { - if (resab->get(2+i)) shiftedParameterData->set(i-1); - if (resbc->get(2+i)) shiftedParameterData->set(i+9); - if (rescd->get(2+i)) shiftedParameterData->set(i+19); - if (resda->get(2+i)) shiftedParameterData->set(i+29); - } - } - for (int i = 0; i < 40; i++) { - if (shiftedParameterData->get((i+shift_*10)%40)) parameterData->set(i); - } - } - - correctParameterData(parameterData, compact_); - - getParameters(parameterData); -} - -ArrayRef< Ref > -Detector::getMatrixCornerPoints(std::vector > bullEyeCornerPoints) { - float ratio = (2 * nbLayers_ + (nbLayers_ > 4 ? 1 : 0) + (nbLayers_ - 4) / 8) / (2.0f * nbCenterLayers_); - - int dx = bullEyeCornerPoints[0]->getX() - bullEyeCornerPoints[2]->getX(); - dx += dx > 0 ? 1 : -1; - int dy = bullEyeCornerPoints[0]->getY() - bullEyeCornerPoints[2]->getY(); - dy += dy > 0 ? 1 : -1; - - int targetcx = MathUtils::round(bullEyeCornerPoints[2]->getX() - ratio * dx); - int targetcy = MathUtils::round(bullEyeCornerPoints[2]->getY() - ratio * dy); - - int targetax = MathUtils::round(bullEyeCornerPoints[0]->getX() + ratio * dx); - int targetay = MathUtils::round(bullEyeCornerPoints[0]->getY() + ratio * dy); - - dx = bullEyeCornerPoints[1]->getX() - bullEyeCornerPoints[3]->getX(); - dx += dx > 0 ? 1 : -1; - dy = bullEyeCornerPoints[1]->getY() - bullEyeCornerPoints[3]->getY(); - dy += dy > 0 ? 1 : -1; - - int targetdx = MathUtils::round(bullEyeCornerPoints[3]->getX() - ratio * dx); - int targetdy = MathUtils::round(bullEyeCornerPoints[3]->getY() - ratio * dy); - int targetbx = MathUtils::round(bullEyeCornerPoints[1]->getX() + ratio * dx); - int targetby = MathUtils::round(bullEyeCornerPoints[1]->getY() + ratio * dy); - - if (!isValid(targetax, targetay) || - !isValid(targetbx, targetby) || - - !isValid(targetcx, targetcy) || - !isValid(targetdx, targetdy)) { - throw ReaderException("matrix extends over image bounds"); - } - Array< Ref >* array = new Array< Ref >(); - vector< Ref >& returnValue (array->values()); - returnValue.push_back(Ref(new ResultPoint(float(targetax), float(targetay)))); - returnValue.push_back(Ref(new ResultPoint(float(targetbx), float(targetby)))); - returnValue.push_back(Ref(new ResultPoint(float(targetcx), float(targetcy)))); - returnValue.push_back(Ref(new ResultPoint(float(targetdx), float(targetdy)))); - return ArrayRef< Ref >(array); -} - -void Detector::correctParameterData(Ref parameterData, bool compact) { - int numCodewords; - int numDataCodewords; - - if (compact) { - numCodewords = 7; - numDataCodewords = 2; - } else { - numCodewords = 10; - numDataCodewords = 4; - } - - int numECCodewords = numCodewords - numDataCodewords; - - ArrayRef parameterWords(new Array(numCodewords)); - - int codewordSize = 4; - for (int i = 0; i < numCodewords; i++) { - int flag = 1; - for (int j = 1; j <= codewordSize; j++) { - if (parameterData->get(codewordSize*i + codewordSize - j)) { - parameterWords[i] += flag; - } - flag <<= 1; - } - } - - try { - // std::printf("parameter data reed solomon\n"); - ReedSolomonDecoder rsDecoder(GenericGF::AZTEC_PARAM); - rsDecoder.decode(parameterWords, numECCodewords); - } catch (ReedSolomonException const& ignored) { - (void)ignored; - // std::printf("reed solomon decoding failed\n"); - throw ReaderException("failed to decode parameter data"); - } - - parameterData->clear(); - for (int i = 0; i < numDataCodewords; i++) { - int flag = 1; - for (int j = 1; j <= codewordSize; j++) { - if ((parameterWords[i] & flag) == flag) { - parameterData->set(i*codewordSize+codewordSize-j); - } - flag <<= 1; - } - } -} - -std::vector > Detector::getBullEyeCornerPoints(Ref pCenter) { - Ref pina = pCenter; - Ref pinb = pCenter; - Ref pinc = pCenter; - Ref pind = pCenter; - - bool color = true; - - for (nbCenterLayers_ = 1; nbCenterLayers_ < 9; nbCenterLayers_++) { - Ref pouta = getFirstDifferent(pina, color, 1, -1); - Ref poutb = getFirstDifferent(pinb, color, 1, 1); - Ref poutc = getFirstDifferent(pinc, color, -1, 1); - Ref poutd = getFirstDifferent(pind, color, -1, -1); - - //d a - // - //c b - - if (nbCenterLayers_ > 2) { - float q = distance(poutd, pouta) * nbCenterLayers_ / (distance(pind, pina) * (nbCenterLayers_ + 2)); - if (q < 0.75 || q > 1.25 || !isWhiteOrBlackRectangle(pouta, poutb, poutc, poutd)) { - break; - } - } - - pina = pouta; - pinb = poutb; - pinc = poutc; - pind = poutd; - - color = !color; - } - - if (nbCenterLayers_ != 5 && nbCenterLayers_ != 7) { - throw ReaderException("encountered wrong bullseye ring count"); - } - - compact_ = nbCenterLayers_ == 5; - - - - float ratio = 0.75f*2 / (2*nbCenterLayers_-3); - - int dx = pina->getX() - pind->getX(); - int dy = pina->getY() - pinc->getY(); - - int targetcx = MathUtils::round(pinc->getX() - ratio * dx); - int targetcy = MathUtils::round(pinc->getY() - ratio * dy); - int targetax = MathUtils::round(pina->getX() + ratio * dx); - int targetay = MathUtils::round(pina->getY() + ratio * dy); - - dx = pinb->getX() - pind->getX(); - dy = pinb->getY() - pind->getY(); - - int targetdx = MathUtils::round(pind->getX() - ratio * dx); - int targetdy = MathUtils::round(pind->getY() - ratio * dy); - int targetbx = MathUtils::round(pinb->getX() + ratio * dx); - int targetby = MathUtils::round(pinb->getY() + ratio * dy); - - if (!isValid(targetax, targetay) || - !isValid(targetbx, targetby) || - !isValid(targetcx, targetcy) || - !isValid(targetdx, targetdy)) { - throw ReaderException("bullseye extends over image bounds"); - } - - std::vector > returnValue; - returnValue.push_back(Ref(new Point(targetax, targetay))); - returnValue.push_back(Ref(new Point(targetbx, targetby))); - returnValue.push_back(Ref(new Point(targetcx, targetcy))); - returnValue.push_back(Ref(new Point(targetdx, targetdy))); - - return returnValue; - -} - -Ref Detector::getMatrixCenter() { - Ref pointA, pointB, pointC, pointD; - try { - - std::vector > cornerPoints = WhiteRectangleDetector(image_).detect(); - pointA = cornerPoints[0]; - pointB = cornerPoints[1]; - pointC = cornerPoints[2]; - pointD = cornerPoints[3]; - - } catch (NotFoundException const& e) { - (void)e; - - int cx = image_->getWidth() / 2; - int cy = image_->getHeight() / 2; - - pointA = getFirstDifferent(Ref(new Point(cx+7, cy-7)), false, 1, -1)->toResultPoint(); - pointB = getFirstDifferent(Ref(new Point(cx+7, cy+7)), false, 1, 1)->toResultPoint(); - pointC = getFirstDifferent(Ref(new Point(cx-7, cy+7)), false, -1, -1)->toResultPoint(); - pointD = getFirstDifferent(Ref(new Point(cx-7, cy-7)), false, -1, -1)->toResultPoint(); - - } - - int cx = MathUtils::round((pointA->getX() + pointD->getX() + pointB->getX() + pointC->getX()) / 4.0f); - int cy = MathUtils::round((pointA->getY() + pointD->getY() + pointB->getY() + pointC->getY()) / 4.0f); - - try { - - std::vector > cornerPoints = WhiteRectangleDetector(image_, 15, cx, cy).detect(); - pointA = cornerPoints[0]; - pointB = cornerPoints[1]; - pointC = cornerPoints[2]; - pointD = cornerPoints[3]; - - } catch (NotFoundException const& e) { - (void)e; - - pointA = getFirstDifferent(Ref(new Point(cx+7, cy-7)), false, 1, -1)->toResultPoint(); - pointB = getFirstDifferent(Ref(new Point(cx+7, cy+7)), false, 1, 1)->toResultPoint(); - pointC = getFirstDifferent(Ref(new Point(cx-7, cy+7)), false, -1, 1)->toResultPoint(); - pointD = getFirstDifferent(Ref(new Point(cx-7, cy-7)), false, -1, -1)->toResultPoint(); - - } - - cx = MathUtils::round((pointA->getX() + pointD->getX() + pointB->getX() + pointC->getX()) / 4.0f); - cy = MathUtils::round((pointA->getY() + pointD->getY() + pointB->getY() + pointC->getY()) / 4.0f); - - return Ref(new Point(cx, cy)); - -} - -Ref Detector::sampleGrid(Ref image, - Ref topLeft, - Ref bottomLeft, - Ref bottomRight, - Ref topRight) { - int dimension; - if (compact_) { - dimension = 4 * nbLayers_+11; - } else { - if (nbLayers_ <= 4) { - dimension = 4 * nbLayers_ + 15; - } else { - dimension = 4 * nbLayers_ + 2 * ((nbLayers_-4)/8 + 1) + 15; - } - } - - GridSampler sampler = GridSampler::getInstance(); - - return sampler.sampleGrid(image, - dimension, - 0.5f, - 0.5f, - dimension - 0.5f, - 0.5f, - dimension - 0.5f, - dimension - 0.5f, - 0.5f, - dimension - 0.5f, - topLeft->getX(), - topLeft->getY(), - topRight->getX(), - topRight->getY(), - bottomRight->getX(), - bottomRight->getY(), - bottomLeft->getX(), - bottomLeft->getY()); -} - -void Detector::getParameters(Ref parameterData) { - nbLayers_ = 0; - nbDataBlocks_ = 0; - - int nbBitsForNbLayers; - int nbBitsForNbDatablocks; - - if (compact_) { - nbBitsForNbLayers = 2; - nbBitsForNbDatablocks = 6; - } else { - nbBitsForNbLayers = 5; - nbBitsForNbDatablocks = 11; - } - - for (int i = 0; i < nbBitsForNbLayers; i++) { - nbLayers_ <<= 1; - if (parameterData->get(i)) { - nbLayers_++; - } - } - - for (int i = nbBitsForNbLayers; i < nbBitsForNbLayers + nbBitsForNbDatablocks; i++) { - nbDataBlocks_ <<= 1; - if (parameterData->get(i)) { - nbDataBlocks_++; - } - } - - nbLayers_++; - nbDataBlocks_++; -} - -Ref Detector::sampleLine(Ref p1, Ref p2, int size) { - Ref res(new BitArray(size)); - - float d = distance(p1, p2); - float moduleSize = d / (size-1); - float dx = moduleSize * float(p2->getX() - p1->getX())/d; - float dy = moduleSize * float(p2->getY() - p1->getY())/d; - - float px = float(p1->getX()); - float py = float(p1->getY()); - - for (int i = 0; i < size; i++) { - if (image_->get(MathUtils::round(px), MathUtils::round(py))) res->set(i); - px+=dx; - py+=dy; - } - - return res; -} - -bool Detector::isWhiteOrBlackRectangle(Ref p1, - Ref p2, - Ref p3, - Ref p4) { - int corr = 3; - - p1 = new Point(p1->getX() - corr, p1->getY() + corr); - p2 = new Point(p2->getX() - corr, p2->getY() - corr); - p3 = new Point(p3->getX() + corr, p3->getY() - corr); - p4 = new Point(p4->getX() + corr, p4->getY() + corr); - - int cInit = getColor(p4, p1); - - if (cInit == 0) { - return false; - } - - int c = getColor(p1, p2); - - if (c != cInit) { - return false; - } - - c = getColor(p2, p3); - - if (c != cInit) { - return false; - } - - c = getColor(p3, p4); - - if (c != cInit) { - return false; - } - - return true; -} - -int Detector::getColor(Ref p1, Ref p2) { - float d = distance(p1, p2); - - float dx = (p2->getX() - p1->getX()) / d; - float dy = (p2->getY() - p1->getY()) / d; - - int error = 0; - - float px = float(p1->getX()); - float py = float(p1->getY()); - - bool colorModel = image_->get(p1->getX(), p1->getY()); - - for (int i = 0; i < d; i++) { - px += dx; - py += dy; - if (image_->get(MathUtils::round(px), MathUtils::round(py)) != colorModel) { - error ++; - } - } - - float errRatio = (float)error/d; - - - if (errRatio > 0.1f && errRatio < 0.9f) { - return 0; - } - - return (errRatio <= 0.1) == colorModel ? 1 : -1; -} - -Ref Detector::getFirstDifferent(Ref init, bool color, int dx, int dy) { - int x = init->getX() + dx; - int y = init->getY() + dy; - - while (isValid(x, y) && image_->get(x, y) == color) { - x += dx; - y += dy; - } - - x -= dx; - y -= dy; - - while (isValid(x, y) && image_->get(x, y) == color) { - x += dx; - } - - x -= dx; - - while (isValid(x, y) && image_->get(x, y) == color) { - y += dy; - } - - y -= dy; - - return Ref(new Point(x, y)); -} - -bool Detector::isValid(int x, int y) { - return x >= 0 && x < (int)image_->getWidth() && y > 0 && y < (int)image_->getHeight(); -} - -float Detector::distance(Ref a, Ref b) { - return sqrtf((float)((a->getX() - b->getX()) * (a->getX() - b->getX()) + (a->getY() - b->getY()) * (a->getY() - b->getY()))); -} diff --git a/cpp/core/src/zxing/aztec/detector/Detector.h b/cpp/core/src/zxing/aztec/detector/Detector.h deleted file mode 100644 index 65414adbd..000000000 --- a/cpp/core/src/zxing/aztec/detector/Detector.h +++ /dev/null @@ -1,92 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Detector.h - * zxing - * - * Created by Lukas Stabe on 08/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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. - */ - -#ifndef __ZXING_AZTEC_DETECTOR_DETECTOR_H__ -#define __ZXING_AZTEC_DETECTOR_DETECTOR_H__ - -#include - -#include -#include -#include -#include -#include - -namespace zxing { -namespace aztec { - -class Point : public Counted { - private: - const int x; - const int y; - - public: - Ref toResultPoint() { - return Ref(new ResultPoint(float(x), float(y))); - } - - Point(int ax, int ay) : x(ax), y(ay) {} - - int getX() const { return x; } - int getY() const { return y; } -}; - -class Detector : public Counted { - - private: - Ref image_; - - bool compact_; - int nbLayers_; - int nbDataBlocks_; - int nbCenterLayers_; - int shift_; - - void extractParameters(std::vector > bullEyeCornerPoints); - ArrayRef< Ref > getMatrixCornerPoints(std::vector > bullEyeCornerPoints); - static void correctParameterData(Ref parameterData, bool compact); - std::vector > getBullEyeCornerPoints(Ref pCenter); - Ref getMatrixCenter(); - Ref sampleGrid(Ref image, - Ref topLeft, - Ref bottomLeft, - Ref bottomRight, - Ref topRight); - void getParameters(Ref parameterData); - Ref sampleLine(Ref p1, Ref p2, int size); - bool isWhiteOrBlackRectangle(Ref p1, - Ref p2, - Ref p3, - Ref p4); - int getColor(Ref p1, Ref p2); - Ref getFirstDifferent(Ref init, bool color, int dx, int dy); - bool isValid(int x, int y); - static float distance(Ref a, Ref b); - - public: - Detector(Ref image); - Ref detect(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/common/Array.h b/cpp/core/src/zxing/common/Array.h deleted file mode 100644 index 45fc28270..000000000 --- a/cpp/core/src/zxing/common/Array.h +++ /dev/null @@ -1,170 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __ARRAY_H__ -#define __ARRAY_H__ - -/* - * Array.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -#include - -namespace zxing { - -template class Array : public Counted { -protected: -public: - std::vector values_; - Array() {} - Array(int n) : - Counted(), values_(n, T()) { - } - Array(T const* ts, int n) : - Counted(), values_(ts, ts+n) { - } - Array(T const* ts, T const* te) : - Counted(), values_(ts, te) { - } - Array(T v, int n) : - Counted(), values_(n, v) { - } - Array(std::vector &v) : - Counted(), values_(v) { - } - Array(Array &other) : - Counted(), values_(other.values_) { - } - Array(Array *other) : - Counted(), values_(other->values_) { - } - virtual ~Array() { - } - Array& operator=(const Array &other) { - values_ = other.values_; - return *this; - } - Array& operator=(const std::vector &array) { - values_ = array; - return *this; - } - T const& operator[](int i) const { - return values_[i]; - } - T& operator[](int i) { - return values_[i]; - } - int size() const { - return values_.size(); - } - bool empty() const { - return values_.size() == 0; - } - std::vector const& values() const { - return values_; - } - std::vector& values() { - return values_; - } -}; - -template class ArrayRef : public Counted { -private: -public: - Array *array_; - ArrayRef() : - array_(0) { - } - explicit ArrayRef(int n) : - array_(0) { - reset(new Array (n)); - } - ArrayRef(T *ts, int n) : - array_(0) { - reset(new Array (ts, n)); - } - ArrayRef(Array *a) : - array_(0) { - reset(a); - } - ArrayRef(const ArrayRef &other) : - Counted(), array_(0) { - reset(other.array_); - } - - template - ArrayRef(const ArrayRef &other) : - array_(0) { - reset(static_cast *>(other.array_)); - } - - ~ArrayRef() { - if (array_) { - array_->release(); - } - array_ = 0; - } - - T const& operator[](int i) const { - return (*array_)[i]; - } - - T& operator[](int i) { - return (*array_)[i]; - } - - void reset(Array *a) { - if (a) { - a->retain(); - } - if (array_) { - array_->release(); - } - array_ = a; - } - void reset(const ArrayRef &other) { - reset(other.array_); - } - ArrayRef& operator=(const ArrayRef &other) { - reset(other); - return *this; - } - ArrayRef& operator=(Array *a) { - reset(a); - return *this; - } - - Array& operator*() const { - return *array_; - } - - Array* operator->() const { - return array_; - } - - operator bool () const { - return array_ != 0; - } - bool operator ! () const { - return array_ == 0; - } -}; - -} // namespace zxing - -#endif // __ARRAY_H__ diff --git a/cpp/core/src/zxing/common/BitArray.cpp b/cpp/core/src/zxing/common/BitArray.cpp deleted file mode 100644 index 3495e1476..000000000 --- a/cpp/core/src/zxing/common/BitArray.cpp +++ /dev/null @@ -1,155 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors. All rights reserved. - * - * 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 - -using std::vector; -using zxing::BitArray; - -// VC++ -using zxing::Ref; - -int BitArray::makeArraySize(int size) { - return (size + bitsPerWord-1) >> logBits; -} - -BitArray::BitArray(int size_) - : size(size_), bits(makeArraySize(size)) {} - -BitArray::~BitArray() { -} - -int BitArray::getSize() const { - return size; -} - -void BitArray::setBulk(int i, int newBits) { - bits[i >> logBits] = newBits; -} - -void BitArray::clear() { - int max = bits->size(); - for (int i = 0; i < max; i++) { - bits[i] = 0; - } -} - -bool BitArray::isRange(int start, int end, bool value) { - if (end < start) { - throw IllegalArgumentException(); - } - if (end == start) { - return true; // empty range matches - } - end--; // will be easier to treat this as the last actually set bit -- inclusive - int firstInt = start >> logBits; - int lastInt = end >> logBits; - for (int i = firstInt; i <= lastInt; i++) { - int firstBit = i > firstInt ? 0 : start & bitsMask; - int lastBit = i < lastInt ? (bitsPerWord-1) : end & bitsMask; - int mask; - if (firstBit == 0 && lastBit == (bitsPerWord-1)) { - mask = -1; - } else { - mask = 0; - for (int j = firstBit; j <= lastBit; j++) { - mask |= 1 << j; - } - } - - // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (that is, - // equals the mask, or we're looking for 0s and the masked portion is not all 0s - if ((bits[i] & mask) != (value ? mask : 0)) { - return false; - } - } - return true; -} - -vector& BitArray::getBitArray() { - return bits->values(); -} - -void BitArray::reverse() { - ArrayRef newBits(bits->size()); - int size = this->size; - for (int i = 0; i < size; i++) { - if (get(size - i - 1)) { - newBits[i >> logBits] |= 1 << (i & bitsMask); - } - } - bits = newBits; -} - -BitArray::Reverse::Reverse(Ref array_) : array(array_) { - array->reverse(); -} - -BitArray::Reverse::~Reverse() { - array->reverse(); -} - -namespace { - // N.B.: This only works for 32 bit ints ... - int numberOfTrailingZeros(int i) { - // HD, Figure 5-14 - int y; - if (i == 0) return 32; - int n = 31; - y = i <<16; if (y != 0) { n = n -16; i = y; } - y = i << 8; if (y != 0) { n = n - 8; i = y; } - y = i << 4; if (y != 0) { n = n - 4; i = y; } - y = i << 2; if (y != 0) { n = n - 2; i = y; } - return n - (((unsigned int)(i << 1)) >> 31); - } -} - -int BitArray::getNextSet(int from) { - if (from >= size) { - return size; - } - int bitsOffset = from >> logBits; - int currentBits = bits[bitsOffset]; - // mask off lesser bits first - currentBits &= ~((1 << (from & bitsMask)) - 1); - while (currentBits == 0) { - if (++bitsOffset == (int)bits->size()) { - return size; - } - currentBits = bits[bitsOffset]; - } - int result = (bitsOffset << logBits) + numberOfTrailingZeros(currentBits); - return result > size ? size : result; -} - -int BitArray::getNextUnset(int from) { - if (from >= size) { - return size; - } - int bitsOffset = from >> logBits; - int currentBits = ~bits[bitsOffset]; - // mask off lesser bits first - currentBits &= ~((1 << (from & bitsMask)) - 1); - while (currentBits == 0) { - if (++bitsOffset == (int)bits->size()) { - return size; - } - currentBits = ~bits[bitsOffset]; - } - int result = (bitsOffset << logBits) + numberOfTrailingZeros(currentBits); - return result > size ? size : result; -} diff --git a/cpp/core/src/zxing/common/BitArray.h b/cpp/core/src/zxing/common/BitArray.h deleted file mode 100644 index e4a95a7c2..000000000 --- a/cpp/core/src/zxing/common/BitArray.h +++ /dev/null @@ -1,81 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __BIT_ARRAY_H__ -#define __BIT_ARRAY_H__ - -/* - * Copyright 2010 ZXing authors. All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include - -namespace zxing { - -class BitArray : public Counted { -public: - static const int bitsPerWord = std::numeric_limits::digits; - -private: - int size; - ArrayRef bits; - static const int logBits = ZX_LOG_DIGITS(bitsPerWord); - static const int bitsMask = (1 << logBits) - 1; - -public: - BitArray(int size); - ~BitArray(); - int getSize() const; - - bool get(int i) const { - return (bits[i >> logBits] & (1 << (i & bitsMask))) != 0; - } - - void set(int i) { - bits[i >> logBits] |= 1 << (i & bitsMask); - } - - int getNextSet(int from); - int getNextUnset(int from); - - void setBulk(int i, int newBits); - void setRange(int start, int end); - void clear(); - bool isRange(int start, int end, bool value); - std::vector& getBitArray(); - - void reverse(); - - class Reverse { - private: - Ref array; - public: - Reverse(Ref array); - ~Reverse(); - }; - -private: - static int makeArraySize(int size); -}; - -std::ostream& operator << (std::ostream&, BitArray const&); - -} - -#endif // __BIT_ARRAY_H__ diff --git a/cpp/core/src/zxing/common/BitArrayIO.cpp b/cpp/core/src/zxing/common/BitArrayIO.cpp deleted file mode 100644 index 35d2bca67..000000000 --- a/cpp/core/src/zxing/common/BitArrayIO.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors. All rights reserved. - * - * 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 - -using zxing::BitArray; -using std::ostream; - -ostream& zxing::operator << (ostream& os, BitArray const& ba) { - for (int i = 0, size = ba.getSize(); i < size; i++) { - if ((i & 0x07) == 0) { - os << ' '; - } - os << (ba.get(i) ? 'X' : '.'); - } - return os; -} diff --git a/cpp/core/src/zxing/common/BitMatrix.cpp b/cpp/core/src/zxing/common/BitMatrix.cpp deleted file mode 100644 index db74cdef7..000000000 --- a/cpp/core/src/zxing/common/BitMatrix.cpp +++ /dev/null @@ -1,143 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors. All rights reserved. - * - * 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 -#include - -#include -#include -#include - -using std::ostream; -using std::ostringstream; - -using zxing::BitMatrix; -using zxing::BitArray; -using zxing::ArrayRef; -using zxing::Ref; - -void BitMatrix::init(int width, int height) { - if (width < 1 || height < 1) { - throw IllegalArgumentException("Both dimensions must be greater than 0"); - } - this->width = width; - this->height = height; - this->rowSize = (width + bitsPerWord - 1) >> logBits; - bits = ArrayRef(rowSize * height); -} - -BitMatrix::BitMatrix(int dimension) { - init(dimension, dimension); -} - -BitMatrix::BitMatrix(int width, int height) { - init(width, height); -} - -BitMatrix::~BitMatrix() {} - -void BitMatrix::flip(int x, int y) { - int offset = y * rowSize + (x >> logBits); - bits[offset] ^= 1 << (x & bitsMask); -} - -void BitMatrix::setRegion(int left, int top, int width, int height) { - if (top < 0 || left < 0) { - throw IllegalArgumentException("Left and top must be nonnegative"); - } - if (height < 1 || width < 1) { - throw IllegalArgumentException("Height and width must be at least 1"); - } - int right = left + width; - int bottom = top + height; - if (bottom > this->height || right > this->width) { - throw IllegalArgumentException("The region must fit inside the matrix"); - } - for (int y = top; y < bottom; y++) { - int offset = y * rowSize; - for (int x = left; x < right; x++) { - bits[offset + (x >> logBits)] |= 1 << (x & bitsMask); - } - } -} - -Ref BitMatrix::getRow(int y, Ref row) { - if (row.empty() || row->getSize() < width) { - row = new BitArray(width); - } - int offset = y * rowSize; - for (int x = 0; x < rowSize; x++) { - row->setBulk(x << logBits, bits[offset + x]); - } - return row; -} - -int BitMatrix::getWidth() const { - return width; -} - -int BitMatrix::getHeight() const { - return height; -} - -ArrayRef BitMatrix::getTopLeftOnBit() const { - int bitsOffset = 0; - while (bitsOffset < bits->size() && bits[bitsOffset] == 0) { - bitsOffset++; - } - if (bitsOffset == bits->size()) { - return ArrayRef(); - } - int y = bitsOffset / rowSize; - int x = (bitsOffset % rowSize) << 5; - - int theBits = bits[bitsOffset]; - int bit = 0; - while ((theBits << (31-bit)) == 0) { - bit++; - } - x += bit; - ArrayRef res (2); - res[0]=x; - res[1]=y; - return res; -} - -ArrayRef BitMatrix::getBottomRightOnBit() const { - int bitsOffset = bits->size() - 1; - while (bitsOffset >= 0 && bits[bitsOffset] == 0) { - bitsOffset--; - } - if (bitsOffset < 0) { - return ArrayRef(); - } - - int y = bitsOffset / rowSize; - int x = (bitsOffset % rowSize) << 5; - - int theBits = bits[bitsOffset]; - int bit = 31; - while ((theBits >> bit) == 0) { - bit--; - } - x += bit; - - ArrayRef res (2); - res[0]=x; - res[1]=y; - return res; -} diff --git a/cpp/core/src/zxing/common/BitMatrix.h b/cpp/core/src/zxing/common/BitMatrix.h deleted file mode 100644 index 86a0768de..000000000 --- a/cpp/core/src/zxing/common/BitMatrix.h +++ /dev/null @@ -1,91 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __BIT_MATRIX_H__ -#define __BIT_MATRIX_H__ - -/* - * BitMatrix.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { - -class BitMatrix : public Counted { -public: - static const int bitsPerWord = std::numeric_limits::digits; - -private: - int width; - int height; - int rowSize; - ArrayRef bits; - -#define ZX_LOG_DIGITS(digits) \ - ((digits == 8) ? 3 : \ - ((digits == 16) ? 4 : \ - ((digits == 32) ? 5 : \ - ((digits == 64) ? 6 : \ - ((digits == 128) ? 7 : \ - (-1)))))) - - static const int logBits = ZX_LOG_DIGITS(bitsPerWord); - static const int bitsMask = (1 << logBits) - 1; - -public: - BitMatrix(int dimension); - BitMatrix(int width, int height); - - ~BitMatrix(); - - bool get(int x, int y) const { - int offset = y * rowSize + (x >> logBits); - return ((((unsigned)bits[offset]) >> (x & bitsMask)) & 1) != 0; - } - - void set(int x, int y) { - int offset = y * rowSize + (x >> logBits); - bits[offset] |= 1 << (x & bitsMask); - } - - void flip(int x, int y); - void clear(); - void setRegion(int left, int top, int width, int height); - Ref getRow(int y, Ref row); - - int getWidth() const; - int getHeight() const; - - ArrayRef getTopLeftOnBit() const; - ArrayRef getBottomRightOnBit() const; - - friend std::ostream& operator<<(std::ostream &out, const BitMatrix &bm); - const char *description(); - -private: - inline void init(int, int); - - BitMatrix(const BitMatrix&); - BitMatrix& operator =(const BitMatrix&); -}; - -} - -#endif // __BIT_MATRIX_H__ diff --git a/cpp/core/src/zxing/common/BitSource.cpp b/cpp/core/src/zxing/common/BitSource.cpp deleted file mode 100644 index 195ae7d52..000000000 --- a/cpp/core/src/zxing/common/BitSource.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * BitSource.cpp - * zxing - * - * Created by Christian Brunschen on 09/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 -#include -#include - -namespace zxing { - -int BitSource::readBits(int numBits) { - if (numBits < 0 || numBits > 32 || numBits > available()) { - std::ostringstream oss; - oss << numBits; - throw IllegalArgumentException(oss.str().c_str()); - } - - int result = 0; - - // First, read remainder from current byte - if (bitOffset_ > 0) { - int bitsLeft = 8 - bitOffset_; - int toRead = numBits < bitsLeft ? numBits : bitsLeft; - int bitsToNotRead = bitsLeft - toRead; - int mask = (0xFF >> (8 - toRead)) << bitsToNotRead; - result = (bytes_[byteOffset_] & mask) >> bitsToNotRead; - numBits -= toRead; - bitOffset_ += toRead; - if (bitOffset_ == 8) { - bitOffset_ = 0; - byteOffset_++; - } - } - - // Next read whole bytes - if (numBits > 0) { - while (numBits >= 8) { - result = (result << 8) | (bytes_[byteOffset_] & 0xFF); - byteOffset_++; - numBits -= 8; - } - - - // Finally read a partial byte - if (numBits > 0) { - int bitsToNotRead = 8 - numBits; - int mask = (0xFF >> bitsToNotRead) << bitsToNotRead; - result = (result << numBits) | ((bytes_[byteOffset_] & mask) >> bitsToNotRead); - bitOffset_ += numBits; - } - } - - return result; -} - -int BitSource::available() { - return 8 * (bytes_->size() - byteOffset_) - bitOffset_; -} -} diff --git a/cpp/core/src/zxing/common/BitSource.h b/cpp/core/src/zxing/common/BitSource.h deleted file mode 100644 index 3ab16a062..000000000 --- a/cpp/core/src/zxing/common/BitSource.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef __BIT_SOURCE_H__ -#define __BIT_SOURCE_H__ - -/* - * BitSource.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -/** - *

This provides an easy abstraction to read bits at a time from a sequence of bytes, where the - * number of bits read is not often a multiple of 8.

- * - *

This class is not thread-safe.

- * - * @author srowen@google.com (Sean Owen) - * @author christian.brunschen@gmail.com (Christian Brunschen) - */ -class BitSource : public Counted { - typedef char byte; -private: - ArrayRef bytes_; - int byteOffset_; - int bitOffset_; -public: - /** - * @param bytes bytes from which this will read bits. Bits will be read from the first byte first. - * Bits are read within a byte from most-significant to least-significant bit. - */ - BitSource(ArrayRef &bytes) : - bytes_(bytes), byteOffset_(0), bitOffset_(0) { - } - - int getBitOffset() { - return bitOffset_; - } - - int getByteOffset() { - return byteOffset_; - } - - /** - * @param numBits number of bits to read - * @return int representing the bits read. The bits will appear as the least-significant - * bits of the int - * @throws IllegalArgumentException if numBits isn't in [1,32] - */ - int readBits(int numBits); - - /** - * @return number of bits that can be read successfully - */ - int available(); -}; - -} - -#endif // __BIT_SOURCE_H__ diff --git a/cpp/core/src/zxing/common/CharacterSetECI.cpp b/cpp/core/src/zxing/common/CharacterSetECI.cpp deleted file mode 100644 index 8386208b5..000000000 --- a/cpp/core/src/zxing/common/CharacterSetECI.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2008-2011 ZXing authors - * - * 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 -#include -#include - -using std::string; - -using zxing::common::CharacterSetECI; -using zxing::IllegalArgumentException; - -std::map CharacterSetECI::VALUE_TO_ECI; -std::map CharacterSetECI::NAME_TO_ECI; - -const bool CharacterSetECI::inited = CharacterSetECI::init_tables(); - -#define ADD_CHARACTER_SET(VALUES, STRINGS) \ - { static int values[] = {VALUES, -1}; \ - static char const* strings[] = {STRINGS, 0}; \ - addCharacterSet(values, strings); } - -#define XC , - -bool CharacterSetECI::init_tables() { - ADD_CHARACTER_SET(0 XC 2, "Cp437"); - ADD_CHARACTER_SET(1 XC 3, "ISO8859_1" XC "ISO-8859-1"); - ADD_CHARACTER_SET(4, "ISO8859_2" XC "ISO-8859-2"); - ADD_CHARACTER_SET(5, "ISO8859_3" XC "ISO-8859-3"); - ADD_CHARACTER_SET(6, "ISO8859_4" XC "ISO-8859-4"); - ADD_CHARACTER_SET(7, "ISO8859_5" XC "ISO-8859-5"); - ADD_CHARACTER_SET(8, "ISO8859_6" XC "ISO-8859-6"); - ADD_CHARACTER_SET(9, "ISO8859_7" XC "ISO-8859-7"); - ADD_CHARACTER_SET(10, "ISO8859_8" XC "ISO-8859-8"); - ADD_CHARACTER_SET(11, "ISO8859_9" XC "ISO-8859-9"); - ADD_CHARACTER_SET(12, "ISO8859_10" XC "ISO-8859-10"); - ADD_CHARACTER_SET(13, "ISO8859_11" XC "ISO-8859-11"); - ADD_CHARACTER_SET(15, "ISO8859_13" XC "ISO-8859-13"); - ADD_CHARACTER_SET(16, "ISO8859_14" XC "ISO-8859-14"); - ADD_CHARACTER_SET(17, "ISO8859_15" XC "ISO-8859-15"); - ADD_CHARACTER_SET(18, "ISO8859_16" XC "ISO-8859-16"); - ADD_CHARACTER_SET(20, "SJIS" XC "Shift_JIS"); - ADD_CHARACTER_SET(21, "Cp1250" XC "windows-1250"); - ADD_CHARACTER_SET(22, "Cp1251" XC "windows-1251"); - ADD_CHARACTER_SET(23, "Cp1252" XC "windows-1252"); - ADD_CHARACTER_SET(24, "Cp1256" XC "windows-1256"); - ADD_CHARACTER_SET(25, "UnicodeBigUnmarked" XC "UTF-16BE" XC "UnicodeBig"); - ADD_CHARACTER_SET(26, "UTF8" XC "UTF-8"); - ADD_CHARACTER_SET(27 XC 170, "ASCII" XC "US-ASCII"); - ADD_CHARACTER_SET(28, "Big5"); - ADD_CHARACTER_SET(29, "GB18030" XC "GB2312" XC "EUC_CN" XC "GBK"); - ADD_CHARACTER_SET(30, "EUC_KR" XC "EUC-KR"); - return true; -} - -#undef XC - -CharacterSetECI::CharacterSetECI(int const* values, - char const* const* names) - : values_(values), names_(names) { - for(int const* values = values_; *values != -1; values++) { - VALUE_TO_ECI[*values] = this; - } - for(char const* const* names = names_; *names; names++) { - NAME_TO_ECI[string(*names)] = this; - } -} - -char const* CharacterSetECI::name() const { - return names_[0]; -} - -int CharacterSetECI::getValue() const { - return values_[0]; -} - -void CharacterSetECI::addCharacterSet(int const* values, char const* const* names) { - new CharacterSetECI(values, names); -} - -CharacterSetECI* CharacterSetECI::getCharacterSetECIByValue(int value) { - if (value < 0 || value >= 900) { - throw FormatException(); - } - return VALUE_TO_ECI[value]; -} - -CharacterSetECI* CharacterSetECI::getCharacterSetECIByName(string const& name) { - return NAME_TO_ECI[name]; -} diff --git a/cpp/core/src/zxing/common/CharacterSetECI.h b/cpp/core/src/zxing/common/CharacterSetECI.h deleted file mode 100644 index 95ea86fc6..000000000 --- a/cpp/core/src/zxing/common/CharacterSetECI.h +++ /dev/null @@ -1,53 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __CHARACTERSET_ECI__ -#define __CHARACTERSET_ECI__ - -/* - * Copyright 2008-2011 ZXing authors - * - * 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 -#include - -namespace zxing { -namespace common { - -class CharacterSetECI { -private: - static std::map VALUE_TO_ECI; - static std::map NAME_TO_ECI; - static const bool inited; - static bool init_tables(); - - int const* const values_; - char const* const* const names_; - - CharacterSetECI(int const* values, char const* const* names); - - static void addCharacterSet(int const* value, char const* const* encodingNames); - -public: - char const* name() const; - int getValue() const; - - static CharacterSetECI* getCharacterSetECIByValue(int value); - static CharacterSetECI* getCharacterSetECIByName(std::string const& name); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/common/Counted.h b/cpp/core/src/zxing/common/Counted.h deleted file mode 100644 index 41ac5eca5..000000000 --- a/cpp/core/src/zxing/common/Counted.h +++ /dev/null @@ -1,140 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __COUNTED_H__ -#define __COUNTED_H__ - -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -/* base class for reference-counted objects */ -class Counted { -private: - unsigned int count_; -public: - Counted() : - count_(0) { - } - virtual ~Counted() { - } - Counted *retain() { - count_++; - return this; - } - void release() { - count_--; - if (count_ == 0) { - count_ = 0xDEADF001; - delete this; - } - } - - - /* return the current count for denugging purposes or similar */ - int count() const { - return count_; - } -}; - -/* counting reference to reference-counted objects */ -template class Ref { -private: -public: - T *object_; - explicit Ref(T *o = 0) : - object_(0) { - reset(o); - } - Ref(const Ref &other) : - object_(0) { - reset(other.object_); - } - - template - Ref(const Ref &other) : - object_(0) { - reset(other.object_); - } - - ~Ref() { - if (object_) { - object_->release(); - } - } - - void reset(T *o) { - if (o) { - o->retain(); - } - if (object_ != 0) { - object_->release(); - } - object_ = o; - } - Ref& operator=(const Ref &other) { - reset(other.object_); - return *this; - } - template - Ref& operator=(const Ref &other) { - reset(other.object_); - return *this; - } - Ref& operator=(T* o) { - reset(o); - return *this; - } - template - Ref& operator=(Y* o) { - reset(o); - return *this; - } - - T& operator*() { - return *object_; - } - T* operator->() const { - return object_; - } - operator T*() const { - return object_; - } - - bool operator==(const T* that) { - return object_ == that; - } - bool operator==(const Ref &other) const { - return object_ == other.object_ || *object_ == *(other.object_); - } - template - bool operator==(const Ref &other) const { - return object_ == other.object_ || *object_ == *(other.object_); - } - - bool operator!=(const T* that) { - return !(*this == that); - } - - bool empty() const { - return object_ == 0; - } -}; - -} - -#endif // __COUNTED_H__ diff --git a/cpp/core/src/zxing/common/DecoderResult.cpp b/cpp/core/src/zxing/common/DecoderResult.cpp deleted file mode 100644 index 923f9e5bd..000000000 --- a/cpp/core/src/zxing/common/DecoderResult.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * DecoderResult.cpp - * zxing - * - * Created by Christian Brunschen on 20/05/2008. - * Copyright 2008-2011 ZXing authors All rights reserved. - * - * 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 - -using namespace std; -using namespace zxing; - -DecoderResult::DecoderResult(ArrayRef rawBytes, - Ref text, - ArrayRef< ArrayRef >& byteSegments, - string const& ecLevel) : - rawBytes_(rawBytes), - text_(text), - byteSegments_(byteSegments), - ecLevel_(ecLevel) {} - -DecoderResult::DecoderResult(ArrayRef rawBytes, - Ref text) - : rawBytes_(rawBytes), text_(text) {} - -ArrayRef DecoderResult::getRawBytes() { - return rawBytes_; -} - -Ref DecoderResult::getText() { - return text_; -} diff --git a/cpp/core/src/zxing/common/DecoderResult.h b/cpp/core/src/zxing/common/DecoderResult.h deleted file mode 100644 index 9a1f7fa80..000000000 --- a/cpp/core/src/zxing/common/DecoderResult.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef __DECODER_RESULT_H__ -#define __DECODER_RESULT_H__ - -/* - * DecoderResult.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { - -class DecoderResult : public Counted { -private: - ArrayRef rawBytes_; - Ref text_; - ArrayRef< ArrayRef > byteSegments_; - std::string ecLevel_; - -public: - DecoderResult(ArrayRef rawBytes, - Ref text, - ArrayRef< ArrayRef >& byteSegments, - std::string const& ecLevel); - - DecoderResult(ArrayRef rawBytes, Ref text); - - ArrayRef getRawBytes(); - Ref getText(); -}; - -} - -#endif // __DECODER_RESULT_H__ diff --git a/cpp/core/src/zxing/common/DetectorResult.cpp b/cpp/core/src/zxing/common/DetectorResult.cpp deleted file mode 100644 index 323ffb3c8..000000000 --- a/cpp/core/src/zxing/common/DetectorResult.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * DetectorResult.cpp - * zxing - * - * Created by Christian Brunschen on 14/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -DetectorResult::DetectorResult(Ref bits, - ArrayRef< Ref > points) - : bits_(bits), points_(points) { -} - -Ref DetectorResult::getBits() { - return bits_; -} - -ArrayRef< Ref > DetectorResult::getPoints() { - return points_; -} - -} diff --git a/cpp/core/src/zxing/common/DetectorResult.h b/cpp/core/src/zxing/common/DetectorResult.h deleted file mode 100644 index 26b633a00..000000000 --- a/cpp/core/src/zxing/common/DetectorResult.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __DETECTOR_RESULT_H__ -#define __DETECTOR_RESULT_H__ - -/* - * DetectorResult.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { - -class DetectorResult : public Counted { -private: - Ref bits_; - ArrayRef< Ref > points_; - -public: - DetectorResult(Ref bits, ArrayRef< Ref > points); - Ref getBits(); - ArrayRef< Ref > getPoints(); -}; - -} - -#endif // __DETECTOR_RESULT_H__ diff --git a/cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp b/cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp deleted file mode 100644 index 49edbf7ff..000000000 --- a/cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp +++ /dev/null @@ -1,212 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * GlobalHistogramBinarizer.cpp - * zxing - * - * Copyright 2010 ZXing authors. All rights reserved. - * - * 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 -#include -#include - -using zxing::GlobalHistogramBinarizer; -using zxing::Binarizer; -using zxing::ArrayRef; -using zxing::Ref; -using zxing::BitArray; -using zxing::BitMatrix; - -// VC++ -using zxing::LuminanceSource; - -namespace { - const int LUMINANCE_BITS = 5; - const int LUMINANCE_SHIFT = 8 - LUMINANCE_BITS; - const int LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS; - const ArrayRef EMPTY (0); -} - -GlobalHistogramBinarizer::GlobalHistogramBinarizer(Ref source) - : Binarizer(source), luminances(EMPTY), buckets(LUMINANCE_BUCKETS) {} - -GlobalHistogramBinarizer::~GlobalHistogramBinarizer() {} - -void GlobalHistogramBinarizer::initArrays(int luminanceSize) { - if (luminances->size() < luminanceSize) { - luminances = ArrayRef(luminanceSize); - } - for (int x = 0; x < LUMINANCE_BUCKETS; x++) { - buckets[x] = 0; - } -} - -Ref GlobalHistogramBinarizer::getBlackRow(int y, Ref row) { - // std::cerr << "gbr " << y << std::endl; - LuminanceSource& source = *getLuminanceSource(); - int width = source.getWidth(); - if (row == NULL || static_cast(row->getSize()) < width) { - row = new BitArray(width); - } else { - row->clear(); - } - - initArrays(width); - ArrayRef localLuminances = source.getRow(y, luminances); - if (false) { - std::cerr << "gbr " << y << " r "; - for(int i=0, e=localLuminances->size(); i < e; ++i) { - std::cerr << 0+localLuminances[i] << " "; - } - std::cerr << std::endl; - } - ArrayRef localBuckets = buckets; - for (int x = 0; x < width; x++) { - int pixel = localLuminances[x] & 0xff; - localBuckets[pixel >> LUMINANCE_SHIFT]++; - } - int blackPoint = estimateBlackPoint(localBuckets); - // std::cerr << "gbr bp " << y << " " << blackPoint << std::endl; - - int left = localLuminances[0] & 0xff; - int center = localLuminances[1] & 0xff; - for (int x = 1; x < width - 1; x++) { - int right = localLuminances[x + 1] & 0xff; - // A simple -1 4 -1 box filter with a weight of 2. - int luminance = ((center << 2) - left - right) >> 1; - if (luminance < blackPoint) { - row->set(x); - } - left = center; - center = right; - } - return row; -} - -Ref GlobalHistogramBinarizer::getBlackMatrix() { - LuminanceSource& source = *getLuminanceSource(); - int width = source.getWidth(); - int height = source.getHeight(); - Ref matrix(new BitMatrix(width, height)); - - // Quickly calculates the histogram by sampling four rows from the image. - // This proved to be more robust on the blackbox tests than sampling a - // diagonal as we used to do. - initArrays(width); - ArrayRef localBuckets = buckets; - for (int y = 1; y < 5; y++) { - int row = height * y / 5; - ArrayRef localLuminances = source.getRow(row, luminances); - int right = (width << 2) / 5; - for (int x = width / 5; x < right; x++) { - int pixel = localLuminances[x] & 0xff; - localBuckets[pixel >> LUMINANCE_SHIFT]++; - } - } - - int blackPoint = estimateBlackPoint(localBuckets); - - ArrayRef localLuminances = source.getMatrix(); - for (int y = 0; y < height; y++) { - int offset = y * width; - for (int x = 0; x < width; x++) { - int pixel = localLuminances[offset + x] & 0xff; - if (pixel < blackPoint) { - matrix->set(x, y); - } - } - } - - return matrix; -} - -using namespace std; - -int GlobalHistogramBinarizer::estimateBlackPoint(ArrayRef const& buckets) { - // Find tallest peak in histogram - int numBuckets = buckets->size(); - int maxBucketCount = 0; - int firstPeak = 0; - int firstPeakSize = 0; - if (false) { - for (int x = 0; x < numBuckets; x++) { - cerr << buckets[x] << " "; - } - cerr << endl; - } - for (int x = 0; x < numBuckets; x++) { - if (buckets[x] > firstPeakSize) { - firstPeak = x; - firstPeakSize = buckets[x]; - } - if (buckets[x] > maxBucketCount) { - maxBucketCount = buckets[x]; - } - } - - // Find second-tallest peak -- well, another peak that is tall and not - // so close to the first one - int secondPeak = 0; - int secondPeakScore = 0; - for (int x = 0; x < numBuckets; x++) { - int distanceToBiggest = x - firstPeak; - // Encourage more distant second peaks by multiplying by square of distance - int score = buckets[x] * distanceToBiggest * distanceToBiggest; - if (score > secondPeakScore) { - secondPeak = x; - secondPeakScore = score; - } - } - - if (firstPeak > secondPeak) { - int temp = firstPeak; - firstPeak = secondPeak; - secondPeak = temp; - } - - // Kind of arbitrary; if the two peaks are very close, then we figure there is - // so little dynamic range in the image, that discriminating black and white - // is too error-prone. - // Decoding the image/line is either pointless, or may in some cases lead to - // a false positive for 1D formats, which are relatively lenient. - // We arbitrarily say "close" is - // "<= 1/16 of the total histogram buckets apart" - // std::cerr << "! " << secondPeak << " " << firstPeak << " " << numBuckets << std::endl; - if (secondPeak - firstPeak <= numBuckets >> 4) { - throw NotFoundException(); - } - - // Find a valley between them that is low and closer to the white peak - int bestValley = secondPeak - 1; - int bestValleyScore = -1; - for (int x = secondPeak - 1; x > firstPeak; x--) { - int fromFirst = x - firstPeak; - // Favor a "valley" that is not too close to either peak -- especially not - // the black peak -- and that has a low value of course - int score = fromFirst * fromFirst * (secondPeak - x) * - (maxBucketCount - buckets[x]); - if (score > bestValleyScore) { - bestValley = x; - bestValleyScore = score; - } - } - - // std::cerr << "bps " << (bestValley << LUMINANCE_SHIFT) << std::endl; - return bestValley << LUMINANCE_SHIFT; -} - -Ref GlobalHistogramBinarizer::createBinarizer(Ref source) { - return Ref (new GlobalHistogramBinarizer(source)); -} diff --git a/cpp/core/src/zxing/common/GlobalHistogramBinarizer.h b/cpp/core/src/zxing/common/GlobalHistogramBinarizer.h deleted file mode 100644 index b0d1bd401..000000000 --- a/cpp/core/src/zxing/common/GlobalHistogramBinarizer.h +++ /dev/null @@ -1,48 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __GLOBALHISTOGRAMBINARIZER_H__ -#define __GLOBALHISTOGRAMBINARIZER_H__ -/* - * GlobalHistogramBinarizer.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { - -class GlobalHistogramBinarizer : public Binarizer { -private: - ArrayRef luminances; - ArrayRef buckets; -public: - GlobalHistogramBinarizer(Ref source); - virtual ~GlobalHistogramBinarizer(); - - virtual Ref getBlackRow(int y, Ref row); - virtual Ref getBlackMatrix(); - static int estimateBlackPoint(ArrayRef const& buckets); - Ref createBinarizer(Ref source); -private: - void initArrays(int luminanceSize); -}; - -} - -#endif /* GLOBALHISTOGRAMBINARIZER_H_ */ diff --git a/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp b/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp deleted file mode 100644 index ee78bc74a..000000000 --- a/cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * GreyscaleLuminanceSource.cpp - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -using zxing::Ref; -using zxing::ArrayRef; -using zxing::LuminanceSource; -using zxing::GreyscaleLuminanceSource; - -GreyscaleLuminanceSource:: -GreyscaleLuminanceSource(ArrayRef greyData, - int dataWidth, int dataHeight, - int left, int top, - int width, int height) - : Super(width, height), - greyData_(greyData), - dataWidth_(dataWidth), dataHeight_(dataHeight), - left_(left), top_(top) { - - if (left + width > dataWidth || top + height > dataHeight || top < 0 || left < 0) { - throw IllegalArgumentException("Crop rectangle does not fit within image data."); - } -} - -ArrayRef GreyscaleLuminanceSource::getRow(int y, ArrayRef row) const { - if (y < 0 || y >= this->getHeight()) { - throw IllegalArgumentException("Requested row is outside the image."); - } - int width = getWidth(); - if (!row || row->size() < width) { - ArrayRef temp (width); - row = temp; - } - int offset = (y + top_) * dataWidth_ + left_; - memcpy(&row[0], &greyData_[offset], width); - return row; -} - -ArrayRef GreyscaleLuminanceSource::getMatrix() const { - int size = getWidth() * getHeight(); - ArrayRef result (size); - if (left_ == 0 && top_ == 0 && dataWidth_ == getWidth() && dataHeight_ == getHeight()) { - memcpy(&result[0], &greyData_[0], size); - } else { - for (int row = 0; row < getHeight(); row++) { - memcpy(&result[row * getWidth()], &greyData_[(top_ + row) * dataWidth_ + left_], getWidth()); - } - } - return result; -} - -Ref GreyscaleLuminanceSource::rotateCounterClockwise() const { - // Intentionally flip the left, top, width, and height arguments as - // needed. dataWidth and dataHeight are always kept unrotated. - Ref result ( - new GreyscaleRotatedLuminanceSource(greyData_, - dataWidth_, dataHeight_, - top_, left_, getHeight(), getWidth())); - return result; -} diff --git a/cpp/core/src/zxing/common/GreyscaleLuminanceSource.h b/cpp/core/src/zxing/common/GreyscaleLuminanceSource.h deleted file mode 100644 index 8275323b6..000000000 --- a/cpp/core/src/zxing/common/GreyscaleLuminanceSource.h +++ /dev/null @@ -1,53 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __GREYSCALE_LUMINANCE_SOURCE__ -#define __GREYSCALE_LUMINANCE_SOURCE__ -/* - * GreyscaleLuminanceSource.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -class GreyscaleLuminanceSource : public LuminanceSource { - -private: - typedef LuminanceSource Super; - ArrayRef greyData_; - const int dataWidth_; - const int dataHeight_; - const int left_; - const int top_; - -public: - GreyscaleLuminanceSource(ArrayRef greyData, int dataWidth, int dataHeight, int left, - int top, int width, int height); - - ArrayRef getRow(int y, ArrayRef row) const; - ArrayRef getMatrix() const; - - bool isRotateSupported() const { - return true; - } - - Ref rotateCounterClockwise() const; -}; - -} - -#endif diff --git a/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp b/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp deleted file mode 100644 index 1d053f815..000000000 --- a/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp +++ /dev/null @@ -1,81 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * GreyscaleRotatedLuminanceSource.cpp - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -using zxing::ArrayRef; -using zxing::GreyscaleRotatedLuminanceSource; - -// Note that dataWidth and dataHeight are not reversed, as we need to -// be able to traverse the greyData correctly, which does not get -// rotated. -GreyscaleRotatedLuminanceSource:: -GreyscaleRotatedLuminanceSource(ArrayRef greyData, - int dataWidth, int dataHeight, - int left, int top, - int width, int height) - : Super(width, height), - greyData_(greyData), - dataWidth_(dataWidth), - left_(left), top_(top) { - // Intentionally comparing to the opposite dimension since we're rotated. - if (left + width > dataHeight || top + height > dataWidth) { - throw IllegalArgumentException("Crop rectangle does not fit within image data."); - } -} - -// The API asks for rows, but we're rotated, so we return columns. -ArrayRef -GreyscaleRotatedLuminanceSource::getRow(int y, ArrayRef row) const { - if (y < 0 || y >= getHeight()) { - throw IllegalArgumentException("Requested row is outside the image."); - } - if (!row || row->size() < getWidth()) { - row = ArrayRef(getWidth()); - } - int offset = (left_ * dataWidth_) + (dataWidth_ - 1 - (y + top_)); - using namespace std; - if (false) { - cerr << offset << " = " - << top_ << " " << left_ << " " - << getHeight() << " " << getWidth() << " " - << y << endl; - } - for (int x = 0; x < getWidth(); x++) { - row[x] = greyData_[offset]; - offset += dataWidth_; - } - return row; -} - -ArrayRef GreyscaleRotatedLuminanceSource::getMatrix() const { - ArrayRef result (getWidth() * getHeight()); - for (int y = 0; y < getHeight(); y++) { - char* row = &result[y * getWidth()]; - int offset = (left_ * dataWidth_) + (dataWidth_ - 1 - (y + top_)); - for (int x = 0; x < getWidth(); x++) { - row[x] = greyData_[offset]; - offset += dataWidth_; - } - } - return result; -} diff --git a/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h b/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h deleted file mode 100644 index 6af60f92f..000000000 --- a/cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h +++ /dev/null @@ -1,46 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __GREYSCALE_ROTATED_LUMINANCE_SOURCE__ -#define __GREYSCALE_ROTATED_LUMINANCE_SOURCE__ -/* - * GreyscaleRotatedLuminanceSource.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -class GreyscaleRotatedLuminanceSource : public LuminanceSource { - private: - typedef LuminanceSource Super; - ArrayRef greyData_; - const int dataWidth_; - const int left_; - const int top_; - -public: - GreyscaleRotatedLuminanceSource(ArrayRef greyData, int dataWidth, int dataHeight, - int left, int top, int width, int height); - - ArrayRef getRow(int y, ArrayRef row) const; - ArrayRef getMatrix() const; -}; - -} - -#endif diff --git a/cpp/core/src/zxing/common/GridSampler.cpp b/cpp/core/src/zxing/common/GridSampler.cpp deleted file mode 100644 index c1c86ada2..000000000 --- a/cpp/core/src/zxing/common/GridSampler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * GridSampler.cpp - * zxing - * - * Created by Christian Brunschen on 18/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { -using namespace std; - -GridSampler GridSampler::gridSampler; - -GridSampler::GridSampler() { -} - -Ref GridSampler::sampleGrid(Ref image, int dimension, Ref transform) { - Ref bits(new BitMatrix(dimension)); - vector points(dimension << 1, (const float)0.0f); - for (int y = 0; y < dimension; y++) { - int max = points.size(); - float yValue = (float)y + 0.5f; - for (int x = 0; x < max; x += 2) { - points[x] = (float)(x >> 1) + 0.5f; - points[x + 1] = yValue; - } - transform->transformPoints(points); - checkAndNudgePoints(image, points); - for (int x = 0; x < max; x += 2) { - if (image->get((int)points[x], (int)points[x + 1])) { - bits->set(x >> 1, y); - } - } - } - return bits; -} - -Ref GridSampler::sampleGrid(Ref image, int dimensionX, int dimensionY, Ref transform) { - Ref bits(new BitMatrix(dimensionX, dimensionY)); - vector points(dimensionX << 1, (const float)0.0f); - for (int y = 0; y < dimensionY; y++) { - int max = points.size(); - float yValue = (float)y + 0.5f; - for (int x = 0; x < max; x += 2) { - points[x] = (float)(x >> 1) + 0.5f; - points[x + 1] = yValue; - } - transform->transformPoints(points); - checkAndNudgePoints(image, points); - for (int x = 0; x < max; x += 2) { - if (image->get((int)points[x], (int)points[x + 1])) { - bits->set(x >> 1, y); - } - } - } - return bits; -} - -Ref GridSampler::sampleGrid(Ref image, int dimension, float p1ToX, float p1ToY, float p2ToX, - float p2ToY, float p3ToX, float p3ToY, float p4ToX, float p4ToY, float p1FromX, float p1FromY, float p2FromX, - float p2FromY, float p3FromX, float p3FromY, float p4FromX, float p4FromY) { - Ref transform(PerspectiveTransform::quadrilateralToQuadrilateral(p1ToX, p1ToY, p2ToX, p2ToY, - p3ToX, p3ToY, p4ToX, p4ToY, p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY)); - - return sampleGrid(image, dimension, transform); - -} - -void GridSampler::checkAndNudgePoints(Ref image, vector &points) { - int width = image->getWidth(); - int height = image->getHeight(); - - - // The Java code assumes that if the start and end points are in bounds, the rest will also be. - // However, in some unusual cases points in the middle may also be out of bounds. - // Since we can't rely on an ArrayIndexOutOfBoundsException like Java, we check every point. - - for (size_t offset = 0; offset < points.size(); offset += 2) { - int x = (int)points[offset]; - int y = (int)points[offset + 1]; - if (x < -1 || x > width || y < -1 || y > height) { - ostringstream s; - s << "Transformed point out of bounds at " << x << "," << y; - throw ReaderException(s.str().c_str()); - } - - if (x == -1) { - points[offset] = 0.0f; - } else if (x == width) { - points[offset] = float(width - 1); - } - if (y == -1) { - points[offset + 1] = 0.0f; - } else if (y == height) { - points[offset + 1] = float(height - 1); - } - } - -} - -GridSampler &GridSampler::getInstance() { - return gridSampler; -} -} diff --git a/cpp/core/src/zxing/common/GridSampler.h b/cpp/core/src/zxing/common/GridSampler.h deleted file mode 100644 index d7f74e5b2..000000000 --- a/cpp/core/src/zxing/common/GridSampler.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef __GRID_SAMPLER_H__ -#define __GRID_SAMPLER_H__ - -/* - * GridSampler.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -class GridSampler { -private: - static GridSampler gridSampler; - GridSampler(); - -public: - Ref sampleGrid(Ref image, int dimension, Ref transform); - Ref sampleGrid(Ref image, int dimensionX, int dimensionY, Ref transform); - - Ref sampleGrid(Ref image, int dimension, float p1ToX, float p1ToY, float p2ToX, float p2ToY, - float p3ToX, float p3ToY, float p4ToX, float p4ToY, float p1FromX, float p1FromY, float p2FromX, - float p2FromY, float p3FromX, float p3FromY, float p4FromX, float p4FromY); - static void checkAndNudgePoints(Ref image, std::vector &points); - static GridSampler &getInstance(); -}; -} - -#endif // __GRID_SAMPLER_H__ diff --git a/cpp/core/src/zxing/common/HybridBinarizer.cpp b/cpp/core/src/zxing/common/HybridBinarizer.cpp deleted file mode 100644 index 1789e24f7..000000000 --- a/cpp/core/src/zxing/common/HybridBinarizer.cpp +++ /dev/null @@ -1,226 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * HybridBinarizer.cpp - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -#include - -using namespace std; -using namespace zxing; - -namespace { - const int BLOCK_SIZE_POWER = 3; - const int BLOCK_SIZE = 1 << BLOCK_SIZE_POWER; // ...0100...00 - const int BLOCK_SIZE_MASK = BLOCK_SIZE - 1; // ...0011...11 - const int MINIMUM_DIMENSION = BLOCK_SIZE * 5; -} - -HybridBinarizer::HybridBinarizer(Ref source) : - GlobalHistogramBinarizer(source), matrix_(NULL), cached_row_(NULL) { -} - -HybridBinarizer::~HybridBinarizer() { -} - - -Ref -HybridBinarizer::createBinarizer(Ref source) { - return Ref (new HybridBinarizer(source)); -} - - -/** - * Calculates the final BitMatrix once for all requests. This could be called once from the - * constructor instead, but there are some advantages to doing it lazily, such as making - * profiling easier, and not doing heavy lifting when callers don't expect it. - */ -Ref HybridBinarizer::getBlackMatrix() { - if (matrix_) { - return matrix_; - } - LuminanceSource& source = *getLuminanceSource(); - int width = source.getWidth(); - int height = source.getHeight(); - if (width >= MINIMUM_DIMENSION && height >= MINIMUM_DIMENSION) { - ArrayRef luminances = source.getMatrix(); - int subWidth = width >> BLOCK_SIZE_POWER; - if ((width & BLOCK_SIZE_MASK) != 0) { - subWidth++; - } - int subHeight = height >> BLOCK_SIZE_POWER; - if ((height & BLOCK_SIZE_MASK) != 0) { - subHeight++; - } - ArrayRef blackPoints = - calculateBlackPoints(luminances, subWidth, subHeight, width, height); - - Ref newMatrix (new BitMatrix(width, height)); - calculateThresholdForBlock(luminances, - subWidth, - subHeight, - width, - height, - blackPoints, - newMatrix); - matrix_ = newMatrix; - } else { - // If the image is too small, fall back to the global histogram approach. - matrix_ = GlobalHistogramBinarizer::getBlackMatrix(); - } - return matrix_; -} - -namespace { - inline int cap(int value, int min, int max) { - return value < min ? min : value > max ? max : value; - } -} - -void -HybridBinarizer::calculateThresholdForBlock(ArrayRef luminances, - int subWidth, - int subHeight, - int width, - int height, - ArrayRef blackPoints, - Ref const& matrix) { - for (int y = 0; y < subHeight; y++) { - int yoffset = y << BLOCK_SIZE_POWER; - int maxYOffset = height - BLOCK_SIZE; - if (yoffset > maxYOffset) { - yoffset = maxYOffset; - } - for (int x = 0; x < subWidth; x++) { - int xoffset = x << BLOCK_SIZE_POWER; - int maxXOffset = width - BLOCK_SIZE; - if (xoffset > maxXOffset) { - xoffset = maxXOffset; - } - int left = cap(x, 2, subWidth - 3); - int top = cap(y, 2, subHeight - 3); - int sum = 0; - for (int z = -2; z <= 2; z++) { - int *blackRow = &blackPoints[(top + z) * subWidth]; - sum += blackRow[left - 2]; - sum += blackRow[left - 1]; - sum += blackRow[left]; - sum += blackRow[left + 1]; - sum += blackRow[left + 2]; - } - int average = sum / 25; - thresholdBlock(luminances, xoffset, yoffset, average, width, matrix); - } - } -} - -void HybridBinarizer::thresholdBlock(ArrayRef luminances, - int xoffset, - int yoffset, - int threshold, - int stride, - Ref const& matrix) { - for (int y = 0, offset = yoffset * stride + xoffset; - y < BLOCK_SIZE; - y++, offset += stride) { - for (int x = 0; x < BLOCK_SIZE; x++) { - int pixel = luminances[offset + x] & 0xff; - if (pixel <= threshold) { - matrix->set(xoffset + x, yoffset + y); - } - } - } -} - -namespace { - inline int getBlackPointFromNeighbors(ArrayRef blackPoints, int subWidth, int x, int y) { - return (blackPoints[(y-1)*subWidth+x] + - 2*blackPoints[y*subWidth+x-1] + - blackPoints[(y-1)*subWidth+x-1]) >> 2; - } -} - - -ArrayRef HybridBinarizer::calculateBlackPoints(ArrayRef luminances, - int subWidth, - int subHeight, - int width, - int height) { - const int minDynamicRange = 24; - - ArrayRef blackPoints (subHeight * subWidth); - for (int y = 0; y < subHeight; y++) { - int yoffset = y << BLOCK_SIZE_POWER; - int maxYOffset = height - BLOCK_SIZE; - if (yoffset > maxYOffset) { - yoffset = maxYOffset; - } - for (int x = 0; x < subWidth; x++) { - int xoffset = x << BLOCK_SIZE_POWER; - int maxXOffset = width - BLOCK_SIZE; - if (xoffset > maxXOffset) { - xoffset = maxXOffset; - } - int sum = 0; - int min = 0xFF; - int max = 0; - for (int yy = 0, offset = yoffset * width + xoffset; - yy < BLOCK_SIZE; - yy++, offset += width) { - for (int xx = 0; xx < BLOCK_SIZE; xx++) { - int pixel = luminances[offset + xx] & 0xFF; - sum += pixel; - // still looking for good contrast - if (pixel < min) { - min = pixel; - } - if (pixel > max) { - max = pixel; - } - } - - // short-circuit min/max tests once dynamic range is met - if (max - min > minDynamicRange) { - // finish the rest of the rows quickly - for (yy++, offset += width; yy < BLOCK_SIZE; yy++, offset += width) { - for (int xx = 0; xx < BLOCK_SIZE; xx += 2) { - sum += luminances[offset + xx] & 0xFF; - sum += luminances[offset + xx + 1] & 0xFF; - } - } - } - } - // See - // http://groups.google.com/group/zxing/browse_thread/thread/d06efa2c35a7ddc0 - int average = sum >> (BLOCK_SIZE_POWER * 2); - if (max - min <= minDynamicRange) { - average = min >> 1; - if (y > 0 && x > 0) { - int bp = getBlackPointFromNeighbors(blackPoints, subWidth, x, y); - if (min < bp) { - average = bp; - } - } - } - blackPoints[y * subWidth + x] = average; - } - } - return blackPoints; -} - diff --git a/cpp/core/src/zxing/common/HybridBinarizer.h b/cpp/core/src/zxing/common/HybridBinarizer.h deleted file mode 100644 index 932c2a2d7..000000000 --- a/cpp/core/src/zxing/common/HybridBinarizer.h +++ /dev/null @@ -1,67 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __HYBRIDBINARIZER_H__ -#define __HYBRIDBINARIZER_H__ -/* - * HybridBinarizer.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { - - class HybridBinarizer : public GlobalHistogramBinarizer { - private: - Ref matrix_; - Ref cached_row_; - - public: - HybridBinarizer(Ref source); - virtual ~HybridBinarizer(); - - virtual Ref getBlackMatrix(); - Ref createBinarizer(Ref source); - private: - // We'll be using one-D arrays because C++ can't dynamically allocate 2D - // arrays - ArrayRef calculateBlackPoints(ArrayRef luminances, - int subWidth, - int subHeight, - int width, - int height); - void calculateThresholdForBlock(ArrayRef luminances, - int subWidth, - int subHeight, - int width, - int height, - ArrayRef blackPoints, - Ref const& matrix); - void thresholdBlock(ArrayRefluminances, - int xoffset, - int yoffset, - int threshold, - int stride, - Ref const& matrix); - }; - -} - -#endif diff --git a/cpp/core/src/zxing/common/IllegalArgumentException.cpp b/cpp/core/src/zxing/common/IllegalArgumentException.cpp deleted file mode 100644 index 45c1fa1c4..000000000 --- a/cpp/core/src/zxing/common/IllegalArgumentException.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * IllegalArgumentException.cpp - * zxing - * - * Created by Christian Brunschen on 06/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 - -using zxing::IllegalArgumentException; - -IllegalArgumentException::IllegalArgumentException() : Exception() {} -IllegalArgumentException::IllegalArgumentException(const char *msg) : Exception(msg) {} -IllegalArgumentException::~IllegalArgumentException() throw() {} diff --git a/cpp/core/src/zxing/common/IllegalArgumentException.h b/cpp/core/src/zxing/common/IllegalArgumentException.h deleted file mode 100644 index 735ab06e8..000000000 --- a/cpp/core/src/zxing/common/IllegalArgumentException.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __ILLEGAL_ARGUMENT_EXCEPTION_H__ -#define __ILLEGAL_ARGUMENT_EXCEPTION_H__ - -/* - * IllegalArgumentException.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - -class IllegalArgumentException : public Exception { -public: - IllegalArgumentException(); - IllegalArgumentException(const char *msg); - ~IllegalArgumentException() throw(); -}; - -} - -#endif // __ILLEGAL_ARGUMENT_EXCEPTION_H__ diff --git a/cpp/core/src/zxing/common/PerspectiveTransform.cpp b/cpp/core/src/zxing/common/PerspectiveTransform.cpp deleted file mode 100644 index 7344efb92..000000000 --- a/cpp/core/src/zxing/common/PerspectiveTransform.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * PerspectiveTransform.cpp - * zxing - * - * Created by Christian Brunschen on 12/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 - -namespace zxing { -using namespace std; - -PerspectiveTransform::PerspectiveTransform(float inA11, float inA21, - float inA31, float inA12, - float inA22, float inA32, - float inA13, float inA23, - float inA33) : - a11(inA11), a12(inA12), a13(inA13), a21(inA21), a22(inA22), a23(inA23), - a31(inA31), a32(inA32), a33(inA33) {} - -Ref PerspectiveTransform::quadrilateralToQuadrilateral(float x0, float y0, float x1, float y1, - float x2, float y2, float x3, float y3, float x0p, float y0p, float x1p, float y1p, float x2p, float y2p, - float x3p, float y3p) { - Ref qToS = PerspectiveTransform::quadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3); - Ref sToQ = - PerspectiveTransform::squareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p); - return sToQ->times(qToS); -} - -Ref PerspectiveTransform::squareToQuadrilateral(float x0, float y0, float x1, float y1, float x2, - float y2, float x3, float y3) { - float dx3 = x0 - x1 + x2 - x3; - float dy3 = y0 - y1 + y2 - y3; - if (dx3 == 0.0f && dy3 == 0.0f) { - Ref result(new PerspectiveTransform(x1 - x0, x2 - x1, x0, y1 - y0, y2 - y1, y0, 0.0f, - 0.0f, 1.0f)); - return result; - } else { - float dx1 = x1 - x2; - float dx2 = x3 - x2; - float dy1 = y1 - y2; - float dy2 = y3 - y2; - float denominator = dx1 * dy2 - dx2 * dy1; - float a13 = (dx3 * dy2 - dx2 * dy3) / denominator; - float a23 = (dx1 * dy3 - dx3 * dy1) / denominator; - Ref result(new PerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 - + a13 * y1, y3 - y0 + a23 * y3, y0, a13, a23, 1.0f)); - return result; - } -} - -Ref PerspectiveTransform::quadrilateralToSquare(float x0, float y0, float x1, float y1, float x2, - float y2, float x3, float y3) { - // Here, the adjoint serves as the inverse: - return squareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3)->buildAdjoint(); -} - -Ref PerspectiveTransform::buildAdjoint() { - // Adjoint is the transpose of the cofactor matrix: - Ref result(new PerspectiveTransform(a22 * a33 - a23 * a32, a23 * a31 - a21 * a33, a21 * a32 - - a22 * a31, a13 * a32 - a12 * a33, a11 * a33 - a13 * a31, a12 * a31 - a11 * a32, a12 * a23 - a13 * a22, - a13 * a21 - a11 * a23, a11 * a22 - a12 * a21)); - return result; -} - -Ref PerspectiveTransform::times(Ref other) { - Ref result(new PerspectiveTransform(a11 * other->a11 + a21 * other->a12 + a31 * other->a13, - a11 * other->a21 + a21 * other->a22 + a31 * other->a23, a11 * other->a31 + a21 * other->a32 + a31 - * other->a33, a12 * other->a11 + a22 * other->a12 + a32 * other->a13, a12 * other->a21 + a22 - * other->a22 + a32 * other->a23, a12 * other->a31 + a22 * other->a32 + a32 * other->a33, a13 - * other->a11 + a23 * other->a12 + a33 * other->a13, a13 * other->a21 + a23 * other->a22 + a33 - * other->a23, a13 * other->a31 + a23 * other->a32 + a33 * other->a33)); - return result; -} - -void PerspectiveTransform::transformPoints(vector &points) { - int max = points.size(); - for (int i = 0; i < max; i += 2) { - float x = points[i]; - float y = points[i + 1]; - float denominator = a13 * x + a23 * y + a33; - points[i] = (a11 * x + a21 * y + a31) / denominator; - points[i + 1] = (a12 * x + a22 * y + a32) / denominator; - } -} - -ostream& operator<<(ostream& out, const PerspectiveTransform &pt) { - out << pt.a11 << ", " << pt.a12 << ", " << pt.a13 << ", \n"; - out << pt.a21 << ", " << pt.a22 << ", " << pt.a23 << ", \n"; - out << pt.a31 << ", " << pt.a32 << ", " << pt.a33 << "\n"; - return out; -} - -} diff --git a/cpp/core/src/zxing/common/PerspectiveTransform.h b/cpp/core/src/zxing/common/PerspectiveTransform.h deleted file mode 100644 index 43b7fa146..000000000 --- a/cpp/core/src/zxing/common/PerspectiveTransform.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __PERSPECTIVE_TANSFORM_H__ -#define __PERSPECTIVE_TANSFORM_H__ - -/* - * PerspectiveTransform.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -class PerspectiveTransform : public Counted { -private: - float a11, a12, a13, a21, a22, a23, a31, a32, a33; - PerspectiveTransform(float a11, float a21, float a31, float a12, float a22, float a32, float a13, float a23, - float a33); - -public: - static Ref - quadrilateralToQuadrilateral(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, - float x0p, float y0p, float x1p, float y1p, float x2p, float y2p, float x3p, float y3p); - static Ref squareToQuadrilateral(float x0, float y0, float x1, float y1, float x2, float y2, - float x3, float y3); - static Ref quadrilateralToSquare(float x0, float y0, float x1, float y1, float x2, float y2, - float x3, float y3); - Ref buildAdjoint(); - Ref times(Ref other); - void transformPoints(std::vector &points); - - friend std::ostream& operator<<(std::ostream& out, const PerspectiveTransform &pt); -}; -} - -#endif // __PERSPECTIVE_TANSFORM_H__ diff --git a/cpp/core/src/zxing/common/Point.h b/cpp/core/src/zxing/common/Point.h deleted file mode 100644 index cae032b75..000000000 --- a/cpp/core/src/zxing/common/Point.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __POINT_H__ -#define __POINT_H__ - -/* - * Point.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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. - */ - -namespace zxing { -class PointI { -public: - int x; - int y; -}; - -class Point { -public: - Point() : x(0.0f), y(0.0f) {}; - Point(float x_, float y_) : x(x_), y(y_) {}; - - float x; - float y; -}; - -class Line { -public: - Line(Point start_, Point end_) : start(start_), end(end_) {}; - - Point start; - Point end; -}; -} -#endif // POINT_H_ diff --git a/cpp/core/src/zxing/common/Str.cpp b/cpp/core/src/zxing/common/Str.cpp deleted file mode 100644 index 983651a7d..000000000 --- a/cpp/core/src/zxing/common/Str.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * String.cpp - * zxing - * - * Created by Christian Brunschen on 20/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -using std::string; -using zxing::String; -using zxing::Ref; - -String::String(const std::string &text) : - text_(text) { -} - -String::String(int capacity) { - text_.reserve(capacity); -} - -const std::string& String::getText() const { - return text_; -} - -char String::charAt(int i) const { return text_[i]; } - -int String::size() const { return text_.size(); } - -int String::length() const { return text_.size(); } - -Ref String::substring(int i) const { - return Ref(new String(text_.substr(i))); -} - -void String::append(const std::string &tail) { - text_.append(tail); -} - -void String::append(char c) { - text_.append(1,c); -} - -std::ostream& zxing::operator << (std::ostream& out, String const& s) { - out << s.text_; - return out; -} diff --git a/cpp/core/src/zxing/common/Str.h b/cpp/core/src/zxing/common/Str.h deleted file mode 100644 index adc8d4ef5..000000000 --- a/cpp/core/src/zxing/common/Str.h +++ /dev/null @@ -1,51 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __STR_H__ -#define __STR_H__ - -/* - * Str.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { - -class String; -std::ostream& operator << (std::ostream& out, String const& s); - -class String : public Counted { -private: - std::string text_; -public: - explicit String(const std::string &text); - explicit String(int); - char charAt(int) const; - Ref substring(int) const; - const std::string& getText() const; - int size() const; - void append(std::string const& tail); - void append(char c); - int length() const; - friend std::ostream& zxing::operator << (std::ostream& out, String const& s); -}; - -} - -#endif // __COMMON__STRING_H__ diff --git a/cpp/core/src/zxing/common/StringUtils.cpp b/cpp/core/src/zxing/common/StringUtils.cpp deleted file mode 100644 index 30f9325be..000000000 --- a/cpp/core/src/zxing/common/StringUtils.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -/* - * Copyright (C) 2010-2011 ZXing authors - * - * 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 -#include - -using namespace std; -using namespace zxing; -using namespace zxing::common; - -// N.B.: these are the iconv strings for at least some versions of iconv - -char const* const StringUtils::PLATFORM_DEFAULT_ENCODING = "UTF-8"; -char const* const StringUtils::ASCII = "ASCII"; -char const* const StringUtils::SHIFT_JIS = "SHIFT_JIS"; -char const* const StringUtils::GB2312 = "GBK"; -char const* const StringUtils::EUC_JP = "EUC-JP"; -char const* const StringUtils::UTF8 = "UTF-8"; -char const* const StringUtils::ISO88591 = "ISO8859-1"; -const bool StringUtils::ASSUME_SHIFT_JIS = false; - -string -StringUtils::guessEncoding(char* bytes, int length, - Hashtable const& hints) { - Hashtable::const_iterator i = hints.find(DecodeHints::CHARACTER_SET); - if (i != hints.end()) { - return i->second; - } - typedef bool boolean; - // For now, merely tries to distinguish ISO-8859-1, UTF-8 and Shift_JIS, - // which should be by far the most common encodings. - boolean canBeISO88591 = true; - boolean canBeShiftJIS = true; - boolean canBeUTF8 = true; - int utf8BytesLeft = 0; - //int utf8LowChars = 0; - int utf2BytesChars = 0; - int utf3BytesChars = 0; - int utf4BytesChars = 0; - int sjisBytesLeft = 0; - //int sjisLowChars = 0; - int sjisKatakanaChars = 0; - //int sjisDoubleBytesChars = 0; - int sjisCurKatakanaWordLength = 0; - int sjisCurDoubleBytesWordLength = 0; - int sjisMaxKatakanaWordLength = 0; - int sjisMaxDoubleBytesWordLength = 0; - //int isoLowChars = 0; - //int isoHighChars = 0; - int isoHighOther = 0; - - typedef char byte; - boolean utf8bom = length > 3 && - bytes[0] == (byte) 0xEF && - bytes[1] == (byte) 0xBB && - bytes[2] == (byte) 0xBF; - - for (int i = 0; - i < length && (canBeISO88591 || canBeShiftJIS || canBeUTF8); - i++) { - - int value = bytes[i] & 0xFF; - - // UTF-8 stuff - if (canBeUTF8) { - if (utf8BytesLeft > 0) { - if ((value & 0x80) == 0) { - canBeUTF8 = false; - } else { - utf8BytesLeft--; - } - } else if ((value & 0x80) != 0) { - if ((value & 0x40) == 0) { - canBeUTF8 = false; - } else { - utf8BytesLeft++; - if ((value & 0x20) == 0) { - utf2BytesChars++; - } else { - utf8BytesLeft++; - if ((value & 0x10) == 0) { - utf3BytesChars++; - } else { - utf8BytesLeft++; - if ((value & 0x08) == 0) { - utf4BytesChars++; - } else { - canBeUTF8 = false; - } - } - } - } - } //else { - //utf8LowChars++; - //} - } - - // ISO-8859-1 stuff - if (canBeISO88591) { - if (value > 0x7F && value < 0xA0) { - canBeISO88591 = false; - } else if (value > 0x9F) { - if (value < 0xC0 || value == 0xD7 || value == 0xF7) { - isoHighOther++; - } //else { - //isoHighChars++; - //} - } //else { - //isoLowChars++; - //} - } - - // Shift_JIS stuff - if (canBeShiftJIS) { - if (sjisBytesLeft > 0) { - if (value < 0x40 || value == 0x7F || value > 0xFC) { - canBeShiftJIS = false; - } else { - sjisBytesLeft--; - } - } else if (value == 0x80 || value == 0xA0 || value > 0xEF) { - canBeShiftJIS = false; - } else if (value > 0xA0 && value < 0xE0) { - sjisKatakanaChars++; - sjisCurDoubleBytesWordLength = 0; - sjisCurKatakanaWordLength++; - if (sjisCurKatakanaWordLength > sjisMaxKatakanaWordLength) { - sjisMaxKatakanaWordLength = sjisCurKatakanaWordLength; - } - } else if (value > 0x7F) { - sjisBytesLeft++; - //sjisDoubleBytesChars++; - sjisCurKatakanaWordLength = 0; - sjisCurDoubleBytesWordLength++; - if (sjisCurDoubleBytesWordLength > sjisMaxDoubleBytesWordLength) { - sjisMaxDoubleBytesWordLength = sjisCurDoubleBytesWordLength; - } - } else { - //sjisLowChars++; - sjisCurKatakanaWordLength = 0; - sjisCurDoubleBytesWordLength = 0; - } - } - } - - if (canBeUTF8 && utf8BytesLeft > 0) { - canBeUTF8 = false; - } - if (canBeShiftJIS && sjisBytesLeft > 0) { - canBeShiftJIS = false; - } - - // Easy -- if there is BOM or at least 1 valid not-single byte character (and no evidence it can't be UTF-8), done - if (canBeUTF8 && (utf8bom || utf2BytesChars + utf3BytesChars + utf4BytesChars > 0)) { - return UTF8; - } - // Easy -- if assuming Shift_JIS or at least 3 valid consecutive not-ascii characters (and no evidence it can't be), done - if (canBeShiftJIS && (ASSUME_SHIFT_JIS || sjisMaxKatakanaWordLength >= 3 || sjisMaxDoubleBytesWordLength >= 3)) { - return SHIFT_JIS; - } - // Distinguishing Shift_JIS and ISO-8859-1 can be a little tough for short words. The crude heuristic is: - // - If we saw - // - only two consecutive katakana chars in the whole text, or - // - at least 10% of bytes that could be "upper" not-alphanumeric Latin1, - // - then we conclude Shift_JIS, else ISO-8859-1 - if (canBeISO88591 && canBeShiftJIS) { - return (sjisMaxKatakanaWordLength == 2 && sjisKatakanaChars == 2) || isoHighOther * 10 >= length - ? SHIFT_JIS : ISO88591; - } - - // Otherwise, try in order ISO-8859-1, Shift JIS, UTF-8 and fall back to default platform encoding - if (canBeISO88591) { - return ISO88591; - } - if (canBeShiftJIS) { - return SHIFT_JIS; - } - if (canBeUTF8) { - return UTF8; - } - // Otherwise, we take a wild guess with platform encoding - return PLATFORM_DEFAULT_ENCODING; -} diff --git a/cpp/core/src/zxing/common/StringUtils.h b/cpp/core/src/zxing/common/StringUtils.h deleted file mode 100644 index dd7d670ef..000000000 --- a/cpp/core/src/zxing/common/StringUtils.h +++ /dev/null @@ -1,52 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __STRING_UTILS__ -#define __STRING_UTILS__ - -/* - * Copyright (C) 2010-2011 ZXing authors - * - * 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 -#include -#include - -namespace zxing { -namespace common { - -class StringUtils { -private: - static char const* const PLATFORM_DEFAULT_ENCODING; - - StringUtils() {} - -public: - static char const* const ASCII; - static char const* const SHIFT_JIS; - static char const* const GB2312; - static char const* const EUC_JP; - static char const* const UTF8; - static char const* const ISO88591; - static const bool ASSUME_SHIFT_JIS; - - typedef std::map Hashtable; - - static std::string guessEncoding(char* bytes, int length, Hashtable const& hints); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/common/detector/JavaMath.h b/cpp/core/src/zxing/common/detector/JavaMath.h deleted file mode 100644 index ce99ab747..000000000 --- a/cpp/core/src/zxing/common/detector/JavaMath.h +++ /dev/null @@ -1,43 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __ZXING_COMMON_DETECTOR_MATH_H__ -#define __ZXING_COMMON_DETECTOR_MATH_H__ -/* - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -namespace common { -namespace detector { - -class Math { - private: - Math(); - ~Math(); - public: - - // Java standard Math.round - static inline int round(float a) { - return (int)std::floor(a +0.5f); - } - -}; - -} -} -} - -#endif diff --git a/cpp/core/src/zxing/common/detector/MathUtils.h b/cpp/core/src/zxing/common/detector/MathUtils.h deleted file mode 100644 index 5884566cc..000000000 --- a/cpp/core/src/zxing/common/detector/MathUtils.h +++ /dev/null @@ -1,57 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __ZXING_COMMON_DETECTOR_MATHUTILS_H__ -#define __ZXING_COMMON_DETECTOR_MATHUTILS_H__ -/* - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -namespace common { -namespace detector { - -class MathUtils { - private: - MathUtils(); - ~MathUtils(); - public: - - /** - * Ends up being a bit faster than {@link Math#round(float)}. This merely rounds its - * argument to the nearest int, where x.5 rounds up to x+1. - */ - static inline int round(float d) { - return (int) (d + 0.5f); - } - - static inline float distance(float aX, float aY, float bX, float bY) { - float xDiff = aX - bX; - float yDiff = aY - bY; - return sqrt(xDiff * xDiff + yDiff * yDiff); - } - - static inline float distance(int aX, int aY, int bX, int bY) { - int xDiff = aX - bX; - int yDiff = aY - bY; - return sqrt(float(xDiff * xDiff + yDiff * yDiff)); - } -}; - -} -} -} - -#endif diff --git a/cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp b/cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp deleted file mode 100644 index 3ed9df95a..000000000 --- a/cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * MonochromeRectangleDetector.cpp - * y_wmk - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 y_wmk authors All rights reserved. - * - * 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 -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::ResultPoint; -using zxing::TwoInts; -using zxing::MonochromeRectangleDetector; - -vector > MonochromeRectangleDetector::detect() { - int height = image_->getHeight(); - int width = image_->getWidth(); - int halfHeight = height >> 1; - int halfWidth = width >> 1; - int deltaY = std::max(1, height / (MAX_MODULES << 3)); - int deltaX = std::max(1, width / (MAX_MODULES << 3)); - - int top = 0; - int bottom = height; - int left = 0; - int right = width; - Ref pointA(findCornerFromCenter(halfWidth, 0, left, right, - halfHeight, -deltaY, top, bottom, halfWidth >> 1)); - top = (int) pointA->getY() - 1;; - Ref pointB(findCornerFromCenter(halfWidth, -deltaX, left, right, - halfHeight, 0, top, bottom, halfHeight >> 1)); - left = (int) pointB->getX() - 1; - Ref pointC(findCornerFromCenter(halfWidth, deltaX, left, right, - halfHeight, 0, top, bottom, halfHeight >> 1)); - right = (int) pointC->getX() + 1; - Ref pointD(findCornerFromCenter(halfWidth, 0, left, right, - halfHeight, deltaY, top, bottom, halfWidth >> 1)); - bottom = (int) pointD->getY() + 1; - - // Go try to find point A again with better information -- might have been off at first. - pointA.reset(findCornerFromCenter(halfWidth, 0, left, right, - halfHeight, -deltaY, top, bottom, halfWidth >> 2)); - - vector > corners(4); - corners[0].reset(pointA); - corners[1].reset(pointB); - corners[2].reset(pointC); - corners[3].reset(pointD); - return corners; -} - -Ref MonochromeRectangleDetector::findCornerFromCenter(int centerX, int deltaX, int left, int right, - int centerY, int deltaY, int top, int bottom, int maxWhiteRun) { - Ref lastRange(NULL); - for (int y = centerY, x = centerX; - y < bottom && y >= top && x < right && x >= left; - y += deltaY, x += deltaX) { - Ref range(NULL); - if (deltaX == 0) { - // horizontal slices, up and down - range = blackWhiteRange(y, maxWhiteRun, left, right, true); - } else { - // vertical slices, left and right - range = blackWhiteRange(x, maxWhiteRun, top, bottom, false); - } - if (range == NULL) { - if (lastRange == NULL) { - throw NotFoundException("Couldn't find corners (lastRange = NULL) "); - } else { - // lastRange was found - if (deltaX == 0) { - int lastY = y - deltaY; - if (lastRange->start < centerX) { - if (lastRange->end > centerX) { - // straddle, choose one or the other based on direction - Ref result(new ResultPoint(deltaY > 0 ? lastRange->start : lastRange->end, lastY)); - return result; - } - Ref result(new ResultPoint(lastRange->start, lastY)); - return result; - } else { - Ref result(new ResultPoint(lastRange->end, lastY)); - return result; - } - } else { - int lastX = x - deltaX; - if (lastRange->start < centerY) { - if (lastRange->end > centerY) { - Ref result(new ResultPoint(lastX, deltaX < 0 ? lastRange->start : lastRange->end)); - return result; - } - Ref result(new ResultPoint(lastX, lastRange->start)); - return result; - } else { - Ref result(new ResultPoint(lastX, lastRange->end)); - return result; - } - } - } - } - lastRange = range; - } - throw NotFoundException("Couldn't find corners"); -} - -Ref MonochromeRectangleDetector::blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim, - bool horizontal) { - - int center = (minDim + maxDim) >> 1; - - // Scan left/up first - int start = center; - while (start >= minDim) { - if (horizontal ? image_->get(start, fixedDimension) : image_->get(fixedDimension, start)) { - start--; - } else { - int whiteRunStart = start; - do { - start--; - } while (start >= minDim && !(horizontal ? image_->get(start, fixedDimension) : - image_->get(fixedDimension, start))); - int whiteRunSize = whiteRunStart - start; - if (start < minDim || whiteRunSize > maxWhiteRun) { - start = whiteRunStart; - break; - } - } - } - start++; - - // Then try right/down - int end = center; - while (end < maxDim) { - if (horizontal ? image_->get(end, fixedDimension) : image_->get(fixedDimension, end)) { - end++; - } else { - int whiteRunStart = end; - do { - end++; - } while (end < maxDim && !(horizontal ? image_->get(end, fixedDimension) : - image_->get(fixedDimension, end))); - int whiteRunSize = end - whiteRunStart; - if (end >= maxDim || whiteRunSize > maxWhiteRun) { - end = whiteRunStart; - break; - } - } - } - end--; - Ref result(NULL); - if (end > start) { - result = new TwoInts; - result->start = start; - result->end = end; - } - return result; -} diff --git a/cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h b/cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h deleted file mode 100644 index f32c99d96..000000000 --- a/cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h +++ /dev/null @@ -1,62 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __MONOCHROMERECTANGLEDETECTOR_H__ -#define __MONOCHROMERECTANGLEDETECTOR_H__ - -/* - * MonochromeRectangleDetector.h - * y_wmk - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 y_wmk authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -namespace zxing { - -struct TwoInts: public Counted { - int start; - int end; -}; - -class MonochromeRectangleDetector : public Counted { - private: - static const int MAX_MODULES = 32; - Ref image_; - - public: - MonochromeRectangleDetector(Ref image) : image_(image) { }; - - std::vector > detect(); - - private: - Ref findCornerFromCenter(int centerX, int deltaX, int left, int right, - int centerY, int deltaY, int top, int bottom, int maxWhiteRun); - - Ref blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim, - bool horizontal); - - int max(int a, float b) { return (float) a > b ? a : (int) b;}; -}; - -} - -#endif // __MONOCHROMERECTANGLEDETECTOR_H__ diff --git a/cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp b/cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp deleted file mode 100644 index 88e67969b..000000000 --- a/cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp +++ /dev/null @@ -1,330 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * WhiteRectangleDetector.cpp - * y_wmk - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 y_wmk authors All rights reserved. - * - * 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 -#include -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::ResultPoint; -using zxing::WhiteRectangleDetector; -using zxing::common::detector::MathUtils; - -// VC++ -using zxing::BitMatrix; - -int WhiteRectangleDetector::INIT_SIZE = 30; -int WhiteRectangleDetector::CORR = 1; - -WhiteRectangleDetector::WhiteRectangleDetector(Ref image) : image_(image) { - width_ = image->getWidth(); - height_ = image->getHeight(); - - leftInit_ = (width_ - INIT_SIZE) >> 1; - rightInit_ = (width_ + INIT_SIZE) >> 1; - upInit_ = (height_ - INIT_SIZE) >> 1; - downInit_ = (height_ + INIT_SIZE) >> 1; - - if (upInit_ < 0 || leftInit_ < 0 || downInit_ >= height_ || rightInit_ >= width_) { - throw NotFoundException("Invalid dimensions WhiteRectangleDetector"); -} -} - -WhiteRectangleDetector::WhiteRectangleDetector(Ref image, int initSize, int x, int y) : image_(image) { - width_ = image->getWidth(); - height_ = image->getHeight(); - - int halfsize = initSize >> 1; - leftInit_ = x - halfsize; - rightInit_ = x + halfsize; - upInit_ = y - halfsize; - downInit_ = y + halfsize; - - if (upInit_ < 0 || leftInit_ < 0 || downInit_ >= height_ || rightInit_ >= width_) { - throw NotFoundException("Invalid dimensions WhiteRectangleDetector"); - } -} - -/** - *

- * Detects a candidate barcode-like rectangular region within an image. It - * starts around the center of the image, increases the size of the candidate - * region until it finds a white rectangular region. - *

- * - * @return {@link vector >} describing the corners of the rectangular - * region. The first and last points are opposed on the diagonal, as - * are the second and third. The first point will be the topmost - * point and the last, the bottommost. The second point will be - * leftmost and the third, the rightmost - * @throws NotFoundException if no Data Matrix Code can be found -*/ -std::vector > WhiteRectangleDetector::detect() { - int left = leftInit_; - int right = rightInit_; - int up = upInit_; - int down = downInit_; - - bool sizeExceeded = false; - bool aBlackPointFoundOnBorder = true; - bool atLeastOneBlackPointFoundOnBorder = false; - - while (aBlackPointFoundOnBorder) { - aBlackPointFoundOnBorder = false; - - // ..... - // . | - // ..... - bool rightBorderNotWhite = true; - while (rightBorderNotWhite && right < width_) { - rightBorderNotWhite = containsBlackPoint(up, down, right, false); - if (rightBorderNotWhite) { - right++; - aBlackPointFoundOnBorder = true; - } - } - - if (right >= width_) { - sizeExceeded = true; - break; - } - - // ..... - // . . - // .___. - bool bottomBorderNotWhite = true; - while (bottomBorderNotWhite && down < height_) { - bottomBorderNotWhite = containsBlackPoint(left, right, down, true); - if (bottomBorderNotWhite) { - down++; - aBlackPointFoundOnBorder = true; - } - } - - if (down >= height_) { - sizeExceeded = true; - break; - } - - // ..... - // | . - // ..... - bool leftBorderNotWhite = true; - while (leftBorderNotWhite && left >= 0) { - leftBorderNotWhite = containsBlackPoint(up, down, left, false); - if (leftBorderNotWhite) { - left--; - aBlackPointFoundOnBorder = true; - } - } - - if (left < 0) { - sizeExceeded = true; - break; - } - - // .___. - // . . - // ..... - bool topBorderNotWhite = true; - while (topBorderNotWhite && up >= 0) { - topBorderNotWhite = containsBlackPoint(left, right, up, true); - if (topBorderNotWhite) { - up--; - aBlackPointFoundOnBorder = true; - } - } - - if (up < 0) { - sizeExceeded = true; - break; - } - - if (aBlackPointFoundOnBorder) { - atLeastOneBlackPointFoundOnBorder = true; - } - - } - if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { - - int maxSize = right - left; - - Ref z(NULL); - //go up right - for (int i = 1; i < maxSize; i++) { - z = getBlackPointOnSegment(left, down - i, left + i, down); - if (z != NULL) { - break; - } - } - - if (z == NULL) { - throw NotFoundException("z == NULL"); - } - - Ref t(NULL); - //go down right - for (int i = 1; i < maxSize; i++) { - t = getBlackPointOnSegment(left, up + i, left + i, up); - if (t != NULL) { - break; - } - } - - if (t == NULL) { - throw NotFoundException("t == NULL"); - } - - Ref x(NULL); - //go down left - for (int i = 1; i < maxSize; i++) { - x = getBlackPointOnSegment(right, up + i, right - i, up); - if (x != NULL) { - break; - } - } - - if (x == NULL) { - throw NotFoundException("x == NULL"); - } - - Ref y(NULL); - //go up left - for (int i = 1; i < maxSize; i++) { - y = getBlackPointOnSegment(right, down - i, right - i, down); - if (y != NULL) { - break; - } - } - - if (y == NULL) { - throw NotFoundException("y == NULL"); - } - - return centerEdges(y, z, x, t); - - } else { - throw NotFoundException("No black point found on border"); - } -} - -Ref -WhiteRectangleDetector::getBlackPointOnSegment(int aX_, int aY_, int bX_, int bY_) { - float aX = float(aX_), aY = float(aY_), bX = float(bX_), bY = float(bY_); - int dist = MathUtils::round(MathUtils::distance(aX, aY, bX, bY)); - float xStep = (bX - aX) / dist; - float yStep = (bY - aY) / dist; - - for (int i = 0; i < dist; i++) { - int x = MathUtils::round(aX + i * xStep); - int y = MathUtils::round(aY + i * yStep); - if (image_->get(x, y)) { - Ref point(new ResultPoint(float(x), float(y))); - return point; - } - } - Ref point(NULL); - return point; -} - -/** - * recenters the points of a constant distance towards the center - * - * @param y bottom most point - * @param z left most point - * @param x right most point - * @param t top most point - * @return {@link vector >} describing the corners of the rectangular - * region. The first and last points are opposed on the diagonal, as - * are the second and third. The first point will be the topmost - * point and the last, the bottommost. The second point will be - * leftmost and the third, the rightmost - */ -vector > WhiteRectangleDetector::centerEdges(Ref y, Ref z, - Ref x, Ref t) { - - // - // t t - // z x - // x OR z - // y y - // - - float yi = y->getX(); - float yj = y->getY(); - float zi = z->getX(); - float zj = z->getY(); - float xi = x->getX(); - float xj = x->getY(); - float ti = t->getX(); - float tj = t->getY(); - - std::vector > corners(4); - if (yi < (float)width_/2.0f) { - Ref pointA(new ResultPoint(ti - CORR, tj + CORR)); - Ref pointB(new ResultPoint(zi + CORR, zj + CORR)); - Ref pointC(new ResultPoint(xi - CORR, xj - CORR)); - Ref pointD(new ResultPoint(yi + CORR, yj - CORR)); - corners[0].reset(pointA); - corners[1].reset(pointB); - corners[2].reset(pointC); - corners[3].reset(pointD); - } else { - Ref pointA(new ResultPoint(ti + CORR, tj + CORR)); - Ref pointB(new ResultPoint(zi + CORR, zj - CORR)); - Ref pointC(new ResultPoint(xi - CORR, xj + CORR)); - Ref pointD(new ResultPoint(yi - CORR, yj - CORR)); - corners[0].reset(pointA); - corners[1].reset(pointB); - corners[2].reset(pointC); - corners[3].reset(pointD); - } - return corners; -} - -/** - * Determines whether a segment contains a black point - * - * @param a min value of the scanned coordinate - * @param b max value of the scanned coordinate - * @param fixed value of fixed coordinate - * @param horizontal set to true if scan must be horizontal, false if vertical - * @return true if a black point has been found, else false. - */ -bool WhiteRectangleDetector::containsBlackPoint(int a, int b, int fixed, bool horizontal) { - if (horizontal) { - for (int x = a; x <= b; x++) { - if (image_->get(x, fixed)) { - return true; - } - } - } else { - for (int y = a; y <= b; y++) { - if (image_->get(fixed, y)) { - return true; - } - } - } - - return false; -} diff --git a/cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h b/cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h deleted file mode 100644 index 91808060f..000000000 --- a/cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef __WHITERECTANGLEDETECTOR_H__ -#define __WHITERECTANGLEDETECTOR_H__ - -/* - * WhiteRectangleDetector.h - * - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - - -namespace zxing { - -class WhiteRectangleDetector : public Counted { - private: - static int INIT_SIZE; - static int CORR; - Ref image_; - int width_; - int height_; - int leftInit_; - int rightInit_; - int downInit_; - int upInit_; - - public: - WhiteRectangleDetector(Ref image); - WhiteRectangleDetector(Ref image, int initSize, int x, int y); - std::vector > detect(); - - private: - Ref getBlackPointOnSegment(int aX, int aY, int bX, int bY); - std::vector > centerEdges(Ref y, Ref z, - Ref x, Ref t); - bool containsBlackPoint(int a, int b, int fixed, bool horizontal); -}; -} - -#endif diff --git a/cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp b/cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp deleted file mode 100644 index f7b779d1a..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp +++ /dev/null @@ -1,150 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * GenericGF.cpp - * zxing - * - * Created by Lukas Stabe on 13/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -using zxing::GenericGF; -using zxing::GenericGFPoly; -using zxing::Ref; - -Ref GenericGF::AZTEC_DATA_12(new GenericGF(0x1069, 4096, 1)); -Ref GenericGF::AZTEC_DATA_10(new GenericGF(0x409, 1024, 1)); -Ref GenericGF::AZTEC_DATA_6(new GenericGF(0x43, 64, 1)); -Ref GenericGF::AZTEC_PARAM(new GenericGF(0x13, 16, 1)); -Ref GenericGF::QR_CODE_FIELD_256(new GenericGF(0x011D, 256, 0)); -Ref GenericGF::DATA_MATRIX_FIELD_256(new GenericGF(0x012D, 256, 1)); -Ref GenericGF::AZTEC_DATA_8 = DATA_MATRIX_FIELD_256; -Ref GenericGF::MAXICODE_FIELD_64 = AZTEC_DATA_6; - -namespace { - int INITIALIZATION_THRESHOLD = 0; -} - -GenericGF::GenericGF(int primitive_, int size_, int b) - : size(size_), primitive(primitive_), generatorBase(b), initialized(false) { - if (size <= INITIALIZATION_THRESHOLD) { - initialize(); - } -} - -void GenericGF::initialize() { - expTable.resize(size); - logTable.resize(size); - - int x = 1; - - for (int i = 0; i < size; i++) { - expTable[i] = x; - x <<= 1; // x = x * 2; we're assuming the generator alpha is 2 - if (x >= size) { - x ^= primitive; - x &= size-1; - } - } - for (int i = 0; i < size-1; i++) { - logTable[expTable[i]] = i; - } - //logTable[0] == 0 but this should never be used - zero = - Ref(new GenericGFPoly(Ref(this), ArrayRef(new Array(1)))); - zero->getCoefficients()[0] = 0; - one = - Ref(new GenericGFPoly(Ref(this), ArrayRef(new Array(1)))); - one->getCoefficients()[0] = 1; - initialized = true; -} - -void GenericGF::checkInit() { - if (!initialized) { - initialize(); - } -} - -Ref GenericGF::getZero() { - checkInit(); - return zero; -} - -Ref GenericGF::getOne() { - checkInit(); - return one; -} - -Ref GenericGF::buildMonomial(int degree, int coefficient) { - checkInit(); - - if (degree < 0) { - throw IllegalArgumentException("Degree must be non-negative"); - } - if (coefficient == 0) { - return zero; - } - ArrayRef coefficients(new Array(degree + 1)); - coefficients[0] = coefficient; - - return Ref(new GenericGFPoly(Ref(this), coefficients)); -} - -int GenericGF::addOrSubtract(int a, int b) { - return a ^ b; -} - -int GenericGF::exp(int a) { - checkInit(); - return expTable[a]; -} - -int GenericGF::log(int a) { - checkInit(); - if (a == 0) { - throw IllegalArgumentException("cannot give log(0)"); - } - return logTable[a]; -} - -int GenericGF::inverse(int a) { - checkInit(); - if (a == 0) { - throw IllegalArgumentException("Cannot calculate the inverse of 0"); - } - return expTable[size - logTable[a] - 1]; -} - -int GenericGF::multiply(int a, int b) { - checkInit(); - - if (a == 0 || b == 0) { - return 0; - } - - return expTable[(logTable[a] + logTable[b]) % (size - 1)]; - } - -int GenericGF::getSize() { - return size; -} - -int GenericGF::getGeneratorBase() { - return generatorBase; -} diff --git a/cpp/core/src/zxing/common/reedsolomon/GenericGF.h b/cpp/core/src/zxing/common/reedsolomon/GenericGF.h deleted file mode 100644 index 3a068f863..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/GenericGF.h +++ /dev/null @@ -1,73 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * GenericGF.h - * zxing - * - * Created by Lukas Stabe on 13/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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. - */ - -#ifndef GENERICGF_H -#define GENERICGF_H - -#include -#include - -namespace zxing { - class GenericGFPoly; - - class GenericGF : public Counted { - - private: - std::vector expTable; - std::vector logTable; - Ref zero; - Ref one; - int size; - int primitive; - int generatorBase; - bool initialized; - - void initialize(); - void checkInit(); - - public: - static Ref AZTEC_DATA_12; - static Ref AZTEC_DATA_10; - static Ref AZTEC_DATA_8; - static Ref AZTEC_DATA_6; - static Ref AZTEC_PARAM; - static Ref QR_CODE_FIELD_256; - static Ref DATA_MATRIX_FIELD_256; - static Ref MAXICODE_FIELD_64; - - GenericGF(int primitive, int size, int b); - - Ref getZero(); - Ref getOne(); - int getSize(); - int getGeneratorBase(); - Ref buildMonomial(int degree, int coefficient); - - static int addOrSubtract(int a, int b); - int exp(int a); - int log(int a); - int inverse(int a); - int multiply(int a, int b); - }; -} - -#endif //GENERICGF_H - diff --git a/cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp b/cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp deleted file mode 100644 index a601fd372..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp +++ /dev/null @@ -1,218 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * GenericGFPoly.cpp - * zxing - * - * Created by Lukas Stabe on 13/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -using zxing::GenericGFPoly; -using zxing::ArrayRef; -using zxing::Ref; - -// VC++ -using zxing::GenericGF; - -GenericGFPoly::GenericGFPoly(Ref field, - ArrayRef coefficients) - : field_(field) { - if (coefficients->size() == 0) { - throw IllegalArgumentException("need coefficients"); - } - int coefficientsLength = coefficients->size(); - if (coefficientsLength > 1 && coefficients[0] == 0) { - // Leading term must be non-zero for anything except the constant polynomial "0" - int firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { - firstNonZero++; - } - if (firstNonZero == coefficientsLength) { - coefficients_ = field->getZero()->getCoefficients(); - } else { - coefficients_ = ArrayRef(new Array(coefficientsLength-firstNonZero)); - for (int i = 0; i < (int)coefficients_->size(); i++) { - coefficients_[i] = coefficients[i + firstNonZero]; - } - } - } else { - coefficients_ = coefficients; - } -} - -ArrayRef GenericGFPoly::getCoefficients() { - return coefficients_; -} - -int GenericGFPoly::getDegree() { - return coefficients_->size() - 1; -} - -bool GenericGFPoly::isZero() { - return coefficients_[0] == 0; -} - -int GenericGFPoly::getCoefficient(int degree) { - return coefficients_[coefficients_->size() - 1 - degree]; -} - -int GenericGFPoly::evaluateAt(int a) { - if (a == 0) { - // Just return the x^0 coefficient - return getCoefficient(0); - } - - int size = coefficients_->size(); - if (a == 1) { - // Just the sum of the coefficients - int result = 0; - for (int i = 0; i < size; i++) { - result = GenericGF::addOrSubtract(result, coefficients_[i]); - } - return result; - } - int result = coefficients_[0]; - for (int i = 1; i < size; i++) { - result = GenericGF::addOrSubtract(field_->multiply(a, result), coefficients_[i]); - } - return result; -} - -Ref GenericGFPoly::addOrSubtract(Ref other) { - if (!(field_.object_ == other->field_.object_)) { - throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); - } - if (isZero()) { - return other; - } - if (other->isZero()) { - return Ref(this); - } - - ArrayRef smallerCoefficients = coefficients_; - ArrayRef largerCoefficients = other->getCoefficients(); - if (smallerCoefficients->size() > largerCoefficients->size()) { - ArrayRef temp = smallerCoefficients; - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - - ArrayRef sumDiff(new Array(largerCoefficients->size())); - int lengthDiff = largerCoefficients->size() - smallerCoefficients->size(); - // Copy high-order terms only found in higher-degree polynomial's coefficients - for (int i = 0; i < lengthDiff; i++) { - sumDiff[i] = largerCoefficients[i]; - } - - for (int i = lengthDiff; i < (int)largerCoefficients->size(); i++) { - sumDiff[i] = GenericGF::addOrSubtract(smallerCoefficients[i-lengthDiff], - largerCoefficients[i]); - } - - return Ref(new GenericGFPoly(field_, sumDiff)); -} - -Ref GenericGFPoly::multiply(Ref other) { - if (!(field_.object_ == other->field_.object_)) { - throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); - } - - if (isZero() || other->isZero()) { - return field_->getZero(); - } - - ArrayRef aCoefficients = coefficients_; - int aLength = aCoefficients->size(); - - ArrayRef bCoefficients = other->getCoefficients(); - int bLength = bCoefficients->size(); - - ArrayRef product(new Array(aLength + bLength - 1)); - for (int i = 0; i < aLength; i++) { - int aCoeff = aCoefficients[i]; - for (int j = 0; j < bLength; j++) { - product[i+j] = GenericGF::addOrSubtract(product[i+j], - field_->multiply(aCoeff, bCoefficients[j])); - } - } - - return Ref(new GenericGFPoly(field_, product)); -} - -Ref GenericGFPoly::multiply(int scalar) { - if (scalar == 0) { - return field_->getZero(); - } - if (scalar == 1) { - return Ref(this); - } - int size = coefficients_->size(); - ArrayRef product(new Array(size)); - for (int i = 0; i < size; i++) { - product[i] = field_->multiply(coefficients_[i], scalar); - } - return Ref(new GenericGFPoly(field_, product)); -} - -Ref GenericGFPoly::multiplyByMonomial(int degree, int coefficient) { - if (degree < 0) { - throw IllegalArgumentException("degree must not be less then 0"); - } - if (coefficient == 0) { - return field_->getZero(); - } - int size = coefficients_->size(); - ArrayRef product(new Array(size+degree)); - for (int i = 0; i < size; i++) { - product[i] = field_->multiply(coefficients_[i], coefficient); - } - return Ref(new GenericGFPoly(field_, product)); -} - -std::vector > GenericGFPoly::divide(Ref other) { - if (!(field_.object_ == other->field_.object_)) { - throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); - } - if (other->isZero()) { - throw IllegalArgumentException("divide by 0"); - } - - Ref quotient = field_->getZero(); - Ref remainder = Ref(this); - - int denominatorLeadingTerm = other->getCoefficient(other->getDegree()); - int inverseDenominatorLeadingTerm = field_->inverse(denominatorLeadingTerm); - - while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) { - int degreeDifference = remainder->getDegree() - other->getDegree(); - int scale = field_->multiply(remainder->getCoefficient(remainder->getDegree()), - inverseDenominatorLeadingTerm); - Ref term = other->multiplyByMonomial(degreeDifference, scale); - Ref iterationQuotiont = field_->buildMonomial(degreeDifference, - scale); - quotient = quotient->addOrSubtract(iterationQuotiont); - remainder = remainder->addOrSubtract(term); - } - - std::vector > returnValue; - returnValue[0] = quotient; - returnValue[1] = remainder; - return returnValue; -} diff --git a/cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h b/cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h deleted file mode 100644 index e8ae843c1..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h +++ /dev/null @@ -1,56 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * GenericGFPoly.h - * zxing - * - * Created by Lukas Stabe on 13/02/2012. - * Copyright 2012 ZXing authors All rights reserved. - * - * 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. - */ - -#ifndef GENERICGFPOLY_H -#define GENERICGFPOLY_H - -#include -#include -#include - -namespace zxing { - -class GenericGF; - -class GenericGFPoly : public Counted { -private: - Ref field_; - ArrayRef coefficients_; - -public: - GenericGFPoly(Ref field, ArrayRef coefficients); - ArrayRef getCoefficients(); - int getDegree(); - bool isZero(); - int getCoefficient(int degree); - int evaluateAt(int a); - Ref addOrSubtract(Ref other); - Ref multiply(Ref other); - Ref multiply(int scalar); - Ref multiplyByMonomial(int degree, int coefficient); - std::vector > divide(Ref other); - - -}; - -} - -#endif //GENERICGFPOLY_H diff --git a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp b/cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp deleted file mode 100644 index c33407ec4..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Created by Christian Brunschen on 05/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 - -#include -#include -#include -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::ReedSolomonDecoder; -using zxing::GenericGFPoly; -using zxing::IllegalStateException; - -// VC++ -using zxing::GenericGF; - -ReedSolomonDecoder::ReedSolomonDecoder(Ref field_) : field(field_) {} - -ReedSolomonDecoder::~ReedSolomonDecoder() { -} - -void ReedSolomonDecoder::decode(ArrayRef received, int twoS) { - Ref poly(new GenericGFPoly(field, received)); - ArrayRef syndromeCoefficients(twoS); - bool noError = true; - for (int i = 0; i < twoS; i++) { - int eval = poly->evaluateAt(field->exp(i + field->getGeneratorBase())); - syndromeCoefficients[syndromeCoefficients->size() - 1 - i] = eval; - if (eval != 0) { - noError = false; - } - } - if (noError) { - return; - } - Ref syndrome(new GenericGFPoly(field, syndromeCoefficients)); - vector > sigmaOmega = - runEuclideanAlgorithm(field->buildMonomial(twoS, 1), syndrome, twoS); - Ref sigma = sigmaOmega[0]; - Ref omega = sigmaOmega[1]; - ArrayRef errorLocations = findErrorLocations(sigma); - ArrayRef errorMagitudes = findErrorMagnitudes(omega, errorLocations); - for (int i = 0; i < errorLocations->size(); i++) { - int position = received->size() - 1 - field->log(errorLocations[i]); - if (position < 0) { - throw ReedSolomonException("Bad error location"); - } - received[position] = GenericGF::addOrSubtract(received[position], errorMagitudes[i]); - } -} - -vector > ReedSolomonDecoder::runEuclideanAlgorithm(Ref a, - Ref b, - int R) { - // Assume a's degree is >= b's - if (a->getDegree() < b->getDegree()) { - Ref tmp = a; - a = b; - b = tmp; - } - - Ref rLast(a); - Ref r(b); - Ref tLast(field->getZero()); - Ref t(field->getOne()); - - // Run Euclidean algorithm until r's degree is less than R/2 - while (r->getDegree() >= R / 2) { - Ref rLastLast(rLast); - Ref tLastLast(tLast); - rLast = r; - tLast = t; - - // Divide rLastLast by rLast, with quotient q and remainder r - if (rLast->isZero()) { - // Oops, Euclidean algorithm already terminated? - throw ReedSolomonException("r_{i-1} was zero"); - } - r = rLastLast; - Ref q = field->getZero(); - int denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree()); - int dltInverse = field->inverse(denominatorLeadingTerm); - while (r->getDegree() >= rLast->getDegree() && !r->isZero()) { - int degreeDiff = r->getDegree() - rLast->getDegree(); - int scale = field->multiply(r->getCoefficient(r->getDegree()), dltInverse); - q = q->addOrSubtract(field->buildMonomial(degreeDiff, scale)); - r = r->addOrSubtract(rLast->multiplyByMonomial(degreeDiff, scale)); - } - - t = q->multiply(tLast)->addOrSubtract(tLastLast); - - if (r->getDegree() >= rLast->getDegree()) { - throw IllegalStateException("Division algorithm failed to reduce polynomial?"); - } - } - - int sigmaTildeAtZero = t->getCoefficient(0); - if (sigmaTildeAtZero == 0) { - throw ReedSolomonException("sigmaTilde(0) was zero"); - } - - int inverse = field->inverse(sigmaTildeAtZero); - Ref sigma(t->multiply(inverse)); - Ref omega(r->multiply(inverse)); - vector > result(2); - result[0] = sigma; - result[1] = omega; - return result; -} - -ArrayRef ReedSolomonDecoder::findErrorLocations(Ref errorLocator) { - // This is a direct application of Chien's search - int numErrors = errorLocator->getDegree(); - if (numErrors == 1) { // shortcut - ArrayRef result(new Array(1)); - result[0] = errorLocator->getCoefficient(1); - return result; - } - ArrayRef result(new Array(numErrors)); - int e = 0; - for (int i = 1; i < field->getSize() && e < numErrors; i++) { - if (errorLocator->evaluateAt(i) == 0) { - result[e] = field->inverse(i); - e++; - } - } - if (e != numErrors) { - throw ReedSolomonException("Error locator degree does not match number of roots"); - } - return result; -} - -ArrayRef ReedSolomonDecoder::findErrorMagnitudes(Ref errorEvaluator, ArrayRef errorLocations) { - // This is directly applying Forney's Formula - int s = errorLocations->size(); - ArrayRef result(new Array(s)); - for (int i = 0; i < s; i++) { - int xiInverse = field->inverse(errorLocations[i]); - int denominator = 1; - for (int j = 0; j < s; j++) { - if (i != j) { - int term = field->multiply(errorLocations[j], xiInverse); - int termPlus1 = (term & 0x1) == 0 ? term | 1 : term & ~1; - denominator = field->multiply(denominator, termPlus1); - } - } - result[i] = field->multiply(errorEvaluator->evaluateAt(xiInverse), - field->inverse(denominator)); - if (field->getGeneratorBase() != 0) { - result[i] = field->multiply(result[i], xiInverse); - } - } - return result; -} diff --git a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h b/cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h deleted file mode 100644 index 296a47964..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __REED_SOLOMON_DECODER_H__ -#define __REED_SOLOMON_DECODER_H__ - -/* - * ReedSolomonDecoder.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -namespace zxing { -class GenericGFPoly; -class GenericGF; - -class ReedSolomonDecoder { -private: - Ref field; -public: - ReedSolomonDecoder(Ref fld); - ~ReedSolomonDecoder(); - void decode(ArrayRef received, int twoS); - std::vector > runEuclideanAlgorithm(Ref a, Ref b, int R); - -private: - ArrayRef findErrorLocations(Ref errorLocator); - ArrayRef findErrorMagnitudes(Ref errorEvaluator, ArrayRef errorLocations); -}; -} - -#endif // __REED_SOLOMON_DECODER_H__ diff --git a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp b/cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp deleted file mode 100644 index 20af025bb..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - * ReedSolomonException.cpp - * zxing - * - * Created by Christian Brunschen on 06/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 - -namespace zxing { -ReedSolomonException::ReedSolomonException(const char *msg) throw() : - Exception(msg) { -} -ReedSolomonException::~ReedSolomonException() throw() { -} - -} diff --git a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h b/cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h deleted file mode 100644 index 1c01250b5..000000000 --- a/cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef __REED_SOLOMON_EXCEPTION_H__ -#define __REED_SOLOMON_EXCEPTION_H__ - -/* - * ReedSolomonException.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -class ReedSolomonException : public Exception { -public: - ReedSolomonException(const char *msg) throw(); - ~ReedSolomonException() throw(); -}; -} - -#endif // __REED_SOLOMON_EXCEPTION_H__ diff --git a/cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp b/cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp deleted file mode 100644 index c99180c41..000000000 --- a/cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * DataMatrixReader.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace datamatrix { - -using namespace std; - -DataMatrixReader::DataMatrixReader() : - decoder_() { -} - -Ref DataMatrixReader::decode(Ref image, DecodeHints hints) { - (void)hints; - Detector detector(image->getBlackMatrix()); - Ref detectorResult(detector.detect()); - ArrayRef< Ref > points(detectorResult->getPoints()); - - - Ref decoderResult(decoder_.decode(detectorResult->getBits())); - - Ref result( - new Result(decoderResult->getText(), decoderResult->getRawBytes(), points, BarcodeFormat::DATA_MATRIX)); - - return result; -} - -DataMatrixReader::~DataMatrixReader() { -} - -} -} diff --git a/cpp/core/src/zxing/datamatrix/DataMatrixReader.h b/cpp/core/src/zxing/datamatrix/DataMatrixReader.h deleted file mode 100644 index e266739c1..000000000 --- a/cpp/core/src/zxing/datamatrix/DataMatrixReader.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef __DATA_MATRIX_READER_H__ -#define __DATA_MATRIX_READER_H__ - -/* - * DataMatrixReader.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace datamatrix { - -class DataMatrixReader : public Reader { -private: - Decoder decoder_; - -public: - DataMatrixReader(); - virtual Ref decode(Ref image, DecodeHints hints); - virtual ~DataMatrixReader(); - -}; - -} -} - -#endif // __DATA_MATRIX_READER_H__ diff --git a/cpp/core/src/zxing/datamatrix/Version.cpp b/cpp/core/src/zxing/datamatrix/Version.cpp deleted file mode 100644 index f94ca65ac..000000000 --- a/cpp/core/src/zxing/datamatrix/Version.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Version.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace datamatrix { -using namespace std; - -ECB::ECB(int count, int dataCodewords) : - count_(count), dataCodewords_(dataCodewords) { -} - -int ECB::getCount() { - return count_; -} - -int ECB::getDataCodewords() { - return dataCodewords_; -} - -ECBlocks::ECBlocks(int ecCodewords, ECB *ecBlocks) : - ecCodewords_(ecCodewords), ecBlocks_(1, ecBlocks) { -} - -ECBlocks::ECBlocks(int ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2) : - ecCodewords_(ecCodewords), ecBlocks_(1, ecBlocks1) { - ecBlocks_.push_back(ecBlocks2); -} - -int ECBlocks::getECCodewords() { - return ecCodewords_; -} - -std::vector& ECBlocks::getECBlocks() { - return ecBlocks_; -} - -ECBlocks::~ECBlocks() { - for (size_t i = 0; i < ecBlocks_.size(); i++) { - delete ecBlocks_[i]; - } -} - -vector > Version::VERSIONS; -static int N_VERSIONS = Version::buildVersions(); - -Version::Version(int versionNumber, int symbolSizeRows, int symbolSizeColumns, int dataRegionSizeRows, - int dataRegionSizeColumns, ECBlocks* ecBlocks) : versionNumber_(versionNumber), - symbolSizeRows_(symbolSizeRows), symbolSizeColumns_(symbolSizeColumns), - dataRegionSizeRows_(dataRegionSizeRows), dataRegionSizeColumns_(dataRegionSizeColumns), - ecBlocks_(ecBlocks), totalCodewords_(0) { - // Calculate the total number of codewords - int total = 0; - int ecCodewords = ecBlocks_->getECCodewords(); - vector &ecbArray = ecBlocks_->getECBlocks(); - for (unsigned int i = 0; i < ecbArray.size(); i++) { - ECB *ecBlock = ecbArray[i]; - total += ecBlock->getCount() * (ecBlock->getDataCodewords() + ecCodewords); - } - totalCodewords_ = total; -} - -Version::~Version() { - delete ecBlocks_; -} - -int Version::getVersionNumber() { - return versionNumber_; -} - -int Version::getSymbolSizeRows() { - return symbolSizeRows_; -} - -int Version::getSymbolSizeColumns() { - return symbolSizeColumns_; -} - -int Version::getDataRegionSizeRows() { - return dataRegionSizeRows_; -} - -int Version::getDataRegionSizeColumns() { - return dataRegionSizeColumns_; -} - -int Version::getTotalCodewords() { - return totalCodewords_; -} - -ECBlocks* Version::getECBlocks() { - return ecBlocks_; -} - -Ref Version::getVersionForDimensions(int numRows, int numColumns) { - if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { - throw ReaderException("Number of rows and columns must be even"); - } - - // TODO(bbrown): This is doing a linear search through the array of versions. - // If we interleave the rectangular versions with the square versions we could - // do a binary search. - for (int i = 0; i < N_VERSIONS; ++i){ - Ref version(VERSIONS[i]); - if (version->getSymbolSizeRows() == numRows && version->getSymbolSizeColumns() == numColumns) { - return version; - } - } - throw ReaderException("Error version not found"); - } - -/** - * See ISO 16022:2006 5.5.1 Table 7 - */ -int Version::buildVersions() { - VERSIONS.push_back(Ref(new Version(1, 10, 10, 8, 8, - new ECBlocks(5, new ECB(1, 3))))); - VERSIONS.push_back(Ref(new Version(2, 12, 12, 10, 10, - new ECBlocks(7, new ECB(1, 5))))); - VERSIONS.push_back(Ref(new Version(3, 14, 14, 12, 12, - new ECBlocks(10, new ECB(1, 8))))); - VERSIONS.push_back(Ref(new Version(4, 16, 16, 14, 14, - new ECBlocks(12, new ECB(1, 12))))); - VERSIONS.push_back(Ref(new Version(5, 18, 18, 16, 16, - new ECBlocks(14, new ECB(1, 18))))); - VERSIONS.push_back(Ref(new Version(6, 20, 20, 18, 18, - new ECBlocks(18, new ECB(1, 22))))); - VERSIONS.push_back(Ref(new Version(7, 22, 22, 20, 20, - new ECBlocks(20, new ECB(1, 30))))); - VERSIONS.push_back(Ref(new Version(8, 24, 24, 22, 22, - new ECBlocks(24, new ECB(1, 36))))); - VERSIONS.push_back(Ref(new Version(9, 26, 26, 24, 24, - new ECBlocks(28, new ECB(1, 44))))); - VERSIONS.push_back(Ref(new Version(10, 32, 32, 14, 14, - new ECBlocks(36, new ECB(1, 62))))); - VERSIONS.push_back(Ref(new Version(11, 36, 36, 16, 16, - new ECBlocks(42, new ECB(1, 86))))); - VERSIONS.push_back(Ref(new Version(12, 40, 40, 18, 18, - new ECBlocks(48, new ECB(1, 114))))); - VERSIONS.push_back(Ref(new Version(13, 44, 44, 20, 20, - new ECBlocks(56, new ECB(1, 144))))); - VERSIONS.push_back(Ref(new Version(14, 48, 48, 22, 22, - new ECBlocks(68, new ECB(1, 174))))); - VERSIONS.push_back(Ref(new Version(15, 52, 52, 24, 24, - new ECBlocks(42, new ECB(2, 102))))); - VERSIONS.push_back(Ref(new Version(16, 64, 64, 14, 14, - new ECBlocks(56, new ECB(2, 140))))); - VERSIONS.push_back(Ref(new Version(17, 72, 72, 16, 16, - new ECBlocks(36, new ECB(4, 92))))); - VERSIONS.push_back(Ref(new Version(18, 80, 80, 18, 18, - new ECBlocks(48, new ECB(4, 114))))); - VERSIONS.push_back(Ref(new Version(19, 88, 88, 20, 20, - new ECBlocks(56, new ECB(4, 144))))); - VERSIONS.push_back(Ref(new Version(20, 96, 96, 22, 22, - new ECBlocks(68, new ECB(4, 174))))); - VERSIONS.push_back(Ref(new Version(21, 104, 104, 24, 24, - new ECBlocks(56, new ECB(6, 136))))); - VERSIONS.push_back(Ref(new Version(22, 120, 120, 18, 18, - new ECBlocks(68, new ECB(6, 175))))); - VERSIONS.push_back(Ref(new Version(23, 132, 132, 20, 20, - new ECBlocks(62, new ECB(8, 163))))); - VERSIONS.push_back(Ref(new Version(24, 144, 144, 22, 22, - new ECBlocks(62, new ECB(8, 156), new ECB(2, 155))))); - VERSIONS.push_back(Ref(new Version(25, 8, 18, 6, 16, - new ECBlocks(7, new ECB(1, 5))))); - VERSIONS.push_back(Ref(new Version(26, 8, 32, 6, 14, - new ECBlocks(11, new ECB(1, 10))))); - VERSIONS.push_back(Ref(new Version(27, 12, 26, 10, 24, - new ECBlocks(14, new ECB(1, 16))))); - VERSIONS.push_back(Ref(new Version(28, 12, 36, 10, 16, - new ECBlocks(18, new ECB(1, 22))))); - VERSIONS.push_back(Ref(new Version(29, 16, 36, 14, 16, - new ECBlocks(24, new ECB(1, 32))))); - VERSIONS.push_back(Ref(new Version(30, 16, 48, 14, 22, - new ECBlocks(28, new ECB(1, 49))))); - return VERSIONS.size(); -} -} -} diff --git a/cpp/core/src/zxing/datamatrix/Version.h b/cpp/core/src/zxing/datamatrix/Version.h deleted file mode 100644 index d8523fe23..000000000 --- a/cpp/core/src/zxing/datamatrix/Version.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef __VERSION_H__ -#define __VERSION_H__ - -/* - * Version.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace datamatrix { - -class ECB { -private: - int count_; - int dataCodewords_; -public: - ECB(int count, int dataCodewords); - int getCount(); - int getDataCodewords(); -}; - -class ECBlocks { -private: - int ecCodewords_; - std::vector ecBlocks_; -public: - ECBlocks(int ecCodewords, ECB *ecBlocks); - ECBlocks(int ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2); - int getECCodewords(); - std::vector& getECBlocks(); - ~ECBlocks(); -}; - -class Version : public Counted { -private: - int versionNumber_; - int symbolSizeRows_; - int symbolSizeColumns_; - int dataRegionSizeRows_; - int dataRegionSizeColumns_; - ECBlocks* ecBlocks_; - int totalCodewords_; - Version(int versionNumber, int symbolSizeRows, int symbolSizeColumns, int dataRegionSizeRows, - int dataRegionSizeColumns, ECBlocks *ecBlocks); - -public: - static std::vector > VERSIONS; - - ~Version(); - int getVersionNumber(); - int getSymbolSizeRows(); - int getSymbolSizeColumns(); - int getDataRegionSizeRows(); - int getDataRegionSizeColumns(); - int getTotalCodewords(); - ECBlocks* getECBlocks(); - static int buildVersions(); - Ref getVersionForDimensions(int numRows, int numColumns); - -private: - Version(const Version&); - Version & operator=(const Version&); -}; -} -} - -#endif // __VERSION_H__ diff --git a/cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp b/cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp deleted file mode 100644 index 94634680a..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp +++ /dev/null @@ -1,361 +0,0 @@ -/* - * BitMatrixParser.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -#include - -namespace zxing { -namespace datamatrix { - -int BitMatrixParser::copyBit(size_t x, size_t y, int versionBits) { - return bitMatrix_->get(x, y) ? (versionBits << 1) | 0x1 : versionBits << 1; -} - -BitMatrixParser::BitMatrixParser(Ref bitMatrix) : bitMatrix_(NULL), - parsedVersion_(NULL), - readBitMatrix_(NULL) { - size_t dimension = bitMatrix->getHeight(); - if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) - throw ReaderException("Dimension must be even, > 8 < 144"); - - parsedVersion_ = readVersion(bitMatrix); - bitMatrix_ = extractDataRegion(bitMatrix); - readBitMatrix_ = new BitMatrix(bitMatrix_->getWidth(), bitMatrix_->getHeight()); -} - -Ref BitMatrixParser::readVersion(Ref bitMatrix) { - if (parsedVersion_ != 0) { - return parsedVersion_; - } - - int numRows = bitMatrix->getHeight(); - int numColumns = bitMatrix->getWidth(); - - Ref version = parsedVersion_->getVersionForDimensions(numRows, numColumns); - if (version != 0) { - return version; - } - throw ReaderException("Couldn't decode version"); -} - -ArrayRef BitMatrixParser::readCodewords() { - ArrayRef result(parsedVersion_->getTotalCodewords()); - int resultOffset = 0; - int row = 4; - int column = 0; - - int numRows = bitMatrix_->getHeight(); - int numColumns = bitMatrix_->getWidth(); - - bool corner1Read = false; - bool corner2Read = false; - bool corner3Read = false; - bool corner4Read = false; - - // Read all of the codewords - do { - // Check the four corner cases - if ((row == numRows) && (column == 0) && !corner1Read) { - result[resultOffset++] = (char) readCorner1(numRows, numColumns); - row -= 2; - column +=2; - corner1Read = true; - } else if ((row == numRows-2) && (column == 0) && ((numColumns & 0x03) != 0) && !corner2Read) { - result[resultOffset++] = (char) readCorner2(numRows, numColumns); - row -= 2; - column +=2; - corner2Read = true; - } else if ((row == numRows+4) && (column == 2) && ((numColumns & 0x07) == 0) && !corner3Read) { - result[resultOffset++] = (char) readCorner3(numRows, numColumns); - row -= 2; - column +=2; - corner3Read = true; - } else if ((row == numRows-2) && (column == 0) && ((numColumns & 0x07) == 4) && !corner4Read) { - result[resultOffset++] = (char) readCorner4(numRows, numColumns); - row -= 2; - column +=2; - corner4Read = true; - } else { - // Sweep upward diagonally to the right - do { - if ((row < numRows) && (column >= 0) && !readBitMatrix_->get(column, row)) { - result[resultOffset++] = (char) readUtah(row, column, numRows, numColumns); - } - row -= 2; - column +=2; - } while ((row >= 0) && (column < numColumns)); - row += 1; - column +=3; - - // Sweep downward diagonally to the left - do { - if ((row >= 0) && (column < numColumns) && !readBitMatrix_->get(column, row)) { - result[resultOffset++] = (char) readUtah(row, column, numRows, numColumns); - } - row += 2; - column -=2; - } while ((row < numRows) && (column >= 0)); - row += 3; - column +=1; - } - } while ((row < numRows) || (column < numColumns)); - - if (resultOffset != parsedVersion_->getTotalCodewords()) { - throw ReaderException("Did not read all codewords"); - } - return result; -} - -bool BitMatrixParser::readModule(int row, int column, int numRows, int numColumns) { - // Adjust the row and column indices based on boundary wrapping - if (row < 0) { - row += numRows; - column += 4 - ((numRows + 4) & 0x07); - } - if (column < 0) { - column += numColumns; - row += 4 - ((numColumns + 4) & 0x07); - } - readBitMatrix_->set(column, row); - return bitMatrix_->get(column, row); - } - -int BitMatrixParser::readUtah(int row, int column, int numRows, int numColumns) { - int currentByte = 0; - if (readModule(row - 2, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 2, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 1, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 1, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row - 1, column, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row, column - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row, column - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(row, column, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - -int BitMatrixParser::readCorner1(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - -int BitMatrixParser::readCorner2(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 4, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - -int BitMatrixParser::readCorner3(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 3, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - -int BitMatrixParser::readCorner4(int numRows, int numColumns) { - int currentByte = 0; - if (readModule(numRows - 3, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 2, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(numRows - 1, 0, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 2, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(0, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(1, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(2, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - currentByte <<= 1; - if (readModule(3, numColumns - 1, numRows, numColumns)) { - currentByte |= 1; - } - return currentByte; - } - -Ref BitMatrixParser::extractDataRegion(Ref bitMatrix) { - int symbolSizeRows = parsedVersion_->getSymbolSizeRows(); - int symbolSizeColumns = parsedVersion_->getSymbolSizeColumns(); - - if ((int)bitMatrix->getHeight() != symbolSizeRows) { - throw IllegalArgumentException("Dimension of bitMatrix must match the version size"); - } - - int dataRegionSizeRows = parsedVersion_->getDataRegionSizeRows(); - int dataRegionSizeColumns = parsedVersion_->getDataRegionSizeColumns(); - - int numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; - int numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; - - int sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; - int sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; - - Ref bitMatrixWithoutAlignment(new BitMatrix(sizeDataRegionColumn, sizeDataRegionRow)); - for (int dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { - int dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; - for (int dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { - int dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; - for (int i = 0; i < dataRegionSizeRows; ++i) { - int readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; - int writeRowOffset = dataRegionRowOffset + i; - for (int j = 0; j < dataRegionSizeColumns; ++j) { - int readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; - if (bitMatrix->get(readColumnOffset, readRowOffset)) { - int writeColumnOffset = dataRegionColumnOffset + j; - bitMatrixWithoutAlignment->set(writeColumnOffset, writeRowOffset); - } - } - } - } - } - return bitMatrixWithoutAlignment; -} - -} -} diff --git a/cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h b/cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h deleted file mode 100644 index aed7b61fe..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef __BIT_MATRIX_PARSER_DM_H__ -#define __BIT_MATRIX_PARSER_DM_H__ - -/* - * BitMatrixParser.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { -namespace datamatrix { - -class BitMatrixParser : public Counted { -private: - Ref bitMatrix_; - Ref parsedVersion_; - Ref readBitMatrix_; - - int copyBit(size_t x, size_t y, int versionBits); - -public: - BitMatrixParser(Ref bitMatrix); - Ref readVersion(Ref bitMatrix); - ArrayRef readCodewords(); - bool readModule(int row, int column, int numRows, int numColumns); - -private: - int readUtah(int row, int column, int numRows, int numColumns); - int readCorner1(int numRows, int numColumns); - int readCorner2(int numRows, int numColumns); - int readCorner3(int numRows, int numColumns); - int readCorner4(int numRows, int numColumns); - Ref extractDataRegion(Ref bitMatrix); -}; - -} -} - -#endif // __BIT_MATRIX_PARSER_DM_H__ diff --git a/cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp b/cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp deleted file mode 100644 index 1cbfaf388..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * DataBlock.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace datamatrix { - -using namespace std; - -DataBlock::DataBlock(int numDataCodewords, ArrayRef codewords) : - numDataCodewords_(numDataCodewords), codewords_(codewords) { -} - -int DataBlock::getNumDataCodewords() { - return numDataCodewords_; -} - -ArrayRef DataBlock::getCodewords() { - return codewords_; -} - -std::vector > DataBlock::getDataBlocks(ArrayRef rawCodewords, Version *version) { - // Figure out the number and size of data blocks used by this version and - // error correction level - ECBlocks* ecBlocks = version->getECBlocks(); - - // First count the total number of data blocks - int totalBlocks = 0; - vector ecBlockArray = ecBlocks->getECBlocks(); - for (size_t i = 0; i < ecBlockArray.size(); i++) { - totalBlocks += ecBlockArray[i]->getCount(); - } - - // Now establish DataBlocks of the appropriate size and number of data codewords - std::vector > result(totalBlocks); - int numResultBlocks = 0; - for (size_t j = 0; j < ecBlockArray.size(); j++) { - ECB *ecBlock = ecBlockArray[j]; - for (int i = 0; i < ecBlock->getCount(); i++) { - int numDataCodewords = ecBlock->getDataCodewords(); - int numBlockCodewords = ecBlocks->getECCodewords() + numDataCodewords; - ArrayRef buffer(numBlockCodewords); - Ref blockRef(new DataBlock(numDataCodewords, buffer)); - result[numResultBlocks++] = blockRef; - } - } - - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 more byte. Figure out where these start. - int shorterBlocksTotalCodewords = result[0]->codewords_->size(); - int longerBlocksStartAt = result.size() - 1; - while (longerBlocksStartAt >= 0) { - int numCodewords = result[longerBlocksStartAt]->codewords_->size(); - if (numCodewords == shorterBlocksTotalCodewords) { - break; - } - if (numCodewords != shorterBlocksTotalCodewords + 1) { - throw IllegalArgumentException("Data block sizes differ by more than 1"); - } - longerBlocksStartAt--; - } - longerBlocksStartAt++; - - int shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks->getECCodewords(); - // The last elements of result may be 1 element longer; - // first fill out as many elements as all of them have - int rawCodewordsOffset = 0; - for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { - for (int j = 0; j < numResultBlocks; j++) { - result[j]->codewords_[i] = rawCodewords[rawCodewordsOffset++]; - } - } - // Fill out the last data block in the longer ones - for (int j = longerBlocksStartAt; j < numResultBlocks; j++) { - result[j]->codewords_[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++]; - } - // Now add in error correction blocks - int max = result[0]->codewords_->size(); - for (int i = shorterBlocksNumDataCodewords; i < max; i++) { - for (int j = 0; j < numResultBlocks; j++) { - int iOffset = j < longerBlocksStartAt ? i : i + 1; - result[j]->codewords_[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - - if (rawCodewordsOffset != rawCodewords->size()) { - throw IllegalArgumentException("rawCodewordsOffset != rawCodewords.length"); - } - - return result; -} - -} -} diff --git a/cpp/core/src/zxing/datamatrix/decoder/DataBlock.h b/cpp/core/src/zxing/datamatrix/decoder/DataBlock.h deleted file mode 100644 index 5bc48db2c..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/DataBlock.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __DATA_BLOCK_DM_H__ -#define __DATA_BLOCK_DM_H__ - -/* - * DataBlock.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace datamatrix { - -class DataBlock : public Counted { -private: - int numDataCodewords_; - ArrayRef codewords_; - - DataBlock(int numDataCodewords, ArrayRef codewords); - -public: - static std::vector > getDataBlocks(ArrayRef rawCodewords, Version *version); - - int getNumDataCodewords(); - ArrayRef getCodewords(); -}; - -} -} - -#endif // __DATA_BLOCK_DM_H__ diff --git a/cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp b/cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp deleted file mode 100644 index 8482b1a83..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp +++ /dev/null @@ -1,416 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * DecodedBitStreamParser.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace datamatrix { - -using namespace std; - -const char DecodedBitStreamParser::C40_BASIC_SET_CHARS[] = { - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' -}; - -const char DecodedBitStreamParser::C40_SHIFT2_SET_CHARS[] = { - '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', - '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' -}; - -const char DecodedBitStreamParser::TEXT_BASIC_SET_CHARS[] = { - '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' -}; - -const char DecodedBitStreamParser::TEXT_SHIFT3_SET_CHARS[] = { - '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', (char) 127 -}; - -Ref DecodedBitStreamParser::decode(ArrayRef bytes) { - Ref bits(new BitSource(bytes)); - ostringstream result; - ostringstream resultTrailer; - vector byteSegments; - int mode = ASCII_ENCODE; - do { - if (mode == ASCII_ENCODE) { - mode = decodeAsciiSegment(bits, result, resultTrailer); - } else { - switch (mode) { - case C40_ENCODE: - decodeC40Segment(bits, result); - break; - case TEXT_ENCODE: - decodeTextSegment(bits, result); - break; - case ANSIX12_ENCODE: - decodeAnsiX12Segment(bits, result); - break; - case EDIFACT_ENCODE: - decodeEdifactSegment(bits, result); - break; - case BASE256_ENCODE: - decodeBase256Segment(bits, result, byteSegments); - break; - default: - throw FormatException("Unsupported mode indicator"); - } - mode = ASCII_ENCODE; - } - } while (mode != PAD_ENCODE && bits->available() > 0); - - if (resultTrailer.str().size() > 0) { - result << resultTrailer.str(); - } - ArrayRef rawBytes(bytes); - Ref text(new String(result.str())); - return Ref(new DecoderResult(rawBytes, text)); -} - -int DecodedBitStreamParser::decodeAsciiSegment(Ref bits, ostringstream & result, - ostringstream & resultTrailer) { - bool upperShift = false; - do { - int oneByte = bits->readBits(8); - if (oneByte == 0) { - throw FormatException("Not enough bits to decode"); - } else if (oneByte <= 128) { // ASCII data (ASCII value + 1) - oneByte = upperShift ? (oneByte + 128) : oneByte; - // upperShift = false; - result << (char) (oneByte - 1); - return ASCII_ENCODE; - } else if (oneByte == 129) { // Pad - return PAD_ENCODE; - } else if (oneByte <= 229) { // 2-digit data 00-99 (Numeric Value + 130) - int value = oneByte - 130; - if (value < 10) { // padd with '0' for single digit values - result << '0'; - } - result << value; - } else if (oneByte == 230) { // Latch to C40 encodation - return C40_ENCODE; - } else if (oneByte == 231) { // Latch to Base 256 encodation - return BASE256_ENCODE; - } else if (oneByte == 232) { // FNC1 - result << ((char) 29); // translate as ASCII 29 - } else if (oneByte == 233 || oneByte == 234) { - // Structured Append, Reader Programming - // Ignore these symbols for now - // throw FormatException.getInstance(); - } else if (oneByte == 235) { // Upper Shift (shift to Extended ASCII) - upperShift = true; - } else if (oneByte == 236) { // 05 Macro - result << ("[)>RS05GS"); - resultTrailer << ("RSEOT"); - } else if (oneByte == 237) { // 06 Macro - result << ("[)>RS06GS"); - resultTrailer << ("RSEOT"); - } else if (oneByte == 238) { // Latch to ANSI X12 encodation - return ANSIX12_ENCODE; - } else if (oneByte == 239) { // Latch to Text encodation - return TEXT_ENCODE; - } else if (oneByte == 240) { // Latch to EDIFACT encodation - return EDIFACT_ENCODE; - } else if (oneByte == 241) { // ECI Character - // TODO(bbrown): I think we need to support ECI - // throw FormatException.getInstance(); - // Ignore this symbol for now - } else if (oneByte >= 242) { // Not to be used in ASCII encodation - // ... but work around encoders that end with 254, latch back to ASCII - if (oneByte != 254 || bits->available() != 0) { - throw FormatException("Not to be used in ASCII encodation"); - } - } - } while (bits->available() > 0); - return ASCII_ENCODE; -} - -void DecodedBitStreamParser::decodeC40Segment(Ref bits, ostringstream & result) { - // Three C40 values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - // TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time - bool upperShift = false; - - int cValues[3]; - int shift = 0; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits->available() == 8) { - return; - } - int firstByte = bits->readBits(8); - if (firstByte == 254) { // Unlatch codeword - return; - } - - parseTwoBytes(firstByte, bits->readBits(8), cValues); - - for (int i = 0; i < 3; i++) { - int cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } else { - if (upperShift) { - result << (char) (C40_BASIC_SET_CHARS[cValue] + 128); - upperShift = false; - } else { - result << C40_BASIC_SET_CHARS[cValue]; - } - } - break; - case 1: - if (upperShift) { - result << (char) (cValue + 128); - upperShift = false; - } else { - result << (char) cValue; - } - shift = 0; - break; - case 2: - if (cValue < 27) { - if (upperShift) { - result << (char) (C40_SHIFT2_SET_CHARS[cValue] + 128); - upperShift = false; - } else { - result << C40_SHIFT2_SET_CHARS[cValue]; - } - } else if (cValue == 27) { // FNC1 - result << ((char) 29); // translate as ASCII 29 - } else if (cValue == 30) { // Upper Shift - upperShift = true; - } else { - throw FormatException("decodeC40Segment: Upper Shift"); - } - shift = 0; - break; - case 3: - if (upperShift) { - result << (char) (cValue + 224); - upperShift = false; - } else { - result << (char) (cValue + 96); - } - shift = 0; - break; - default: - throw FormatException("decodeC40Segment: no case"); - } - } - } while (bits->available() > 0); -} - -void DecodedBitStreamParser::decodeTextSegment(Ref bits, ostringstream & result) { - // Three Text values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - // TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time - bool upperShift = false; - - int cValues[3]; - int shift = 0; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits->available() == 8) { - return; - } - int firstByte = bits->readBits(8); - if (firstByte == 254) { // Unlatch codeword - return; - } - - parseTwoBytes(firstByte, bits->readBits(8), cValues); - - for (int i = 0; i < 3; i++) { - int cValue = cValues[i]; - switch (shift) { - case 0: - if (cValue < 3) { - shift = cValue + 1; - } else { - if (upperShift) { - result << (char) (TEXT_BASIC_SET_CHARS[cValue] + 128); - upperShift = false; - } else { - result << (TEXT_BASIC_SET_CHARS[cValue]); - } - } - break; - case 1: - if (upperShift) { - result << (char) (cValue + 128); - upperShift = false; - } else { - result << (char) (cValue); - } - shift = 0; - break; - case 2: - // Shift 2 for Text is the same encoding as C40 - if (cValue < 27) { - if (upperShift) { - result << (char) (C40_SHIFT2_SET_CHARS[cValue] + 128); - upperShift = false; - } else { - result << (C40_SHIFT2_SET_CHARS[cValue]); - } - } else if (cValue == 27) { // FNC1 - result << ((char) 29); // translate as ASCII 29 - } else if (cValue == 30) { // Upper Shift - upperShift = true; - } else { - throw FormatException("decodeTextSegment: Upper Shift"); - } - shift = 0; - break; - case 3: - if (upperShift) { - result << (char) (TEXT_SHIFT3_SET_CHARS[cValue] + 128); - upperShift = false; - } else { - result << (TEXT_SHIFT3_SET_CHARS[cValue]); - } - shift = 0; - break; - default: - throw FormatException("decodeTextSegment: no case"); - } - } - } while (bits->available() > 0); -} - -void DecodedBitStreamParser::decodeAnsiX12Segment(Ref bits, ostringstream & result) { - // Three ANSI X12 values are encoded in a 16-bit value as - // (1600 * C1) + (40 * C2) + C3 + 1 - - int cValues[3]; - do { - // If there is only one byte left then it will be encoded as ASCII - if (bits->available() == 8) { - return; - } - int firstByte = bits->readBits(8); - if (firstByte == 254) { // Unlatch codeword - return; - } - - parseTwoBytes(firstByte, bits->readBits(8), cValues); - - for (int i = 0; i < 3; i++) { - int cValue = cValues[i]; - if (cValue == 0) { // X12 segment terminator - result << '\r'; - } else if (cValue == 1) { // X12 segment separator * - result << '*'; - } else if (cValue == 2) { // X12 sub-element separator > - result << '>'; - } else if (cValue == 3) { // space - result << ' '; - } else if (cValue < 14) { // 0 - 9 - result << (char) (cValue + 44); - } else if (cValue < 40) { // A - Z - result << (char) (cValue + 51); - } else { - throw FormatException("decodeAnsiX12Segment: no case"); - } - } - } while (bits->available() > 0); -} - -void DecodedBitStreamParser::parseTwoBytes(int firstByte, int secondByte, int* result) { - int fullBitValue = (firstByte << 8) + secondByte - 1; - int temp = fullBitValue / 1600; - result[0] = temp; - fullBitValue -= temp * 1600; - temp = fullBitValue / 40; - result[1] = temp; - result[2] = fullBitValue - temp * 40; -} - -void DecodedBitStreamParser::decodeEdifactSegment(Ref bits, ostringstream & result) { - do { - // If there is only two or less bytes left then it will be encoded as ASCII - if (bits->available() <= 16) { - return; - } - - for (int i = 0; i < 4; i++) { - int edifactValue = bits->readBits(6); - - // Check for the unlatch character - if (edifactValue == 0x1f) { // 011111 - // Read rest of byte, which should be 0, and stop - int bitsLeft = 8 - bits->getBitOffset(); - if (bitsLeft != 8) { - bits->readBits(bitsLeft); - } - return; - } - - if ((edifactValue & 0x20) == 0) { // no 1 in the leading (6th) bit - edifactValue |= 0x40; // Add a leading 01 to the 6 bit binary value - } - result << (char)(edifactValue); - } - } while (bits->available() > 0); -} - -void DecodedBitStreamParser::decodeBase256Segment(Ref bits, ostringstream& result, vector byteSegments) { - // Figure out how long the Base 256 Segment is. - int codewordPosition = 1 + bits->getByteOffset(); // position is 1-indexed - int d1 = unrandomize255State(bits->readBits(8), codewordPosition++); - int count; - if (d1 == 0) { // Read the remainder of the symbol - count = bits->available() / 8; - } else if (d1 < 250) { - count = d1; - } else { - count = 250 * (d1 - 249) + unrandomize255State(bits->readBits(8), codewordPosition++); - } - - // We're seeing NegativeArraySizeException errors from users. - if (count < 0) { - throw FormatException("NegativeArraySizeException"); - } - - char* bytes = new char[count]; - for (int i = 0; i < count; i++) { - // Have seen this particular error in the wild, such as at - // http://www.bcgen.com/demo/IDAutomationStreamingDataMatrix.aspx?MODE=3&D=Fred&PFMT=3&PT=F&X=0.3&O=0&LM=0.2 - if (bits->available() < 8) { - throw FormatException("byteSegments"); - } - bytes[i] = unrandomize255State(bits->readBits(8), codewordPosition++); - byteSegments.push_back(bytes[i]); - result << (char)bytes[i]; - } -} -} -} - diff --git a/cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h b/cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h deleted file mode 100644 index 2acc831a7..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef __DECODED_BIT_STREAM_PARSER_DM_H__ -#define __DECODED_BIT_STREAM_PARSER_DM_H__ - -/* - * DecodedBitStreamParser.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - - -namespace zxing { -namespace datamatrix { - -class DecodedBitStreamParser { -private: - static const int PAD_ENCODE = 0; // Not really an encoding - static const int ASCII_ENCODE = 1; - static const int C40_ENCODE = 2; - static const int TEXT_ENCODE = 3; - static const int ANSIX12_ENCODE = 4; - static const int EDIFACT_ENCODE = 5; - static const int BASE256_ENCODE = 6; - - /** - * See ISO 16022:2006, Annex C Table C.1 - * The C40 Basic Character Set (*'s used for placeholders for the shift values) - */ - static const char C40_BASIC_SET_CHARS[]; - - static const char C40_SHIFT2_SET_CHARS[]; - /** - * See ISO 16022:2006, Annex C Table C.2 - * The Text Basic Character Set (*'s used for placeholders for the shift values) - */ - static const char TEXT_BASIC_SET_CHARS[]; - - static const char TEXT_SHIFT3_SET_CHARS[]; - /** - * See ISO 16022:2006, 5.2.3 and Annex C, Table C.2 - */ - int decodeAsciiSegment(Ref bits, std::ostringstream &result, std::ostringstream &resultTrailer); - /** - * See ISO 16022:2006, 5.2.5 and Annex C, Table C.1 - */ - void decodeC40Segment(Ref bits, std::ostringstream &result); - /** - * See ISO 16022:2006, 5.2.6 and Annex C, Table C.2 - */ - void decodeTextSegment(Ref bits, std::ostringstream &result); - /** - * See ISO 16022:2006, 5.2.7 - */ - void decodeAnsiX12Segment(Ref bits, std::ostringstream &result); - /** - * See ISO 16022:2006, 5.2.8 and Annex C Table C.3 - */ - void decodeEdifactSegment(Ref bits, std::ostringstream &result); - /** - * See ISO 16022:2006, 5.2.9 and Annex B, B.2 - */ - void decodeBase256Segment(Ref bits, std::ostringstream &result, std::vector byteSegments); - - void parseTwoBytes(int firstByte, int secondByte, int* result); - /** - * See ISO 16022:2006, Annex B, B.2 - */ - char unrandomize255State(int randomizedBase256Codeword, - int base256CodewordPosition) { - int pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; - int tempVariable = randomizedBase256Codeword - pseudoRandomNumber; - return (char) (tempVariable >= 0 ? tempVariable : (tempVariable + 256)); - }; - void append(std::ostream &ost, const char *bufIn, size_t nIn, const char *src); - -public: - DecodedBitStreamParser() { }; - Ref decode(ArrayRef bytes); -}; - -} -} - -#endif // __DECODED_BIT_STREAM_PARSER_DM_H__ diff --git a/cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp b/cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp deleted file mode 100644 index ee37aa21c..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Decoder.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -using zxing::Ref; -using zxing::DecoderResult; -using zxing::datamatrix::Decoder; - -// VC++ -using zxing::ArrayRef; -using zxing::BitMatrix; - -Decoder::Decoder() : rsDecoder_(GenericGF::DATA_MATRIX_FIELD_256) {} - -void Decoder::correctErrors(ArrayRef codewordBytes, int numDataCodewords) { - int numCodewords = codewordBytes->size(); - ArrayRef codewordInts(numCodewords); - for (int i = 0; i < numCodewords; i++) { - codewordInts[i] = codewordBytes[i] & 0xff; - } - int numECCodewords = numCodewords - numDataCodewords; - try { - rsDecoder_.decode(codewordInts, numECCodewords); - } catch (ReedSolomonException const& ignored) { - (void)ignored; - throw ChecksumException(); - } - // Copy back into array of bytes -- only need to worry about the bytes that were data - // We don't care about errors in the error-correction codewords - for (int i = 0; i < numDataCodewords; i++) { - codewordBytes[i] = (char)codewordInts[i]; - } -} - -Ref Decoder::decode(Ref bits) { - // Construct a parser and read version, error-correction level - BitMatrixParser parser(bits); - Version *version = parser.readVersion(bits); - - // Read codewords - ArrayRef codewords(parser.readCodewords()); - // Separate into data blocks - std::vector > dataBlocks = DataBlock::getDataBlocks(codewords, version); - - int dataBlocksCount = dataBlocks.size(); - - // Count total number of data bytes - int totalBytes = 0; - for (int i = 0; i < dataBlocksCount; i++) { - totalBytes += dataBlocks[i]->getNumDataCodewords(); - } - ArrayRef resultBytes(totalBytes); - - // Error-correct and copy data blocks together into a stream of bytes - for (int j = 0; j < dataBlocksCount; j++) { - Ref dataBlock(dataBlocks[j]); - ArrayRef codewordBytes = dataBlock->getCodewords(); - int numDataCodewords = dataBlock->getNumDataCodewords(); - correctErrors(codewordBytes, numDataCodewords); - for (int i = 0; i < numDataCodewords; i++) { - // De-interlace data blocks. - resultBytes[i * dataBlocksCount + j] = codewordBytes[i]; - } - } - // Decode the contents of that stream of bytes - DecodedBitStreamParser decodedBSParser; - return Ref (decodedBSParser.decode(resultBytes)); -} diff --git a/cpp/core/src/zxing/datamatrix/decoder/Decoder.h b/cpp/core/src/zxing/datamatrix/decoder/Decoder.h deleted file mode 100644 index 6394a9f90..000000000 --- a/cpp/core/src/zxing/datamatrix/decoder/Decoder.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __DECODER_DM_H__ -#define __DECODER_DM_H__ - -/* - * Decoder.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - - -namespace zxing { -namespace datamatrix { - -class Decoder { -private: - ReedSolomonDecoder rsDecoder_; - - void correctErrors(ArrayRef bytes, int numDataCodewords); - -public: - Decoder(); - - Ref decode(Ref bits); -}; - -} -} - -#endif // __DECODER_DM_H__ diff --git a/cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp b/cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp deleted file mode 100644 index b04f28237..000000000 --- a/cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * CornerPoint.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - - -namespace zxing { - namespace datamatrix { - - using namespace std; - - CornerPoint::CornerPoint(float posX, float posY) : - ResultPoint(posX,posY), counter_(0) { - } - - int CornerPoint::getCount() const { - return counter_; - } - - void CornerPoint::incrementCount() { - counter_++; - } - - bool CornerPoint::equals(Ref other) const { - return posX_ == other->getX() && posY_ == other->getY(); - } - - } -} diff --git a/cpp/core/src/zxing/datamatrix/detector/CornerPoint.h b/cpp/core/src/zxing/datamatrix/detector/CornerPoint.h deleted file mode 100644 index cbf2a7ef6..000000000 --- a/cpp/core/src/zxing/datamatrix/detector/CornerPoint.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __CORNER_FINDER_H__ -#define __CORNER_FINDER_H__ - -/* - * CornerPoint.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - namespace datamatrix { - - class CornerPoint : public ResultPoint { - private: - int counter_; - - public: - CornerPoint(float posX, float posY); - int getCount() const; - void incrementCount(); - bool equals(Ref other) const; - }; - } -} - -#endif // __CORNER_FINDER_H__ diff --git a/cpp/core/src/zxing/datamatrix/detector/Detector.cpp b/cpp/core/src/zxing/datamatrix/detector/Detector.cpp deleted file mode 100644 index 36c427c24..000000000 --- a/cpp/core/src/zxing/datamatrix/detector/Detector.cpp +++ /dev/null @@ -1,446 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Detector.cpp - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -using std::abs; -using zxing::Ref; -using zxing::BitMatrix; -using zxing::ResultPoint; -using zxing::DetectorResult; -using zxing::PerspectiveTransform; -using zxing::NotFoundException; -using zxing::datamatrix::Detector; -using zxing::datamatrix::ResultPointsAndTransitions; -using zxing::common::detector::MathUtils; - -namespace { - typedef std::map, int> PointMap; - void increment(PointMap& table, Ref const& key) { - int& value = table[key]; - value += 1; - } -} - -ResultPointsAndTransitions::ResultPointsAndTransitions() { - Ref ref(new ResultPoint(0, 0)); - from_ = ref; - to_ = ref; - transitions_ = 0; -} - -ResultPointsAndTransitions::ResultPointsAndTransitions(Ref from, Ref to, - int transitions) - : to_(to), from_(from), transitions_(transitions) { -} - -Ref ResultPointsAndTransitions::getFrom() { - return from_; -} - -Ref ResultPointsAndTransitions::getTo() { - return to_; -} - -int ResultPointsAndTransitions::getTransitions() { - return transitions_; -} - -Detector::Detector(Ref image) - : image_(image) { -} - -Ref Detector::getImage() { - return image_; -} - -Ref Detector::detect() { - Ref rectangleDetector_(new WhiteRectangleDetector(image_)); - std::vector > ResultPoints = rectangleDetector_->detect(); - Ref pointA = ResultPoints[0]; - Ref pointB = ResultPoints[1]; - Ref pointC = ResultPoints[2]; - Ref pointD = ResultPoints[3]; - - // Point A and D are across the diagonal from one another, - // as are B and C. Figure out which are the solid black lines - // by counting transitions - std::vector > transitions(4); - transitions[0].reset(transitionsBetween(pointA, pointB)); - transitions[1].reset(transitionsBetween(pointA, pointC)); - transitions[2].reset(transitionsBetween(pointB, pointD)); - transitions[3].reset(transitionsBetween(pointC, pointD)); - insertionSort(transitions); - - // Sort by number of transitions. First two will be the two solid sides; last two - // will be the two alternating black/white sides - Ref lSideOne(transitions[0]); - Ref lSideTwo(transitions[1]); - - // Figure out which point is their intersection by tallying up the number of times we see the - // endpoints in the four endpoints. One will show up twice. - typedef std::map, int> PointMap; - PointMap pointCount; - increment(pointCount, lSideOne->getFrom()); - increment(pointCount, lSideOne->getTo()); - increment(pointCount, lSideTwo->getFrom()); - increment(pointCount, lSideTwo->getTo()); - - // Figure out which point is their intersection by tallying up the number of times we see the - // endpoints in the four endpoints. One will show up twice. - Ref maybeTopLeft; - Ref bottomLeft; - Ref maybeBottomRight; - for (PointMap::const_iterator entry = pointCount.begin(), end = pointCount.end(); entry != end; ++entry) { - Ref const& point = entry->first; - int value = entry->second; - if (value == 2) { - bottomLeft = point; // this is definitely the bottom left, then -- end of two L sides - } else { - // Otherwise it's either top left or bottom right -- just assign the two arbitrarily now - if (maybeTopLeft == 0) { - maybeTopLeft = point; - } else { - maybeBottomRight = point; - } - } - } - - if (maybeTopLeft == 0 || bottomLeft == 0 || maybeBottomRight == 0) { - throw NotFoundException(); - } - - // Bottom left is correct but top left and bottom right might be switched - std::vector > corners(3); - corners[0].reset(maybeTopLeft); - corners[1].reset(bottomLeft); - corners[2].reset(maybeBottomRight); - - // Use the dot product trick to sort them out - ResultPoint::orderBestPatterns(corners); - - // Now we know which is which: - Ref bottomRight(corners[0]); - bottomLeft = corners[1]; - Ref topLeft(corners[2]); - - // Which point didn't we find in relation to the "L" sides? that's the top right corner - Ref topRight; - if (!(pointA->equals(bottomRight) || pointA->equals(bottomLeft) || pointA->equals(topLeft))) { - topRight = pointA; - } else if (!(pointB->equals(bottomRight) || pointB->equals(bottomLeft) - || pointB->equals(topLeft))) { - topRight = pointB; - } else if (!(pointC->equals(bottomRight) || pointC->equals(bottomLeft) - || pointC->equals(topLeft))) { - topRight = pointC; - } else { - topRight = pointD; - } - - // Next determine the dimension by tracing along the top or right side and counting black/white - // transitions. Since we start inside a black module, we should see a number of transitions - // equal to 1 less than the code dimension. Well, actually 2 less, because we are going to - // end on a black module: - - // The top right point is actually the corner of a module, which is one of the two black modules - // adjacent to the white module at the top right. Tracing to that corner from either the top left - // or bottom right should work here. - - int dimensionTop = transitionsBetween(topLeft, topRight)->getTransitions(); - int dimensionRight = transitionsBetween(bottomRight, topRight)->getTransitions(); - - //dimensionTop++; - if ((dimensionTop & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionTop++; - } - dimensionTop += 2; - - //dimensionRight++; - if ((dimensionRight & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionRight++; - } - dimensionRight += 2; - - Ref bits; - Ref transform; - Ref correctedTopRight; - - - // Rectanguar symbols are 6x16, 6x28, 10x24, 10x32, 14x32, or 14x44. If one dimension is more - // than twice the other, it's certainly rectangular, but to cut a bit more slack we accept it as - // rectangular if the bigger side is at least 7/4 times the other: - if (4 * dimensionTop >= 7 * dimensionRight || 4 * dimensionRight >= 7 * dimensionTop) { - // The matrix is rectangular - correctedTopRight = correctTopRightRectangular(bottomLeft, bottomRight, topLeft, topRight, - dimensionTop, dimensionRight); - if (correctedTopRight == NULL) { - correctedTopRight = topRight; - } - - dimensionTop = transitionsBetween(topLeft, correctedTopRight)->getTransitions(); - dimensionRight = transitionsBetween(bottomRight, correctedTopRight)->getTransitions(); - - if ((dimensionTop & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionTop++; - } - - if ((dimensionRight & 0x01) == 1) { - // it can't be odd, so, round... up? - dimensionRight++; - } - - transform = createTransform(topLeft, correctedTopRight, bottomLeft, bottomRight, dimensionTop, - dimensionRight); - bits = sampleGrid(image_, dimensionTop, dimensionRight, transform); - - } else { - // The matrix is square - int dimension = min(dimensionRight, dimensionTop); - - // correct top right point to match the white module - correctedTopRight = correctTopRight(bottomLeft, bottomRight, topLeft, topRight, dimension); - if (correctedTopRight == NULL) { - correctedTopRight = topRight; - } - - // Redetermine the dimension using the corrected top right point - int dimensionCorrected = std::max(transitionsBetween(topLeft, correctedTopRight)->getTransitions(), - transitionsBetween(bottomRight, correctedTopRight)->getTransitions()); - dimensionCorrected++; - if ((dimensionCorrected & 0x01) == 1) { - dimensionCorrected++; - } - - transform = createTransform(topLeft, correctedTopRight, bottomLeft, bottomRight, - dimensionCorrected, dimensionCorrected); - bits = sampleGrid(image_, dimensionCorrected, dimensionCorrected, transform); - } - - ArrayRef< Ref > points (new Array< Ref >(4)); - points[0].reset(topLeft); - points[1].reset(bottomLeft); - points[2].reset(correctedTopRight); - points[3].reset(bottomRight); - Ref detectorResult(new DetectorResult(bits, points)); - return detectorResult; -} - -/** - * Calculates the position of the white top right module using the output of the rectangle detector - * for a rectangular matrix - */ -Ref Detector::correctTopRightRectangular(Ref bottomLeft, - Ref bottomRight, Ref topLeft, Ref topRight, - int dimensionTop, int dimensionRight) { - - float corr = distance(bottomLeft, bottomRight) / (float) dimensionTop; - int norm = distance(topLeft, topRight); - float cos = (topRight->getX() - topLeft->getX()) / norm; - float sin = (topRight->getY() - topLeft->getY()) / norm; - - Ref c1( - new ResultPoint(topRight->getX() + corr * cos, topRight->getY() + corr * sin)); - - corr = distance(bottomLeft, topLeft) / (float) dimensionRight; - norm = distance(bottomRight, topRight); - cos = (topRight->getX() - bottomRight->getX()) / norm; - sin = (topRight->getY() - bottomRight->getY()) / norm; - - Ref c2( - new ResultPoint(topRight->getX() + corr * cos, topRight->getY() + corr * sin)); - - if (!isValid(c1)) { - if (isValid(c2)) { - return c2; - } - return Ref(NULL); - } - if (!isValid(c2)) { - return c1; - } - - int l1 = abs(dimensionTop - transitionsBetween(topLeft, c1)->getTransitions()) - + abs(dimensionRight - transitionsBetween(bottomRight, c1)->getTransitions()); - int l2 = abs(dimensionTop - transitionsBetween(topLeft, c2)->getTransitions()) - + abs(dimensionRight - transitionsBetween(bottomRight, c2)->getTransitions()); - - return l1 <= l2 ? c1 : c2; -} - -/** - * Calculates the position of the white top right module using the output of the rectangle detector - * for a square matrix - */ -Ref Detector::correctTopRight(Ref bottomLeft, - Ref bottomRight, Ref topLeft, Ref topRight, - int dimension) { - - float corr = distance(bottomLeft, bottomRight) / (float) dimension; - int norm = distance(topLeft, topRight); - float cos = (topRight->getX() - topLeft->getX()) / norm; - float sin = (topRight->getY() - topLeft->getY()) / norm; - - Ref c1( - new ResultPoint(topRight->getX() + corr * cos, topRight->getY() + corr * sin)); - - corr = distance(bottomLeft, topLeft) / (float) dimension; - norm = distance(bottomRight, topRight); - cos = (topRight->getX() - bottomRight->getX()) / norm; - sin = (topRight->getY() - bottomRight->getY()) / norm; - - Ref c2( - new ResultPoint(topRight->getX() + corr * cos, topRight->getY() + corr * sin)); - - if (!isValid(c1)) { - if (isValid(c2)) { - return c2; - } - return Ref(NULL); - } - if (!isValid(c2)) { - return c1; - } - - int l1 = abs( - transitionsBetween(topLeft, c1)->getTransitions() - - transitionsBetween(bottomRight, c1)->getTransitions()); - int l2 = abs( - transitionsBetween(topLeft, c2)->getTransitions() - - transitionsBetween(bottomRight, c2)->getTransitions()); - - return l1 <= l2 ? c1 : c2; -} - -bool Detector::isValid(Ref p) { - return p->getX() >= 0 && p->getX() < image_->getWidth() && p->getY() > 0 - && p->getY() < image_->getHeight(); -} - -int Detector::distance(Ref a, Ref b) { - return MathUtils::round(ResultPoint::distance(a, b)); -} - -Ref Detector::transitionsBetween(Ref from, - Ref to) { - // See QR Code Detector, sizeOfBlackWhiteBlackRun() - int fromX = (int) from->getX(); - int fromY = (int) from->getY(); - int toX = (int) to->getX(); - int toY = (int) to->getY(); - bool steep = abs(toY - fromY) > abs(toX - fromX); - if (steep) { - int temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - - int dx = abs(toX - fromX); - int dy = abs(toY - fromY); - int error = -dx >> 1; - int ystep = fromY < toY ? 1 : -1; - int xstep = fromX < toX ? 1 : -1; - int transitions = 0; - bool inBlack = image_->get(steep ? fromY : fromX, steep ? fromX : fromY); - for (int x = fromX, y = fromY; x != toX; x += xstep) { - bool isBlack = image_->get(steep ? y : x, steep ? x : y); - if (isBlack != inBlack) { - transitions++; - inBlack = isBlack; - } - error += dy; - if (error > 0) { - if (y == toY) { - break; - } - y += ystep; - error -= dx; - } - } - Ref result(new ResultPointsAndTransitions(from, to, transitions)); - return result; -} - -Ref Detector::createTransform(Ref topLeft, - Ref topRight, Ref bottomLeft, Ref bottomRight, - int dimensionX, int dimensionY) { - - Ref transform( - PerspectiveTransform::quadrilateralToQuadrilateral( - 0.5f, - 0.5f, - dimensionX - 0.5f, - 0.5f, - dimensionX - 0.5f, - dimensionY - 0.5f, - 0.5f, - dimensionY - 0.5f, - topLeft->getX(), - topLeft->getY(), - topRight->getX(), - topRight->getY(), - bottomRight->getX(), - bottomRight->getY(), - bottomLeft->getX(), - bottomLeft->getY())); - return transform; -} - -Ref Detector::sampleGrid(Ref image, int dimensionX, int dimensionY, - Ref transform) { - GridSampler &sampler = GridSampler::getInstance(); - return sampler.sampleGrid(image, dimensionX, dimensionY, transform); -} - -void Detector::insertionSort(std::vector > &vector) { - int max = vector.size(); - bool swapped = true; - Ref value; - Ref valueB; - do { - swapped = false; - for (int i = 1; i < max; i++) { - value = vector[i - 1]; - if (compare(value, (valueB = vector[i])) > 0){ - swapped = true; - vector[i - 1].reset(valueB); - vector[i].reset(value); - } - } - } while (swapped); -} - -int Detector::compare(Ref a, Ref b) { - return a->getTransitions() - b->getTransitions(); -} diff --git a/cpp/core/src/zxing/datamatrix/detector/Detector.h b/cpp/core/src/zxing/datamatrix/detector/Detector.h deleted file mode 100644 index 8e0bf063b..000000000 --- a/cpp/core/src/zxing/datamatrix/detector/Detector.h +++ /dev/null @@ -1,94 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __DETECTOR_H__ -#define __DETECTOR_H__ - -/* - * Detector.h - * zxing - * - * Created by Luiz Silva on 09/02/2010. - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { -namespace datamatrix { - -class ResultPointsAndTransitions: public Counted { - private: - Ref to_; - Ref from_; - int transitions_; - - public: - ResultPointsAndTransitions(); - ResultPointsAndTransitions(Ref from, Ref to, int transitions); - Ref getFrom(); - Ref getTo(); - int getTransitions(); -}; - -class Detector: public Counted { - private: - Ref image_; - - protected: - Ref sampleGrid(Ref image, int dimensionX, int dimensionY, - Ref transform); - - void insertionSort(std::vector >& vector); - - Ref correctTopRightRectangular(Ref bottomLeft, - Ref bottomRight, Ref topLeft, Ref topRight, - int dimensionTop, int dimensionRight); - Ref correctTopRight(Ref bottomLeft, Ref bottomRight, - Ref topLeft, Ref topRight, int dimension); - bool isValid(Ref p); - int distance(Ref a, Ref b); - Ref transitionsBetween(Ref from, Ref to); - int min(int a, int b) { - return a > b ? b : a; - } - /** - * Ends up being a bit faster than round(). This merely rounds its - * argument to the nearest int, where x.5 rounds up. - */ - int round(float d) { - return (int) (d + 0.5f); - } - - public: - Ref getImage(); - Detector(Ref image); - - virtual Ref createTransform(Ref topLeft, - Ref topRight, Ref bottomLeft, Ref bottomRight, - int dimensionX, int dimensionY); - - Ref detect(); - - private: - int compare(Ref a, Ref b); -}; - -} -} - -#endif // __DETECTOR_H__ diff --git a/cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp b/cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp deleted file mode 100644 index a1ba77bb5..000000000 --- a/cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - * DetectorException.cpp - * - * Created on: Aug 26, 2011 - * Author: luiz - */ - -#include "DetectorException.h" - -namespace zxing { -namespace datamatrix { - -DetectorException::DetectorException(const char *msg) : - Exception(msg) { - -} - -DetectorException::~DetectorException() throw () { - // TODO Auto-generated destructor stub -} - -} -} /* namespace zxing */ diff --git a/cpp/core/src/zxing/datamatrix/detector/DetectorException.h b/cpp/core/src/zxing/datamatrix/detector/DetectorException.h deleted file mode 100644 index 8002ac9d1..000000000 --- a/cpp/core/src/zxing/datamatrix/detector/DetectorException.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * DetectorException.h - * - * Created on: Aug 26, 2011 - * Author: luiz - */ - -#ifndef DETECTOREXCEPTION_H_ -#define DETECTOREXCEPTION_H_ - -#include - -namespace zxing { -namespace datamatrix { - -class DetectorException : public Exception { - public: - DetectorException(const char *msg); - virtual ~DetectorException() throw(); -}; -} /* namespace nexxera */ -} /* namespace zxing */ -#endif /* DETECTOREXCEPTION_H_ */ diff --git a/cpp/core/src/zxing/multi/ByQuadrantReader.cpp b/cpp/core/src/zxing/multi/ByQuadrantReader.cpp deleted file mode 100644 index b3874836c..000000000 --- a/cpp/core/src/zxing/multi/ByQuadrantReader.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace multi { - -ByQuadrantReader::ByQuadrantReader(Reader& delegate) : delegate_(delegate) {} - -ByQuadrantReader::~ByQuadrantReader(){} - -Ref ByQuadrantReader::decode(Ref image){ - return decode(image, DecodeHints::DEFAULT_HINT); -} - -Ref ByQuadrantReader::decode(Ref image, DecodeHints hints){ - int width = image->getWidth(); - int height = image->getHeight(); - int halfWidth = width / 2; - int halfHeight = height / 2; - Ref topLeft = image->crop(0, 0, halfWidth, halfHeight); - try { - return delegate_.decode(topLeft, hints); - } catch (ReaderException const& re) { - (void)re; - // continue - } - - Ref topRight = image->crop(halfWidth, 0, halfWidth, halfHeight); - try { - return delegate_.decode(topRight, hints); - } catch (ReaderException const& re) { - (void)re; - // continue - } - - Ref bottomLeft = image->crop(0, halfHeight, halfWidth, halfHeight); - try { - return delegate_.decode(bottomLeft, hints); - } catch (ReaderException const& re) { - (void)re; - // continue - } - - Ref bottomRight = image->crop(halfWidth, halfHeight, halfWidth, halfHeight); - try { - return delegate_.decode(bottomRight, hints); - } catch (ReaderException const& re) { - (void)re; - // continue - } - - int quarterWidth = halfWidth / 2; - int quarterHeight = halfHeight / 2; - Ref center = image->crop(quarterWidth, quarterHeight, halfWidth, halfHeight); - return delegate_.decode(center, hints); -} - -} // End zxing::multi namespace -} // End zxing namespace diff --git a/cpp/core/src/zxing/multi/ByQuadrantReader.h b/cpp/core/src/zxing/multi/ByQuadrantReader.h deleted file mode 100644 index 3f7fac656..000000000 --- a/cpp/core/src/zxing/multi/ByQuadrantReader.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __BY_QUADRANT_READER_H__ -#define __BY_QUADRANT_READER_H__ - -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace multi { - -class ByQuadrantReader : public Reader { - private: - Reader& delegate_; - - public: - ByQuadrantReader(Reader& delegate); - virtual ~ByQuadrantReader(); - virtual Ref decode(Ref image); - virtual Ref decode(Ref image, DecodeHints hints); -}; - -} -} - -#endif // __BY_QUADRANT_READER_H__ diff --git a/cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp b/cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp deleted file mode 100644 index 4b16ab293..000000000 --- a/cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::Result; -using zxing::multi::GenericMultipleBarcodeReader; - -// VC++ -using zxing::Reader; -using zxing::BinaryBitmap; -using zxing::DecodeHints; - -GenericMultipleBarcodeReader::GenericMultipleBarcodeReader(Reader& delegate) - : delegate_(delegate) {} - -GenericMultipleBarcodeReader::~GenericMultipleBarcodeReader(){} - -vector > GenericMultipleBarcodeReader::decodeMultiple(Ref image, - DecodeHints hints) { - vector > results; - doDecodeMultiple(image, hints, results, 0, 0, 0); - if (results.empty()){ - throw ReaderException("No code detected"); - } - return results; -} - -void GenericMultipleBarcodeReader::doDecodeMultiple(Ref image, - DecodeHints hints, - vector >& results, - int xOffset, - int yOffset, - int currentDepth) { - if (currentDepth > MAX_DEPTH) { - return; - } - Ref result; - try { - result = delegate_.decode(image, hints); - } catch (ReaderException const& ignored) { - (void)ignored; - return; - } - bool alreadyFound = false; - for (unsigned int i = 0; i < results.size(); i++) { - Ref existingResult = results[i]; - if (existingResult->getText()->getText() == result->getText()->getText()) { - alreadyFound = true; - break; - } - } - if (!alreadyFound) { - results.push_back(translateResultPoints(result, xOffset, yOffset)); - } - - ArrayRef< Ref > resultPoints = result->getResultPoints(); - if (resultPoints->empty()) { - return; - } - - int width = image->getWidth(); - int height = image->getHeight(); - float minX = float(width); - float minY = float(height); - float maxX = 0.0f; - float maxY = 0.0f; - for (int i = 0; i < resultPoints->size(); i++) { - Ref point = resultPoints[i]; - float x = point->getX(); - float y = point->getY(); - if (x < minX) { - minX = x; - } - if (y < minY) { - minY = y; - } - if (x > maxX) { - maxX = x; - } - if (y > maxY) { - maxY = y; - } - } - - // Decode left of barcode - if (minX > MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image->crop(0, 0, (int) minX, height), - hints, results, xOffset, yOffset, currentDepth+1); - } - // Decode above barcode - if (minY > MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image->crop(0, 0, width, (int) minY), - hints, results, xOffset, yOffset, currentDepth+1); - } - // Decode right of barcode - if (maxX < width - MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image->crop((int) maxX, 0, width - (int) maxX, height), - hints, results, xOffset + (int) maxX, yOffset, currentDepth+1); - } - // Decode below barcode - if (maxY < height - MIN_DIMENSION_TO_RECUR) { - doDecodeMultiple(image->crop(0, (int) maxY, width, height - (int) maxY), - hints, results, xOffset, yOffset + (int) maxY, currentDepth+1); - } -} - -Ref GenericMultipleBarcodeReader::translateResultPoints(Ref result, int xOffset, int yOffset){ - ArrayRef< Ref > oldResultPoints = result->getResultPoints(); - if (oldResultPoints->empty()) { - return result; - } - ArrayRef< Ref > newResultPoints; - for (int i = 0; i < oldResultPoints->size(); i++) { - Ref oldPoint = oldResultPoints[i]; - newResultPoints->values().push_back(Ref(new ResultPoint(oldPoint->getX() + xOffset, oldPoint->getY() + yOffset))); - } - return Ref(new Result(result->getText(), result->getRawBytes(), newResultPoints, result->getBarcodeFormat())); -} diff --git a/cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h b/cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h deleted file mode 100644 index ff96ab8a2..000000000 --- a/cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h +++ /dev/null @@ -1,51 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __GENERIC_MULTIPLE_BARCODE_READER_H__ -#define __GENERIC_MULTIPLE_BARCODE_READER_H__ - -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace multi { - -class GenericMultipleBarcodeReader : public MultipleBarcodeReader { - private: - static Ref translateResultPoints(Ref result, - int xOffset, - int yOffset); - void doDecodeMultiple(Ref image, - DecodeHints hints, - std::vector >& results, - int xOffset, - int yOffset, - int currentDepth); - Reader& delegate_; - static const int MIN_DIMENSION_TO_RECUR = 100; - static const int MAX_DEPTH = 4; - - public: - GenericMultipleBarcodeReader(Reader& delegate); - virtual ~GenericMultipleBarcodeReader(); - virtual std::vector > decodeMultiple(Ref image, DecodeHints hints); -}; - -} -} - -#endif // __GENERIC_MULTIPLE_BARCODE_READER_H__ diff --git a/cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp b/cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp deleted file mode 100644 index 67e187e1b..000000000 --- a/cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -namespace multi { - -MultipleBarcodeReader::~MultipleBarcodeReader() { } - -std::vector > MultipleBarcodeReader::decodeMultiple(Ref image) { - return decodeMultiple(image, DecodeHints::DEFAULT_HINT); -} - -} // End zxing::multi namespace -} // End zxing namespace diff --git a/cpp/core/src/zxing/multi/MultipleBarcodeReader.h b/cpp/core/src/zxing/multi/MultipleBarcodeReader.h deleted file mode 100644 index 9f02adbb4..000000000 --- a/cpp/core/src/zxing/multi/MultipleBarcodeReader.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __MULTIPLE_BARCODE_READER_H__ -#define __MULTIPLE_BARCODE_READER_H__ - -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { -namespace multi { - -class MultipleBarcodeReader : public Counted { - protected: - MultipleBarcodeReader() {} - public: - virtual std::vector > decodeMultiple(Ref image); - virtual std::vector > decodeMultiple(Ref image, DecodeHints hints) = 0; - virtual ~MultipleBarcodeReader(); -}; - -} -} - -#endif // __MULTIPLE_BARCODE_READER_H__ diff --git a/cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp b/cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp deleted file mode 100644 index 05c5cbe38..000000000 --- a/cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace multi { -QRCodeMultiReader::QRCodeMultiReader(){} - -QRCodeMultiReader::~QRCodeMultiReader(){} - -std::vector > QRCodeMultiReader::decodeMultiple(Ref image, - DecodeHints hints) -{ - std::vector > results; - MultiDetector detector(image->getBlackMatrix()); - - std::vector > detectorResult = detector.detectMulti(hints); - for (unsigned int i = 0; i < detectorResult.size(); i++) { - try { - Ref decoderResult = getDecoder().decode(detectorResult[i]->getBits()); - ArrayRef< Ref > points = detectorResult[i]->getPoints(); - Ref result = Ref(new Result(decoderResult->getText(), - decoderResult->getRawBytes(), - points, BarcodeFormat::QR_CODE)); - // result->putMetadata(ResultMetadataType.BYTE_SEGMENTS, decoderResult->getByteSegments()); - // result->putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, decoderResult->getECLevel().toString()); - results.push_back(result); - } catch (ReaderException const& re) { - (void)re; - // ignore and continue - } - } - if (results.empty()){ - throw ReaderException("No code detected"); - } - return results; -} - -} // End zxing::multi namespace -} // End zxing namespace diff --git a/cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h b/cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h deleted file mode 100644 index be17041a0..000000000 --- a/cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef __QRCODE_MULTI_READER_H__ -#define __QRCODE_MULTI_READER_H__ - -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace multi { - -class QRCodeMultiReader: public zxing::qrcode::QRCodeReader, public MultipleBarcodeReader { - public: - QRCodeMultiReader(); - virtual ~QRCodeMultiReader(); - virtual std::vector > decodeMultiple(Ref image, DecodeHints hints); -}; - -} -} - -#endif // __QRCODE_MULTI_READER_H__ diff --git a/cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp b/cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp deleted file mode 100644 index 549f49aa5..000000000 --- a/cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2011 ZXing authors - * - * 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 -#include -#include - -namespace zxing { -namespace multi { -using namespace zxing::qrcode; - -MultiDetector::MultiDetector(Ref image) : Detector(image) {} - -MultiDetector::~MultiDetector(){} - -std::vector > MultiDetector::detectMulti(DecodeHints hints){ - Ref image = getImage(); - MultiFinderPatternFinder finder = MultiFinderPatternFinder(image, hints.getResultPointCallback()); - std::vector > info = finder.findMulti(hints); - std::vector > result; - for(unsigned int i = 0; i < info.size(); i++){ - try{ - result.push_back(processFinderPatternInfo(info[i])); - } catch (ReaderException const& e){ - (void)e; - // ignore - } - } - - return result; -} - -} // End zxing::multi namespace -} // End zxing namespace diff --git a/cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h b/cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h deleted file mode 100644 index 7c9a1891c..000000000 --- a/cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef __MULTI_DETECTOR_H__ -#define __MULTI_DETECTOR_H__ - -/* - * Copyright 2011 ZXing authors - * - * 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 -#include -#include - -namespace zxing { -namespace multi { - -class MultiDetector : public zxing::qrcode::Detector { - public: - MultiDetector(Ref image); - virtual ~MultiDetector(); - virtual std::vector > detectMulti(DecodeHints hints); -}; - -} -} - -#endif // __MULTI_DETECTOR_H__ diff --git a/cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp b/cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp deleted file mode 100644 index edc825f01..000000000 --- a/cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp +++ /dev/null @@ -1,236 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2011 ZXing authors - * - * 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 -#include -#include -#include -#include - -using std::abs; -using std::min; -using std::sort; -using std::vector; -using zxing::Ref; -using zxing::BitMatrix; -using zxing::ReaderException; -using zxing::qrcode::FinderPattern; -using zxing::qrcode::FinderPatternInfo; -using zxing::multi::MultiFinderPatternFinder; - -// VC++ - -using zxing::BitMatrix; -using zxing::ResultPointCallback; -using zxing::DecodeHints; - -const float MultiFinderPatternFinder::MAX_MODULE_COUNT_PER_EDGE = 180; -const float MultiFinderPatternFinder::MIN_MODULE_COUNT_PER_EDGE = 9; -const float MultiFinderPatternFinder::DIFF_MODSIZE_CUTOFF_PERCENT = 0.05f; -const float MultiFinderPatternFinder::DIFF_MODSIZE_CUTOFF = 0.5f; - -namespace { - -bool compareModuleSize(Ref a, Ref b){ - float value = a->getEstimatedModuleSize() - b->getEstimatedModuleSize(); - return value < 0.0; -} - -} - -MultiFinderPatternFinder::MultiFinderPatternFinder(Ref image, - Ref resultPointCallback) - : FinderPatternFinder(image, resultPointCallback) -{ -} - -MultiFinderPatternFinder::~MultiFinderPatternFinder(){} - -vector > MultiFinderPatternFinder::findMulti(DecodeHints const& hints){ - bool tryHarder = hints.getTryHarder(); - Ref image = image_; // Protected member - int maxI = image->getHeight(); - int maxJ = image->getWidth(); - // We are looking for black/white/black/white/black modules in - // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far - - // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the - // image, and then account for the center being 3 modules in size. This gives the smallest - // number of pixels the center could be, so skip this often. When trying harder, look for all - // QR versions regardless of how dense they are. - int iSkip = (int) (maxI / (MAX_MODULES * 4.0f) * 3); - if (iSkip < MIN_SKIP || tryHarder) { - iSkip = MIN_SKIP; - } - - int stateCount[5]; - for (int i = iSkip - 1; i < maxI; i += iSkip) { - // Get a row of black/white values - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - int currentState = 0; - for (int j = 0; j < maxJ; j++) { - if (image->get(j, i)) { - // Black pixel - if ((currentState & 1) == 1) { // Counting white pixels - currentState++; - } - stateCount[currentState]++; - } else { // White pixel - if ((currentState & 1) == 0) { // Counting black pixels - if (currentState == 4) { // A winner? - if (foundPatternCross(stateCount) && handlePossibleCenter(stateCount, i, j)) { // Yes - // Clear state to start looking again - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } else { // No, shift counts back by two - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } else { - stateCount[++currentState]++; - } - } else { // Counting white pixels - stateCount[currentState]++; - } - } - } // for j=... - - if (foundPatternCross(stateCount)) { - handlePossibleCenter(stateCount, i, maxJ); - } // end if foundPatternCross - } // for i=iSkip-1 ... - vector > > patternInfo = selectBestPatterns(); - vector > result; - for (unsigned int i = 0; i < patternInfo.size(); i++) { - vector > pattern = patternInfo[i]; - pattern = FinderPatternFinder::orderBestPatterns(pattern); - result.push_back(Ref(new FinderPatternInfo(pattern))); - } - return result; -} - -vector > > MultiFinderPatternFinder::selectBestPatterns(){ - vector > possibleCenters = possibleCenters_; - - int size = possibleCenters.size(); - - if (size < 3) { - // Couldn't find enough finder patterns - throw ReaderException("No code detected"); - } - - vector > > results; - - /* - * Begin HE modifications to safely detect multiple codes of equal size - */ - if (size == 3) { - results.push_back(possibleCenters_); - return results; - } - - // Sort by estimated module size to speed up the upcoming checks - //TODO do a sort based on module size - sort(possibleCenters.begin(), possibleCenters.end(), compareModuleSize); - - /* - * Now lets start: build a list of tuples of three finder locations that - * - feature similar module sizes - * - are placed in a distance so the estimated module count is within the QR specification - * - have similar distance between upper left/right and left top/bottom finder patterns - * - form a triangle with 90° angle (checked by comparing top right/bottom left distance - * with pythagoras) - * - * Note: we allow each point to be used for more than one code region: this might seem - * counterintuitive at first, but the performance penalty is not that big. At this point, - * we cannot make a good quality decision whether the three finders actually represent - * a QR code, or are just by chance layouted so it looks like there might be a QR code there. - * So, if the layout seems right, lets have the decoder try to decode. - */ - - for (int i1 = 0; i1 < (size - 2); i1++) { - Ref p1 = possibleCenters[i1]; - for (int i2 = i1 + 1; i2 < (size - 1); i2++) { - Ref p2 = possibleCenters[i2]; - // Compare the expected module sizes; if they are really off, skip - float vModSize12 = (p1->getEstimatedModuleSize() - p2->getEstimatedModuleSize()) / min(p1->getEstimatedModuleSize(), p2->getEstimatedModuleSize()); - float vModSize12A = abs(p1->getEstimatedModuleSize() - p2->getEstimatedModuleSize()); - if (vModSize12A > DIFF_MODSIZE_CUTOFF && vModSize12 >= DIFF_MODSIZE_CUTOFF_PERCENT) { - // break, since elements are ordered by the module size deviation there cannot be - // any more interesting elements for the given p1. - break; - } - for (int i3 = i2 + 1; i3 < size; i3++) { - Ref p3 = possibleCenters[i3]; - // Compare the expected module sizes; if they are really off, skip - float vModSize23 = (p2->getEstimatedModuleSize() - p3->getEstimatedModuleSize()) / min(p2->getEstimatedModuleSize(), p3->getEstimatedModuleSize()); - float vModSize23A = abs(p2->getEstimatedModuleSize() - p3->getEstimatedModuleSize()); - if (vModSize23A > DIFF_MODSIZE_CUTOFF && vModSize23 >= DIFF_MODSIZE_CUTOFF_PERCENT) { - // break, since elements are ordered by the module size deviation there cannot be - // any more interesting elements for the given p1. - break; - } - vector > test; - test.push_back(p1); - test.push_back(p2); - test.push_back(p3); - test = FinderPatternFinder::orderBestPatterns(test); - // Calculate the distances: a = topleft-bottomleft, b=topleft-topright, c = diagonal - Ref info = Ref(new FinderPatternInfo(test)); - float dA = FinderPatternFinder::distance(info->getTopLeft(), info->getBottomLeft()); - float dC = FinderPatternFinder::distance(info->getTopRight(), info->getBottomLeft()); - float dB = FinderPatternFinder::distance(info->getTopLeft(), info->getTopRight()); - // Check the sizes - float estimatedModuleCount = (dA + dB) / (p1->getEstimatedModuleSize() * 2.0f); - if (estimatedModuleCount > MAX_MODULE_COUNT_PER_EDGE || estimatedModuleCount < MIN_MODULE_COUNT_PER_EDGE) { - continue; - } - // Calculate the difference of the edge lengths in percent - float vABBC = abs((dA - dB) / min(dA, dB)); - if (vABBC >= 0.1f) { - continue; - } - // Calculate the diagonal length by assuming a 90° angle at topleft - float dCpy = (float) sqrt(dA * dA + dB * dB); - // Compare to the real distance in % - float vPyC = abs((dC - dCpy) / min(dC, dCpy)); - if (vPyC >= 0.1f) { - continue; - } - // All tests passed! - results.push_back(test); - } // end iterate p3 - } // end iterate p2 - } // end iterate p1 - if (results.empty()){ - // Nothing found! - throw ReaderException("No code detected"); - } - return results; -} diff --git a/cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h b/cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h deleted file mode 100644 index 4612d7294..000000000 --- a/cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __MULTI_FINDER_PATTERN_FINDER_H__ -#define __MULTI_FINDER_PATTERN_FINDER_H__ - -/* - * Copyright 2011 ZXing authors - * - * 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 -#include -#include - -namespace zxing { -namespace multi { - -class MultiFinderPatternFinder : zxing::qrcode::FinderPatternFinder { - private: - std::vector > > selectBestPatterns(); - - static const float MAX_MODULE_COUNT_PER_EDGE; - static const float MIN_MODULE_COUNT_PER_EDGE; - static const float DIFF_MODSIZE_CUTOFF_PERCENT; - static const float DIFF_MODSIZE_CUTOFF; - - public: - MultiFinderPatternFinder(Ref image, Ref resultPointCallback); - virtual ~MultiFinderPatternFinder(); - virtual std::vector > findMulti(DecodeHints const& hints); - - -}; - -} -} - -#endif // __MULTI_FINDER_PATTERN_FINDER_H__ diff --git a/cpp/core/src/zxing/oned/CodaBarReader.cpp b/cpp/core/src/zxing/oned/CodaBarReader.cpp deleted file mode 100644 index 88b2a0d48..000000000 --- a/cpp/core/src/zxing/oned/CodaBarReader.cpp +++ /dev/null @@ -1,340 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using std::vector; -using std::string; -using zxing::NotFoundException; -using zxing::FormatException; -using zxing::ChecksumException; -using zxing::Ref; -using zxing::Result; -using zxing::oned::CodaBarReader; - -// VC++ -using zxing::BitArray; - -namespace { - char const ALPHABET_STRING[] = "0123456789-$:/.+ABCD"; - char const* const ALPHABET = ALPHABET_STRING; - - /** - * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of - * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow. - */ - const int CHARACTER_ENCODINGS[] = { - 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9 - 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD - }; - - // minimal number of characters that should be present (inclusing start and stop characters) - // under normal circumstances this should be set to 3, but can be set higher - // as a last-ditch attempt to reduce false positives. - const int MIN_CHARACTER_LENGTH = 3; - - // official start and end patterns - const char STARTEND_ENCODING[] = {'A', 'B', 'C', 'D', 0}; - // some codabar generator allow the codabar string to be closed by every - // character. This will cause lots of false positives! - - // some industries use a checksum standard but this is not part of the original codabar standard - // for more information see : http://www.mecsw.com/specs/codabar.html -} - -// These values are critical for determining how permissive the decoding -// will be. All stripe sizes must be within the window these define, as -// compared to the average stripe size. -const int CodaBarReader::MAX_ACCEPTABLE = - (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 2.0f); -const int CodaBarReader::PADDING = - (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 1.5f); - -CodaBarReader::CodaBarReader() - : counters(80, 0), counterLength(0) {} - -Ref CodaBarReader::decodeRow(int rowNumber, Ref row) { - - { // Arrays.fill(counters, 0); - int size = counters.size(); - counters.resize(0); - counters.resize(size); } - - setCounters(row); - int startOffset = findStartPattern(); - int nextStart = startOffset; - - decodeRowResult.clear(); - do { - int charOffset = toNarrowWidePattern(nextStart); - if (charOffset == -1) { - throw NotFoundException(); - } - // Hack: We store the position in the alphabet table into a - // StringBuilder, so that we can access the decoded patterns in - // validatePattern. We'll translate to the actual characters later. - decodeRowResult.append(1, (char)charOffset); - nextStart += 8; - // Stop as soon as we see the end character. - if (decodeRowResult.length() > 1 && - arrayContains(STARTEND_ENCODING, ALPHABET[charOffset])) { - break; - } - } while (nextStart < counterLength); // no fixed end pattern so keep on reading while data is available - - // Look for whitespace after pattern: - int trailingWhitespace = counters[nextStart - 1]; - int lastPatternSize = 0; - for (int i = -8; i < -1; i++) { - lastPatternSize += counters[nextStart + i]; - } - - // We need to see whitespace equal to 50% of the last pattern size, - // otherwise this is probably a false positive. The exception is if we are - // at the end of the row. (I.e. the barcode barely fits.) - if (nextStart < counterLength && trailingWhitespace < lastPatternSize / 2) { - throw NotFoundException(); - } - - validatePattern(startOffset); - - // Translate character table offsets to actual characters. - for (int i = 0; i < (int)decodeRowResult.length(); i++) { - decodeRowResult[i] = ALPHABET[(int)decodeRowResult[i]]; - } - // Ensure a valid start and end character - char startchar = decodeRowResult[0]; - if (!arrayContains(STARTEND_ENCODING, startchar)) { - throw NotFoundException(); - } - char endchar = decodeRowResult[decodeRowResult.length() - 1]; - if (!arrayContains(STARTEND_ENCODING, endchar)) { - throw NotFoundException(); - } - - // remove stop/start characters character and check if a long enough string is contained - if ((int)decodeRowResult.length() <= MIN_CHARACTER_LENGTH) { - // Almost surely a false positive ( start + stop + at least 1 character) - throw NotFoundException(); - } - - decodeRowResult.erase(decodeRowResult.length() - 1, 1); - decodeRowResult.erase(0, 1); - - int runningCount = 0; - for (int i = 0; i < startOffset; i++) { - runningCount += counters[i]; - } - float left = (float) runningCount; - for (int i = startOffset; i < nextStart - 1; i++) { - runningCount += counters[i]; - } - float right = (float) runningCount; - - ArrayRef< Ref > resultPoints(2); - resultPoints[0] = - Ref(new OneDResultPoint(left, (float) rowNumber)); - resultPoints[1] = - Ref(new OneDResultPoint(right, (float) rowNumber)); - - return Ref(new Result(Ref(new String(decodeRowResult)), - ArrayRef(), - resultPoints, - BarcodeFormat::CODABAR)); -} - -void CodaBarReader::validatePattern(int start) { - // First, sum up the total size of our four categories of stripe sizes; - vector sizes (4, 0); - vector counts (4, 0); - int end = decodeRowResult.length() - 1; - - // We break out of this loop in the middle, in order to handle - // inter-character spaces properly. - int pos = start; - for (int i = 0; true; i++) { - int pattern = CHARACTER_ENCODINGS[(int)decodeRowResult[i]]; - for (int j = 6; j >= 0; j--) { - // Even j = bars, while odd j = spaces. Categories 2 and 3 are for - // long stripes, while 0 and 1 are for short stripes. - int category = (j & 1) + (pattern & 1) * 2; - sizes[category] += counters[pos + j]; - counts[category]++; - pattern >>= 1; - } - if (i >= end) { - break; - } - // We ignore the inter-character space - it could be of any size. - pos += 8; - } - - // Calculate our allowable size thresholds using fixed-point math. - vector maxes (4, 0); - vector mins (4, 0); - // Define the threshold of acceptability to be the midpoint between the - // average small stripe and the average large stripe. No stripe lengths - // should be on the "wrong" side of that line. - for (int i = 0; i < 2; i++) { - mins[i] = 0; // Accept arbitrarily small "short" stripes. - mins[i + 2] = ((sizes[i] << INTEGER_MATH_SHIFT) / counts[i] + - (sizes[i + 2] << INTEGER_MATH_SHIFT) / counts[i + 2]) >> 1; - maxes[i] = mins[i + 2]; - maxes[i + 2] = (sizes[i + 2] * MAX_ACCEPTABLE + PADDING) / counts[i + 2]; - } - - // Now verify that all of the stripes are within the thresholds. - pos = start; - for (int i = 0; true; i++) { - int pattern = CHARACTER_ENCODINGS[(int)decodeRowResult[i]]; - for (int j = 6; j >= 0; j--) { - // Even j = bars, while odd j = spaces. Categories 2 and 3 are for - // long stripes, while 0 and 1 are for short stripes. - int category = (j & 1) + (pattern & 1) * 2; - int size = counters[pos + j] << INTEGER_MATH_SHIFT; - if (size < mins[category] || size > maxes[category]) { - throw NotFoundException(); - } - pattern >>= 1; - } - if (i >= end) { - break; - } - pos += 8; - } -} - -/** - * Records the size of all runs of white and black pixels, starting with white. - * This is just like recordPattern, except it records all the counters, and - * uses our builtin "counters" member for storage. - * @param row row to count from - */ -void CodaBarReader::setCounters(Ref row) { - counterLength = 0; - // Start from the first white bit. - int i = row->getNextUnset(0); - int end = row->getSize(); - if (i >= end) { - throw NotFoundException(); - } - bool isWhite = true; - int count = 0; - for (; i < end; i++) { - if (row->get(i) ^ isWhite) { // that is, exactly one is true - count++; - } else { - counterAppend(count); - count = 1; - isWhite = !isWhite; - } - } - counterAppend(count); -} - -void CodaBarReader::counterAppend(int e) { - if (counterLength < (int)counters.size()) { - counters[counterLength] = e; - } else { - counters.push_back(e); - } - counterLength++; -} - -int CodaBarReader::findStartPattern() { - for (int i = 1; i < counterLength; i += 2) { - int charOffset = toNarrowWidePattern(i); - if (charOffset != -1 && arrayContains(STARTEND_ENCODING, ALPHABET[charOffset])) { - // Look for whitespace before start pattern, >= 50% of width of start pattern - // We make an exception if the whitespace is the first element. - int patternSize = 0; - for (int j = i; j < i + 7; j++) { - patternSize += counters[j]; - } - if (i == 1 || counters[i-1] >= patternSize / 2) { - return i; - } - } - } - throw NotFoundException(); -} - -bool CodaBarReader::arrayContains(char const array[], char key) { - return strchr(array, key) != 0; -} - - -int CodaBarReader::toNarrowWidePattern(int position) { - int end = position + 7; - if (end >= counterLength) { - return -1; - } - - vector& theCounters = counters; - - int maxBar = 0; - int minBar = std::numeric_limits::max(); - for (int j = position; j < end; j += 2) { - int currentCounter = theCounters[j]; - if (currentCounter < minBar) { - minBar = currentCounter; - } - if (currentCounter > maxBar) { - maxBar = currentCounter; - } - } - int thresholdBar = (minBar + maxBar) / 2; - - int maxSpace = 0; - int minSpace = std::numeric_limits::max(); - for (int j = position + 1; j < end; j += 2) { - int currentCounter = theCounters[j]; - if (currentCounter < minSpace) { - minSpace = currentCounter; - } - if (currentCounter > maxSpace) { - maxSpace = currentCounter; - } - } - int thresholdSpace = (minSpace + maxSpace) / 2; - - int bitmask = 1 << 7; - int pattern = 0; - for (int i = 0; i < 7; i++) { - int threshold = (i & 1) == 0 ? thresholdBar : thresholdSpace; - bitmask >>= 1; - if (theCounters[position + i] > threshold) { - pattern |= bitmask; - } - } - - for (int i = 0; i < ZXING_ARRAY_LEN(CHARACTER_ENCODINGS); i++) { - if (CHARACTER_ENCODINGS[i] == pattern) { - return i; - } - } - return -1; -} diff --git a/cpp/core/src/zxing/oned/CodaBarReader.h b/cpp/core/src/zxing/oned/CodaBarReader.h deleted file mode 100644 index a9f21b2b0..000000000 --- a/cpp/core/src/zxing/oned/CodaBarReader.h +++ /dev/null @@ -1,57 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __CODA_BAR_READER_H__ -#define __CODA_BAR_READER_H__ -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace oned { - -class CodaBarReader : public OneDReader { -private: - static const int MAX_ACCEPTABLE; - static const int PADDING; - - // Keep some instance variables to avoid reallocations - std::string decodeRowResult; - std::vector counters; - int counterLength; - -public: - CodaBarReader(); - - Ref decodeRow(int rowNumber, Ref row); - - void validatePattern(int start); - -private: - void setCounters(Ref row); - void counterAppend(int e); - int findStartPattern(); - - static bool arrayContains(char const array[], char key); - - int toNarrowWidePattern(int position); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/Code128Reader.cpp b/cpp/core/src/zxing/oned/Code128Reader.cpp deleted file mode 100644 index cb535699b..000000000 --- a/cpp/core/src/zxing/oned/Code128Reader.cpp +++ /dev/null @@ -1,496 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using std::vector; -using std::string; -using zxing::NotFoundException; -using zxing::FormatException; -using zxing::ChecksumException; -using zxing::Ref; -using zxing::Result; -using zxing::oned::Code128Reader; - -// VC++ -using zxing::BitArray; - -const int Code128Reader::MAX_AVG_VARIANCE = int(PATTERN_MATCH_RESULT_SCALE_FACTOR * 250/1000); -const int Code128Reader::MAX_INDIVIDUAL_VARIANCE = int(PATTERN_MATCH_RESULT_SCALE_FACTOR * 700/1000); - -namespace { - -const int CODE_SHIFT = 98; - -const int CODE_CODE_C = 99; -const int CODE_CODE_B = 100; -const int CODE_CODE_A = 101; - -const int CODE_FNC_1 = 102; -const int CODE_FNC_2 = 97; -const int CODE_FNC_3 = 96; -const int CODE_FNC_4_A = 101; -const int CODE_FNC_4_B = 100; - -const int CODE_START_A = 103; -const int CODE_START_B = 104; -const int CODE_START_C = 105; -const int CODE_STOP = 106; - -const int CODE_PATTERNS_LENGTH = 107; -const int CODE_PATTERNS[CODE_PATTERNS_LENGTH][6] = { - {2, 1, 2, 2, 2, 2}, /* 0 */ - {2, 2, 2, 1, 2, 2}, - {2, 2, 2, 2, 2, 1}, - {1, 2, 1, 2, 2, 3}, - {1, 2, 1, 3, 2, 2}, - {1, 3, 1, 2, 2, 2}, /* 5 */ - {1, 2, 2, 2, 1, 3}, - {1, 2, 2, 3, 1, 2}, - {1, 3, 2, 2, 1, 2}, - {2, 2, 1, 2, 1, 3}, - {2, 2, 1, 3, 1, 2}, /* 10 */ - {2, 3, 1, 2, 1, 2}, - {1, 1, 2, 2, 3, 2}, - {1, 2, 2, 1, 3, 2}, - {1, 2, 2, 2, 3, 1}, - {1, 1, 3, 2, 2, 2}, /* 15 */ - {1, 2, 3, 1, 2, 2}, - {1, 2, 3, 2, 2, 1}, - {2, 2, 3, 2, 1, 1}, - {2, 2, 1, 1, 3, 2}, - {2, 2, 1, 2, 3, 1}, /* 20 */ - {2, 1, 3, 2, 1, 2}, - {2, 2, 3, 1, 1, 2}, - {3, 1, 2, 1, 3, 1}, - {3, 1, 1, 2, 2, 2}, - {3, 2, 1, 1, 2, 2}, /* 25 */ - {3, 2, 1, 2, 2, 1}, - {3, 1, 2, 2, 1, 2}, - {3, 2, 2, 1, 1, 2}, - {3, 2, 2, 2, 1, 1}, - {2, 1, 2, 1, 2, 3}, /* 30 */ - {2, 1, 2, 3, 2, 1}, - {2, 3, 2, 1, 2, 1}, - {1, 1, 1, 3, 2, 3}, - {1, 3, 1, 1, 2, 3}, - {1, 3, 1, 3, 2, 1}, /* 35 */ - {1, 1, 2, 3, 1, 3}, - {1, 3, 2, 1, 1, 3}, - {1, 3, 2, 3, 1, 1}, - {2, 1, 1, 3, 1, 3}, - {2, 3, 1, 1, 1, 3}, /* 40 */ - {2, 3, 1, 3, 1, 1}, - {1, 1, 2, 1, 3, 3}, - {1, 1, 2, 3, 3, 1}, - {1, 3, 2, 1, 3, 1}, - {1, 1, 3, 1, 2, 3}, /* 45 */ - {1, 1, 3, 3, 2, 1}, - {1, 3, 3, 1, 2, 1}, - {3, 1, 3, 1, 2, 1}, - {2, 1, 1, 3, 3, 1}, - {2, 3, 1, 1, 3, 1}, /* 50 */ - {2, 1, 3, 1, 1, 3}, - {2, 1, 3, 3, 1, 1}, - {2, 1, 3, 1, 3, 1}, - {3, 1, 1, 1, 2, 3}, - {3, 1, 1, 3, 2, 1}, /* 55 */ - {3, 3, 1, 1, 2, 1}, - {3, 1, 2, 1, 1, 3}, - {3, 1, 2, 3, 1, 1}, - {3, 3, 2, 1, 1, 1}, - {3, 1, 4, 1, 1, 1}, /* 60 */ - {2, 2, 1, 4, 1, 1}, - {4, 3, 1, 1, 1, 1}, - {1, 1, 1, 2, 2, 4}, - {1, 1, 1, 4, 2, 2}, - {1, 2, 1, 1, 2, 4}, /* 65 */ - {1, 2, 1, 4, 2, 1}, - {1, 4, 1, 1, 2, 2}, - {1, 4, 1, 2, 2, 1}, - {1, 1, 2, 2, 1, 4}, - {1, 1, 2, 4, 1, 2}, /* 70 */ - {1, 2, 2, 1, 1, 4}, - {1, 2, 2, 4, 1, 1}, - {1, 4, 2, 1, 1, 2}, - {1, 4, 2, 2, 1, 1}, - {2, 4, 1, 2, 1, 1}, /* 75 */ - {2, 2, 1, 1, 1, 4}, - {4, 1, 3, 1, 1, 1}, - {2, 4, 1, 1, 1, 2}, - {1, 3, 4, 1, 1, 1}, - {1, 1, 1, 2, 4, 2}, /* 80 */ - {1, 2, 1, 1, 4, 2}, - {1, 2, 1, 2, 4, 1}, - {1, 1, 4, 2, 1, 2}, - {1, 2, 4, 1, 1, 2}, - {1, 2, 4, 2, 1, 1}, /* 85 */ - {4, 1, 1, 2, 1, 2}, - {4, 2, 1, 1, 1, 2}, - {4, 2, 1, 2, 1, 1}, - {2, 1, 2, 1, 4, 1}, - {2, 1, 4, 1, 2, 1}, /* 90 */ - {4, 1, 2, 1, 2, 1}, - {1, 1, 1, 1, 4, 3}, - {1, 1, 1, 3, 4, 1}, - {1, 3, 1, 1, 4, 1}, - {1, 1, 4, 1, 1, 3}, /* 95 */ - {1, 1, 4, 3, 1, 1}, - {4, 1, 1, 1, 1, 3}, - {4, 1, 1, 3, 1, 1}, - {1, 1, 3, 1, 4, 1}, - {1, 1, 4, 1, 3, 1}, /* 100 */ - {3, 1, 1, 1, 4, 1}, - {4, 1, 1, 1, 3, 1}, - {2, 1, 1, 4, 1, 2}, - {2, 1, 1, 2, 1, 4}, - {2, 1, 1, 2, 3, 2}, /* 105 */ - {2, 3, 3, 1, 1, 1} -}; - -} - -Code128Reader::Code128Reader(){} - -vector Code128Reader::findStartPattern(Ref row){ - int width = row->getSize(); - int rowOffset = row->getNextSet(0); - - int counterPosition = 0; - vector counters (6, 0); - int patternStart = rowOffset; - bool isWhite = false; - int patternLength = counters.size(); - - for (int i = rowOffset; i < width; i++) { - if (row->get(i) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - int bestVariance = MAX_AVG_VARIANCE; - int bestMatch = -1; - for (int startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) { - int variance = patternMatchVariance(counters, CODE_PATTERNS[startCode], MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = startCode; - } - } - // Look for whitespace before start pattern, >= 50% of width of start pattern - if (bestMatch >= 0 && - row->isRange(std::max(0, patternStart - (i - patternStart) / 2), patternStart, false)) { - vector resultValue (3, 0); - resultValue[0] = patternStart; - resultValue[1] = i; - resultValue[2] = bestMatch; - return resultValue; - } - patternStart += counters[0] + counters[1]; - for (int y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException(); -} - -int Code128Reader::decodeCode(Ref row, vector& counters, int rowOffset) { - recordPattern(row, rowOffset, counters); - int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept - int bestMatch = -1; - for (int d = 0; d < CODE_PATTERNS_LENGTH; d++) { - int const* const pattern = CODE_PATTERNS[d]; - int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = d; - } - } - // TODO We're overlooking the fact that the STOP pattern has 7 values, not 6. - if (bestMatch >= 0) { - return bestMatch; - } else { - throw NotFoundException(); - } -} - -Ref Code128Reader::decodeRow(int rowNumber, Ref row) { - // boolean convertFNC1 = hints != null && hints.containsKey(DecodeHintType.ASSUME_GS1); - boolean convertFNC1 = false; - vector startPatternInfo (findStartPattern(row)); - int startCode = startPatternInfo[2]; - int codeSet; - switch (startCode) { - case CODE_START_A: - codeSet = CODE_CODE_A; - break; - case CODE_START_B: - codeSet = CODE_CODE_B; - break; - case CODE_START_C: - codeSet = CODE_CODE_C; - break; - default: - throw FormatException(); - } - - bool done = false; - bool isNextShifted = false; - - string result; - vector rawCodes(20, 0); - - int lastStart = startPatternInfo[0]; - int nextStart = startPatternInfo[1]; - vector counters (6, 0); - - int lastCode = 0; - int code = 0; - int checksumTotal = startCode; - int multiplier = 0; - bool lastCharacterWasPrintable = true; - - std::ostringstream oss; - - while (!done) { - - bool unshift = isNextShifted; - isNextShifted = false; - - // Save off last code - lastCode = code; - - code = decodeCode(row, counters, nextStart); - - // Remember whether the last code was printable or not (excluding CODE_STOP) - if (code != CODE_STOP) { - lastCharacterWasPrintable = true; - } - - // Add to checksum computation (if not CODE_STOP of course) - if (code != CODE_STOP) { - multiplier++; - checksumTotal += multiplier * code; - } - - // Advance to where the next code will to start - lastStart = nextStart; - for (int i = 0, e = counters.size(); i < e; i++) { - nextStart += counters[i]; - } - - // Take care of illegal start codes - switch (code) { - case CODE_START_A: - case CODE_START_B: - case CODE_START_C: - throw FormatException(); - } - - switch (codeSet) { - - case CODE_CODE_A: - if (code < 64) { - result.append(1, (char) (' ' + code)); - } else if (code < 96) { - result.append(1, (char) (code - 64)); - } else { - // Don't let CODE_STOP, which always appears, affect whether whether we think the - // last code was printable or not. - if (code != CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case CODE_FNC_1: - if (convertFNC1) { - if (result.length() == 0){ - // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code - // is FNC1 then this is GS1-128. We add the symbology identifier. - result.append("]C1"); - } else { - // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) - result.append(1, (char) 29); - } - } - break; - case CODE_FNC_2: - case CODE_FNC_3: - case CODE_FNC_4_A: - // do nothing? - break; - case CODE_SHIFT: - isNextShifted = true; - codeSet = CODE_CODE_B; - break; - case CODE_CODE_B: - codeSet = CODE_CODE_B; - break; - case CODE_CODE_C: - codeSet = CODE_CODE_C; - break; - case CODE_STOP: - done = true; - break; - } - } - break; - case CODE_CODE_B: - if (code < 96) { - result.append(1, (char) (' ' + code)); - } else { - if (code != CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case CODE_FNC_1: - case CODE_FNC_2: - case CODE_FNC_3: - case CODE_FNC_4_B: - // do nothing? - break; - case CODE_SHIFT: - isNextShifted = true; - codeSet = CODE_CODE_A; - break; - case CODE_CODE_A: - codeSet = CODE_CODE_A; - break; - case CODE_CODE_C: - codeSet = CODE_CODE_C; - break; - case CODE_STOP: - done = true; - break; - } - } - break; - case CODE_CODE_C: - if (code < 100) { - if (code < 10) { - result.append(1, '0'); - } - oss.clear(); - oss.str(""); - oss << code; - result.append(oss.str()); - } else { - if (code != CODE_STOP) { - lastCharacterWasPrintable = false; - } - switch (code) { - case CODE_FNC_1: - // do nothing? - break; - case CODE_CODE_A: - codeSet = CODE_CODE_A; - break; - case CODE_CODE_B: - codeSet = CODE_CODE_B; - break; - case CODE_STOP: - done = true; - break; - } - } - break; - } - - // Unshift back to another code set if we were shifted - if (unshift) { - codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A; - } - - } - - int lastPatternSize = nextStart - lastStart; - - // Check for ample whitespace following pattern, but, to do this we first need to remember that - // we fudged decoding CODE_STOP since it actually has 7 bars, not 6. There is a black bar left - // to read off. Would be slightly better to properly read. Here we just skip it: - nextStart = row->getNextUnset(nextStart); - if (!row->isRange(nextStart, - std::min(row->getSize(), nextStart + (nextStart - lastStart) / 2), - false)) { - throw NotFoundException(); - } - - // Pull out from sum the value of the penultimate check code - checksumTotal -= multiplier * lastCode; - // lastCode is the checksum then: - if (checksumTotal % 103 != lastCode) { - throw ChecksumException(); - } - - // Need to pull out the check digits from string - int resultLength = result.length(); - if (resultLength == 0) { - // false positive - throw NotFoundException(); - } - - // Only bother if the result had at least one character, and if the checksum digit happened to - // be a printable character. If it was just interpreted as a control code, nothing to remove. - if (resultLength > 0 && lastCharacterWasPrintable) { - if (codeSet == CODE_CODE_C) { - result.erase(resultLength - 2, resultLength); - } else { - result.erase(resultLength - 1, resultLength); - } - } - - float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f; - float right = lastStart + lastPatternSize / 2.0f; - - int rawCodesSize = rawCodes.size(); - ArrayRef rawBytes (rawCodesSize); - for (int i = 0; i < rawCodesSize; i++) { - rawBytes[i] = rawCodes[i]; - } - - ArrayRef< Ref > resultPoints(2); - resultPoints[0] = - Ref(new OneDResultPoint(left, (float) rowNumber)); - resultPoints[1] = - Ref(new OneDResultPoint(right, (float) rowNumber)); - - return Ref(new Result(Ref(new String(result)), rawBytes, resultPoints, - BarcodeFormat::CODE_128)); -} - -Code128Reader::~Code128Reader(){} - -zxing::BarcodeFormat Code128Reader::getBarcodeFormat(){ - return BarcodeFormat::CODE_128; -} diff --git a/cpp/core/src/zxing/oned/Code128Reader.h b/cpp/core/src/zxing/oned/Code128Reader.h deleted file mode 100644 index 7731ac742..000000000 --- a/cpp/core/src/zxing/oned/Code128Reader.h +++ /dev/null @@ -1,48 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __CODE_128_READER_H__ -#define __CODE_128_READER_H__ -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace oned { - -class Code128Reader : public OneDReader { -private: - static const int MAX_AVG_VARIANCE; - static const int MAX_INDIVIDUAL_VARIANCE; - - static std::vector findStartPattern(Ref row); - static int decodeCode(Ref row, - std::vector& counters, - int rowOffset); - -public: - Ref decodeRow(int rowNumber, Ref row); - Code128Reader(); - ~Code128Reader(); - - BarcodeFormat getBarcodeFormat(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/Code39Reader.cpp b/cpp/core/src/zxing/oned/Code39Reader.cpp deleted file mode 100644 index 47ee33161..000000000 --- a/cpp/core/src/zxing/oned/Code39Reader.cpp +++ /dev/null @@ -1,328 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 "Code39Reader.h" -#include -#include -#include -#include -#include -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::Result; -using zxing::String; -using zxing::NotFoundException; -using zxing::ChecksumException; -using zxing::oned::Code39Reader; - -// VC++ -using zxing::BitArray; - -namespace { - const char* ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; - - /** - * These represent the encodings of characters, as patterns of wide and narrow - * bars. - * The 9 least-significant bits of each int correspond to the pattern of wide - * and narrow, with 1s representing "wide" and 0s representing narrow. - */ - const int CHARACTER_ENCODINGS_LEN = 44; - int CHARACTER_ENCODINGS[CHARACTER_ENCODINGS_LEN] = { - 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, // 0-9 - 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, // A-J - 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, // K-T - 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, // U-* - 0x0A8, 0x0A2, 0x08A, 0x02A // $-% - }; - - int ASTERISK_ENCODING = 0x094; - const char* ALPHABET_STRING = - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; - - std::string alphabet_string (ALPHABET_STRING); -} - -void Code39Reader::init(bool usingCheckDigit_, bool extendedMode_) { - usingCheckDigit = usingCheckDigit_; - extendedMode = extendedMode_; - decodeRowResult.reserve(20); - counters.resize(9); -} - -/** - * Creates a reader that assumes all encoded data is data, and does not treat - * the final character as a check digit. It will not decoded "extended - * Code 39" sequences. - */ -Code39Reader::Code39Reader() { - init(); -} - -/** - * Creates a reader that can be configured to check the last character as a - * check digit. It will not decoded "extended Code 39" sequences. - * - * @param usingCheckDigit if true, treat the last data character as a check - * digit, not data, and verify that the checksum passes. - */ -Code39Reader::Code39Reader(bool usingCheckDigit_) { - init(usingCheckDigit_); -} - -Code39Reader::Code39Reader(bool usingCheckDigit_, bool extendedMode_) { - init(usingCheckDigit_, extendedMode_); -} - -Ref Code39Reader::decodeRow(int rowNumber, Ref row) { - std::vector& theCounters (counters); - { // Arrays.fill(counters, 0); - int size = theCounters.size(); - theCounters.resize(0); - theCounters.resize(size); } - std::string& result (decodeRowResult); - result.clear(); - - vector start (findAsteriskPattern(row, theCounters)); - // Read off white space - int nextStart = row->getNextSet(start[1]); - int end = row->getSize(); - - char decodedChar; - int lastStart; - do { - recordPattern(row, nextStart, theCounters); - int pattern = toNarrowWidePattern(theCounters); - if (pattern < 0) { - throw NotFoundException();; - } - decodedChar = patternToChar(pattern); - result.append(1, decodedChar); - lastStart = nextStart; - for (int i = 0, end=theCounters.size(); i < end; i++) { - nextStart += theCounters[i]; - } - // Read off white space - nextStart = row->getNextSet(nextStart); - } while (decodedChar != '*'); - result.resize(decodeRowResult.length()-1);// remove asterisk - - // Look for whitespace after pattern: - int lastPatternSize = 0; - for (int i = 0, e = theCounters.size(); i < e; i++) { - lastPatternSize += theCounters[i]; - } - int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; - // If 50% of last pattern size, following last pattern, is not whitespace, - // fail (but if it's whitespace to the very end of the image, that's OK) - if (nextStart != end && (whiteSpaceAfterEnd >> 1) < lastPatternSize) { - throw NotFoundException(); - } - - if (usingCheckDigit) { - int max = result.length() - 1; - int total = 0; - for (int i = 0; i < max; i++) { - total += alphabet_string.find_first_of(decodeRowResult[i], 0); - } - if (result[max] != ALPHABET[total % 43]) { - throw ChecksumException(); - } - result.resize(max); - } - - if (result.length() == 0) { - // Almost false positive - throw NotFoundException(); - } - - Ref resultString; - if (extendedMode) { - resultString = decodeExtended(result); - } else { - resultString = Ref(new String(result)); - } - - float left = (float) (start[1] + start[0]) / 2.0f; - float right = lastStart + lastPatternSize / 2.0f; - - ArrayRef< Ref > resultPoints (2); - resultPoints[0] = - Ref(new OneDResultPoint(left, (float) rowNumber)); - resultPoints[1] = - Ref(new OneDResultPoint(right, (float) rowNumber)); - - return Ref( - new Result(resultString, ArrayRef(), resultPoints, BarcodeFormat::CODE_39) - ); -} - -vector Code39Reader::findAsteriskPattern(Ref row, vector& counters){ - int width = row->getSize(); - int rowOffset = row->getNextSet(0); - - int counterPosition = 0; - int patternStart = rowOffset; - bool isWhite = false; - int patternLength = counters.size(); - - for (int i = rowOffset; i < width; i++) { - if (row->get(i) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - // Look for whitespace before start pattern, >= 50% of width of - // start pattern. - if (toNarrowWidePattern(counters) == ASTERISK_ENCODING && - row->isRange(std::max(0, patternStart - ((i - patternStart) >> 1)), patternStart, false)) { - vector resultValue (2, 0); - resultValue[0] = patternStart; - resultValue[1] = i; - return resultValue; - } - patternStart += counters[0] + counters[1]; - for (int y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException(); -} - -// For efficiency, returns -1 on failure. Not throwing here saved as many as -// 700 exceptions per image when using some of our blackbox images. -int Code39Reader::toNarrowWidePattern(vector& counters){ - int numCounters = counters.size(); - int maxNarrowCounter = 0; - int wideCounters; - do { - int minCounter = INT_MAX; - for (int i = 0; i < numCounters; i++) { - int counter = counters[i]; - if (counter < minCounter && counter > maxNarrowCounter) { - minCounter = counter; - } - } - maxNarrowCounter = minCounter; - wideCounters = 0; - int totalWideCountersWidth = 0; - int pattern = 0; - for (int i = 0; i < numCounters; i++) { - int counter = counters[i]; - if (counters[i] > maxNarrowCounter) { - pattern |= 1 << (numCounters - 1 - i); - wideCounters++; - totalWideCountersWidth += counter; - } - } - if (wideCounters == 3) { - // Found 3 wide counters, but are they close enough in width? - // We can perform a cheap, conservative check to see if any individual - // counter is more than 1.5 times the average: - for (int i = 0; i < numCounters && wideCounters > 0; i++) { - int counter = counters[i]; - if (counters[i] > maxNarrowCounter) { - wideCounters--; - // totalWideCountersWidth = 3 * average, so this checks if - // counter >= 3/2 * average. - if ((counter << 1) >= totalWideCountersWidth) { - return -1; - } - } - } - return pattern; - } - } while (wideCounters > 3); - return -1; -} - -char Code39Reader::patternToChar(int pattern){ - for (int i = 0; i < CHARACTER_ENCODINGS_LEN; i++) { - if (CHARACTER_ENCODINGS[i] == pattern) { - return ALPHABET[i]; - } - } - throw ReaderException(""); -} - -Ref Code39Reader::decodeExtended(std::string encoded){ - int length = encoded.length(); - std::string tmpDecoded; - for (int i = 0; i < length; i++) { - char c = encoded[i]; - if (c == '+' || c == '$' || c == '%' || c == '/') { - char next = encoded[i + 1]; - char decodedChar = '\0'; - switch (c) { - case '+': - // +A to +Z map to a to z - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next + 32); - } else { - throw ReaderException(""); - } - break; - case '$': - // $A to $Z map to control codes SH to SB - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next - 64); - } else { - throw ReaderException(""); - } - break; - case '%': - // %A to %E map to control codes ESC to US - if (next >= 'A' && next <= 'E') { - decodedChar = (char) (next - 38); - } else if (next >= 'F' && next <= 'W') { - decodedChar = (char) (next - 11); - } else { - throw ReaderException(""); - } - break; - case '/': - // /A to /O map to ! to , and /Z maps to : - if (next >= 'A' && next <= 'O') { - decodedChar = (char) (next - 32); - } else if (next == 'Z') { - decodedChar = ':'; - } else { - throw ReaderException(""); - } - break; - } - tmpDecoded.append(1, decodedChar); - // bump up i again since we read two characters - i++; - } else { - tmpDecoded.append(1, c); - } - } - Ref decoded(new String(tmpDecoded)); - return decoded; -} diff --git a/cpp/core/src/zxing/oned/Code39Reader.h b/cpp/core/src/zxing/oned/Code39Reader.h deleted file mode 100644 index 28b628596..000000000 --- a/cpp/core/src/zxing/oned/Code39Reader.h +++ /dev/null @@ -1,63 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __CODE_39_READER_H__ -#define __CODE_39_READER_H__ -/* - * Code39Reader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace oned { - -/** - *

Decodes Code 39 barcodes. This does not support "Full ASCII Code 39" yet.

- * Ported form Java (author Sean Owen) - * @author Lukasz Warchol - */ -class Code39Reader : public OneDReader { -private: - bool usingCheckDigit; - bool extendedMode; - std::string decodeRowResult; - std::vector counters; - - void init(bool usingCheckDigit = false, bool extendedMode = false); - - static std::vector findAsteriskPattern(Ref row, - std::vector& counters); - static int toNarrowWidePattern(std::vector& counters); - static char patternToChar(int pattern); - static Ref decodeExtended(std::string encoded); - - void append(char* s, char c); - -public: - Code39Reader(); - Code39Reader(bool usingCheckDigit_); - Code39Reader(bool usingCheckDigit_, bool extendedMode_); - - Ref decodeRow(int rowNumber, Ref row); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/Code93Reader.cpp b/cpp/core/src/zxing/oned/Code93Reader.cpp deleted file mode 100644 index deb3484b0..000000000 --- a/cpp/core/src/zxing/oned/Code93Reader.cpp +++ /dev/null @@ -1,293 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 "Code93Reader.h" -#include -#include -#include -#include -#include -#include -#include -#include - -using std::vector; -using std::string; -using zxing::Ref; -using zxing::Result; -using zxing::String; -using zxing::NotFoundException; -using zxing::ChecksumException; -using zxing::oned::Code93Reader; - -// VC++ -using zxing::BitArray; - -namespace { - char const ALPHABET[] = - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*"; - string ALPHABET_STRING (ALPHABET); - - /** - * These represent the encodings of characters, as patterns of wide and narrow bars. - * The 9 least-significant bits of each int correspond to the pattern of wide and narrow. - */ - int const CHARACTER_ENCODINGS[] = { - 0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, // 0-9 - 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, // A-J - 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, // K-T - 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, // U-Z - 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, // - - % - 0x126, 0x1DA, 0x1D6, 0x132, 0x15E, // Control chars? $-* - }; - int const CHARACTER_ENCODINGS_LENGTH = - (int)sizeof(CHARACTER_ENCODINGS)/sizeof(CHARACTER_ENCODINGS[0]); - const int ASTERISK_ENCODING = CHARACTER_ENCODINGS[47]; -} - -Code93Reader::Code93Reader() { - decodeRowResult.reserve(20); - counters.resize(6); -} - -Ref Code93Reader::decodeRow(int rowNumber, Ref row) { - Range start (findAsteriskPattern(row)); - // Read off white space - int nextStart = row->getNextSet(start[1]); - int end = row->getSize(); - - vector& theCounters (counters); - { // Arrays.fill(counters, 0); - int size = theCounters.size(); - theCounters.resize(0); - theCounters.resize(size); } - string& result (decodeRowResult); - result.clear(); - - char decodedChar; - int lastStart; - do { - recordPattern(row, nextStart, theCounters); - int pattern = toPattern(theCounters); - if (pattern < 0) { - throw NotFoundException(); - } - decodedChar = patternToChar(pattern); - result.append(1, decodedChar); - lastStart = nextStart; - for(int i=0, e=theCounters.size(); i < e; ++i) { - nextStart += theCounters[i]; - } - // Read off white space - nextStart = row->getNextSet(nextStart); - } while (decodedChar != '*'); - result.resize(result.length() - 1); // remove asterisk - - // Look for whitespace after pattern: - int lastPatternSize = 0; - for (int i = 0, e = theCounters.size(); i < e; i++) { - lastPatternSize += theCounters[i]; - } - - // Should be at least one more black module - if (nextStart == end || !row->get(nextStart)) { - throw NotFoundException(); - } - - if (result.length() < 2) { - // false positive -- need at least 2 checksum digits - throw NotFoundException(); - } - - checkChecksums(result); - // Remove checksum digits - result.resize(result.length() - 2); - - Ref resultString = decodeExtended(result); - - float left = (float) (start[1] + start[0]) / 2.0f; - float right = lastStart + lastPatternSize / 2.0f; - - ArrayRef< Ref > resultPoints (2); - resultPoints[0] = - Ref(new OneDResultPoint(left, (float) rowNumber)); - resultPoints[1] = - Ref(new OneDResultPoint(right, (float) rowNumber)); - - return Ref(new Result( - resultString, - ArrayRef(), - resultPoints, - BarcodeFormat::CODE_93)); -} - -Code93Reader::Range Code93Reader::findAsteriskPattern(Ref row) { - int width = row->getSize(); - int rowOffset = row->getNextSet(0); - - { // Arrays.fill(counters, 0); - int size = counters.size(); - counters.resize(0); - counters.resize(size); } - vector& theCounters (counters); - - int patternStart = rowOffset; - bool isWhite = false; - int patternLength = theCounters.size(); - - int counterPosition = 0; - for (int i = rowOffset; i < width; i++) { - if (row->get(i) ^ isWhite) { - theCounters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (toPattern(theCounters) == ASTERISK_ENCODING) { - return Range(patternStart, i); - } - patternStart += theCounters[0] + theCounters[1]; - for (int y = 2; y < patternLength; y++) { - theCounters[y - 2] = theCounters[y]; - } - theCounters[patternLength - 2] = 0; - theCounters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - theCounters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException(); -} - -int Code93Reader::toPattern(vector& counters) { - int max = counters.size(); - int sum = 0; - for(int i=0, e=counters.size(); i> INTEGER_MATH_SHIFT; - if ((scaledShifted & 0xFF) > 0x7F) { - scaledUnshifted++; - } - if (scaledUnshifted < 1 || scaledUnshifted > 4) { - return -1; - } - if ((i & 0x01) == 0) { - for (int j = 0; j < scaledUnshifted; j++) { - pattern = (pattern << 1) | 0x01; - } - } else { - pattern <<= scaledUnshifted; - } - } - return pattern; -} - -char Code93Reader::patternToChar(int pattern) { - for (int i = 0; i < CHARACTER_ENCODINGS_LENGTH; i++) { - if (CHARACTER_ENCODINGS[i] == pattern) { - return ALPHABET[i]; - } - } - throw NotFoundException(); -} - -Ref Code93Reader::decodeExtended(string const& encoded) { - int length = encoded.length(); - string decoded; - for (int i = 0; i < length; i++) { - char c = encoded[i]; - if (c >= 'a' && c <= 'd') { - if (i >= length - 1) { - throw FormatException::getFormatInstance(); - } - char next = encoded[i + 1]; - char decodedChar = '\0'; - switch (c) { - case 'd': - // +A to +Z map to a to z - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next + 32); - } else { - throw FormatException::getFormatInstance(); - } - break; - case 'a': - // $A to $Z map to control codes SH to SB - if (next >= 'A' && next <= 'Z') { - decodedChar = (char) (next - 64); - } else { - throw FormatException::getFormatInstance(); - } - break; - case 'b': - // %A to %E map to control codes ESC to US - if (next >= 'A' && next <= 'E') { - decodedChar = (char) (next - 38); - } else if (next >= 'F' && next <= 'W') { - decodedChar = (char) (next - 11); - } else { - throw FormatException::getFormatInstance(); - } - break; - case 'c': - // /A to /O map to ! to , and /Z maps to : - if (next >= 'A' && next <= 'O') { - decodedChar = (char) (next - 32); - } else if (next == 'Z') { - decodedChar = ':'; - } else { - throw FormatException::getFormatInstance(); - } - break; - } - decoded.append(1, decodedChar); - // bump up i again since we read two characters - i++; - } else { - decoded.append(1, c); - } - } - return Ref(new String(decoded)); -} - -void Code93Reader::checkChecksums(string const& result) { - int length = result.length(); - checkOneChecksum(result, length - 2, 20); - checkOneChecksum(result, length - 1, 15); -} - -void Code93Reader::checkOneChecksum(string const& result, - int checkPosition, - int weightMax) { - int weight = 1; - int total = 0; - for (int i = checkPosition - 1; i >= 0; i--) { - total += weight * ALPHABET_STRING.find_first_of(result[i]); - if (++weight > weightMax) { - weight = 1; - } - } - if (result[checkPosition] != ALPHABET[total % 47]) { - throw ChecksumException(); - } -} diff --git a/cpp/core/src/zxing/oned/Code93Reader.h b/cpp/core/src/zxing/oned/Code93Reader.h deleted file mode 100644 index 7237aad48..000000000 --- a/cpp/core/src/zxing/oned/Code93Reader.h +++ /dev/null @@ -1,58 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __CODE_93_READER_H__ -#define __CODE_93_READER_H__ -/* - * Code93Reader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace oned { - -/** - *

Decodes Code 93 barcodes. This does not support "Full ASCII Code 93" yet.

- * Ported form Java (author Sean Owen) - * @author Lukasz Warchol - */ -class Code93Reader : public OneDReader { -public: - Code93Reader(); - Ref decodeRow(int rowNumber, Ref row); - -private: - std::string decodeRowResult; - std::vector counters; - - Range findAsteriskPattern(Ref row); - - static int toPattern(std::vector& counters); - static char patternToChar(int pattern); - static Ref decodeExtended(std::string const& encoded); - static void checkChecksums(std::string const& result); - static void checkOneChecksum(std::string const& result, - int checkPosition, - int weightMax); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/EAN13Reader.cpp b/cpp/core/src/zxing/oned/EAN13Reader.cpp deleted file mode 100644 index fbec476aa..000000000 --- a/cpp/core/src/zxing/oned/EAN13Reader.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 "EAN13Reader.h" -#include - -using std::vector; -using zxing::Ref; -using zxing::BitArray; -using zxing::oned::EAN13Reader; - -namespace { - const int FIRST_DIGIT_ENCODINGS[10] = { - 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A - }; -} - -EAN13Reader::EAN13Reader() : decodeMiddleCounters(4, 0) { } - -int EAN13Reader::decodeMiddle(Ref row, - Range const& startRange, - std::string& resultString) { - vector& counters (decodeMiddleCounters); - counters.clear(); - counters.resize(4); - int end = row->getSize(); - int rowOffset = startRange[1]; - - int lgPatternFound = 0; - - for (int x = 0; x < 6 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_AND_G_PATTERNS); - resultString.append(1, (char) ('0' + bestMatch % 10)); - for (int i = 0, end = counters.size(); i = 10) { - lgPatternFound |= 1 << (5 - x); - } - } - - determineFirstDigit(resultString, lgPatternFound); - - Range middleRange = findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN) ; - rowOffset = middleRange[1]; - - for (int x = 0; x < 6 && rowOffset < end; x++) { - int bestMatch = - decodeDigit(row, counters, rowOffset, L_PATTERNS); - resultString.append(1, (char) ('0' + bestMatch)); - for (int i = 0, end = counters.size(); i < end; i++) { - rowOffset += counters[i]; - } - } - return rowOffset; -} - -void EAN13Reader::determineFirstDigit(std::string& resultString, int lgPatternFound) { - // std::cerr << "K " << resultString << " " << lgPatternFound << " " < -#include - -namespace zxing { -namespace oned { - -class EAN13Reader : public UPCEANReader { -private: - std::vector decodeMiddleCounters; - static void determineFirstDigit(std::string& resultString, - int lgPatternFound); - -public: - EAN13Reader(); - - int decodeMiddle(Ref row, - Range const& startRange, - std::string& resultString); - - BarcodeFormat getBarcodeFormat(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/EAN8Reader.cpp b/cpp/core/src/zxing/oned/EAN8Reader.cpp deleted file mode 100644 index 3570a7997..000000000 --- a/cpp/core/src/zxing/oned/EAN8Reader.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 "EAN8Reader.h" -#include - -using std::vector; -using zxing::oned::EAN8Reader; - -// VC++ -using zxing::Ref; -using zxing::BitArray; - -EAN8Reader::EAN8Reader() : decodeMiddleCounters(4, 0) {} - -int EAN8Reader::decodeMiddle(Ref row, - Range const& startRange, - std::string& result){ - vector& counters (decodeMiddleCounters); - counters[0] = 0; - counters[1] = 0; - counters[2] = 0; - counters[3] = 0; - - int end = row->getSize(); - int rowOffset = startRange[1]; - - for (int x = 0; x < 4 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS); - result.append(1, (char) ('0' + bestMatch)); - for (int i = 0, end = counters.size(); i < end; i++) { - rowOffset += counters[i]; - } - } - - Range middleRange = - findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN); - rowOffset = middleRange[1]; - for (int x = 0; x < 4 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS); - result.append(1, (char) ('0' + bestMatch)); - for (int i = 0, end = counters.size(); i < end; i++) { - rowOffset += counters[i]; - } - } - return rowOffset; -} - -zxing::BarcodeFormat EAN8Reader::getBarcodeFormat(){ - return BarcodeFormat::EAN_8; -} diff --git a/cpp/core/src/zxing/oned/EAN8Reader.h b/cpp/core/src/zxing/oned/EAN8Reader.h deleted file mode 100644 index 7dfaf3a03..000000000 --- a/cpp/core/src/zxing/oned/EAN8Reader.h +++ /dev/null @@ -1,47 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __EAN_8_READER_H__ -#define __EAN_8_READER_H__ - -/* - * EAN8Reader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace oned { - -class EAN8Reader : public UPCEANReader { - private: - std::vector decodeMiddleCounters; - - public: - EAN8Reader(); - - int decodeMiddle(Ref row, - Range const& startRange, - std::string& resultString); - - BarcodeFormat getBarcodeFormat(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/ITFReader.cpp b/cpp/core/src/zxing/oned/ITFReader.cpp deleted file mode 100644 index 4315ac5c8..000000000 --- a/cpp/core/src/zxing/oned/ITFReader.cpp +++ /dev/null @@ -1,337 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::Array; -using zxing::Result; -using zxing::FormatException; -using zxing::NotFoundException; -using zxing::oned::ITFReader; - -// VC++ -using zxing::BitArray; - -#define VECTOR_INIT(v) v, v + sizeof(v)/sizeof(v[0]) - -namespace { - -const int W = 3; // Pixel width of a wide line -const int N = 1; // Pixed width of a narrow line - -const int DEFAULT_ALLOWED_LENGTHS_[] = -{ 48, 44, 24, 20, 18, 16, 14, 12, 10, 8, 6 }; -const ArrayRef DEFAULT_ALLOWED_LENGTHS (new Array(VECTOR_INIT(DEFAULT_ALLOWED_LENGTHS_))); - -/** - * Start/end guard pattern. - * - * Note: The end pattern is reversed because the row is reversed before - * searching for the END_PATTERN - */ -const int START_PATTERN_[] = {N, N, N, N}; -const vector START_PATTERN (VECTOR_INIT(START_PATTERN_)); - -const int END_PATTERN_REVERSED_[] = {N, N, W}; -const vector END_PATTERN_REVERSED (VECTOR_INIT(END_PATTERN_REVERSED_)); - -/** - * Patterns of Wide / Narrow lines to indicate each digit - */ -const int PATTERNS[][5] = { - {N, N, W, W, N}, // 0 - {W, N, N, N, W}, // 1 - {N, W, N, N, W}, // 2 - {W, W, N, N, N}, // 3 - {N, N, W, N, W}, // 4 - {W, N, W, N, N}, // 5 - {N, W, W, N, N}, // 6 - {N, N, N, W, W}, // 7 - {W, N, N, W, N}, // 8 - {N, W, N, W, N} // 9 -}; - -} - -ITFReader::ITFReader() : narrowLineWidth(-1) { -} - - -Ref ITFReader::decodeRow(int rowNumber, Ref row) { - // Find out where the Middle section (payload) starts & ends - - Range startRange = decodeStart(row); - Range endRange = decodeEnd(row); - - std::string result; - decodeMiddle(row, startRange[1], endRange[0], result); - Ref resultString(new String(result)); - - ArrayRef allowedLengths; - // Java hints stuff missing - if (!allowedLengths) { - allowedLengths = DEFAULT_ALLOWED_LENGTHS; - } - - // To avoid false positives with 2D barcodes (and other patterns), make - // an assumption that the decoded string must be 6, 10 or 14 digits. - int length = resultString->size(); - bool lengthOK = false; - for (int i = 0, e = allowedLengths->size(); i < e; i++) { - if (length == allowedLengths[i]) { - lengthOK = true; - break; - } - } - - if (!lengthOK) { - throw FormatException(); - } - - ArrayRef< Ref > resultPoints(2); - resultPoints[0] = - Ref(new OneDResultPoint(float(startRange[1]), float(rowNumber))); - resultPoints[1] = - Ref(new OneDResultPoint(float(endRange[0]), float(rowNumber))); - return Ref(new Result(resultString, ArrayRef(), resultPoints, BarcodeFormat::ITF)); -} - -/** - * @param row row of black/white values to search - * @param payloadStart offset of start pattern - * @param resultString {@link StringBuffer} to append decoded chars to - * @throws ReaderException if decoding could not complete successfully - */ -void ITFReader::decodeMiddle(Ref row, - int payloadStart, - int payloadEnd, - std::string& resultString) { - // Digits are interleaved in pairs - 5 black lines for one digit, and the - // 5 - // interleaved white lines for the second digit. - // Therefore, need to scan 10 lines and then - // split these into two arrays - vector counterDigitPair(10, 0); - vector counterBlack(5, 0); - vector counterWhite(5, 0); - - while (payloadStart < payloadEnd) { - - // Get 10 runs of black/white. - recordPattern(row, payloadStart, counterDigitPair); - // Split them into each array - for (int k = 0; k < 5; k++) { - int twoK = k << 1; - counterBlack[k] = counterDigitPair[twoK]; - counterWhite[k] = counterDigitPair[twoK + 1]; - } - - int bestMatch = decodeDigit(counterBlack); - resultString.append(1, (char) ('0' + bestMatch)); - bestMatch = decodeDigit(counterWhite); - resultString.append(1, (char) ('0' + bestMatch)); - - for (int i = 0, e = counterDigitPair.size(); i < e; i++) { - payloadStart += counterDigitPair[i]; - } - } -} - -/** - * Identify where the start of the middle / payload section starts. - * - * @param row row of black/white values to search - * @return Array, containing index of start of 'start block' and end of - * 'start block' - * @throws ReaderException - */ -ITFReader::Range ITFReader::decodeStart(Ref row) { - int endStart = skipWhiteSpace(row); - Range startPattern = findGuardPattern(row, endStart, START_PATTERN); - - // Determine the width of a narrow line in pixels. We can do this by - // getting the width of the start pattern and dividing by 4 because its - // made up of 4 narrow lines. - narrowLineWidth = (startPattern[1] - startPattern[0]) >> 2; - - validateQuietZone(row, startPattern[0]); - return startPattern; -} - -/** - * Identify where the end of the middle / payload section ends. - * - * @param row row of black/white values to search - * @return Array, containing index of start of 'end block' and end of 'end - * block' - * @throws ReaderException - */ - -ITFReader::Range ITFReader::decodeEnd(Ref row) { - // For convenience, reverse the row and then - // search from 'the start' for the end block - BitArray::Reverse r (row); - - int endStart = skipWhiteSpace(row); - Range endPattern = findGuardPattern(row, endStart, END_PATTERN_REVERSED); - - // The start & end patterns must be pre/post fixed by a quiet zone. This - // zone must be at least 10 times the width of a narrow line. - // ref: http://www.barcode-1.net/i25code.html - validateQuietZone(row, endPattern[0]); - - // Now recalculate the indices of where the 'endblock' starts & stops to - // accommodate - // the reversed nature of the search - int temp = endPattern[0]; - endPattern[0] = row->getSize() - endPattern[1]; - endPattern[1] = row->getSize() - temp; - - return endPattern; -} - -/** - * The start & end patterns must be pre/post fixed by a quiet zone. This - * zone must be at least 10 times the width of a narrow line. Scan back until - * we either get to the start of the barcode or match the necessary number of - * quiet zone pixels. - * - * Note: Its assumed the row is reversed when using this method to find - * quiet zone after the end pattern. - * - * ref: http://www.barcode-1.net/i25code.html - * - * @param row bit array representing the scanned barcode. - * @param startPattern index into row of the start or end pattern. - * @throws ReaderException if the quiet zone cannot be found, a ReaderException is thrown. - */ -void ITFReader::validateQuietZone(Ref row, int startPattern) { - int quietCount = this->narrowLineWidth * 10; // expect to find this many pixels of quiet zone - - for (int i = startPattern - 1; quietCount > 0 && i >= 0; i--) { - if (row->get(i)) { - break; - } - quietCount--; - } - if (quietCount != 0) { - // Unable to find the necessary number of quiet zone pixels. - throw NotFoundException(); - } -} - -/** - * Skip all whitespace until we get to the first black line. - * - * @param row row of black/white values to search - * @return index of the first black line. - * @throws ReaderException Throws exception if no black lines are found in the row - */ -int ITFReader::skipWhiteSpace(Ref row) { - int width = row->getSize(); - int endStart = row->getNextSet(0); - if (endStart == width) { - throw NotFoundException(); - } - return endStart; -} - -/** - * @param row row of black/white values to search - * @param rowOffset position to start search - * @param pattern pattern of counts of number of black and white pixels that are - * being searched for as a pattern - * @return start/end horizontal offset of guard pattern, as an array of two - * ints - * @throws ReaderException if pattern is not found - */ -ITFReader::Range ITFReader::findGuardPattern(Ref row, - int rowOffset, - vector const& pattern) { - // TODO: This is very similar to implementation in UPCEANReader. Consider if they can be - // merged to a single method. - int patternLength = pattern.size(); - vector counters(patternLength); - int width = row->getSize(); - bool isWhite = false; - - int counterPosition = 0; - int patternStart = rowOffset; - for (int x = rowOffset; x < width; x++) { - if (row->get(x) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, &pattern[0], MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - return Range(patternStart, x); - } - patternStart += counters[0] + counters[1]; - for (int y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException(); -} - -/** - * Attempts to decode a sequence of ITF black/white lines into single - * digit. - * - * @param counters the counts of runs of observed black/white/black/... values - * @return The decoded digit - * @throws ReaderException if digit cannot be decoded - */ -int ITFReader::decodeDigit(vector& counters){ - - int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept - int bestMatch = -1; - int max = sizeof(PATTERNS)/sizeof(PATTERNS[0]); - for (int i = 0; i < max; i++) { - int const* pattern = PATTERNS[i]; - int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = i; - } - } - if (bestMatch >= 0) { - return bestMatch; - } else { - throw NotFoundException(); - } -} - -ITFReader::~ITFReader(){} diff --git a/cpp/core/src/zxing/oned/ITFReader.h b/cpp/core/src/zxing/oned/ITFReader.h deleted file mode 100644 index ce50dd9af..000000000 --- a/cpp/core/src/zxing/oned/ITFReader.h +++ /dev/null @@ -1,54 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __ITF_READER_H__ -#define __ITF_READER_H__ - -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace oned { - -class ITFReader : public OneDReader { -private: - enum {MAX_AVG_VARIANCE = (unsigned int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 420/1000)}; - enum {MAX_INDIVIDUAL_VARIANCE = (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 780/1000)}; - // Stores the actual narrow line width of the image being decoded. - int narrowLineWidth; - - Range decodeStart(Ref row); - Range decodeEnd(Ref row); - static void decodeMiddle(Ref row, int payloadStart, int payloadEnd, std::string& resultString); - void validateQuietZone(Ref row, int startPattern); - static int skipWhiteSpace(Ref row); - - static Range findGuardPattern(Ref row, int rowOffset, std::vector const& pattern); - static int decodeDigit(std::vector& counters); - - void append(char* s, char c); -public: - Ref decodeRow(int rowNumber, Ref row); - ITFReader(); - ~ITFReader(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp b/cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp deleted file mode 100644 index 8c0321bb4..000000000 --- a/cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using zxing::Ref; -using zxing::Result; -using zxing::oned::MultiFormatOneDReader; - -// VC++ -using zxing::DecodeHints; -using zxing::BitArray; - -MultiFormatOneDReader::MultiFormatOneDReader(DecodeHints hints) : readers() { - if (hints.containsFormat(BarcodeFormat::EAN_13) || - hints.containsFormat(BarcodeFormat::EAN_8) || - hints.containsFormat(BarcodeFormat::UPC_A) || - hints.containsFormat(BarcodeFormat::UPC_E)) { - readers.push_back(Ref(new MultiFormatUPCEANReader(hints))); - } - if (hints.containsFormat(BarcodeFormat::CODE_39)) { - readers.push_back(Ref(new Code39Reader())); - } - if (hints.containsFormat(BarcodeFormat::CODE_93)) { - readers.push_back(Ref(new Code93Reader())); - } - if (hints.containsFormat(BarcodeFormat::CODE_128)) { - readers.push_back(Ref(new Code128Reader())); - } - if (hints.containsFormat(BarcodeFormat::ITF)) { - readers.push_back(Ref(new ITFReader())); - } - if (hints.containsFormat(BarcodeFormat::CODABAR)) { - readers.push_back(Ref(new CodaBarReader())); - } -/* - if (hints.containsFormat(BarcodeFormat::RSS_14)) { - readers.push_back(Ref(new RSS14Reader())); - } -*/ -/* - if (hints.containsFormat(BarcodeFormat::RSS_EXPANDED)) { - readers.push_back(Ref(new RSS14ExpandedReader())); - } -*/ - if (readers.size() == 0) { - readers.push_back(Ref(new MultiFormatUPCEANReader(hints))); - readers.push_back(Ref(new Code39Reader())); - readers.push_back(Ref(new CodaBarReader())); - readers.push_back(Ref(new Code93Reader())); - readers.push_back(Ref(new Code128Reader())); - readers.push_back(Ref(new ITFReader())); - // readers.push_back(Ref(new RSS14Reader())); - // readers.push_back(Ref(new RSS14ExpandedReader())); - } -} - -#include - -Ref MultiFormatOneDReader::decodeRow(int rowNumber, Ref row) { - int size = readers.size(); - for (int i = 0; i < size; i++) { - OneDReader* reader = readers[i]; - try { - Ref result = reader->decodeRow(rowNumber, row); - return result; - } catch (ReaderException const& re) { - (void)re; - // continue - } - } - throw NotFoundException(); -} diff --git a/cpp/core/src/zxing/oned/MultiFormatOneDReader.h b/cpp/core/src/zxing/oned/MultiFormatOneDReader.h deleted file mode 100644 index c939f6619..000000000 --- a/cpp/core/src/zxing/oned/MultiFormatOneDReader.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef __MULTI_FORMAT_ONED_READER_H__ -#define __MULTI_FORMAT_ONED_READER_H__ -/* - * MultiFormatOneDReader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { - namespace oned { - class MultiFormatOneDReader : public OneDReader { - - private: - std::vector > readers; - public: - MultiFormatOneDReader(DecodeHints hints); - - Ref decodeRow(int rowNumber, Ref row); - }; - } -} - -#endif diff --git a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp b/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp deleted file mode 100644 index 298b3803e..000000000 --- a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * MultiFormatUPCEANReader.cpp - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using zxing::NotFoundException; -using zxing::Ref; -using zxing::Result; -using zxing::oned::MultiFormatUPCEANReader; - -// VC++ -using zxing::DecodeHints; -using zxing::BitArray; - -MultiFormatUPCEANReader::MultiFormatUPCEANReader(DecodeHints hints) : readers() { - if (hints.containsFormat(BarcodeFormat::EAN_13)) { - readers.push_back(Ref(new EAN13Reader())); - } else if (hints.containsFormat(BarcodeFormat::UPC_A)) { - readers.push_back(Ref(new UPCAReader())); - } - if (hints.containsFormat(BarcodeFormat::EAN_8)) { - readers.push_back(Ref(new EAN8Reader())); - } - if (hints.containsFormat(BarcodeFormat::UPC_E)) { - readers.push_back(Ref(new UPCEReader())); - } - if (readers.size() == 0) { - readers.push_back(Ref(new EAN13Reader())); - // UPC-A is covered by EAN-13 - readers.push_back(Ref(new EAN8Reader())); - readers.push_back(Ref(new UPCEReader())); - } -} - -#include - -Ref MultiFormatUPCEANReader::decodeRow(int rowNumber, Ref row) { - // Compute this location once and reuse it on multiple implementations - UPCEANReader::Range startGuardPattern = UPCEANReader::findStartGuardPattern(row); - for (int i = 0, e = readers.size(); i < e; i++) { - Ref reader = readers[i]; - Ref result; - try { - result = reader->decodeRow(rowNumber, row, startGuardPattern); - } catch (ReaderException const& ignored) { - (void)ignored; - continue; - } - - // Special case: a 12-digit code encoded in UPC-A is identical - // to a "0" followed by those 12 digits encoded as EAN-13. Each - // will recognize such a code, UPC-A as a 12-digit string and - // EAN-13 as a 13-digit string starting with "0". Individually - // these are correct and their readers will both read such a - // code and correctly call it EAN-13, or UPC-A, respectively. - // - // In this case, if we've been looking for both types, we'd like - // to call it a UPC-A code. But for efficiency we only run the - // EAN-13 decoder to also read UPC-A. So we special case it - // here, and convert an EAN-13 result to a UPC-A result if - // appropriate. - bool ean13MayBeUPCA = - result->getBarcodeFormat() == BarcodeFormat::EAN_13 && - result->getText()->charAt(0) == '0'; - - // Note: doesn't match Java which uses hints - - bool canReturnUPCA = true; - - if (ean13MayBeUPCA && canReturnUPCA) { - // Transfer the metdata across - Ref resultUPCA (new Result(result->getText()->substring(1), - result->getRawBytes(), - result->getResultPoints(), - BarcodeFormat::UPC_A)); - // needs java metadata stuff - return resultUPCA; - } - return result; - } - - throw NotFoundException(); -} diff --git a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h b/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h deleted file mode 100644 index d0e2b2074..000000000 --- a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h +++ /dev/null @@ -1,41 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __MULTI_FORMAT_UPC_EAN_READER_H__ -#define __MULTI_FORMAT_UPC_EAN_READER_H__ -/* - * MultiFormatUPCEANReader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -namespace oned { - -class UPCEANReader; - -class MultiFormatUPCEANReader : public OneDReader { -private: - std::vector< Ref > readers; -public: - MultiFormatUPCEANReader(DecodeHints hints); - Ref decodeRow(int rowNumber, Ref row); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/OneDReader.cpp b/cpp/core/src/zxing/oned/OneDReader.cpp deleted file mode 100644 index 5920c3996..000000000 --- a/cpp/core/src/zxing/oned/OneDReader.cpp +++ /dev/null @@ -1,227 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::Result; -using zxing::NotFoundException; -using zxing::oned::OneDReader; - -// VC++ -using zxing::BinaryBitmap; -using zxing::BitArray; -using zxing::DecodeHints; - -OneDReader::OneDReader() {} - -Ref OneDReader::decode(Ref image, DecodeHints hints) { - try { - return doDecode(image, hints); - } catch (NotFoundException const& nfe) { - // std::cerr << "trying harder" << std::endl; - bool tryHarder = hints.getTryHarder(); - if (tryHarder && image->isRotateSupported()) { - // std::cerr << "v rotate" << std::endl; - Ref rotatedImage(image->rotateCounterClockwise()); - // std::cerr << "^ rotate" << std::endl; - Ref result = doDecode(rotatedImage, hints); - // Doesn't have java metadata stuff - ArrayRef< Ref >& points (result->getResultPoints()); - if (points && !points->empty()) { - int height = rotatedImage->getHeight(); - for (int i = 0; i < points->size(); i++) { - points[i].reset(new OneDResultPoint(height - points[i]->getY() - 1, points[i]->getX())); - } - } - // std::cerr << "tried harder" << std::endl; - return result; - } else { - // std::cerr << "tried harder nfe" << std::endl; - throw nfe; - } - } -} - -#include - -Ref OneDReader::doDecode(Ref image, DecodeHints hints) { - int width = image->getWidth(); - int height = image->getHeight(); - Ref row(new BitArray(width)); - - int middle = height >> 1; - bool tryHarder = hints.getTryHarder(); - int rowStep = std::max(1, height >> (tryHarder ? 8 : 5)); - using namespace std; - // cerr << "rS " << rowStep << " " << height << " " << tryHarder << endl; - int maxLines; - if (tryHarder) { - maxLines = height; // Look at the whole image, not just the center - } else { - maxLines = 15; // 15 rows spaced 1/32 apart is roughly the middle half of the image - } - - for (int x = 0; x < maxLines; x++) { - - // Scanning from the middle out. Determine which row we're looking at next: - int rowStepsAboveOrBelow = (x + 1) >> 1; - bool isAbove = (x & 0x01) == 0; // i.e. is x even? - int rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); - if (false) { - std::cerr << "rN " - << rowNumber << " " - << height << " " - << middle << " " - << rowStep << " " - << isAbove << " " - << rowStepsAboveOrBelow - << std::endl; - } - if (rowNumber < 0 || rowNumber >= height) { - // Oops, if we run off the top or bottom, stop - break; - } - - // Estimate black point for this row and load it: - try { - row = image->getBlackRow(rowNumber, row); - } catch (NotFoundException const& ignored) { - (void)ignored; - continue; - } - - // While we have the image data in a BitArray, it's fairly cheap to reverse it in place to - // handle decoding upside down barcodes. - for (int attempt = 0; attempt < 2; attempt++) { - if (attempt == 1) { - row->reverse(); // reverse the row and continue - } - - // Java hints stuff missing - - try { - // Look for a barcode - // std::cerr << "rn " << rowNumber << " " << typeid(*this).name() << std::endl; - Ref result = decodeRow(rowNumber, row); - // We found our barcode - if (attempt == 1) { - // But it was upside down, so note that - // result.putMetadata(ResultMetadataType.ORIENTATION, new Integer(180)); - // And remember to flip the result points horizontally. - ArrayRef< Ref > points(result->getResultPoints()); - if (points) { - points[0] = Ref(new OneDResultPoint(width - points[0]->getX() - 1, - points[0]->getY())); - points[1] = Ref(new OneDResultPoint(width - points[1]->getX() - 1, - points[1]->getY())); - - } - } - return result; - } catch (ReaderException const& re) { - (void)re; - continue; - } - } - } - throw NotFoundException(); -} - -int OneDReader::patternMatchVariance(vector& counters, - vector const& pattern, - int maxIndividualVariance) { - return patternMatchVariance(counters, &pattern[0], maxIndividualVariance); -} - -int OneDReader::patternMatchVariance(vector& counters, - int const pattern[], - int maxIndividualVariance) { - int numCounters = counters.size(); - unsigned int total = 0; - unsigned int patternLength = 0; - for (int i = 0; i < numCounters; i++) { - total += counters[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { - // If we don't even have one pixel per unit of bar width, assume this is too small - // to reliably match, so fail: - return INT_MAX; - } - // We're going to fake floating-point math in integers. We just need to use more bits. - // Scale up patternLength so that intermediate values below like scaledCounter will have - // more "significant digits" - int unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength; - maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT; - - int totalVariance = 0; - for (int x = 0; x < numCounters; x++) { - int counter = counters[x] << INTEGER_MATH_SHIFT; - int scaledPattern = pattern[x] * unitBarWidth; - int variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { - return INT_MAX; - } - totalVariance += variance; - } - return totalVariance / total; -} - -void OneDReader::recordPattern(Ref row, - int start, - vector& counters) { - int numCounters = counters.size(); - for (int i = 0; i < numCounters; i++) { - counters[i] = 0; - } - int end = row->getSize(); - if (start >= end) { - throw NotFoundException(); - } - bool isWhite = !row->get(start); - int counterPosition = 0; - int i = start; - while (i < end) { - if (row->get(i) ^ isWhite) { // that is, exactly one is true - counters[counterPosition]++; - } else { - counterPosition++; - if (counterPosition == numCounters) { - break; - } else { - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - i++; - } - // If we read fully the last section of pixels and filled up our counters -- or filled - // the last counter but ran off the side of the image, OK. Otherwise, a problem. - if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) { - throw NotFoundException(); - } -} - -OneDReader::~OneDReader() {} diff --git a/cpp/core/src/zxing/oned/OneDReader.h b/cpp/core/src/zxing/oned/OneDReader.h deleted file mode 100644 index 6043e0a2c..000000000 --- a/cpp/core/src/zxing/oned/OneDReader.h +++ /dev/null @@ -1,81 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __ONED_READER_H__ -#define __ONED_READER_H__ - -/* - * OneDReader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -namespace oned { - -class OneDReader : public Reader { -private: - Ref doDecode(Ref image, DecodeHints hints); - -protected: - static const int INTEGER_MATH_SHIFT = 8; - - struct Range { - private: - int data[2]; - public: - Range() {} - Range(int zero, int one) { - data[0] = zero; - data[1] = one; - } - int& operator [] (int index) { - return data[index]; - } - int const& operator [] (int index) const { - return data[index]; - } - }; - - static int patternMatchVariance(std::vector& counters, - std::vector const& pattern, - int maxIndividualVariance); - static int patternMatchVariance(std::vector& counters, - int const pattern[], - int maxIndividualVariance); - -protected: - static const int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT; - -public: - - OneDReader(); - virtual Ref decode(Ref image, DecodeHints hints); - - // Implementations must not throw any exceptions. If a barcode is not found on this row, - // a empty ref should be returned e.g. return Ref(); - virtual Ref decodeRow(int rowNumber, Ref row) = 0; - - static void recordPattern(Ref row, - int start, - std::vector& counters); - virtual ~OneDReader(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/OneDResultPoint.cpp b/cpp/core/src/zxing/oned/OneDResultPoint.cpp deleted file mode 100644 index bdf7d7926..000000000 --- a/cpp/core/src/zxing/oned/OneDResultPoint.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * OneDResultPoint.cpp - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 "OneDResultPoint.h" - -namespace zxing { - namespace oned { - - OneDResultPoint::OneDResultPoint(float posX, float posY) : ResultPoint(posX,posY) { - } - } -} diff --git a/cpp/core/src/zxing/oned/OneDResultPoint.h b/cpp/core/src/zxing/oned/OneDResultPoint.h deleted file mode 100644 index 825a04e08..000000000 --- a/cpp/core/src/zxing/oned/OneDResultPoint.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __ONED_RESULT_POINT_H__ -#define __ONED_RESULT_POINT_H__ -/* - * OneDResultPoint.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - namespace oned { - - class OneDResultPoint : public ResultPoint { - - public: - OneDResultPoint(float posX, float posY); - }; - } -} - -#endif diff --git a/cpp/core/src/zxing/oned/UPCAReader.cpp b/cpp/core/src/zxing/oned/UPCAReader.cpp deleted file mode 100644 index 38ca5071c..000000000 --- a/cpp/core/src/zxing/oned/UPCAReader.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * UPCAReader.cpp - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 "UPCAReader.h" -#include - -using zxing::oned::UPCAReader; -using zxing::Ref; -using zxing::Result; - -// VC++ -using zxing::BitArray; -using zxing::BinaryBitmap; -using zxing::DecodeHints; - -UPCAReader::UPCAReader() : ean13Reader() {} - -Ref UPCAReader::decodeRow(int rowNumber, Ref row) { - return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row)); -} - -Ref UPCAReader::decodeRow(int rowNumber, - Ref row, - Range const& startGuardRange) { - return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, startGuardRange)); -} - -Ref UPCAReader::decode(Ref image, DecodeHints hints) { - return maybeReturnResult(ean13Reader.decode(image, hints)); -} - -int UPCAReader::decodeMiddle(Ref row, - Range const& startRange, - std::string& resultString) { - return ean13Reader.decodeMiddle(row, startRange, resultString); -} - -Ref UPCAReader::maybeReturnResult(Ref result) { - if (result.empty()) { - return result; - } - const std::string& text = (result->getText())->getText(); - if (text[0] == '0') { - Ref resultString(new String(text.substr(1))); - Ref res(new Result(resultString, result->getRawBytes(), result->getResultPoints(), - BarcodeFormat::UPC_A)); - return res; - } - return Ref(); -} - -zxing::BarcodeFormat UPCAReader::getBarcodeFormat(){ - return BarcodeFormat::UPC_A; -} diff --git a/cpp/core/src/zxing/oned/UPCAReader.h b/cpp/core/src/zxing/oned/UPCAReader.h deleted file mode 100644 index 00c02bf33..000000000 --- a/cpp/core/src/zxing/oned/UPCAReader.h +++ /dev/null @@ -1,50 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __UPCA_READER_H__ -#define __UPCA_READER_H__ -/* - * UPCAReader.h - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace oned { - -class UPCAReader : public UPCEANReader { - -private: - EAN13Reader ean13Reader; - static Ref maybeReturnResult(Ref result); - -public: - UPCAReader(); - - int decodeMiddle(Ref row, Range const& startRange, std::string& resultString); - - Ref decodeRow(int rowNumber, Ref row); - Ref decodeRow(int rowNumber, Ref row, Range const& startGuardRange); - Ref decode(Ref image, DecodeHints hints); - - BarcodeFormat getBarcodeFormat(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/UPCEANReader.cpp b/cpp/core/src/zxing/oned/UPCEANReader.cpp deleted file mode 100644 index 1643531c1..000000000 --- a/cpp/core/src/zxing/oned/UPCEANReader.cpp +++ /dev/null @@ -1,309 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * UPCEANReader.cpp - * ZXing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include - -using std::vector; -using std::string; - -using zxing::Ref; -using zxing::Result; -using zxing::NotFoundException; -using zxing::FormatException; -using zxing::ChecksumException; -using zxing::oned::UPCEANReader; - -// VC++ -using zxing::BitArray; -using zxing::String; - -#define LEN(v) ((int)(sizeof(v)/sizeof(v[0]))) - -namespace { - - /** - * Start/end guard pattern. - */ - const int START_END_PATTERN_[] = {1, 1, 1}; - const int START_END_PATTERN_LEN = LEN(START_END_PATTERN_); - - /** - * Pattern marking the middle of a UPC/EAN pattern, separating the two halves. - */ - const int MIDDLE_PATTERN_[] = {1, 1, 1, 1, 1}; - const int MIDDLE_PATTERN_LEN = LEN(MIDDLE_PATTERN_); - - /** - * "Odd", or "L" patterns used to encode UPC/EAN digits. - */ - const int L_PATTERNS_[][4] = { - {3, 2, 1, 1}, // 0 - {2, 2, 2, 1}, // 1 - {2, 1, 2, 2}, // 2 - {1, 4, 1, 1}, // 3 - {1, 1, 3, 2}, // 4 - {1, 2, 3, 1}, // 5 - {1, 1, 1, 4}, // 6 - {1, 3, 1, 2}, // 7 - {1, 2, 1, 3}, // 8 - {3, 1, 1, 2} // 9 - }; - const int L_PATTERNS_LEN = LEN(L_PATTERNS_); - - /** - * As above but also including the "even", or "G" patterns used to encode UPC/EAN digits. - */ - const int L_AND_G_PATTERNS_[][4] = { - {3, 2, 1, 1}, // 0 - {2, 2, 2, 1}, // 1 - {2, 1, 2, 2}, // 2 - {1, 4, 1, 1}, // 3 - {1, 1, 3, 2}, // 4 - {1, 2, 3, 1}, // 5 - {1, 1, 1, 4}, // 6 - {1, 3, 1, 2}, // 7 - {1, 2, 1, 3}, // 8 - {3, 1, 1, 2}, // 9 - {1, 1, 2, 3}, // 10 reversed 0 - {1, 2, 2, 2}, // 11 reversed 1 - {2, 2, 1, 2}, // 12 reversed 2 - {1, 1, 4, 1}, // 13 reversed 3 - {2, 3, 1, 1}, // 14 reversed 4 - {1, 3, 2, 1}, // 15 reversed 5 - {4, 1, 1, 1}, // 16 reversed 6 - {2, 1, 3, 1}, // 17 reversed 7 - {3, 1, 2, 1}, // 18 reversed 8 - {2, 1, 1, 3} // 19 reversed 9 - }; - const int L_AND_G_PATTERNS_LEN = LEN(L_AND_G_PATTERNS_); -} - -const int UPCEANReader::MAX_AVG_VARIANCE = (int)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.48f); -const int UPCEANReader::MAX_INDIVIDUAL_VARIANCE = (int)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.7f); - -#define VECTOR_INIT(v) v, v + sizeof(v)/sizeof(v[0]) - -const vector -UPCEANReader::START_END_PATTERN (VECTOR_INIT(START_END_PATTERN_)); - -const vector -UPCEANReader::MIDDLE_PATTERN (VECTOR_INIT(MIDDLE_PATTERN_)); -const vector -UPCEANReader::L_PATTERNS (VECTOR_INIT(L_PATTERNS_)); -const vector -UPCEANReader::L_AND_G_PATTERNS (VECTOR_INIT(L_AND_G_PATTERNS_)); - -UPCEANReader::UPCEANReader() {} - -Ref UPCEANReader::decodeRow(int rowNumber, Ref row) { - return decodeRow(rowNumber, row, findStartGuardPattern(row)); -} - -Ref UPCEANReader::decodeRow(int rowNumber, - Ref row, - Range const& startGuardRange) { - string& result = decodeRowStringBuffer; - result.clear(); - int endStart = decodeMiddle(row, startGuardRange, result); - - Range endRange = decodeEnd(row, endStart); - - // Make sure there is a quiet zone at least as big as the end pattern after the barcode. - // The spec might want more whitespace, but in practice this is the maximum we can count on. - - int end = endRange[1]; - int quietEnd = end + (end - endRange[0]); - if (quietEnd >= row->getSize() || !row->isRange(end, quietEnd, false)) { - throw NotFoundException(); - } - - // UPC/EAN should never be less than 8 chars anyway - if (result.length() < 8) { - throw FormatException(); - } - - Ref resultString (new String(result)); - if (!checkChecksum(resultString)) { - throw ChecksumException(); - } - - float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f; - float right = (float) (endRange[1] + endRange[0]) / 2.0f; - BarcodeFormat format = getBarcodeFormat(); - ArrayRef< Ref > resultPoints(2); - resultPoints[0] = Ref(new OneDResultPoint(left, (float) rowNumber)); - resultPoints[1] = Ref(new OneDResultPoint(right, (float) rowNumber)); - Ref decodeResult (new Result(resultString, ArrayRef(), resultPoints, format)); - // Java extension and man stuff - return decodeResult; -} - -UPCEANReader::Range UPCEANReader::findStartGuardPattern(Ref row) { - bool foundStart = false; - Range startRange; - int nextStart = 0; - vector counters(START_END_PATTERN.size(), 0); - // std::cerr << "fsgp " << *row << std::endl; - while (!foundStart) { - for(int i=0; i < (int)START_END_PATTERN.size(); ++i) { - counters[i] = 0; - } - startRange = findGuardPattern(row, nextStart, false, START_END_PATTERN, counters); - // std::cerr << "sr " << startRange[0] << " " << startRange[1] << std::endl; - int start = startRange[0]; - nextStart = startRange[1]; - // Make sure there is a quiet zone at least as big as the start pattern before the barcode. - // If this check would run off the left edge of the image, do not accept this barcode, - // as it is very likely to be a false positive. - int quietStart = start - (nextStart - start); - if (quietStart >= 0) { - foundStart = row->isRange(quietStart, start, false); - } - } - return startRange; -} - -UPCEANReader::Range UPCEANReader::findGuardPattern(Ref row, - int rowOffset, - bool whiteFirst, - vector const& pattern) { - vector counters (pattern.size(), 0); - return findGuardPattern(row, rowOffset, whiteFirst, pattern, counters); -} - -UPCEANReader::Range UPCEANReader::findGuardPattern(Ref row, - int rowOffset, - bool whiteFirst, - vector const& pattern, - vector& counters) { - // cerr << "fGP " << rowOffset << " " << whiteFirst << endl; - if (false) { - for(int i=0; i < (int)pattern.size(); ++i) { - std::cerr << pattern[i]; - } - std::cerr << std::endl; - } - int patternLength = pattern.size(); - int width = row->getSize(); - bool isWhite = whiteFirst; - rowOffset = whiteFirst ? row->getNextUnset(rowOffset) : row->getNextSet(rowOffset); - int counterPosition = 0; - int patternStart = rowOffset; - for (int x = rowOffset; x < width; x++) { - // std::cerr << "rg " << x << " " << row->get(x) << std::endl; - if (row->get(x) ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - return Range(patternStart, x); - } - patternStart += counters[0] + counters[1]; - for (int y = 2; y < patternLength; y++) { - counters[y - 2] = counters[y]; - } - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - throw NotFoundException(); -} - -UPCEANReader::Range UPCEANReader::decodeEnd(Ref row, int endStart) { - return findGuardPattern(row, endStart, false, START_END_PATTERN); -} - -int UPCEANReader::decodeDigit(Ref row, - vector & counters, - int rowOffset, - vector const& patterns) { - recordPattern(row, rowOffset, counters); - int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept - int bestMatch = -1; - int max = patterns.size(); - for (int i = 0; i < max; i++) { - int const* pattern (patterns[i]); - int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE); - if (variance < bestVariance) { - bestVariance = variance; - bestMatch = i; - } - } - if (bestMatch >= 0) { - return bestMatch; - } else { - throw NotFoundException(); - } -} - -/** - * @return {@link #checkStandardUPCEANChecksum(String)} - */ -bool UPCEANReader::checkChecksum(Ref const& s) { - return checkStandardUPCEANChecksum(s); -} - -/** - * Computes the UPC/EAN checksum on a string of digits, and reports - * whether the checksum is correct or not. - * - * @param s string of digits to check - * @return true iff string of digits passes the UPC/EAN checksum algorithm - */ -bool UPCEANReader::checkStandardUPCEANChecksum(Ref const& s_) { - std::string const& s (s_->getText()); - int length = s.length(); - if (length == 0) { - return false; - } - - int sum = 0; - for (int i = length - 2; i >= 0; i -= 2) { - int digit = (int) s[i] - (int) '0'; - if (digit < 0 || digit > 9) { - return false; - } - sum += digit; - } - sum *= 3; - for (int i = length - 1; i >= 0; i -= 2) { - int digit = (int) s[i] - (int) '0'; - if (digit < 0 || digit > 9) { - return false; - } - sum += digit; - } - return sum % 10 == 0; -} - -UPCEANReader::~UPCEANReader() { -} diff --git a/cpp/core/src/zxing/oned/UPCEANReader.h b/cpp/core/src/zxing/oned/UPCEANReader.h deleted file mode 100644 index 6603739e9..000000000 --- a/cpp/core/src/zxing/oned/UPCEANReader.h +++ /dev/null @@ -1,88 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __UPC_EAN_READER_H__ -#define __UPC_EAN_READER_H__ - -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace oned { - -class UPCEANReader : public OneDReader { - private: - std::string decodeRowStringBuffer; - // UPCEANExtensionSupport extensionReader; - // EANManufacturerOrgSupport eanManSupport; - - static const int MAX_AVG_VARIANCE; - static const int MAX_INDIVIDUAL_VARIANCE; - - static Range findStartGuardPattern(Ref row); - - virtual Range decodeEnd(Ref row, int endStart); - - static bool checkStandardUPCEANChecksum(Ref const& s); - - static Range findGuardPattern(Ref row, - int rowOffset, - bool whiteFirst, - std::vector const& pattern, - std::vector& counters); - - -protected: - static const std::vector START_END_PATTERN; - static const std::vector MIDDLE_PATTERN; - - static const std::vector L_PATTERNS; - static const std::vector L_AND_G_PATTERNS; - - static Range findGuardPattern(Ref row, - int rowOffset, - bool whiteFirst, - std::vector const& pattern); - -public: - UPCEANReader(); - - virtual int decodeMiddle(Ref row, - Range const& startRange, - std::string& resultString) = 0; - - virtual Ref decodeRow(int rowNumber, Ref row); - virtual Ref decodeRow(int rowNumber, Ref row, Range const& range); - - static int decodeDigit(Ref row, - std::vector& counters, - int rowOffset, - std::vector const& patterns); - - virtual bool checkChecksum(Ref const& s); - - virtual BarcodeFormat getBarcodeFormat() = 0; - virtual ~UPCEANReader(); - - friend class MultiFormatUPCEANReader; -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/oned/UPCEReader.cpp b/cpp/core/src/zxing/oned/UPCEReader.cpp deleted file mode 100644 index 13f089123..000000000 --- a/cpp/core/src/zxing/oned/UPCEReader.cpp +++ /dev/null @@ -1,146 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -using std::string; -using std::vector; -using zxing::Ref; -using zxing::String; -using zxing::oned::UPCEReader; - -// VC++ -using zxing::BitArray; - -#define VECTOR_INIT(v) v, v + sizeof(v)/sizeof(v[0]) - -namespace { - /** - * The pattern that marks the middle, and end, of a UPC-E pattern. - * There is no "second half" to a UPC-E barcode. - */ - const int MIDDLE_END_PATTERN_[6] = {1, 1, 1, 1, 1, 1}; - const vector MIDDLE_END_PATTERN (VECTOR_INIT(MIDDLE_END_PATTERN_)); - - - /** - * See {@link #L_AND_G_PATTERNS}; these values similarly represent patterns of - * even-odd parity encodings of digits that imply both the number system (0 or 1) - * used, and the check digit. - */ - const int NUMSYS_AND_CHECK_DIGIT_PATTERNS[2][10] = { - {0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25}, - {0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A} - }; -} - -UPCEReader::UPCEReader() { -} - -int UPCEReader::decodeMiddle(Ref row, Range const& startRange, string& result) { - vector& counters (decodeMiddleCounters); - counters.clear(); - counters.resize(4); - int end = row->getSize(); - int rowOffset = startRange[1]; - - int lgPatternFound = 0; - - for (int x = 0; x < 6 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, rowOffset, L_AND_G_PATTERNS); - result.append(1, (char) ('0' + bestMatch % 10)); - for (int i = 0, e = counters.size(); i < e; i++) { - rowOffset += counters[i]; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (5 - x); - } - } - - determineNumSysAndCheckDigit(result, lgPatternFound); - - return rowOffset; -} - -UPCEReader::Range UPCEReader::decodeEnd(Ref row, int endStart) { - return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN); -} - -bool UPCEReader::checkChecksum(Ref const& s){ - return UPCEANReader::checkChecksum(convertUPCEtoUPCA(s)); -} - - -bool UPCEReader::determineNumSysAndCheckDigit(std::string& resultString, int lgPatternFound) { - for (int numSys = 0; numSys <= 1; numSys++) { - for (int d = 0; d < 10; d++) { - if (lgPatternFound == NUMSYS_AND_CHECK_DIGIT_PATTERNS[numSys][d]) { - resultString.insert(0, 1, (char) ('0' + numSys)); - resultString.append(1, (char) ('0' + d)); - return true; - } - } - } - return false; -} - -/** - * Expands a UPC-E value back into its full, equivalent UPC-A code value. - * - * @param upce UPC-E code as string of digits - * @return equivalent UPC-A code as string of digits - */ -Ref UPCEReader::convertUPCEtoUPCA(Ref const& upce_) { - string const& upce(upce_->getText()); - string result; - result.append(1, upce[0]); - char lastChar = upce[6]; - switch (lastChar) { - case '0': - case '1': - case '2': - result.append(upce.substr(1,2)); - result.append(1, lastChar); - result.append("0000"); - result.append(upce.substr(3,3)); - break; - case '3': - result.append(upce.substr(1,3)); - result.append("00000"); - result.append(upce.substr(4,2)); - break; - case '4': - result.append(upce.substr(1,4)); - result.append("00000"); - result.append(1, upce[5]); - break; - default: - result.append(upce.substr(1,5)); - result.append("0000"); - result.append(1, lastChar); - break; - } - result.append(1, upce[7]); - return Ref(new String(result)); -} - - -zxing::BarcodeFormat UPCEReader::getBarcodeFormat() { - return BarcodeFormat::UPC_E; -} diff --git a/cpp/core/src/zxing/oned/UPCEReader.h b/cpp/core/src/zxing/oned/UPCEReader.h deleted file mode 100644 index 9578f0e94..000000000 --- a/cpp/core/src/zxing/oned/UPCEReader.h +++ /dev/null @@ -1,47 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __UPC_E_READER_H__ -#define __UPC_E_READER_H__ - -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace oned { - -class UPCEReader : public UPCEANReader { -private: - std::vector decodeMiddleCounters; - static bool determineNumSysAndCheckDigit(std::string& resultString, int lgPatternFound); - -protected: - Range decodeEnd(Ref row, int endStart); - bool checkChecksum(Ref const& s); -public: - UPCEReader(); - - int decodeMiddle(Ref row, Range const& startRange, std::string& resultString); - static Ref convertUPCEtoUPCA(Ref const& upce); - - BarcodeFormat getBarcodeFormat(); -}; - -} -} - -#endif diff --git a/cpp/core/src/zxing/pdf417/PDF417Reader.cpp b/cpp/core/src/zxing/pdf417/PDF417Reader.cpp deleted file mode 100644 index 4411c1094..000000000 --- a/cpp/core/src/zxing/pdf417/PDF417Reader.cpp +++ /dev/null @@ -1,170 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -using zxing::Ref; -using zxing::Result; -using zxing::BitMatrix; -using zxing::pdf417::PDF417Reader; -using zxing::pdf417::detector::Detector; - -// VC++ -using zxing::ArrayRef; -using zxing::BinaryBitmap; -using zxing::DecodeHints; - -Ref PDF417Reader::decode(Ref image, DecodeHints hints) { - Ref decoderResult; - /* 2012-05-30 hfn C++ DecodeHintType does not yet know a type "PURE_BARCODE", */ - /* therefore skip this for now, todo: may be add this type later */ - /* - if (!hints.isEmpty() && hints.containsKey(DecodeHintType.PURE_BARCODE)) { - BitMatrix bits = extractPureBits(image.getBlackMatrix()); - decoderResult = decoder.decode(bits); - points = NO_POINTS; - } else { - */ - Detector detector(image); - Ref detectorResult = detector.detect(hints); /* 2012-09-17 hints ("try_harder") */ - ArrayRef< Ref > points(detectorResult->getPoints()); - - if (!hints.isEmpty()) { - Ref rpcb = hints.getResultPointCallback(); - /* .get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); */ - if (rpcb != NULL) { - for (int i = 0; i < points->size(); i++) { - rpcb->foundPossibleResultPoint(*points[i]); - } - } - } - decoderResult = decoder.decode(detectorResult->getBits(),hints); - /* - } - */ - Ref r(new Result(decoderResult->getText(), decoderResult->getRawBytes(), points, - BarcodeFormat::PDF_417)); - return r; -} - -void PDF417Reader::reset() { - // do nothing -} - -Ref PDF417Reader::extractPureBits(Ref image) { - ArrayRef leftTopBlack = image->getTopLeftOnBit(); - ArrayRef rightBottomBlack = image->getBottomRightOnBit(); - /* see BitMatrix::getTopLeftOnBit etc.: - if (leftTopBlack == null || rightBottomBlack == null) { - throw NotFoundException.getNotFoundInstance(); - } */ - - int nModuleSize = moduleSize(leftTopBlack, image); - - int top = leftTopBlack[1]; - int bottom = rightBottomBlack[1]; - int left = findPatternStart(leftTopBlack[0], top, image); - int right = findPatternEnd(leftTopBlack[0], top, image); - - int matrixWidth = (right - left + 1) / nModuleSize; - int matrixHeight = (bottom - top + 1) / nModuleSize; - if (matrixWidth <= 0 || matrixHeight <= 0) { - throw NotFoundException("PDF417Reader::extractPureBits: no matrix found!"); - } - - // Push in the "border" by half the module width so that we start - // sampling in the middle of the module. Just in case the image is a - // little off, this will help recover. - int nudge = nModuleSize >> 1; - top += nudge; - left += nudge; - - // Now just read off the bits - Ref bits(new BitMatrix(matrixWidth, matrixHeight)); - for (int y = 0; y < matrixHeight; y++) { - int iOffset = top + y * nModuleSize; - for (int x = 0; x < matrixWidth; x++) { - if (image->get(left + x * nModuleSize, iOffset)) { - bits->set(x, y); - } - } - } - return bits; -} - -int PDF417Reader::moduleSize(ArrayRef leftTopBlack, Ref image) { - int x = leftTopBlack[0]; - int y = leftTopBlack[1]; - int width = image->getWidth(); - while (x < width && image->get(x, y)) { - x++; - } - if (x == width) { - throw NotFoundException("PDF417Reader::moduleSize: not found!"); - } - - int moduleSize = (int)(((unsigned)(x - leftTopBlack[0])) >> 3); // We've crossed left first bar, which is 8x - if (moduleSize == 0) { - throw NotFoundException("PDF417Reader::moduleSize: is zero!"); - } - - return moduleSize; -} - -int PDF417Reader::findPatternStart(int x, int y, Ref image) { - int width = image->getWidth(); - int start = x; - // start should be on black - int transitions = 0; - bool black = true; - while (start < width - 1 && transitions < 8) { - start++; - bool newBlack = image->get(start, y); - if (black != newBlack) { - transitions++; - } - black = newBlack; - } - if (start == width - 1) { - throw NotFoundException("PDF417Reader::findPatternStart: no pattern start found!"); - } - return start; -} - -int PDF417Reader::findPatternEnd(int x, int y, Ref image) { - int width = image->getWidth(); - int end = width - 1; - // end should be on black - while (end > x && !image->get(end, y)) { - end--; - } - int transitions = 0; - bool black = true; - while (end > x && transitions < 9) { - end--; - bool newBlack = image->get(end, y); - if (black != newBlack) { - transitions++; - } - black = newBlack; - } - if (end == x) { - throw NotFoundException("PDF417Reader::findPatternEnd: no pattern end found!"); - } - return end; -} diff --git a/cpp/core/src/zxing/pdf417/PDF417Reader.h b/cpp/core/src/zxing/pdf417/PDF417Reader.h deleted file mode 100644 index 73636ba27..000000000 --- a/cpp/core/src/zxing/pdf417/PDF417Reader.h +++ /dev/null @@ -1,49 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __PDF417_READER_H__ -#define __PDF417_READER_H__ - -/* - * PDF417Reader.h - * zxing - * - * Copyright 2010,2012 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace pdf417 { - - -class PDF417Reader : public Reader { - private: - decoder::Decoder decoder; - - static Ref extractPureBits(Ref image); - static int moduleSize(ArrayRef leftTopBlack, Ref image); - static int findPatternStart(int x, int y, Ref image); - static int findPatternEnd(int x, int y, Ref image); - - public: - Ref decode(Ref image, DecodeHints hints); - void reset(); -}; - -} -} - -#endif // __PDF417_READER_H__ diff --git a/cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp b/cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp deleted file mode 100644 index b8c396cef..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp +++ /dev/null @@ -1,997 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2008-2012 ZXing authors All rights reserved. - * - * 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. - * - * Modified by Hartmut Neubauer (HFN) - * - * 2012-06-27 HFN plausibility checks of outer columns and modulus-3 conditions - * of rows added. - * 2012-09-?? HFN because the Detector now counts the rows, there is no more - * need to check the equality of consecutive rows. All rows are - * parsed now. - */ - -#include - -using zxing::pdf417::decoder::BitMatrixParser; -using zxing::ArrayRef; - -// VC++ - -using zxing::Ref; -using zxing::BitMatrix; - -const int BitMatrixParser::MAX_ROWS = 90; -// Maximum Codewords (Data + Error) -const int BitMatrixParser::MAX_CW_CAPACITY = 929; -const int BitMatrixParser::MODULES_IN_SYMBOL = 17; - -BitMatrixParser::BitMatrixParser(Ref bitMatrix) - : bitMatrix_(bitMatrix) -{ - rows_ = 0; - leftColumnECData_ = 0; - rightColumnECData_ = 0; - for (int i = 0; i < 3; i++) { - aLeftColumnTriple_[i]=0; - aRightColumnTriple_[i]=0; - } - eraseCount_ = 0; - ecLevel_ = -1; -} - -/** - * To ensure separability of rows, codewords of consecutive rows belong to - * different subsets of all possible codewords. This routine scans the - * symbols in the barcode. When it finds a number of consecutive rows which - * are the same, it assumes that this is a row of codewords and processes - * them into a codeword array. - * - * 2012-09-12 HFN: Because now, at an earlier stage, the Detector has counted - * the rows, now it is no more necessary to check the equality of consecutive - * rows. We now have to check every row. - * - * @return an array of codewords. - * @throw FormatException for example if number of rows is too big or something - * with row processing is bad - */ -ArrayRef BitMatrixParser::readCodewords() -{ - //int width = bitMatrix_->getWidth(); - int height = bitMatrix_->getHeight(); - - erasures_ = new Array(MAX_CW_CAPACITY); - - ArrayRef codewords (new Array(MAX_CW_CAPACITY)); - int next = 0; - int rowNumber = 0; - for (int i = 0; i < height; i++) { - if (rowNumber >= MAX_ROWS) { - // Something is wrong, since we have exceeded - // the maximum rows in the specification. - throw FormatException("BitMatrixParser::readCodewords(PDF): Too many rows!"); - } - // Process Row - next = processRow(rowNumber, codewords, next); - rowNumber++; - } - erasures_ = trimArray(erasures_, eraseCount_); - return trimArray(codewords, next); -} - -/** - * Convert the symbols in the row to codewords. - * Each PDF417 symbol character consists of four bar elements and four space - * elements, each of which can be one to six modules wide. The four bar and - * four space elements shall measure 17 modules in total. - * - * @param rowNumber the current row number of codewords. - * @param codewords the codeword array to save codewords into. - * @param next the next available index into the codewords array. - * @return the next available index into the codeword array after processing - * this row. - */ -int BitMatrixParser::processRow(int rowNumber, ArrayRef codewords, int next) { - int width = bitMatrix_->getWidth(); - int columnNumber = 0; - int cwClusterNumber = -1; - int64_t symbol = 0; - for (int i = 0; i < width; i += MODULES_IN_SYMBOL) { - for (int mask = MODULES_IN_SYMBOL - 1; mask >= 0; mask--) { - if (bitMatrix_->get(i + (MODULES_IN_SYMBOL - 1 - mask), rowNumber)) { - symbol |= int64_t(1) << mask; - } - } - if (columnNumber > 0) { - cwClusterNumber = -1; - int cw = getCodeword(symbol,&cwClusterNumber); - - // 2012-06-27 HFN: cwClusterNumber should be the modulus of the row number by 3; otherwise, - // handle the codeword as erasure: - if ((cwClusterNumber >= 0) && (cwClusterNumber != rowNumber % 3)) { - cw = -1; - } - - if (cw < 0 && i < width - MODULES_IN_SYMBOL) { - // Skip errors on the Right row indicator column - if (eraseCount_ >= (int)erasures_->size()) { - throw FormatException("BitMatrixParser::processRow(PDF417): eraseCount too big!"); - } - erasures_[eraseCount_] = next; - next++; - eraseCount_++; - } else { - if (next >= codewords->size()) { - throw FormatException("BitMatrixParser::processRow(PDF417): codewords index out of bound."); - } - codewords[next++] = cw; - } - } else { - // Left row indicator column - cwClusterNumber = -1; - int cw = getCodeword(symbol,&cwClusterNumber); - aLeftColumnTriple_[rowNumber % 3] = cw; /* added 2012-06-22 hfn */ - if (ecLevel_ < 0 && rowNumber % 3 == 1) { - leftColumnECData_ = cw; - } - } - symbol = 0; - columnNumber++; - } - if (columnNumber > 1) { - // Right row indicator column is in codeword[next] - // Overwrite the last codeword i.e. Right Row Indicator - --next; - aRightColumnTriple_[rowNumber % 3] = codewords[next]; /* added 2012-06-22 hfn */ - if (rowNumber % 3 == 2) { - if (ecLevel_ < 0) { - rightColumnECData_ = codewords[next]; - if (rightColumnECData_ == leftColumnECData_ && (int)leftColumnECData_ > 0) { /* leftColumnECData_ != 0 */ - ecLevel_ = ((rightColumnECData_ % 30) - rows_ % 3) / 3; - } - } - // 2012-06-22 hfn: verify whether outer columns are still okay: - if (!VerifyOuterColumns(rowNumber)) { - throw FormatException("BitMatrixParser::processRow(PDF417): outer columns corrupted!"); - } - } - codewords[next] = 0; - } - return next; -} - -/* Static methods. */ - -/** - * Trim the array to the required size. - * - * @param array the array - * @param size the size to trim it to - * @return the new trimmed array - */ -ArrayRef BitMatrixParser::trimArray(ArrayRef array, int size) -{ - if (size < 0) { - throw IllegalArgumentException("BitMatrixParser::trimArray: negative size!"); - } - // 2012-10-12 hfn don't throw "NoErrorException" when size == 0 - ArrayRef a = new Array(size); - for (int i = 0; i < size; i++) { - a[i] = array[i]; - } - return a; -} - -/** - * Translate the symbol into a codeword. - * - * @param symbol - * @return the codeword corresponding to the symbol. - */ - -/** - * 2012-06-27 hfn With the second argument, it is possible to verify in which of the three - * "blocks" of the codeword table the codeword has been found: 0, 1 or 2. - */ -int BitMatrixParser::getCodeword(int64_t symbol, int *pi) -{ - int64_t sym = symbol & 0x3FFFF; - int i = findCodewordIndex(sym); - if (i == -1) { - return -1; - } else { - int cw = CODEWORD_TABLE[i] - 1; - if (pi!= NULL) { - *pi = cw / 929; - } - cw %= 929; - return cw; - } -} - -/** - * Use a binary search to find the index of the codeword corresponding to - * this symbol. - * - * @param symbol the symbol from the barcode. - * @return the index into the codeword table. - */ -int BitMatrixParser::findCodewordIndex(int64_t symbol) -{ - int first = 0; - int upto = SYMBOL_TABLE_LENGTH; - while (first < upto) { - int mid = ((unsigned int)(first + upto)) >> 1; // Compute mid point. - if (symbol < SYMBOL_TABLE[mid]) { - upto = mid; // repeat search in bottom half. - } else if (symbol > SYMBOL_TABLE[mid]) { - first = mid + 1; // Repeat search in top half. - } else { - return mid; // Found it. return position - } - } - return -1; -} - -/* - * 2012-06-22 hfn additional verification of outer columns - */ -bool BitMatrixParser::VerifyOuterColumns(int rownumber) -{ - return IsEqual(aLeftColumnTriple_[0], aRightColumnTriple_[1], rownumber) - && IsEqual(aLeftColumnTriple_[1], aRightColumnTriple_[2], rownumber) - && IsEqual(aLeftColumnTriple_[2], aRightColumnTriple_[0], rownumber); -} - -/* - * Verifies whether two codewords are equal or at least one of the codewords has not - * been recognized. - */ -bool BitMatrixParser::IsEqual(int &a, int &b, int rownumber) -{ - int ret = (a == b) || (a == -1) || (b == -1); - if (!ret) { - int row3 = rownumber / 3; - int row30 = row3 * 30; - int row59 = row30 + 29; - if (a < row30 || a > row59) { - a = -1; - } - if (b < row30 || b > row59) { - b = -1; - } - } - return true; -} - -const int BitMatrixParser::SYMBOL_TABLE[] = -{ - 0x1025e, 0x1027a, 0x1029e, - 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, - 0x103a6, 0x103ac, 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, - 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, - 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, - 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, 0x10520, 0x1053c, - 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, - 0x105ce, 0x105dc, 0x105e2, 0x105e4, 0x105e8, 0x105f6, 0x1062e, - 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, - 0x10716, 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, - 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, 0x10822, - 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, - 0x1087a, 0x10882, 0x10884, 0x10890, 0x1089e, 0x108a0, 0x108bc, - 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, - 0x10908, 0x1091e, 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, - 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, - 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, - 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, 0x10b18, 0x10b30, - 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, - 0x10bc4, 0x10bc8, 0x10bd0, 0x10bde, 0x10be6, 0x10bec, 0x10c2e, - 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, - 0x10c9c, 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, - 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, 0x10d70, - 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, - 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, 0x10dee, 0x10df2, 0x10df4, - 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, - 0x10e8c, 0x10e98, 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, - 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, - 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, - 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, 0x1105e, 0x1107a, - 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, - 0x110cc, 0x110d8, 0x110ee, 0x110f2, 0x110f4, 0x11102, 0x1111e, - 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, - 0x111be, 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, - 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, 0x11330, - 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, - 0x113c8, 0x113d0, 0x113de, 0x113e6, 0x113ec, 0x11408, 0x11410, - 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, - 0x1160c, 0x11618, 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, - 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, - 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, - 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, 0x1185c, 0x11862, - 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, - 0x118c8, 0x118d0, 0x118de, 0x118e6, 0x118ec, 0x118fa, 0x1190e, - 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, - 0x1199e, 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, - 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, 0x11a7e, - 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, - 0x11b40, 0x11b78, 0x11b8c, 0x11b98, 0x11bb0, 0x11bbe, 0x11bce, - 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, - 0x11c2c, 0x11c46, 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, - 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, - 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, - 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, 0x11dc8, 0x11dd0, - 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, - 0x11e22, 0x11e24, 0x11e28, 0x11e36, 0x11e42, 0x11e44, 0x11e50, - 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, - 0x11e9e, 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, - 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, 0x11f62, - 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, - 0x12090, 0x1209e, 0x120a0, 0x120bc, 0x120d8, 0x120f2, 0x120f4, - 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, - 0x12198, 0x121b0, 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, - 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, - 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, - 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, 0x123ec, 0x1241e, - 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, - 0x1267c, 0x126c0, 0x126f8, 0x12738, 0x12770, 0x1277e, 0x12782, - 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, - 0x127d8, 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, - 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, 0x12c7c, - 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, - 0x12ee0, 0x12efc, 0x12f04, 0x12f08, 0x12f10, 0x12f20, 0x12f3c, - 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, - 0x12fce, 0x12fdc, 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, - 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, - 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, - 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, 0x131c6, 0x131cc, - 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, - 0x132e0, 0x132fc, 0x13308, 0x1331e, 0x13320, 0x1333c, 0x13340, - 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, - 0x133e2, 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, - 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, 0x13608, - 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, - 0x1370c, 0x13718, 0x13730, 0x1373e, 0x13760, 0x1377c, 0x1379c, - 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, - 0x137ec, 0x13816, 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, - 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, - 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, - 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, 0x139b8, 0x139c8, - 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, - 0x13a18, 0x13a30, 0x13a3e, 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, - 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, - 0x13b9e, 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, - 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, 0x13c36, - 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, - 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, 0x13cbc, 0x13cc6, 0x13ccc, - 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, - 0x13d20, 0x13d3c, 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, - 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, - 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, - 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, 0x13eb8, 0x13ec2, - 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, - 0x13f2c, 0x13f3a, 0x13f46, 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, - 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, - 0x14110, 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, - 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, 0x14208, - 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, - 0x14306, 0x1430c, 0x14318, 0x14330, 0x1433e, 0x14360, 0x1437c, - 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, - 0x14408, 0x14410, 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, - 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, - 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, - 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, 0x147bc, 0x147c6, - 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, - 0x14878, 0x148f0, 0x149e0, 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, - 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, - 0x14ee0, 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, - 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, 0x14fb0, - 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, - 0x153c0, 0x15860, 0x1587c, 0x158c0, 0x158f8, 0x159f0, 0x15be0, - 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, - 0x15e10, 0x15e20, 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, - 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, - 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, - 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, 0x1617e, 0x16184, - 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, - 0x161d8, 0x161f2, 0x161f4, 0x1620e, 0x1621c, 0x16238, 0x16270, - 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, - 0x16320, 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, - 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, 0x163e8, - 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, - 0x164fc, 0x165c0, 0x165f8, 0x16610, 0x1661e, 0x16620, 0x1663c, - 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, - 0x1677c, 0x1678e, 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, - 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, - 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, - 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, 0x16de0, 0x16e18, - 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, - 0x16f38, 0x16f70, 0x16f7e, 0x16f84, 0x16f88, 0x16f90, 0x16f9e, - 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, - 0x17046, 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, - 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, 0x1710c, - 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, - 0x171b8, 0x171c2, 0x171c4, 0x171c8, 0x171d0, 0x171de, 0x171e6, - 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, - 0x17260, 0x1727c, 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, - 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, - 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, - 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, 0x174f8, 0x175f0, - 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, - 0x17708, 0x17710, 0x1771e, 0x17720, 0x1773c, 0x17740, 0x17778, - 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, - 0x17822, 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, - 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, 0x17888, - 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, - 0x178ee, 0x178f2, 0x178f4, 0x17902, 0x17904, 0x17908, 0x17910, - 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, - 0x17998, 0x179b0, 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, - 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, - 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, - 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, 0x17b9c, 0x17bb8, - 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, - 0x17c32, 0x17c34, 0x17c4e, 0x17c5c, 0x17c62, 0x17c64, 0x17c68, - 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, - 0x17cd0, 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, - 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, 0x17da0, - 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, - 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, 0x17e6e, 0x17e72, 0x17e74, - 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, - 0x17ee4, 0x17ee8, 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, - 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, - 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, - 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, 0x1842c, 0x1843a, - 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, - 0x184be, 0x184ce, 0x184dc, 0x184e2, 0x184e4, 0x184e8, 0x184f6, - 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, - 0x1858e, 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, - 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, 0x18622, - 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, - 0x18684, 0x18688, 0x18690, 0x1869e, 0x186a0, 0x186bc, 0x186c6, - 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, - 0x1875c, 0x18796, 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, - 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, - 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, - 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, 0x18930, 0x1893e, - 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, - 0x189de, 0x189e6, 0x189ec, 0x189fa, 0x18a18, 0x18a30, 0x18a3e, - 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, - 0x18b7e, 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, - 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, 0x18bf4, - 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, - 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, 0x18c84, 0x18c90, 0x18c9e, - 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, - 0x18d10, 0x18d1e, 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, - 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, - 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, - 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, 0x18ed0, 0x18efa, - 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, - 0x18f8a, 0x18f92, 0x18f94, 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, - 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, - 0x19086, 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, - 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, 0x19160, - 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, - 0x191de, 0x191e6, 0x191ec, 0x191fa, 0x19218, 0x1923e, 0x19260, - 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, - 0x19384, 0x19390, 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, - 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, - 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, - 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, 0x19710, 0x19720, - 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, - 0x197be, 0x197ce, 0x197dc, 0x197e2, 0x197e4, 0x197e8, 0x19822, - 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, - 0x19882, 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, - 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, 0x1993c, - 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, - 0x199e8, 0x19a08, 0x19a10, 0x19a1e, 0x19a20, 0x19a3c, 0x19a40, - 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, - 0x19bc4, 0x19bc8, 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, - 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, - 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, - 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, 0x19d88, 0x19d90, - 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, - 0x19e46, 0x19e4c, 0x19e58, 0x19e74, 0x19e86, 0x19e8c, 0x19e98, - 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, - 0x19f12, 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, - 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, 0x19fb2, - 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, - 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, 0x1a0e4, 0x1a0e8, 0x1a0f6, - 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, - 0x1a18e, 0x1a19c, 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, - 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, - 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, - 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, 0x1a3a0, 0x1a3bc, - 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, - 0x1a430, 0x1a43e, 0x1a460, 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, - 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, - 0x1a704, 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, - 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, 0x1a7ce, - 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, - 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, 0x1ac70, 0x1ac7e, 0x1ace0, - 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, - 0x1ae3c, 0x1ae40, 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, - 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, - 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, - 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, 0x1b0a0, 0x1b0bc, - 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, - 0x1b11e, 0x1b120, 0x1b13c, 0x1b140, 0x1b178, 0x1b186, 0x1b198, - 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, - 0x1b21e, 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, - 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, 0x1b3d0, - 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, - 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, 0x1b67c, 0x1b6c0, 0x1b738, - 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, - 0x1b82e, 0x1b84e, 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, - 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, - 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, - 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, 0x1ba0e, 0x1ba1c, - 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, - 0x1bb20, 0x1bb3c, 0x1bb40, 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, - 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, - 0x1bc72, 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, - 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, 0x1bd18, - 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, - 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, 0x1be12, 0x1be14, 0x1be22, - 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, - 0x1be66, 0x1be82, 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, - 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, - 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, - 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, 0x1c164, 0x1c168, - 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, - 0x1c262, 0x1c264, 0x1c268, 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, - 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, - 0x1c326, 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, - 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, 0x1c464, - 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, - 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, 0x1c4fa, 0x1c51c, 0x1c538, - 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, - 0x1c5a0, 0x1c5bc, 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, - 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, - 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, - 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, 0x1c6e4, 0x1c6e8, - 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, - 0x1c748, 0x1c750, 0x1c75e, 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, - 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, - 0x1c85c, 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, - 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, 0x1c8ec, - 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, - 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, 0x1c9c6, 0x1c9cc, 0x1c9d8, - 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, - 0x1cafc, 0x1cb02, 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, - 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, - 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, - 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, 0x1cc72, 0x1cc74, - 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, - 0x1cd06, 0x1cd0c, 0x1cd18, 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, - 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, - 0x1cdfa, 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, - 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, 0x1cea0, - 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, - 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, 0x1cf68, 0x1cf96, 0x1cfa6, - 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, - 0x1d04e, 0x1d05c, 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, - 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, - 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, - 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, 0x1d1a0, 0x1d1bc, - 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, - 0x1d238, 0x1d270, 0x1d27e, 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, - 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, - 0x1d386, 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, - 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, 0x1d4e0, - 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, - 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, 0x1d70c, 0x1d718, 0x1d730, - 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, - 0x1d7c4, 0x1d7c8, 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, - 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, - 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, - 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, 0x1d930, 0x1d93e, - 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, - 0x1d9e6, 0x1d9fa, 0x1da0c, 0x1da18, 0x1da30, 0x1da3e, 0x1da60, - 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, - 0x1db90, 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, - 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, 0x1dc7a, - 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, - 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, 0x1dd08, 0x1dd10, 0x1dd1e, - 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, - 0x1dde2, 0x1dde4, 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, - 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, - 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, - 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, 0x1df72, 0x1df74, - 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, - 0x1e092, 0x1e094, 0x1e0a2, 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, - 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, - 0x1e142, 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, - 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, 0x1e222, - 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, - 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, 0x1e284, 0x1e288, 0x1e290, - 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, - 0x1e2f4, 0x1e31a, 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, - 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, - 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, - 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, 0x1e4a0, 0x1e4bc, - 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, - 0x1e504, 0x1e508, 0x1e510, 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, - 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, - 0x1e5dc, 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, - 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, 0x1e68e, - 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, - 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, 0x1e73a, 0x1e746, 0x1e74c, - 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, - 0x1e7a8, 0x1e7b6, 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, - 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, - 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, - 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, 0x1e8ee, 0x1e8f2, - 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, - 0x1e940, 0x1e978, 0x1e986, 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, - 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, - 0x1ea08, 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, - 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, 0x1eb8e, - 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, - 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, 0x1ec32, 0x1ec34, 0x1ec4e, - 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, - 0x1ecc2, 0x1ecc4, 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, - 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, - 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, - 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, 0x1ee58, 0x1ee6e, - 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, - 0x1eece, 0x1eedc, 0x1eee2, 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, - 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, - 0x1ef5e, 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, - 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, 0x1f0d2, - 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, - 0x1f158, 0x1f16e, 0x1f172, 0x1f174, 0x1f18a, 0x1f192, 0x1f194, - 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, - 0x1f23a, 0x1f246, 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, - 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, - 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, - 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, 0x1f35e, 0x1f366, - 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, - 0x1f42c, 0x1f43a, 0x1f446, 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, - 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, - 0x1f4dc, 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, - 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, 0x1f59c, - 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, - 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, 0x1f614, 0x1f622, 0x1f624, - 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, - 0x1f666, 0x1f67a, 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, - 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, - 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, - 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, 0x1f7d2, 0x1f7d4, - 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, - 0x1f92e, 0x1f932, 0x1f934, 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, - 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, - 0x1f9d2, 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, - 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, 0x1fa9c, - 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, - 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, 0x1fb3a, 0x1fb46, 0x1fb4c, - 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, - 0x1fba2, 0x1fba4, 0x1fba8, 0x1fbb6, 0x1fbda -}; - -const int BitMatrixParser::CODEWORD_TABLE[] = -{ - 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, - 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, - 859, 2511, 873, 871, 1780, 835, 2493, 825, 2491, - 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, - 807, 2482, 806, 2480, 815, 814, 813, 812, 2484, - 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, - 2626, 2625, 2623, 2628, 1820, 2752, 2739, 2737, 2728, - 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, - 787, 781, 747, 739, 736, 2413, 754, 752, 1719, - 692, 689, 681, 2371, 678, 2369, 700, 697, 694, - 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, - 2338, 651, 646, 643, 2345, 654, 652, 1652, 1650, - 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, - 2317, 611, 610, 608, 606, 2324, 603, 2323, 615, - 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, - 2575, 2538, 2536, 905, 901, 898, 909, 2509, 2507, - 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, - 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, - 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, - 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, - 2629, 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, - 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, - 2784, 591, 588, 576, 569, 566, 2296, 1590, 537, - 534, 526, 2276, 522, 2274, 545, 542, 539, 548, - 1572, 1570, 481, 2245, 466, 2242, 462, 2239, 492, - 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, - 413, 2196, 406, 2191, 2188, 425, 419, 2202, 415, - 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, - 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, - 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, - 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, - 1411, 384, 1423, 1422, 1420, 1424, 2461, 802, 2441, - 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, - 742, 738, 2414, 756, 753, 1720, 2367, 2365, 2362, - 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, - 699, 696, 704, 1690, 1687, 2337, 2336, 2334, 2332, - 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, - 2340, 650, 648, 645, 2346, 655, 653, 1653, 1651, - 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, - 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, - 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, - 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, - 2720, 2713, 2711, 2697, 2694, 2691, 2702, 2672, 2670, - 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, - 2639, 1822, 2654, 2652, 2650, 2657, 2771, 1855, 2765, - 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, - 344, 342, 336, 2142, 332, 2140, 345, 1375, 1373, - 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, - 2132, 1354, 1352, 1349, 1356, 262, 257, 2101, 253, - 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, - 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, 202, - 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, - 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, - 1266, 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, - 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, - 2000, 172, 171, 169, 2012, 166, 2010, 1186, 1184, - 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, - 176, 1194, 1193, 2313, 2307, 2305, 592, 589, 2294, - 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, - 2267, 2264, 1547, 538, 536, 529, 2278, 525, 2275, - 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, - 2225, 1489, 478, 2247, 470, 2244, 465, 2241, 493, - 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, - 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, - 414, 412, 2197, 409, 2195, 405, 2193, 2190, 426, - 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, - 1469, 1466, 434, 1477, 1475, 2478, 2472, 2470, 2459, - 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, - 2440, 792, 789, 785, 2401, 2399, 2393, 1702, 2389, - 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, - 1721, 2358, 2357, 2355, 2353, 1661, 2350, 1660, 2347, - 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, - 683, 2372, 701, 698, 705, 1691, 1689, 2619, 2617, - 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, - 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, 2570, - 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, - 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, - 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, - 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, - 2669, 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, - 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, - 135, 133, 131, 1984, 128, 1983, 125, 1981, 138, - 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, - 107, 1973, 104, 1971, 1969, 122, 121, 119, 117, - 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, - 1116, 84, 83, 1953, 81, 1952, 78, 1950, 1948, - 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, - 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, - 100, 1090, 1089, 1087, 1091, 49, 47, 1917, 44, - 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, - 1922, 1919, 66, 64, 1931, 61, 1929, 1042, 1040, - 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, - 1043, 1050, 1049, 12, 10, 1869, 1867, 1864, 1861, - 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, - 1886, 22, 1883, 982, 980, 977, 974, 32, 30, - 991, 989, 987, 984, 34, 995, 994, 992, 2151, - 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, - 2138, 2136, 2134, 1359, 343, 341, 338, 2143, 335, - 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, - 2119, 1326, 2116, 1324, 310, 308, 305, 2131, 302, - 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, - 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, 2087, - 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, - 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, - 279, 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, - 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, - 2053, 205, 2051, 201, 2049, 2046, 2043, 220, 218, - 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, - 1259, 1257, 1254, 232, 1251, 230, 1267, 1265, 1263, - 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, - 2299, 1593, 2308, 2306, 590, 2288, 2287, 2285, 2283, - 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, - 571, 2298, 582, 581, 1592, 2263, 2262, 2260, 2258, - 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, - 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, - 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, - 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, - 480, 477, 2248, 473, 2246, 469, 2243, 490, 487, - 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, - 2469, 2468, 2466, 2464, 1730, 2473, 2471, 2453, 2452, - 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, - 805, 804, 2428, 2427, 2425, 2423, 1725, 2420, 1724, - 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, - 793, 791, 788, 795, 2388, 2386, 2384, 1697, 2381, - 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, - 2392, 1701, 2412, 2410, 2407, 751, 748, 744, 2416, - 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, - 2607, 2614, 1802, 1801, 1799, 2594, 2592, 2590, 2587, - 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, - 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, 2578, - 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, - 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, - 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, - 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, - 2624, 1818, 2726, 2776, 782, 740, 737, 1715, 686, - 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, - 1645, 1643, 1640, 1648, 602, 600, 597, 595, 2320, - 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, - 613, 1615, 1613, 2328, 926, 924, 892, 886, 899, - 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, - 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, - 2632, 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, - 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, - 463, 2240, 486, 483, 1524, 1521, 1518, 1529, 411, - 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, - 428, 1468, 1465, 2210, 366, 363, 2158, 360, 2156, - 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, - 1405, 382, 1402, 380, 1417, 1415, 1412, 1421, 2175, - 2174, 777, 774, 771, 784, 732, 725, 722, 2404, - 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, - 1684, 1681, 626, 624, 622, 2335, 620, 2333, 617, - 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, - 925, 2530, 2527, 894, 891, 888, 2501, 2499, 2496, - 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, - 2643, 2640, 2651, 2768, 2759, 2757, 2744, 2743, 2741, - 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, - 300, 296, 2126, 315, 312, 1347, 1342, 1350, 261, - 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, - 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, - 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, - 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, - 154, 1997, 150, 1995, 147, 1992, 1989, 163, 160, - 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, - 1164, 167, 1185, 1183, 1180, 1177, 174, 1190, 1188, - 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, - 573, 1588, 520, 518, 512, 2268, 508, 2265, 530, - 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, - 479, 471, 489, 1526, 1523, 1520, 397, 395, 2185, - 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, - 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, - 779, 776, 773, 2397, 2394, 2390, 734, 728, 724, - 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, - 673, 670, 667, 688, 1685, 1683, 2606, 2589, 2586, - 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, - 2532, 895, 893, 890, 2718, 2709, 2707, 2689, 2687, - 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, - 2760, 2758, 142, 141, 1139, 1138, 134, 132, 129, - 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, - 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, - 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, - 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, - 1074, 1072, 98, 1069, 96, 1084, 1082, 1079, 1088, - 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, - 1908, 60, 57, 54, 1923, 50, 1920, 1031, 1030, - 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, - 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, - 9, 1868, 7, 1865, 1862, 1859, 20, 1878, 16, - 1875, 13, 1872, 970, 968, 966, 963, 29, 960, - 26, 23, 983, 981, 978, 975, 33, 971, 31, - 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, - 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, - 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, - 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, - 244, 242, 2090, 239, 2088, 236, 2085, 2082, 260, - 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, - 2038, 186, 2036, 183, 2033, 2030, 2026, 206, 198, - 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, - 1255, 2310, 2302, 2300, 2286, 2284, 2281, 565, 563, - 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, - 521, 519, 517, 514, 2270, 511, 533, 1569, 1567, - 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, - 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, - 2467, 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, - 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, - 2382, 2379, 1695, 2375, 1693, 2396, 735, 733, 730, - 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, - 2583, 2581, 2579, 1800, 2591, 2550, 2549, 2547, 2545, - 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, - 1833, 1831, 2690, 2688, 2686, 1815, 1809, 1808, 1774, - 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, - 1674, 633, 629, 1638, 1636, 1633, 1641, 598, 1605, - 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, - 1775, 822, 820, 1757, 1755, 1584, 524, 1560, 1558, - 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, - 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, - 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, - 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, - 1712, 672, 669, 666, 682, 1678, 1675, 625, 623, - 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, - 918, 884, 880, 889, 849, 848, 847, 846, 2497, - 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, - 1365, 301, 297, 1340, 1338, 1335, 1343, 255, 251, - 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, - 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, - 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, - 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, - 157, 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, - 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, - 1562, 1559, 458, 447, 2227, 472, 1516, 1513, 1510, - 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, - 1451, 1449, 1446, 420, 1460, 2209, 769, 764, 720, - 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, - 656, 2349, 671, 1679, 1677, 2553, 922, 919, 2519, - 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, - 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, - 1127, 109, 106, 102, 1103, 1102, 1100, 1098, 116, - 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, - 1065, 1063, 90, 1060, 87, 1075, 1073, 1070, 1080, - 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, - 1018, 1016, 1014, 58, 1011, 55, 1008, 51, 1029, - 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, - 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, - 952, 949, 946, 17, 14, 969, 967, 964, 961, - 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, - 1896, 986, 1905, 1903, 350, 349, 1381, 329, 327, - 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, - 1341, 1339, 1337, 1345, 243, 240, 237, 2086, 233, - 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, - 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, - 1231, 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, - 555, 554, 552, 550, 2282, 562, 1586, 507, 506, - 504, 502, 2257, 499, 2254, 515, 1563, 1561, 445, - 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, - 475, 1517, 1515, 1512, 2447, 798, 797, 2422, 2419, - 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, - 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, 2543, - 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, - 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, - 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, - 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, - 1504, 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, - 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, - 1397, 1394, 1404, 2171, 2170, 1708, 1672, 1669, 619, - 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, - 1336, 1286, 1281, 1278, 248, 1292, 1289, 2111, 1218, - 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, - 2073, 2071, 1151, 1150, 1148, 1146, 152, 1143, 149, - 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, - 2017, 2016, 2014, 2019, 1582, 510, 1556, 1553, 452, - 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, - 1436, 1450, 2207, 765, 716, 713, 1709, 662, 660, - 657, 1673, 1671, 916, 914, 879, 878, 877, 882, - 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, - 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, - 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, - 1007, 1006, 1004, 1002, 999, 41, 996, 37, 1017, - 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, - 1938, 942, 940, 938, 935, 932, 5, 2, 955, - 953, 950, 947, 18, 943, 15, 965, 962, 958, - 1895, 1894, 1892, 1890, 973, 1899, 1897, 1379, 325, - 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, - 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, - 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, - 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, - 500, 513, 1557, 1555, 444, 442, 439, 436, 2213, - 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, - 767, 711, 710, 708, 706, 2377, 718, 715, 1710, - 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, - 1749, 1747, 1499, 1438, 1435, 2204, 1390, 1388, 1385, - 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, - 1770, 1329, 1282, 1279, 2109, 1214, 1207, 1222, 2068, - 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, - 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, 1433, - 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, - 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, - 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, - 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, - 930, 3, 951, 948, 944, 1889, 1887, 1884, 1881, - 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, - 1322, 1331, 1277, 1275, 1272, 1269, 235, 1284, 2110, - 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, - 2067, 1580, 501, 1551, 1548, 440, 437, 1497, 1494, - 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, - 1386, 2164, 2161, 1621, 1766, 2103, 1208, 2058, 2054, - 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, - 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, 1001, - 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, - 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, - 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, - 1540, 1484, 1481, 1478, 1491, 1700 -}; - -const int BitMatrixParser::SYMBOL_TABLE_LENGTH = - sizeof(BitMatrixParser::SYMBOL_TABLE) / sizeof(int); diff --git a/cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h b/cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h deleted file mode 100644 index afc080b3c..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef __BIT_MATRIX_PARSER__PDF_H__ -#define __BIT_MATRIX_PARSER__PDF_H__ - -/* - * BitMatrixParser.h / PDF417 - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -namespace zxing { -namespace pdf417 { -namespace decoder { - -class BitMatrixParser : public Counted { -private: - static const int MAX_ROWS; - // Maximum Codewords (Data + Error) - static const int MAX_CW_CAPACITY; - static const int MODULES_IN_SYMBOL; - - Ref bitMatrix_; - int rows_; /* = 0 */ - int leftColumnECData_; /* = 0 */ - int rightColumnECData_; /* = 0 */ - /* added 2012-06-22 HFN */ - int aLeftColumnTriple_[3]; - int aRightColumnTriple_[3]; - int eraseCount_; /* = 0 */ - ArrayRef erasures_; - int ecLevel_; /* = -1 */ - -public: - static const int SYMBOL_TABLE[]; - static const int SYMBOL_TABLE_LENGTH; - static const int CODEWORD_TABLE[]; - -public: - BitMatrixParser(Ref bitMatrix); - ArrayRef getErasures() const {return erasures_;} - int getECLevel() const {return ecLevel_;} - int getEraseCount() const {return eraseCount_;} - ArrayRef readCodewords(); /* throw(FormatException) */ - static int getCodeword(int64_t symbol, int *pi = NULL); - -private: - bool VerifyOuterColumns(int rownumber); - static ArrayRef trimArray(ArrayRef array, int size); - static int findCodewordIndex(int64_t symbol); - - - int processRow(int rowNumber, - ArrayRef codewords, int next); - - int processRow(ArrayRef rowCounters, int rowNumber, int rowHeight, - ArrayRef codewords, int next); /* throw(FormatException) */ -protected: - bool IsEqual(int &a, int &b, int rownumber); -}; - -} -} -} - -#endif // __BIT_MATRIX_PARSER__PDF_H__ diff --git a/cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp b/cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp deleted file mode 100644 index cb04f3c17..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp +++ /dev/null @@ -1,563 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010, 2012 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -using std::string; -using zxing::pdf417::DecodedBitStreamParser; -using zxing::ArrayRef; -using zxing::Ref; -using zxing::DecoderResult; -using zxing::String; - -const int DecodedBitStreamParser::TEXT_COMPACTION_MODE_LATCH = 900; -const int DecodedBitStreamParser::BYTE_COMPACTION_MODE_LATCH = 901; -const int DecodedBitStreamParser::NUMERIC_COMPACTION_MODE_LATCH = 902; -const int DecodedBitStreamParser::BYTE_COMPACTION_MODE_LATCH_6 = 924; -const int DecodedBitStreamParser::BEGIN_MACRO_PDF417_CONTROL_BLOCK = 928; -const int DecodedBitStreamParser::BEGIN_MACRO_PDF417_OPTIONAL_FIELD = 923; -const int DecodedBitStreamParser::MACRO_PDF417_TERMINATOR = 922; -const int DecodedBitStreamParser::MODE_SHIFT_TO_BYTE_COMPACTION_MODE = 913; -const int DecodedBitStreamParser::MAX_NUMERIC_CODEWORDS = 15; - -const int DecodedBitStreamParser::PL = 25; -const int DecodedBitStreamParser::LL = 27; -const int DecodedBitStreamParser::AS = 27; -const int DecodedBitStreamParser::ML = 28; -const int DecodedBitStreamParser::AL = 28; -const int DecodedBitStreamParser::PS = 29; -const int DecodedBitStreamParser::PAL = 29; - -const int DecodedBitStreamParser::EXP900_SIZE = 16; - -const char DecodedBitStreamParser::PUNCT_CHARS[] = { - ';', '<', '>', '@', '[', '\\', '}', '_', '`', '~', '!', - '\r', '\t', ',', ':', '\n', '-', '.', '$', '/', '"', '|', '*', - '(', ')', '?', '{', '}', '\''}; - -const char DecodedBitStreamParser::MIXED_CHARS[] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '&', - '\r', '\t', ',', ':', '#', '-', '.', '$', '/', '+', '%', '*', - '=', '^'}; - -ArrayRef DecodedBitStreamParser::initEXP900() { - ArrayRef EXP900 (16); - EXP900[0] = BigInteger(1); - BigInteger nineHundred (900); - EXP900[1] = nineHundred; - for (int i = 2; i < EXP900->size(); i++) { - EXP900[i] = EXP900[i - 1] * nineHundred; - } - return EXP900; -} - -ArrayRef DecodedBitStreamParser::EXP900 = initEXP900(); - -DecodedBitStreamParser::DecodedBitStreamParser(){} - -/** - * PDF417 main decoder. - **/ -Ref DecodedBitStreamParser::decode(ArrayRef codewords) -{ - Ref result (new String(100)); - // Get compaction mode - int codeIndex = 1; - int code = codewords[codeIndex++]; - while (codeIndex < codewords[0]) { - switch (code) { - case TEXT_COMPACTION_MODE_LATCH: - codeIndex = textCompaction(codewords, codeIndex, result); - break; - case BYTE_COMPACTION_MODE_LATCH: - codeIndex = byteCompaction(code, codewords, codeIndex, result); - break; - case NUMERIC_COMPACTION_MODE_LATCH: - codeIndex = numericCompaction(codewords, codeIndex, result); - break; - case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - codeIndex = byteCompaction(code, codewords, codeIndex, result); - break; - case BYTE_COMPACTION_MODE_LATCH_6: - codeIndex = byteCompaction(code, codewords, codeIndex, result); - break; - default: - // Default to text compaction. During testing numerous barcodes - // appeared to be missing the starting mode. In these cases defaulting - // to text compaction seems to work. - codeIndex--; - codeIndex = textCompaction(codewords, codeIndex, result); - break; - } - if (codeIndex < codewords->size()) { - code = codewords[codeIndex++]; - } else { - throw FormatException(); - } - } - return Ref(new DecoderResult(ArrayRef(), result)); -} - -/** - * Text Compaction mode (see 5.4.1.5) permits all printable ASCII characters to be - * encoded, i.e. values 32 - 126 inclusive in accordance with ISO/IEC 646 (IRV), as - * well as selected control characters. - * - * @param codewords The array of codewords (data + error) - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ -int DecodedBitStreamParser::textCompaction(ArrayRef codewords, - int codeIndex, - Ref result) { - // 2 character per codeword - ArrayRef textCompactionData (codewords[0] << 1); - // Used to hold the byte compaction value if there is a mode shift - ArrayRef byteCompactionData (codewords[0] << 1); - - int index = 0; - bool end = false; - while ((codeIndex < codewords[0]) && !end) { - int code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - textCompactionData[index] = code / 30; - textCompactionData[index + 1] = code % 30; - index += 2; - } else { - switch (code) { - case TEXT_COMPACTION_MODE_LATCH: - textCompactionData[index++] = TEXT_COMPACTION_MODE_LATCH; - break; - case BYTE_COMPACTION_MODE_LATCH: - codeIndex--; - end = true; - break; - case NUMERIC_COMPACTION_MODE_LATCH: - codeIndex--; - end = true; - break; - case MODE_SHIFT_TO_BYTE_COMPACTION_MODE: - // The Mode Shift codeword 913 shall cause a temporary - // switch from Text Compaction mode to Byte Compaction mode. - // This switch shall be in effect for only the next codeword, - // after which the mode shall revert to the prevailing sub-mode - // of the Text Compaction mode. Codeword 913 is only available - // in Text Compaction mode; its use is described in 5.4.2.4. - textCompactionData[index] = MODE_SHIFT_TO_BYTE_COMPACTION_MODE; - code = codewords[codeIndex++]; - byteCompactionData[index] = code; //Integer.toHexString(code); - index++; - break; - case BYTE_COMPACTION_MODE_LATCH_6: - codeIndex--; - end = true; - break; - } - } - } - decodeTextCompaction(textCompactionData, byteCompactionData, index, result); - return codeIndex; -} - -/** - * The Text Compaction mode includes all the printable ASCII characters - * (i.e. values from 32 to 126) and three ASCII control characters: HT or tab - * (ASCII value 9), LF or line feed (ASCII value 10), and CR or carriage - * return (ASCII value 13). The Text Compaction mode also includes various latch - * and shift characters which are used exclusively within the mode. The Text - * Compaction mode encodes up to 2 characters per codeword. The compaction rules - * for converting data into PDF417 codewords are defined in 5.4.2.2. The sub-mode - * switches are defined in 5.4.2.3. - * - * @param textCompactionData The text compaction data. - * @param byteCompactionData The byte compaction data if there - * was a mode shift. - * @param length The size of the text compaction and byte compaction data. - * @param result The decoded data is appended to the result. - */ -void DecodedBitStreamParser::decodeTextCompaction(ArrayRef textCompactionData, - ArrayRef byteCompactionData, - int length, - Ref result) -{ - // Beginning from an initial state of the Alpha sub-mode - // The default compaction mode for PDF417 in effect at the start of each symbol shall always be Text - // Compaction mode Alpha sub-mode (uppercase alphabetic). A latch codeword from another mode to the Text - // Compaction mode shall always switch to the Text Compaction Alpha sub-mode. - Mode subMode = ALPHA; - Mode priorToShiftMode = ALPHA; - int i = 0; - while (i < length) { - int subModeCh = textCompactionData[i]; - char ch = 0; - switch (subMode) { - case ALPHA: - // Alpha (uppercase alphabetic) - if (subModeCh < 26) { - // Upper case Alpha Character - ch = (char) ('A' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == LL) { - subMode = LOWER; - } else if (subModeCh == ML) { - subMode = MIXED; - } else if (subModeCh == PS) { - // Shift to punctuation - priorToShiftMode = subMode; - subMode = PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result->append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - - case LOWER: - // Lower (lowercase alphabetic) - if (subModeCh < 26) { - ch = (char) ('a' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == AS) { - // Shift to alpha - priorToShiftMode = subMode; - subMode = ALPHA_SHIFT; - } else if (subModeCh == ML) { - subMode = MIXED; - } else if (subModeCh == PS) { - // Shift to punctuation - priorToShiftMode = subMode; - subMode = PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result->append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - - case MIXED: - // Mixed (numeric and some punctuation) - if (subModeCh < PL) { - ch = MIXED_CHARS[subModeCh]; - } else { - if (subModeCh == PL) { - subMode = PUNCT; - } else if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == LL) { - subMode = LOWER; - } else if (subModeCh == AL) { - subMode = ALPHA; - } else if (subModeCh == PS) { - // Shift to punctuation - priorToShiftMode = subMode; - subMode = PUNCT_SHIFT; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result->append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - - case PUNCT: - // Punctuation - if (subModeCh < PAL) { - ch = PUNCT_CHARS[subModeCh]; - } else { - if (subModeCh == PAL) { - subMode = ALPHA; - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - result->append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - - case ALPHA_SHIFT: - // Restore sub-mode - subMode = priorToShiftMode; - if (subModeCh < 26) { - ch = (char) ('A' + subModeCh); - } else { - if (subModeCh == 26) { - ch = ' '; - } else { - if (subModeCh == 26) { - ch = ' '; - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - } - break; - - case PUNCT_SHIFT: - // Restore sub-mode - subMode = priorToShiftMode; - if (subModeCh < PAL) { - ch = PUNCT_CHARS[subModeCh]; - } else { - if (subModeCh == PAL) { - subMode = ALPHA; - // 2012-11-27 added from recent java code: - } else if (subModeCh == MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { - // PS before Shift-to-Byte is used as a padding character, - // see 5.4.2.4 of the specification - result->append((char) byteCompactionData[i]); - } else if (subModeCh == TEXT_COMPACTION_MODE_LATCH) { - subMode = ALPHA; - } - } - break; - } - if (ch != 0) { - // Append decoded character to result - result->append(ch); - } - i++; - } -} - -/** - * Byte Compaction mode (see 5.4.3) permits all 256 possible 8-bit byte values to be encoded. - * This includes all ASCII characters value 0 to 127 inclusive and provides for international - * character set support. - * - * @param mode The byte compaction mode i.e. 901 or 924 - * @param codewords The array of codewords (data + error) - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ -int DecodedBitStreamParser::byteCompaction(int mode, - ArrayRef codewords, - int codeIndex, Ref result) { - if (mode == BYTE_COMPACTION_MODE_LATCH) { - // Total number of Byte Compaction characters to be encoded - // is not a multiple of 6 - int count = 0; - int64_t value = 0; - ArrayRef decodedData = new Array(6); - ArrayRef byteCompactedCodewords = new Array(6); - bool end = false; - int nextCode = codewords[codeIndex++]; - while ((codeIndex < codewords[0]) && !end) { - byteCompactedCodewords[count++] = nextCode; - // Base 900 - value = 900 * value + nextCode; - nextCode = codewords[codeIndex++]; - // perhaps it should be ok to check only nextCode >= TEXT_COMPACTION_MODE_LATCH - if (nextCode == TEXT_COMPACTION_MODE_LATCH || - nextCode == BYTE_COMPACTION_MODE_LATCH || - nextCode == NUMERIC_COMPACTION_MODE_LATCH || - nextCode == BYTE_COMPACTION_MODE_LATCH_6 || - nextCode == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - nextCode == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - nextCode == MACRO_PDF417_TERMINATOR) - { - end = true; - } - else - { - if ((count%5 == 0) && (count > 0)) - { - // Decode every 5 codewords - // Convert to Base 256 - for (int j = 0; j < 6; ++j) - { - decodedData[5 - j] = (char) (value%256); - value >>= 8; - } - result->append(string(&(decodedData->values()[0]), decodedData->values().size())); - count = 0; - } - } - } - - // if the end of all codewords is reached the last codeword needs to be added - if (codeIndex == codewords[0] && nextCode < TEXT_COMPACTION_MODE_LATCH) - byteCompactedCodewords[count++] = nextCode; - - // If Byte Compaction mode is invoked with codeword 901, - // the last group of codewords is interpreted directly - // as one byte per codeword, without compaction. - for (int i = 0; i < count; i++) - { - result->append((char)byteCompactedCodewords[i]); - } - - } else if (mode == BYTE_COMPACTION_MODE_LATCH_6) { - // Total number of Byte Compaction characters to be encoded - // is an integer multiple of 6 - int count = 0; - int64_t value = 0; - bool end = false; - while (codeIndex < codewords[0] && !end) { - int code = codewords[codeIndex++]; - if (code < TEXT_COMPACTION_MODE_LATCH) { - count++; - // Base 900 - value = 900 * value + code; - } else { - if (code == TEXT_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH || - code == NUMERIC_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH_6 || - code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - code == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = true; - } - } - if ((count % 5 == 0) && (count > 0)) { - // Decode every 5 codewords - // Convert to Base 256 - ArrayRef decodedData = new Array(6); - for (int j = 0; j < 6; ++j) { - decodedData[5 - j] = (char) (value & 0xFF); - value >>= 8; - } - result->append(string(&decodedData[0],6)); - // 2012-11-27 hfn after recent java code/fix by srowen - count = 0; - } - } - } - return codeIndex; -} - -/** - * Numeric Compaction mode (see 5.4.4) permits efficient encoding of numeric data strings. - * - * @param codewords The array of codewords (data + error) - * @param codeIndex The current index into the codeword array. - * @param result The decoded data is appended to the result. - * @return The next index into the codeword array. - */ -int DecodedBitStreamParser::numericCompaction(ArrayRef codewords, - int codeIndex, - Ref result) { - int count = 0; - bool end = false; - - ArrayRef numericCodewords = new Array(MAX_NUMERIC_CODEWORDS); - - while (codeIndex < codewords[0] && !end) { - int code = codewords[codeIndex++]; - if (codeIndex == codewords[0]) { - end = true; - } - if (code < TEXT_COMPACTION_MODE_LATCH) { - numericCodewords[count] = code; - count++; - } else { - if (code == TEXT_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH || - code == BYTE_COMPACTION_MODE_LATCH_6 || - code == BEGIN_MACRO_PDF417_CONTROL_BLOCK || - code == BEGIN_MACRO_PDF417_OPTIONAL_FIELD || - code == MACRO_PDF417_TERMINATOR) { - codeIndex--; - end = true; - } - } - if (count % MAX_NUMERIC_CODEWORDS == 0 || - code == NUMERIC_COMPACTION_MODE_LATCH || - end) { - // Re-invoking Numeric Compaction mode (by using codeword 902 - // while in Numeric Compaction mode) serves to terminate the - // current Numeric Compaction mode grouping as described in 5.4.4.2, - // and then to start a new one grouping. - Ref s = decodeBase900toBase10(numericCodewords, count); - result->append(s->getText()); - count = 0; - } - } - return codeIndex; -} - -/** - * Convert a list of Numeric Compacted codewords from Base 900 to Base 10. - * - * @param codewords The array of codewords - * @param count The number of codewords - * @return The decoded string representing the Numeric data. - */ -/* - EXAMPLE - Encode the fifteen digit numeric string 000213298174000 - Prefix the numeric string with a 1 and set the initial value of - t = 1 000 213 298 174 000 - Calculate codeword 0 - d0 = 1 000 213 298 174 000 mod 900 = 200 - - t = 1 000 213 298 174 000 div 900 = 1 111 348 109 082 - Calculate codeword 1 - d1 = 1 111 348 109 082 mod 900 = 282 - - t = 1 111 348 109 082 div 900 = 1 234 831 232 - Calculate codeword 2 - d2 = 1 234 831 232 mod 900 = 632 - - t = 1 234 831 232 div 900 = 1 372 034 - Calculate codeword 3 - d3 = 1 372 034 mod 900 = 434 - - t = 1 372 034 div 900 = 1 524 - Calculate codeword 4 - d4 = 1 524 mod 900 = 624 - - t = 1 524 div 900 = 1 - Calculate codeword 5 - d5 = 1 mod 900 = 1 - t = 1 div 900 = 0 - Codeword sequence is: 1, 624, 434, 632, 282, 200 - - Decode the above codewords involves - 1 x 900 power of 5 + 624 x 900 power of 4 + 434 x 900 power of 3 + - 632 x 900 power of 2 + 282 x 900 power of 1 + 200 x 900 power of 0 = 1000213298174000 - - Remove leading 1 => Result is 000213298174000 -*/ -Ref DecodedBitStreamParser::decodeBase900toBase10(ArrayRef codewords, int count) -{ - BigInteger result = BigInteger(0); - for (int i = 0; i < count; i++) { - result = result + (EXP900[count - i - 1] * BigInteger(codewords[i])); - } - string resultString = bigIntegerToString(result); - if (resultString[0] != '1') { - throw FormatException("DecodedBitStreamParser::decodeBase900toBase10: String does not begin with 1"); - } - string resultString2; - resultString2.assign(resultString.begin()+1,resultString.end()); - Ref res (new String(resultString2)); - return res; -} diff --git a/cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h b/cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h deleted file mode 100644 index e9aff887c..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h +++ /dev/null @@ -1,84 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __DECODED_BIT_STREAM_PARSER_PD_H__ -#define __DECODED_BIT_STREAM_PARSER_PD_H__ - -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace pdf417 { - -class DecodedBitStreamParser { - protected: - enum Mode { - ALPHA, - LOWER, - MIXED, - PUNCT, - ALPHA_SHIFT, - PUNCT_SHIFT - }; - - private: - - static const int TEXT_COMPACTION_MODE_LATCH; - static const int BYTE_COMPACTION_MODE_LATCH; - static const int NUMERIC_COMPACTION_MODE_LATCH; - static const int BYTE_COMPACTION_MODE_LATCH_6; - static const int BEGIN_MACRO_PDF417_CONTROL_BLOCK; - static const int BEGIN_MACRO_PDF417_OPTIONAL_FIELD; - static const int MACRO_PDF417_TERMINATOR; - static const int MODE_SHIFT_TO_BYTE_COMPACTION_MODE; - static const int MAX_NUMERIC_CODEWORDS; - - static const int PL; - static const int LL; - static const int AS; - static const int ML; - static const int AL; - static const int PS; - static const int PAL; - static const int EXP900_SIZE; - - static const char PUNCT_CHARS[]; - static const char MIXED_CHARS[]; - - static ArrayRef EXP900; - static ArrayRef initEXP900(); - - static int textCompaction(ArrayRef codewords, int codeIndex, Ref result); - static void decodeTextCompaction(ArrayRef textCompactionData, - ArrayRef byteCompactionData, - int length, - Ref result); - static int byteCompaction(int mode, ArrayRef codewords, int codeIndex, Ref result); - static int numericCompaction(ArrayRef codewords, int codeIndex, Ref result); - static Ref decodeBase900toBase10(ArrayRef codewords, int count); - - public: - DecodedBitStreamParser(); - static Ref decode(ArrayRef codewords); -}; - -} /* namespace pdf417 */ -} /* namespace zxing */ - -#endif // __DECODED_BIT_STREAM_PARSER_PD_H__ diff --git a/cpp/core/src/zxing/pdf417/decoder/Decoder.cpp b/cpp/core/src/zxing/pdf417/decoder/Decoder.cpp deleted file mode 100644 index 7fb8cb0e3..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/Decoder.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010, 2012 ZXing authors All rights reserved. - * - * 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. - * - * 2012-06-27 hfn: PDF417 Reed-Solomon error correction, using following Java - * source code: - * http://code.google.com/p/zxing/issues/attachmentText?id=817&aid=8170033000&name=pdf417-java-reed-solomon-error-correction-2.patch&token=0819f5d7446ae2814fd91385eeec6a11 - */ - -#include -#include -#include -#include -#include -#include - -using zxing::pdf417::decoder::Decoder; -using zxing::pdf417::decoder::ec::ErrorCorrection; -using zxing::Ref; -using zxing::DecoderResult; - -// VC++ - -using zxing::BitMatrix; -using zxing::DecodeHints; -using zxing::ArrayRef; - -const int Decoder::MAX_ERRORS = 3; -const int Decoder::MAX_EC_CODEWORDS = 512; - -Ref Decoder::decode(Ref bits, DecodeHints const& hints) { - (void)hints; - // Construct a parser to read the data codewords and error-correction level - BitMatrixParser parser(bits); - ArrayRef codewords(parser.readCodewords()); - if (codewords->size() == 0) { - throw FormatException("PDF:Decoder:decode: cannot read codewords"); - } - - int ecLevel = parser.getECLevel(); - int numECCodewords = 1 << (ecLevel + 1); - ArrayRef erasures = parser.getErasures(); - - correctErrors(codewords, erasures, numECCodewords); - verifyCodewordCount(codewords, numECCodewords); - - // Decode the codewords - return DecodedBitStreamParser::decode(codewords); -} - -/** - * Verify that all is OK with the codeword array. - * - * @param codewords - * @return an index to the first data codeword. - * @throws FormatException - */ -void Decoder::verifyCodewordCount(ArrayRef codewords, int numECCodewords) { - int cwsize = codewords->size(); - if (cwsize < 4) { - // Codeword array size should be at least 4 allowing for - // Count CW, At least one Data CW, Error Correction CW, Error Correction CW - throw FormatException("PDF:Decoder:verifyCodewordCount: codeword array too small!"); - } - // The first codeword, the Symbol Length Descriptor, shall always encode the total number of data - // codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad - // codewords, but excluding the number of error correction codewords. - int numberOfCodewords = codewords[0]; - if (numberOfCodewords > cwsize) { - throw FormatException("PDF:Decoder:verifyCodewordCount: bad codeword number descriptor!"); - } - if (numberOfCodewords == 0) { - // Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords) - if (numECCodewords < cwsize) { - codewords[0] = cwsize - numECCodewords; - } else { - throw FormatException("PDF:Decoder:verifyCodewordCount: bad error correction cw number!"); - } - } -} - -/** - * Correct errors whenever it is possible using Reed-Solomom algorithm - * - * @param codewords, erasures, numECCodewords - * @return 0. - * @throws FormatException - */ -void Decoder::correctErrors(ArrayRef codewords, - ArrayRef erasures, int numECCodewords) { - if (erasures->size() > numECCodewords / 2 + MAX_ERRORS || - numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) { - throw FormatException("PDF:Decoder:correctErrors: Too many errors or EC Codewords corrupted"); - } - - Ref errorCorrection(new ErrorCorrection); - errorCorrection->decode(codewords, numECCodewords, erasures); - - // 2012-06-27 HFN if, despite of error correction, there are still codewords with invalid - // value, throw an exception here: - for (int i = 0; i < codewords->size(); i++) { - if (codewords[i]<0) { - throw FormatException("PDF:Decoder:correctErrors: Error correction did not succeed!"); - } - } -} diff --git a/cpp/core/src/zxing/pdf417/decoder/Decoder.h b/cpp/core/src/zxing/pdf417/decoder/Decoder.h deleted file mode 100644 index 304be874f..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/Decoder.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __DECOCER_PDF_H__ -#define __DECOCER_PDF_H__ - -/* - * Decoder.h - * zxing - * - * Created by Hartmut Neubauer, 2012-05-25 - * Copyright 2010,2012 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - - -namespace zxing { -namespace pdf417 { -namespace decoder { - -/** - *

The main class which implements PDF417 Code decoding -- as - * opposed to locating and extracting the PDF417 Code from an image.

- * - *

2012-06-27 HFN Reed-Solomon error correction activated, see class PDF417RSDecoder.

- *

2012-09-19 HFN Reed-Solomon error correction via ErrorCorrection/ModulusGF/ModulusPoly.

- */ - -class Decoder { -private: - static const int MAX_ERRORS; - static const int MAX_EC_CODEWORDS; - - void correctErrors(ArrayRef codewords, - ArrayRef erasures, int numECCodewords); - static void verifyCodewordCount(ArrayRef codewords, int numECCodewords); - -public: - - Ref decode(Ref bits, DecodeHints const &hints); -}; - -} -} -} - -#endif // __DECOCER_PDF_H__ diff --git a/cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp b/cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp deleted file mode 100644 index 2756faf24..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp +++ /dev/null @@ -1,214 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2012 ZXing authors - * - * 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. - * - * 2012-09-19 HFN translation from Java into C++ - */ - -#include -#include -#include - -using std::vector; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::pdf417::decoder::ec::ErrorCorrection; -using zxing::pdf417::decoder::ec::ModulusPoly; -using zxing::pdf417::decoder::ec::ModulusGF; - -/** - *

PDF417 error correction implementation.

- * - *

This example - * is quite useful in understanding the algorithm.

- * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.ReedSolomonDecoder - */ - - -ErrorCorrection::ErrorCorrection() - : field_(ModulusGF::PDF417_GF) -{ -} - -void ErrorCorrection::decode(ArrayRef received, - int numECCodewords, - ArrayRef erasures) -{ - Ref poly (new ModulusPoly(field_, received)); - ArrayRef S( new Array(numECCodewords)); - bool error = false; - for (int i = numECCodewords; i > 0; i--) { - int eval = poly->evaluateAt(field_.exp(i)); - S[numECCodewords - i] = eval; - if (eval != 0) { - error = true; - } - } - - if (error) { - - Ref knownErrors = field_.getOne(); - for (int i=0;isize();i++) { - int b = field_.exp(received->size() - 1 - erasures[i]); - // Add (1 - bx) term: - ArrayRef one_minus_b_x(new Array(2)); - one_minus_b_x[1]=field_.subtract(0,b); - one_minus_b_x[0]=1; - Ref term (new ModulusPoly(field_,one_minus_b_x)); - knownErrors = knownErrors->multiply(term); - } - - Ref syndrome (new ModulusPoly(field_, S)); - //syndrome = syndrome.multiply(knownErrors); - - vector > sigmaOmega ( - runEuclideanAlgorithm(field_.buildMonomial(numECCodewords, 1), syndrome, numECCodewords)); - Ref sigma = sigmaOmega[0]; - Ref omega = sigmaOmega[1]; - - //sigma = sigma.multiply(knownErrors); - - ArrayRef errorLocations = findErrorLocations(sigma); - ArrayRef errorMagnitudes = findErrorMagnitudes(omega, sigma, errorLocations); - - for (int i = 0; i < errorLocations->size(); i++) { - int position = received->size() - 1 - field_.log(errorLocations[i]); - if (position < 0) { - throw ReedSolomonException("Bad error location!"); - } - received[position] = field_.subtract(received[position], errorMagnitudes[i]); -#if (defined (DEBUG) && defined _WIN32) - { - WCHAR szmsg[256]; - swprintf(szmsg,L"ErrorCorrection::decode: fix @ %d, new value = %d\n", - position, received[position]); - OutputDebugString(szmsg); - } -#endif - } - } -} - -vector > ErrorCorrection::runEuclideanAlgorithm(Ref a, Ref b, int R) -{ - // Assume a's degree is >= b's - if (a->getDegree() < b->getDegree()) { - Ref temp = a; - a = b; - b = temp; - } - - Ref rLast ( a); - Ref r ( b); - Ref tLast ( field_.getZero()); - Ref t ( field_.getOne()); - - // Run Euclidean algorithm until r's degree is less than R/2 - while (r->getDegree() >= R / 2) { - Ref rLastLast (rLast); - Ref tLastLast (tLast); - rLast = r; - tLast = t; - - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast->isZero()) { - // Oops, Euclidean algorithm already terminated? - throw ReedSolomonException("Euclidean algorithm already terminated?"); - } - r = rLastLast; - Ref q (field_.getZero()); - int denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree()); - int dltInverse = field_.inverse(denominatorLeadingTerm); - while (r->getDegree() >= rLast->getDegree() && !r->isZero()) { - int degreeDiff = r->getDegree() - rLast->getDegree(); - int scale = field_.multiply(r->getCoefficient(r->getDegree()), dltInverse); - q = q->add(field_.buildMonomial(degreeDiff, scale)); - r = r->subtract(rLast->multiplyByMonomial(degreeDiff, scale)); - } - - t = q->multiply(tLast)->subtract(tLastLast)->negative(); - } - - int sigmaTildeAtZero = t->getCoefficient(0); - if (sigmaTildeAtZero == 0) { - throw ReedSolomonException("sigmaTilde = 0!"); - } - - int inverse = field_.inverse(sigmaTildeAtZero); - Ref sigma (t->multiply(inverse)); - Ref omega (r->multiply(inverse)); - vector > v(2); - v[0] = sigma; - v[1] = omega; - return v; -} - -ArrayRef ErrorCorrection::findErrorLocations(Ref errorLocator) { - // This is a direct application of Chien's search - int numErrors = errorLocator->getDegree(); - ArrayRef result( new Array(numErrors)); - int e = 0; - for (int i = 1; i < field_.getSize() && e < numErrors; i++) { - if (errorLocator->evaluateAt(i) == 0) { - result[e] = field_.inverse(i); - e++; - } - } - if (e != numErrors) { -#if (defined (DEBUG) && defined _WIN32) - char sz[128]; - sprintf(sz,"Error number inconsistency, %d/%d!",e,numErrors); - throw ReedSolomonException(sz); -#else - throw ReedSolomonException("Error number inconsistency!"); -#endif - } -#if (defined (DEBUG) && defined _WIN32) - { - WCHAR szmsg[256]; - swprintf(szmsg,L"ErrorCorrection::findErrorLocations: found %d errors.\n", - e); - OutputDebugString(szmsg); - } -#endif - return result; -} - -ArrayRef ErrorCorrection::findErrorMagnitudes(Ref errorEvaluator, - Ref errorLocator, - ArrayRef errorLocations) { - int i; - int errorLocatorDegree = errorLocator->getDegree(); - ArrayRef formalDerivativeCoefficients (new Array(errorLocatorDegree)); - for (i = 1; i <= errorLocatorDegree; i++) { - formalDerivativeCoefficients[errorLocatorDegree - i] = - field_.multiply(i, errorLocator->getCoefficient(i)); - } - Ref formalDerivative (new ModulusPoly(field_, formalDerivativeCoefficients)); - - // This is directly applying Forney's Formula - int s = errorLocations->size(); - ArrayRef result ( new Array(s)); - for (i = 0; i < s; i++) { - int xiInverse = field_.inverse(errorLocations[i]); - int numerator = field_.subtract(0, errorEvaluator->evaluateAt(xiInverse)); - int denominator = field_.inverse(formalDerivative->evaluateAt(xiInverse)); - result[i] = field_.multiply(numerator, denominator); - } - return result; -} - diff --git a/cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h b/cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h deleted file mode 100644 index 7ea8c4a18..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h +++ /dev/null @@ -1,71 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __ERROR_CORRECTION_PDF_H__ -#define __ERROR_CORRECTION_PDF_H__ -/* - * Copyright 2012 ZXing authors - * - * 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. - * - * 2012-09-17 HFN translation from Java into C++ - */ - -#include -#include -#include -#include -#include -#include -#include - -namespace zxing { -namespace pdf417 { -namespace decoder { -namespace ec { - - -/** - *

PDF417 error correction implementation.

- * - *

This example - * is quite useful in understanding the algorithm.

- * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.ReedSolomonDecoder - */ -class ErrorCorrection: public Counted { - - private: - ModulusGF &field_; - - public: - ErrorCorrection(); - void decode(ArrayRef received, - int numECCodewords, - ArrayRef erasures); - - private: - std::vector > runEuclideanAlgorithm(Ref a, Ref b, int R); - - ArrayRef findErrorLocations(Ref errorLocator); - ArrayRef findErrorMagnitudes(Ref errorEvaluator, - Ref errorLocator, - ArrayRef errorLocations); -}; - -} -} -} -} - -#endif /* __ERROR_CORRECTION_PDF_H__ */ diff --git a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp b/cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp deleted file mode 100644 index 741f014af..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2012 ZXing authors - * - * 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. - * - * 2012-09-19 HFN translation from Java into C++ - */ - -#include -#include - -using zxing::Ref; -using zxing::pdf417::decoder::ec::ModulusGF; -using zxing::pdf417::decoder::ec::ModulusPoly; - -/** - * The central Modulus Galois Field for PDF417 with prime number 929 - * and generator 3. - */ -ModulusGF ModulusGF::PDF417_GF(929,3); - - -/** - *

A field based on powers of a generator integer, modulo some modulus.

- * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGF - */ - -ModulusGF::ModulusGF(int modulus, int generator) - : modulus_(modulus) { - expTable_ = new Array(modulus_); - logTable_ = new Array(modulus_); - int x = 1,i; - for (i = 0; i < modulus_; i++) { - expTable_[i] = x; - x = (x * generator) % modulus_; - } - for (i = 0; i < modulus_-1; i++) { - logTable_[expTable_[i]] = i; - } - // logTable[0] == 0 but this should never be used - ArrayRefaZero(new Array(1)),aOne(new Array(1)); - aZero[0]=0;aOne[0]=1; - zero_ = new ModulusPoly(*this, aZero); - one_ = new ModulusPoly(*this, aOne); -} - -Ref ModulusGF::getZero() { - return zero_; -} - -Ref ModulusGF::getOne() { - return one_; -} - -Ref ModulusGF::buildMonomial(int degree, int coefficient) -{ - if (degree < 0) { - throw IllegalArgumentException("monomial: degree < 0!"); - } - if (coefficient == 0) { - return zero_; - } - int nCoefficients = degree + 1; - ArrayRef coefficients (new Array(nCoefficients)); - coefficients[0] = coefficient; - Ref result(new ModulusPoly(*this,coefficients)); - return result; -} - - - -int ModulusGF::add(int a, int b) { - return (a + b) % modulus_; -} - -int ModulusGF::subtract(int a, int b) { - return (modulus_ + a - b) % modulus_; -} - -int ModulusGF::exp(int a) { - return expTable_[a]; -} - -int ModulusGF::log(int a) { - if (a == 0) { - throw IllegalArgumentException("log of zero!"); - } - return logTable_[a]; -} - -int ModulusGF::inverse(int a) { - if (a == 0) { - throw IllegalArgumentException("inverse of zero!");; - } - return expTable_[modulus_ - logTable_[a] - 1]; -} - -int ModulusGF::multiply(int a, int b) { - if (a == 0 || b == 0) { - return 0; - } - return expTable_[(logTable_[a] + logTable_[b]) % (modulus_ - 1)]; -} - -int ModulusGF::getSize() { - return modulus_; -} diff --git a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h b/cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h deleted file mode 100644 index b4d8b4b81..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef __MODULUS_GF_PDF_H__ -#define __MODULUS_GF_PDF_H__ -/* - * Copyright 2012 ZXing authors - * - * 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. - * - * 2012-09-17 HFN translation from Java into C++ - */ - -#include -#include -#include -#include - -namespace zxing { -namespace pdf417 { -namespace decoder { -namespace ec { - -class ModulusPoly; - -/** - *

A field based on powers of a generator integer, modulo some modulus.

- * - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGF - */ -class ModulusGF { - - public: - static ModulusGF PDF417_GF; - - private: - ArrayRef expTable_; - ArrayRef logTable_; - Ref zero_; - Ref one_; - int modulus_; - - public: - ModulusGF(int modulus, int generator); - Ref getZero(); - Ref getOne(); - Ref buildMonomial(int degree, int coefficient); - - int add(int a, int b); - int subtract(int a, int b); - int exp(int a); - int log(int a); - int inverse(int a); - int multiply(int a, int b); - int getSize(); - -}; - -} -} -} -} - -#endif /* __MODULUS_GF_PDF_H__ */ diff --git a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp b/cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp deleted file mode 100644 index 7825b539b..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp +++ /dev/null @@ -1,284 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2012 ZXing authors - * - * 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. - * - * 2012-09-19 HFN translation from Java into C++ - */ - -#include -#include - -using zxing::Ref; -using zxing::ArrayRef; -using zxing::pdf417::decoder::ec::ModulusGF; -using zxing::pdf417::decoder::ec::ModulusPoly; - -/** - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGFPoly - */ - -ModulusPoly::ModulusPoly(ModulusGF& field, ArrayRef coefficients) - : field_(field) -{ - if (coefficients->size() == 0) { - throw IllegalArgumentException("no coefficients!"); - } - int coefficientsLength = coefficients->size(); - if (coefficientsLength > 1 && coefficients[0] == 0) { - // Leading term must be non-zero for anything except the constant polynomial "0" - int firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) { - firstNonZero++; - } - if (firstNonZero == coefficientsLength) { - coefficientsLength = field_.getZero()->getCoefficients()->size(); - coefficients_.reset(new Array (coefficientsLength)); - *coefficients_ = *(field_.getZero()->getCoefficients()); - } else { - ArrayRef c(coefficients); - coefficientsLength -= firstNonZero; - coefficients_.reset(new Array (coefficientsLength)); - for (int i = 0; i < coefficientsLength; i++) { - coefficients_[i] = c[i + firstNonZero]; - } - /* - coefficientsLength -= firstNonZero; - coefficients_.reset(new Array(coefficientsLength - firstNonZero)); - for (int i = 0; i < coefficientsLength; i++) { - coefficients_[i] = coefficients[i + firstNonZero]; - } - */ - } - } else { - coefficients_ = coefficients; - } -} - -ArrayRef ModulusPoly::getCoefficients() { - return coefficients_; -} - -/** - * @return degree of this polynomial - */ -int ModulusPoly::getDegree() { - return coefficients_->size() - 1; -} - -/** - * @return true iff this polynomial is the monomial "0" - */ -bool ModulusPoly::isZero() { - return coefficients_[0] == 0; -} - -/** - * @return coefficient of x^degree term in this polynomial - */ -int ModulusPoly::getCoefficient(int degree) { - return coefficients_[coefficients_->size() - 1 - degree]; -} - -/** - * @return evaluation of this polynomial at a given point - */ -int ModulusPoly::evaluateAt(int a) { - int i; - if (a == 0) { - // Just return the x^0 coefficient - return getCoefficient(0); - } - int size = coefficients_->size(); - if (a == 1) { - // Just the sum of the coefficients - int result = 0; - for (i = 0; i < size; i++) { - result = field_.add(result, coefficients_[i]); - } - return result; - } - int result = coefficients_[0]; - for (i = 1; i < size; i++) { - result = field_.add(field_.multiply(a, result), coefficients_[i]); - } - return result; -} - -Ref ModulusPoly::add(Ref other) { - if (&field_ != &other->field_) { - throw IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (isZero()) { - return other; - } - if (other->isZero()) { - return Ref(this); - } - - ArrayRef smallerCoefficients = coefficients_; - ArrayRef largerCoefficients = other->coefficients_; - if (smallerCoefficients->size() > largerCoefficients->size()) { - ArrayRef temp(smallerCoefficients); - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - ArrayRef sumDiff (new Array(largerCoefficients->size())); - int lengthDiff = largerCoefficients->size() - smallerCoefficients->size(); - // Copy high-order terms only found in higher-degree polynomial's coefficients - for (int i = 0; i < lengthDiff; i++) { - sumDiff[i] = largerCoefficients[i]; - } - - for (int i = lengthDiff; i < largerCoefficients->size(); i++) { - sumDiff[i] = field_.add(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); - } - - return Ref(new ModulusPoly(field_, sumDiff)); -} - -Ref ModulusPoly::subtract(Ref other) { - if (&field_ != &other->field_) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (other->isZero()) { - return Ref(this); - } - return add(other->negative()); -} - -Ref ModulusPoly::multiply(Ref other) { - if (&field_ != &other->field_) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (isZero() || other->isZero()) { - return field_.getZero(); - } - int i,j; - ArrayRef aCoefficients = coefficients_; - int aLength = aCoefficients->size(); - ArrayRef bCoefficients = other->coefficients_; - int bLength = bCoefficients->size(); - ArrayRef product (new Array(aLength + bLength - 1)); - for (i = 0; i < aLength; i++) { - int aCoeff = aCoefficients[i]; - for (j = 0; j < bLength; j++) { - product[i + j] = field_.add(product[i + j], field_.multiply(aCoeff, bCoefficients[j])); - } - } - return Ref(new ModulusPoly(field_, product)); -} - -Ref ModulusPoly::negative() { - int size = coefficients_->size(); - ArrayRef negativeCoefficients (new Array(size)); - for (int i = 0; i < size; i++) { - negativeCoefficients[i] = field_.subtract(0, coefficients_[i]); - } - return Ref(new ModulusPoly(field_, negativeCoefficients)); -} - -Ref ModulusPoly::multiply(int scalar) { - if (scalar == 0) { - return field_.getZero(); - } - if (scalar == 1) { - return Ref(this); - } - int size = coefficients_->size(); - ArrayRef product( new Array(size)); - for (int i = 0; i < size; i++) { - product[i] = field_.multiply(coefficients_[i], scalar); - } - return Ref(new ModulusPoly(field_, product)); -} - -Ref ModulusPoly::multiplyByMonomial(int degree, int coefficient) { - if (degree < 0) { - throw new IllegalArgumentException("negative degree!"); - } - if (coefficient == 0) { - return field_.getZero(); - } - int size = coefficients_->size(); - ArrayRef product (new Array(size + degree)); - for (int i = 0; i < size; i++) { - product[i] = field_.multiply(coefficients_[i], coefficient); - } - return Ref(new ModulusPoly(field_, product)); -} - -std::vector > ModulusPoly::divide(Ref other) { - if (&field_ != &other->field_) { - throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field"); - } - if (other->isZero()) { - throw new IllegalArgumentException("Divide by 0"); - } - - Ref quotient (field_.getZero()); - Ref remainder (this); - - int denominatorLeadingTerm = other->getCoefficient(other->getDegree()); - int inverseDenominatorLeadingTerm = field_.inverse(denominatorLeadingTerm); - - while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) { - int degreeDifference = remainder->getDegree() - other->getDegree(); - int scale = field_.multiply(remainder->getCoefficient(remainder->getDegree()), inverseDenominatorLeadingTerm); - Ref term (other->multiplyByMonomial(degreeDifference, scale)); - Ref iterationQuotient (field_.buildMonomial(degreeDifference, scale)); - quotient = quotient->add(iterationQuotient); - remainder = remainder->subtract(term); - } - - std::vector > result(2); - result[0] = quotient; - result[1] = remainder; - return result; -} - -#if 0 -@Override -public String toString() { - StringBuilder result = new StringBuilder(8 * getDegree()); - for (int degree = getDegree(); degree >= 0; degree--) { - int coefficient = getCoefficient(degree); - if (coefficient != 0) { - if (coefficient < 0) { - result.append(" - "); - coefficient = -coefficient; - } else { - if (result.length() > 0) { - result.append(" + "); - } - } - if (degree == 0 || coefficient != 1) { - result.append(coefficient); - } - if (degree != 0) { - if (degree == 1) { - result.append('x'); - } else { - result.append("x^"); - result.append(degree); - } - } - } - } - return result.toString(); -} -#endif - -ModulusPoly::~ModulusPoly() {} diff --git a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h b/cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h deleted file mode 100644 index f3f76a151..000000000 --- a/cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef __MODULUS_GFPOLY_PDF_H__ -#define __MODULUS_GFPOLY_PDF_H__ - -/* - * Copyright 2012 ZXing authors - * - * 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. - * - * 2012-09-17 HFN translation from Java into C++ - */ - -#include -#include -#include -#include - -namespace zxing { -namespace pdf417 { -namespace decoder { -namespace ec { - -class ModulusGF; - -/** - * @author Sean Owen - * @see com.google.zxing.common.reedsolomon.GenericGFPoly - */ -class ModulusPoly: public Counted { - - private: - ModulusGF &field_; - ArrayRef coefficients_; - public: - ModulusPoly(ModulusGF& field, ArrayRef coefficients); - ~ModulusPoly(); - ArrayRef getCoefficients(); - int getDegree(); - bool isZero(); - int getCoefficient(int degree); - int evaluateAt(int a); - Ref add(Ref other); - Ref subtract(Ref other); - Ref multiply(Ref other); - Ref negative(); - Ref multiply(int scalar); - Ref multiplyByMonomial(int degree, int coefficient); - std::vector > divide(Ref other); - #if 0 - public String toString(); - #endif -}; - -} -} -} -} - -#endif /* __MODULUS_GFPOLY_PDF_H__ */ diff --git a/cpp/core/src/zxing/pdf417/detector/Detector.cpp b/cpp/core/src/zxing/pdf417/detector/Detector.cpp deleted file mode 100644 index 7bcc96666..000000000 --- a/cpp/core/src/zxing/pdf417/detector/Detector.cpp +++ /dev/null @@ -1,664 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -using std::max; -using std::abs; -using std::numeric_limits; -using zxing::pdf417::detector::Detector; -using zxing::common::detector::Math; -using zxing::common::detector::MathUtils; -using zxing::Ref; -using zxing::ArrayRef; -using zxing::DetectorResult; -using zxing::ResultPoint; -using zxing::Point; -using zxing::BitMatrix; -using zxing::GridSampler; - -// VC++ - -using zxing::BinaryBitmap; -using zxing::DecodeHints; -using zxing::Line; - -/** - *

Encapsulates logic that can detect a PDF417 Code in an image, even if the - * PDF417 Code is rotated or skewed, or partially obscured.

- * - * @author SITA Lab (kevin.osullivan@sita.aero) - * @author Daniel Switkin (dswitkin@google.com) - * @author Schweers Informationstechnologie GmbH (hartmut.neubauer@schweers.de) - * @author creatale GmbH (christoph.schulz@creatale.de) - */ - -const int Detector::MAX_AVG_VARIANCE= (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.42f); -const int Detector::MAX_INDIVIDUAL_VARIANCE = (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.8f); - -// B S B S B S B S Bar/Space pattern -// 11111111 0 1 0 1 0 1 000 -const int Detector::START_PATTERN[] = {8, 1, 1, 1, 1, 1, 1, 3}; -const int Detector::START_PATTERN_LENGTH = sizeof(START_PATTERN) / sizeof(int); - -// 11111111 0 1 0 1 0 1 000 -const int Detector::START_PATTERN_REVERSE[] = {3, 1, 1, 1, 1, 1, 1, 8}; -const int Detector::START_PATTERN_REVERSE_LENGTH = sizeof(START_PATTERN_REVERSE) / sizeof(int); - -// 1111111 0 1 000 1 0 1 00 1 -const int Detector::STOP_PATTERN[] = {7, 1, 1, 3, 1, 1, 1, 2, 1}; -const int Detector::STOP_PATTERN_LENGTH = sizeof(STOP_PATTERN) / sizeof(int); - -// B S B S B S B S B Bar/Space pattern -// 1111111 0 1 000 1 0 1 00 1 -const int Detector::STOP_PATTERN_REVERSE[] = {1, 2, 1, 1, 1, 3, 1, 1, 7}; -const int Detector::STOP_PATTERN_REVERSE_LENGTH = sizeof(STOP_PATTERN_REVERSE) / sizeof(int); - -Detector::Detector(Ref image) : image_(image) {} - -Ref Detector::detect() { - return detect(DecodeHints()); -} - -Ref Detector::detect(DecodeHints const& hints) { - (void)hints; - // Fetch the 1 bit matrix once up front. - Ref matrix = image_->getBlackMatrix(); - - // Try to find the vertices assuming the image is upright. - const int rowStep = 8; - ArrayRef< Ref > vertices (findVertices(matrix, rowStep)); - if (!vertices) { - // Maybe the image is rotated 180 degrees? - vertices = findVertices180(matrix, rowStep); - if (vertices) { - correctVertices(matrix, vertices, true); - } - } else { - correctVertices(matrix, vertices, false); - } - - if (!vertices) { - throw NotFoundException("No vertices found."); - } - - float moduleWidth = computeModuleWidth(vertices); - if (moduleWidth < 1.0f) { - throw NotFoundException("Bad module width."); - } - - int dimension = computeDimension(vertices[12], vertices[14], - vertices[13], vertices[15], moduleWidth); - if (dimension < 1) { - throw NotFoundException("Bad dimension."); - } - - int yDimension = max(computeYDimension(vertices[12], vertices[14], - vertices[13], vertices[15], moduleWidth), dimension); - - // Deskew and sample lines from image. - Ref linesMatrix = sampleLines(vertices, dimension, yDimension); - Ref linesGrid(LinesSampler(linesMatrix, dimension).sample()); - - ArrayRef< Ref > points(4); - points[0] = vertices[5]; - points[1] = vertices[4]; - points[2] = vertices[6]; - points[3] = vertices[7]; - return Ref(new DetectorResult(linesGrid, points)); -} - -/** - * Locate the vertices and the codewords area of a black blob using the Start - * and Stop patterns as locators. - * - * @param matrix the scanned barcode image. - * @param rowStep the step size for iterating rows (every n-th row). - * @return an array containing the vertices: - * vertices[0] x, y top left barcode - * vertices[1] x, y bottom left barcode - * vertices[2] x, y top right barcode - * vertices[3] x, y bottom right barcode - * vertices[4] x, y top left codeword area - * vertices[5] x, y bottom left codeword area - * vertices[6] x, y top right codeword area - * vertices[7] x, y bottom right codeword area - */ -ArrayRef< Ref > Detector::findVertices(Ref matrix, int rowStep) -{ - const int height = matrix->getHeight(); - const int width = matrix->getWidth(); - - ArrayRef< Ref > result(16); - bool found = false; - - ArrayRef counters(new Array(START_PATTERN_LENGTH)); - - // Top Left - for (int i = 0; i < height; i += rowStep) { - ArrayRef loc = findGuardPattern(matrix, 0, i, width, false, START_PATTERN, - START_PATTERN_LENGTH, counters); - if (loc) { - result[0] = new ResultPoint((float)loc[0], (float)i); - result[4] = new ResultPoint((float)loc[1], (float)i); - found = true; - break; - } - } - // Bottom left - if (found) { // Found the Top Left vertex - found = false; - for (int i = height - 1; i > 0; i -= rowStep) { - ArrayRef loc = findGuardPattern(matrix, 0, i, width, false, START_PATTERN, - START_PATTERN_LENGTH, counters); - if (loc) { - result[1] = new ResultPoint((float)loc[0], (float)i); - result[5] = new ResultPoint((float)loc[1], (float)i); - found = true; - break; - } - } - } - - counters = new Array(STOP_PATTERN_LENGTH); - - // Top right - if (found) { // Found the Bottom Left vertex - found = false; - for (int i = 0; i < height; i += rowStep) { - ArrayRef loc = findGuardPattern(matrix, 0, i, width, false, STOP_PATTERN, - STOP_PATTERN_LENGTH, counters); - if (loc) { - result[2] = new ResultPoint((float)loc[1], (float)i); - result[6] = new ResultPoint((float)loc[0], (float)i); - found = true; - break; - } - } - } - // Bottom right - if (found) { // Found the Top right vertex - found = false; - for (int i = height - 1; i > 0; i -= rowStep) { - ArrayRef loc = findGuardPattern(matrix, 0, i, width, false, STOP_PATTERN, - STOP_PATTERN_LENGTH, counters); - if (loc) { - result[3] = new ResultPoint((float)loc[1], (float)i); - result[7] = new ResultPoint((float)loc[0], (float)i); - found = true; - break; - } - } - } - - return found ? result : ArrayRef< Ref >(); -} - -ArrayRef< Ref > Detector::findVertices180(Ref matrix, int rowStep) { - const int height = matrix->getHeight(); - const int width = matrix->getWidth(); - const int halfWidth = width >> 1; - - ArrayRef< Ref > result(16); - bool found = false; - - ArrayRef counters = new Array(START_PATTERN_REVERSE_LENGTH); - - // Top Left - for (int i = height - 1; i > 0; i -= rowStep) { - ArrayRef loc = - findGuardPattern(matrix, halfWidth, i, halfWidth, true, START_PATTERN_REVERSE, - START_PATTERN_REVERSE_LENGTH, counters); - if (loc) { - result[0] = new ResultPoint((float)loc[1], (float)i); - result[4] = new ResultPoint((float)loc[0], (float)i); - found = true; - break; - } - } - // Bottom Left - if (found) { // Found the Top Left vertex - found = false; - for (int i = 0; i < height; i += rowStep) { - ArrayRef loc = - findGuardPattern(matrix, halfWidth, i, halfWidth, true, START_PATTERN_REVERSE, - START_PATTERN_REVERSE_LENGTH, counters); - if (loc) { - result[1] = new ResultPoint((float)loc[1], (float)i); - result[5] = new ResultPoint((float)loc[0], (float)i); - found = true; - break; - } - } - } - - counters = new Array(STOP_PATTERN_REVERSE_LENGTH); - - // Top Right - if (found) { // Found the Bottom Left vertex - found = false; - for (int i = height - 1; i > 0; i -= rowStep) { - ArrayRef loc = findGuardPattern(matrix, 0, i, halfWidth, false, STOP_PATTERN_REVERSE, - STOP_PATTERN_REVERSE_LENGTH, counters); - if (loc) { - result[2] = new ResultPoint((float)loc[0], (float)i); - result[6] = new ResultPoint((float)loc[1], (float)i); - found = true; - break; - } - } - } - // Bottom Right - if (found) { // Found the Top Right vertex - found = false; - for (int i = 0; i < height; i += rowStep) { - ArrayRef loc = findGuardPattern(matrix, 0, i, halfWidth, false, STOP_PATTERN_REVERSE, - STOP_PATTERN_REVERSE_LENGTH, counters); - if (loc) { - result[3] = new ResultPoint((float)loc[0], (float)i); - result[7] = new ResultPoint((float)loc[1], (float)i); - found = true; - break; - } - } - } - - return found ? result : ArrayRef< Ref >(); -} - -/** - * @param matrix row of black/white values to search - * @param column x position to start search - * @param row y position to start search - * @param width the number of pixels to search on this row - * @param pattern pattern of counts of number of black and white pixels that are - * being searched for as a pattern - * @param counters array of counters, as long as pattern, to re-use - * @return start/end horizontal offset of guard pattern, as an array of two ints. - */ -ArrayRef Detector::findGuardPattern(Ref matrix, - int column, - int row, - int width, - bool whiteFirst, - const int pattern[], - int patternSize, - ArrayRef& counters) { - counters->values().assign(counters->size(), 0); - int patternLength = patternSize; - bool isWhite = whiteFirst; - - int counterPosition = 0; - int patternStart = column; - for (int x = column; x < column + width; x++) { - bool pixel = matrix->get(x, row); - if (pixel ^ isWhite) { - counters[counterPosition]++; - } else { - if (counterPosition == patternLength - 1) { - if (patternMatchVariance(counters, pattern, - MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) { - ArrayRef result = new Array(2); - result[0] = patternStart; - result[1] = x; - return result; - } - patternStart += counters[0] + counters[1]; - for(int i = 0; i < patternLength - 2; ++i) - counters[i] = counters[ i + 2]; - counters[patternLength - 2] = 0; - counters[patternLength - 1] = 0; - counterPosition--; - } else { - counterPosition++; - } - counters[counterPosition] = 1; - isWhite = !isWhite; - } - } - return ArrayRef(); -} - -/** - * Determines how closely a set of observed counts of runs of black/white - * values matches a given target pattern. This is reported as the ratio of - * the total variance from the expected pattern proportions across all - * pattern elements, to the length of the pattern. - * - * @param counters observed counters - * @param pattern expected pattern - * @param maxIndividualVariance The most any counter can differ before we give up - * @return ratio of total variance between counters and pattern compared to - * total pattern size, where the ratio has been multiplied by 256. - * So, 0 means no variance (perfect match); 256 means the total - * variance between counters and patterns equals the pattern length, - * higher values mean even more variance - */ -int Detector::patternMatchVariance(ArrayRef& counters, - const int pattern[], - int maxIndividualVariance) -{ - int numCounters = counters->size(); - int total = 0; - int patternLength = 0; - for (int i = 0; i < numCounters; i++) { - total += counters[i]; - patternLength += pattern[i]; - } - if (total < patternLength) { - // If we don't even have one pixel per unit of bar width, assume this - // is too small to reliably match, so fail: - return numeric_limits::max(); - } - // We're going to fake floating-point math in integers. We just need to use more bits. - // Scale up patternLength so that intermediate values below like scaledCounter will have - // more "significant digits". - int unitBarWidth = (total << 8) / patternLength; - maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> 8; - - int totalVariance = 0; - for (int x = 0; x < numCounters; x++) { - int counter = counters[x] << 8; - int scaledPattern = pattern[x] * unitBarWidth; - int variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; - if (variance > maxIndividualVariance) { - return numeric_limits::max(); - } - totalVariance += variance; - } - return totalVariance / total; -} - -/** - *

Correct the vertices by searching for top and bottom vertices of wide - * bars, then locate the intersections between the upper and lower horizontal - * line and the inner vertices vertical lines.

- * - * @param matrix the scanned barcode image. - * @param vertices the vertices vector is extended and the new members are: - * vertices[ 8] x,y point on upper border of left wide bar - * vertices[ 9] x,y point on lower border of left wide bar - * vertices[10] x,y point on upper border of right wide bar - * vertices[11] x,y point on lower border of right wide bar - * vertices[12] x,y final top left codeword area - * vertices[13] x,y final bottom left codeword area - * vertices[14] x,y final top right codeword area - * vertices[15] x,y final bottom right codeword area - * @param upsideDown true if rotated by 180 degree. - */ -void Detector::correctVertices(Ref matrix, - ArrayRef< Ref >& vertices, - bool upsideDown) -{ - bool isLowLeft = abs(vertices[4]->getY() - vertices[5]->getY()) < 20.0; - bool isLowRight = abs(vertices[6]->getY() - vertices[7]->getY()) < 20.0; - if (isLowLeft || isLowRight) { - throw NotFoundException("Cannot find enough PDF417 guard patterns!"); - } else { - findWideBarTopBottom(matrix, vertices, 0, 0, 8, 17, upsideDown ? 1 : -1); - findWideBarTopBottom(matrix, vertices, 1, 0, 8, 17, upsideDown ? -1 : 1); - findWideBarTopBottom(matrix, vertices, 2, 11, 7, 18, upsideDown ? 1 : -1); - findWideBarTopBottom(matrix, vertices, 3, 11, 7, 18, upsideDown ? -1 : 1); - findCrossingPoint(vertices, 12, 4, 5, 8, 10, matrix); - findCrossingPoint(vertices, 13, 4, 5, 9, 11, matrix); - findCrossingPoint(vertices, 14, 6, 7, 8, 10, matrix); - findCrossingPoint(vertices, 15, 6, 7, 9, 11, matrix); - } -} - -/** - *

Locate the top or bottom of one of the two wide black bars of a guard pattern.

- * - *

Warning: it only searches along the y axis, so the return points would not be - * right if the barcode is too curved.

- * - * @param matrix The bit matrix. - * @param vertices The 16 vertices located by findVertices(); the result - * points are stored into vertices[8], ... , vertices[11]. - * @param offsetVertice The offset of the outer vertice and the inner - * vertice (+ 4) to be corrected and (+ 8) where the result is stored. - * @param startWideBar start of a wide bar. - * @param lenWideBar length of wide bar. - * @param lenPattern length of the pattern. - * @param rowStep +1 if corner should be exceeded towards the bottom, -1 towards the top. - */ -void Detector::findWideBarTopBottom(Ref matrix, - ArrayRef< Ref > &vertices, - int offsetVertice, - int startWideBar, - int lenWideBar, - int lenPattern, - int rowStep) -{ - Ref verticeStart(vertices[offsetVertice]); - Ref verticeEnd(vertices[offsetVertice + 4]); - - // Start horizontally at the middle of the bar. - int endWideBar = startWideBar + lenWideBar; - float barDiff = verticeEnd->getX() - verticeStart->getX(); - float barStart = verticeStart->getX() + barDiff * (float)startWideBar / (float)lenPattern; - float barEnd = verticeStart->getX() + barDiff * (float)endWideBar / (float)lenPattern; - int x = Math::round((barStart + barEnd) / 2.0f); - - // Start vertically between the preliminary vertices. - int yStart = Math::round(verticeStart->getY()); - int y = yStart; - - // Find offset of thin bar to the right as additional safeguard. - int nextBarX = int(max(barStart, barEnd) + 1); - for (; nextBarX < matrix->getWidth(); nextBarX++) - if (!matrix->get(nextBarX - 1, y) && matrix->get(nextBarX, y)) break; - nextBarX -= x; - - bool isEnd = false; - while (!isEnd) { - if (matrix->get(x, y)) { - // If the thin bar to the right ended, stop as well - isEnd = !matrix->get(x + nextBarX, y) && !matrix->get(x + nextBarX + 1, y); - y += rowStep; - if (y <= 0 || y >= (int)matrix->getHeight() - 1) { - // End of barcode image reached. - isEnd = true; - } - } else { - // Look sidewise whether black bar continues? (in the case the image is skewed) - if (x > 0 && matrix->get(x - 1, y)) { - x--; - } else if (x < (int)matrix->getWidth() - 1 && matrix->get(x + 1, y)) { - x++; - } else { - // End of pattern regarding big bar and big gap reached. - isEnd = true; - if (y != yStart) { - // Turn back one step, because target has been exceeded. - y -= rowStep; - } - } - } - } - - vertices[offsetVertice + 8] = new ResultPoint((float)x, (float)y); -} - -/** - *

Finds the intersection of two lines.

- * - * @param vertices The reference of the vertices vector - * @param idxResult Index of result point inside the vertices vector. - * @param idxLineA1 - * @param idxLineA2 Indices two points inside the vertices vector that define the first line. - * @param idxLineB1 - * @param idxLineB2 Indices two points inside the vertices vector that define the second line. - * @param matrix: bit matrix, here only for testing whether the result is inside the matrix. - * @return Returns true when the result is valid and lies inside the matrix. Otherwise throws an - * exception. - **/ -void Detector::findCrossingPoint(ArrayRef< Ref >& vertices, - int idxResult, - int idxLineA1, int idxLineA2, - int idxLineB1, int idxLineB2, - Ref& matrix) -{ - Point p1(vertices[idxLineA1]->getX(), vertices[idxLineA1]->getY()); - Point p2(vertices[idxLineA2]->getX(), vertices[idxLineA2]->getY()); - Point p3(vertices[idxLineB1]->getX(), vertices[idxLineB1]->getY()); - Point p4(vertices[idxLineB2]->getX(), vertices[idxLineB2]->getY()); - - Point result(intersection(Line(p1, p2), Line(p3, p4))); - if (result.x == numeric_limits::infinity() || - result.y == numeric_limits::infinity()) { - throw NotFoundException("PDF:Detector: cannot find the crossing of parallel lines!"); - } - - int x = Math::round(result.x); - int y = Math::round(result.y); - if (x < 0 || x >= (int)matrix->getWidth() || y < 0 || y >= (int)matrix->getHeight()) { - throw NotFoundException("PDF:Detector: crossing points out of region!"); - } - - vertices[idxResult] = Ref(new ResultPoint(result.x, result.y)); -} - -/** - * Computes the intersection between two lines. - */ -Point Detector::intersection(Line a, Line b) { - float dxa = a.start.x - a.end.x; - float dxb = b.start.x - b.end.x; - float dya = a.start.y - a.end.y; - float dyb = b.start.y - b.end.y; - - float p = a.start.x * a.end.y - a.start.y * a.end.x; - float q = b.start.x * b.end.y - b.start.y * b.end.x; - float denom = dxa * dyb - dya * dxb; - if(abs(denom) < 1e-12) // Lines don't intersect (replaces "denom == 0") - return Point(numeric_limits::infinity(), - numeric_limits::infinity()); - - float x = (p * dxb - dxa * q) / denom; - float y = (p * dyb - dya * q) / denom; - - return Point(x, y); -} - -/** - *

Estimates module size (pixels in a module) based on the Start and End - * finder patterns.

- * - * @param vertices an array of vertices: - * vertices[0] x, y top left barcode - * vertices[1] x, y bottom left barcode - * vertices[2] x, y top right barcode - * vertices[3] x, y bottom right barcode - * vertices[4] x, y top left codeword area - * vertices[5] x, y bottom left codeword area - * vertices[6] x, y top right codeword area - * vertices[7] x, y bottom right codeword area - * @return the module size. - */ -float Detector::computeModuleWidth(ArrayRef< Ref >& vertices) { - float pixels1 = ResultPoint::distance(vertices[0], vertices[4]); - float pixels2 = ResultPoint::distance(vertices[1], vertices[5]); - float moduleWidth1 = (pixels1 + pixels2) / (17 * 2.0f); - float pixels3 = ResultPoint::distance(vertices[6], vertices[2]); - float pixels4 = ResultPoint::distance(vertices[7], vertices[3]); - float moduleWidth2 = (pixels3 + pixels4) / (18 * 2.0f); - return (moduleWidth1 + moduleWidth2) / 2.0f; -} - -/** - * Computes the dimension (number of modules in a row) of the PDF417 Code - * based on vertices of the codeword area and estimated module size. - * - * @param topLeft of codeword area - * @param topRight of codeword area - * @param bottomLeft of codeword area - * @param bottomRight of codeword are - * @param moduleWidth estimated module size - * @return the number of modules in a row. - */ -int Detector::computeDimension(Ref const& topLeft, - Ref const& topRight, - Ref const& bottomLeft, - Ref const& bottomRight, - float moduleWidth) -{ - int topRowDimension = MathUtils::round(ResultPoint::distance(topLeft, topRight) / moduleWidth); - int bottomRowDimension = - MathUtils::round(ResultPoint::distance(bottomLeft, bottomRight) / moduleWidth); - return ((((topRowDimension + bottomRowDimension) >> 1) + 8) / 17) * 17; -} - -/** - * Computes the y dimension (number of modules in a column) of the PDF417 Code - * based on vertices of the codeword area and estimated module size. - * - * @param topLeft of codeword area - * @param topRight of codeword area - * @param bottomLeft of codeword area - * @param bottomRight of codeword are - * @param moduleWidth estimated module size - * @return the number of modules in a row. - */ -int Detector::computeYDimension(Ref const& topLeft, - Ref const& topRight, - Ref const& bottomLeft, - Ref const& bottomRight, - float moduleWidth) -{ - int leftColumnDimension = - MathUtils::round(ResultPoint::distance(topLeft, bottomLeft) / moduleWidth); - int rightColumnDimension = - MathUtils::round(ResultPoint::distance(topRight, bottomRight) / moduleWidth); - return (leftColumnDimension + rightColumnDimension) >> 1; -} - -/** - * Deskew and over-sample image. - * - * @param vertices vertices from findVertices() - * @param dimension x dimension - * @param yDimension y dimension - * @return an over-sampled BitMatrix. - */ -Ref Detector::sampleLines(ArrayRef< Ref > const& vertices, - int dimensionY, - int dimension) { - const int sampleDimensionX = dimension * 8; - const int sampleDimensionY = dimensionY * 4; - Ref transform( - PerspectiveTransform::quadrilateralToQuadrilateral( - 0.0f, 0.0f, - (float)sampleDimensionX, 0.0f, - 0.0f, (float)sampleDimensionY, - (float)sampleDimensionX, (float)sampleDimensionY, - vertices[12]->getX(), vertices[12]->getY(), - vertices[14]->getX(), vertices[14]->getY(), - vertices[13]->getX(), vertices[13]->getY(), - vertices[15]->getX(), vertices[15]->getY())); - - Ref linesMatrix = GridSampler::getInstance().sampleGrid( - image_->getBlackMatrix(), sampleDimensionX, sampleDimensionY, transform); - - - return linesMatrix; -} diff --git a/cpp/core/src/zxing/pdf417/detector/Detector.h b/cpp/core/src/zxing/pdf417/detector/Detector.h deleted file mode 100644 index 874ec5c19..000000000 --- a/cpp/core/src/zxing/pdf417/detector/Detector.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef __DETECTOR_H__ -#define __DETECTOR_H__ - -/* - * Detector.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { -namespace pdf417 { -namespace detector { - -class Detector { -private: - static const int INTEGER_MATH_SHIFT = 8; - static const int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT; - static const int MAX_AVG_VARIANCE; - static const int MAX_INDIVIDUAL_VARIANCE; - - static const int START_PATTERN[]; - static const int START_PATTERN_LENGTH; - static const int START_PATTERN_REVERSE[]; - static const int START_PATTERN_REVERSE_LENGTH; - static const int STOP_PATTERN[]; - static const int STOP_PATTERN_LENGTH; - static const int STOP_PATTERN_REVERSE[]; - static const int STOP_PATTERN_REVERSE_LENGTH; - - Ref image_; - - static ArrayRef< Ref > findVertices(Ref matrix, int rowStep); - static ArrayRef< Ref > findVertices180(Ref matrix, int rowStep); - - static ArrayRef findGuardPattern(Ref matrix, - int column, - int row, - int width, - bool whiteFirst, - const int pattern[], - int patternSize, - ArrayRef& counters); - static int patternMatchVariance(ArrayRef& counters, const int pattern[], - int maxIndividualVariance); - - static void correctVertices(Ref matrix, - ArrayRef< Ref >& vertices, - bool upsideDown); - static void findWideBarTopBottom(Ref matrix, - ArrayRef< Ref >& vertices, - int offsetVertice, - int startWideBar, - int lenWideBar, - int lenPattern, - int nIncrement); - static void findCrossingPoint(ArrayRef< Ref >& vertices, - int idxResult, - int idxLineA1,int idxLineA2, - int idxLineB1,int idxLineB2, - Ref& matrix); - static Point intersection(Line a, Line b); - static float computeModuleWidth(ArrayRef< Ref >& vertices); - static int computeDimension(Ref const& topLeft, - Ref const& topRight, - Ref const& bottomLeft, - Ref const& bottomRight, - float moduleWidth); - int computeYDimension(Ref const& topLeft, - Ref const& topRight, - Ref const& bottomLeft, - Ref const& bottomRight, - float moduleWidth); - - Ref sampleLines(ArrayRef< Ref > const& vertices, int dimensionY, int dimension); - -public: - Detector(Ref image); - Ref getImage(); - Ref detect(); - Ref detect(DecodeHints const& hints); -}; - -} -} -} - -#endif // __DETECTOR_H__ diff --git a/cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp b/cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp deleted file mode 100644 index 62c005473..000000000 --- a/cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp +++ /dev/null @@ -1,714 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010, 2012 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -using std::map; -using std::vector; -using std::min; -using std::abs; -using zxing::pdf417::detector::LinesSampler; -using zxing::pdf417::decoder::BitMatrixParser; -using zxing::Ref; -using zxing::BitMatrix; -using zxing::NotFoundException; -using zxing::Point; - -// VC++ -using zxing::Line; - -const int LinesSampler::MODULES_IN_SYMBOL; -const int LinesSampler::BARS_IN_SYMBOL; -const int LinesSampler::POSSIBLE_SYMBOLS; -const int LinesSampler::BARCODE_START_OFFSET; - -namespace { - -class VoteResult { - private: - bool indecisive; - int vote; - public: - VoteResult() : indecisive(false), vote(0) {} - bool isIndecisive() { - return indecisive; - } - void setIndecisive(bool indecisive) { - this->indecisive = indecisive; - } - int getVote() { - return vote; - } - void setVote(int vote) { - this->vote = vote; - } -}; - -VoteResult getValueWithMaxVotes(map& votes) { - VoteResult result; - int maxVotes = 0; - for (map::iterator i = votes.begin(); i != votes.end(); i++) { - if (i->second > maxVotes) { - maxVotes = i->second; - result.setVote(i->first); - result.setIndecisive(false); - } else if (i->second == maxVotes) { - result.setIndecisive(true); - } - } - return result; -} - -} - -vector LinesSampler::init_ratios_table() { - // Pre-computes and outputs the symbol ratio table. - vector > table (BitMatrixParser::SYMBOL_TABLE_LENGTH); - for(int i=0; i < (int)table.size(); ++i) { - table[i].resize(LinesSampler::BARS_IN_SYMBOL); - } - vector RATIOS_TABLE (BitMatrixParser::SYMBOL_TABLE_LENGTH * LinesSampler::BARS_IN_SYMBOL); - int x = 0; - for (int i = 0; i < BitMatrixParser::SYMBOL_TABLE_LENGTH; i++) { - int currentSymbol = BitMatrixParser::SYMBOL_TABLE[i]; - int currentBit = currentSymbol & 0x1; - for (int j = 0; j < BARS_IN_SYMBOL; j++) { - float size = 0.0f; - while ((currentSymbol & 0x1) == currentBit) { - size += 1.0f; - currentSymbol >>= 1; - } - currentBit = currentSymbol & 0x1; - table[i][BARS_IN_SYMBOL - j - 1] = size / MODULES_IN_SYMBOL; - } - for (int j = 0; j < BARS_IN_SYMBOL; j++) { - RATIOS_TABLE[x] = table[i][j]; - x++; - } - } - return RATIOS_TABLE; -} - -const vector LinesSampler::RATIOS_TABLE = init_ratios_table(); - -LinesSampler::LinesSampler(Ref linesMatrix, int dimension) - : linesMatrix_(linesMatrix), dimension_(dimension) {} - -/** - * Samples a grid from a lines matrix. - * - * @return the potentially decodable bit matrix. - */ -Ref LinesSampler::sample() { - const int symbolsPerLine = dimension_ / MODULES_IN_SYMBOL; - - // XXX - vector symbolWidths; - computeSymbolWidths(symbolWidths, symbolsPerLine, linesMatrix_); - - // XXX - vector > codewords(linesMatrix_->getHeight()); - vector > clusterNumbers(linesMatrix_->getHeight()); - linesMatrixToCodewords(clusterNumbers, symbolsPerLine, symbolWidths, linesMatrix_, codewords); - - // XXX - vector > > votes = - distributeVotes(symbolsPerLine, codewords, clusterNumbers); - - // XXX - vector > detectedCodeWords(votes.size()); - for (int i = 0; i < (int)votes.size(); i++) { - detectedCodeWords[i].resize(votes[i].size(), 0); - for (int j = 0; j < (int)votes[i].size(); j++) { - if (!votes[i][j].empty()) { - detectedCodeWords[i][j] = getValueWithMaxVotes(votes[i][j]).getVote(); - } - } - } - - // XXX - vector insertLinesAt = findMissingLines(symbolsPerLine, detectedCodeWords); - - // XXX - int rowCount = decodeRowCount(symbolsPerLine, detectedCodeWords, insertLinesAt); - detectedCodeWords.resize(rowCount); - - // XXX - Ref grid(new BitMatrix(dimension_, detectedCodeWords.size())); - codewordsToBitMatrix(detectedCodeWords, grid); - - return grid; -} - -/** - * @brief LinesSampler::codewordsToBitMatrix - * @param codewords - * @param matrix - */ -void LinesSampler::codewordsToBitMatrix(vector > &codewords, Ref &matrix) { - for (int i = 0; i < (int)codewords.size(); i++) { - for (int j = 0; j < (int)codewords[i].size(); j++) { - int moduleOffset = j * MODULES_IN_SYMBOL; - for (int k = 0; k < MODULES_IN_SYMBOL; k++) { - if ((codewords[i][j] & (1 << (MODULES_IN_SYMBOL - k - 1))) > 0) { - matrix->set(moduleOffset + k, i); - } - } - } - } -} - -/** - * @brief LinesSampler::calculateClusterNumber - * @param codeword - * @return - */ -int LinesSampler::calculateClusterNumber(int codeword) { - if (codeword == 0) { - return -1; - } - int barNumber = 0; - bool blackBar = true; - int clusterNumber = 0; - for (int i = 0; i < MODULES_IN_SYMBOL; i++) { - if ((codeword & (1 << i)) > 0) { - if (!blackBar) { - blackBar = true; - barNumber++; - } - if (barNumber % 2 == 0) { - clusterNumber++; - } else { - clusterNumber--; - } - } else { - if (blackBar) { - blackBar = false; - } - } - } - return (clusterNumber + 9) % 9; -} - -//#define OUTPUT_SYMBOL_WIDTH 1 -//#define OUTPUT_BAR_WIDTH 1 -//#define OUTPUT_CW_STARTS 1 -//#define OUTPUT_CLUSTER_NUMBERS 1 -//#define OUTPUT_EC_LEVEL 1 - -void LinesSampler::computeSymbolWidths(vector &symbolWidths, const int symbolsPerLine, Ref linesMatrix) -{ - int symbolStart = 0; - bool lastWasSymbolStart = true; - const float symbolWidth = symbolsPerLine > 0 ? (float)linesMatrix->getWidth() / (float)symbolsPerLine : (float)linesMatrix->getWidth(); - - // Use the following property of PDF417 barcodes to detect symbols: - // Every symbol starts with a black module and every symbol is 17 modules wide, - // therefore there have to be columns in the line matrix that are completely composed of black pixels. - vector blackCount(linesMatrix->getWidth(), 0); - for (int x = BARCODE_START_OFFSET; x < linesMatrix->getWidth(); x++) { - for (int y = 0; y < linesMatrix->getHeight(); y++) { - if (linesMatrix->get(x, y)) { - blackCount[x]++; - } - } - if (blackCount[x] == linesMatrix->getHeight()) { - if (!lastWasSymbolStart) { - float currentWidth = (float)(x - symbolStart); - // Make sure we really found a symbol by asserting a minimal size of 75% of the expected symbol width. - // This might break highly distorted barcodes, but fixes an issue with barcodes where there is a - // full black column from top to bottom within a symbol. - if (currentWidth > 0.75 * symbolWidth) { - // The actual symbol width might be slightly bigger than the expected symbol width, - // but if we are more than half an expected symbol width bigger, we assume that - // we missed one or more symbols and assume that they were the expected symbol width. - while (currentWidth > 1.5 * symbolWidth) { - symbolWidths.push_back(symbolWidth); - currentWidth -= symbolWidth; - } - symbolWidths.push_back(currentWidth); - lastWasSymbolStart = true; - symbolStart = x; - } - } - } else { - if (lastWasSymbolStart) { - lastWasSymbolStart = false; - } - } - } - - // The last symbol ends at the right edge of the matrix, where there usually is no black bar. - float currentWidth = (float)(linesMatrix->getWidth() - symbolStart); - while (currentWidth > 1.5 * symbolWidth) { - symbolWidths.push_back(symbolWidth); - currentWidth -= symbolWidth; - } - symbolWidths.push_back(currentWidth); - - -#if PDF417_DIAG && OUTPUT_SYMBOL_WIDTH - { - cout << "symbols per line: " << symbolsPerLine << endl; - cout << "symbol width (" << symbolWidths.size() << "): "; - for (int i = 0; i < symbolWidths.size(); i++) { - cout << symbolWidths[i] << ", "; - } - cout << endl; - } -#endif -} - -void LinesSampler::linesMatrixToCodewords(vector >& clusterNumbers, - const int symbolsPerLine, - const vector& symbolWidths, - Ref linesMatrix, - vector >& codewords) -{ - for (int y = 0; y < linesMatrix->getHeight(); y++) { - // Not sure if this is the right way to handle this but avoids an error: - if (symbolsPerLine > (int)symbolWidths.size()) { - throw NotFoundException("Inconsistent number of symbols in this line."); - } - - // TODO: use symbolWidths.size() instead of symbolsPerLine to at least decode some codewords - - codewords[y].resize(symbolsPerLine, 0); - clusterNumbers[y].resize(symbolsPerLine, -1); - int line = y; - vector barWidths(1, 0); - int barCount = 0; - // Runlength encode the bars in the scanned linesMatrix. - // We assume that the first bar is black, as determined by the PDF417 standard. - bool isSetBar = true; - // Filter small white bars at the beginning of the barcode. - // Small white bars may occur due to small deviations in scan line sampling. - barWidths[0] += BARCODE_START_OFFSET; - for (int x = BARCODE_START_OFFSET; x < linesMatrix->getWidth(); x++) { - if (linesMatrix->get(x, line)) { - if (!isSetBar) { - isSetBar = true; - barCount++; - barWidths.resize(barWidths.size() + 1); - } - } else { - if (isSetBar) { - isSetBar = false; - barCount++; - barWidths.resize(barWidths.size() + 1); - } - - } - barWidths[barCount]++; - } - // Don't forget the last bar. - barCount++; - barWidths.resize(barWidths.size() + 1); - -#if PDF417_DIAG && OUTPUT_BAR_WIDTH - { - for (int i = 0; i < barWidths.size(); i++) { - cout << barWidths[i] << ", "; - } - cout << endl; - } -#endif - - ////////////////////////////////////////////////// - - // Find the symbols in the line by counting bar lengths until we reach symbolWidth. - // We make sure, that the last bar of a symbol is always white, as determined by the PDF417 standard. - // This helps to reduce the amount of errors done during the symbol recognition. - // The symbolWidth usually is not constant over the width of the barcode. - int cwWidth = 0; - int cwCount = 0; - vector cwStarts(symbolsPerLine, 0); - cwStarts[0] = 0; - cwCount++; - for (int i = 0; i < barCount && cwCount < symbolsPerLine; i++) { - cwWidth += barWidths[i]; - if ((float)cwWidth > symbolWidths[cwCount - 1]) { - if ((i % 2) == 1) { // check if bar is white - i++; - } - cwWidth = barWidths[i]; - cwStarts[cwCount] = i; - cwCount++; - } - } - -#if PDF417_DIAG && OUTPUT_CW_STARTS - { - for (int i = 0; i < cwStarts.size(); i++) { - cout << cwStarts[i] << ", "; - } - cout << endl; - } -#endif - - /////////////////////////////////////////// - - vector > cwRatios(symbolsPerLine); - // Distribute bar widths to modules of a codeword. - for (int i = 0; i < symbolsPerLine; i++) { - cwRatios[i].resize(BARS_IN_SYMBOL, 0.0f); - const int cwStart = cwStarts[i]; - const int cwEnd = (i == symbolsPerLine - 1) ? barCount : cwStarts[i + 1]; - const int cwLength = cwEnd - cwStart; - - if (cwLength < 7 || cwLength > 9) { - // We try to recover smybols with 7 or 9 bars and spaces with heuristics, but everything else is beyond repair. - continue; - } - - float cwWidth = 0; - - // For symbols with 9 bar length simply ignore the last bar. - for (int j = 0; j < min(BARS_IN_SYMBOL, cwLength); ++j) { - cwWidth += (float)barWidths[cwStart + j]; - } - - // If there were only 7 bars and spaces detected use the following heuristic: - // Assume the length of the symbol is symbolWidth and the last (unrecognized) bar uses all remaining space. - if (cwLength == 7) { - for (int j = 0; j < cwLength; ++j) { - cwRatios[i][j] = (float)barWidths[cwStart + j] / symbolWidths[i]; - } - cwRatios[i][7] = (symbolWidths[i] - cwWidth) / symbolWidths[i]; - } else { - for (int j = 0; j < (int)cwRatios[i].size(); ++j) { - cwRatios[i][j] = (float)barWidths[cwStart + j] / cwWidth; - } - } - - float bestMatchError = std::numeric_limits::max(); - int bestMatch = 0; - - // Search for the most possible codeword by comparing the ratios of bar size to symbol width. - // The sum of the squared differences is used as similarity metric. - // (Picture it as the square euclidian distance in the space of eight tuples where a tuple represents the bar ratios.) - for (int j = 0; j < POSSIBLE_SYMBOLS; j++) { - float error = 0.0f; - for (int k = 0; k < BARS_IN_SYMBOL; k++) { - float diff = RATIOS_TABLE[j * BARS_IN_SYMBOL + k] - cwRatios[i][k]; - error += diff * diff; - if (error >= bestMatchError) { - break; - } - } - if (error < bestMatchError) { - bestMatchError = error; - bestMatch = BitMatrixParser::SYMBOL_TABLE[j]; - } - } - codewords[y][i] = bestMatch; - clusterNumbers[y][i] = calculateClusterNumber(bestMatch); - } - } - - -#if PDF417_DIAG && OUTPUT_CLUSTER_NUMBERS - { - for (int i = 0; i < clusterNumbers.size(); i++) { - for (int j = 0; j < clusterNumbers[i].size(); j++) { - cout << clusterNumbers[i][j] << ", "; - } - cout << endl; - } - } -#endif - - -#if PDF417_DIAG - { - Ref bits(new BitMatrix(symbolsPerLine * MODULES_IN_SYMBOL, codewords.size())); - codewordsToBitMatrix(codewords, bits); - static int __cnt__ = 0; - stringstream ss; - ss << "pdf417-detectedRaw" << __cnt__++ << ".png"; - bits->writePng(ss.str().c_str(), 8, 16); - } -#endif -} - -vector > > -LinesSampler::distributeVotes(const int symbolsPerLine, - const vector >& codewords, - const vector >& clusterNumbers) -{ - // Matrix of votes for codewords which are possible at this position. - vector > > votes(1); - votes[0].resize(symbolsPerLine); - - int currentRow = 0; - map clusterNumberVotes; - int lastLineClusterNumber = -1; - - for (int y = 0; y < (int)codewords.size(); y++) { - // Vote for the most probable cluster number for this row. - clusterNumberVotes.clear(); - for (int i = 0; i < (int)codewords[y].size(); i++) { - if (clusterNumbers[y][i] != -1) { - clusterNumberVotes[clusterNumbers[y][i]] = clusterNumberVotes[clusterNumbers[y][i]] + 1; - } - } - - // Ignore lines where no codeword could be read. - if (!clusterNumberVotes.empty()) { - VoteResult voteResult = getValueWithMaxVotes(clusterNumberVotes); - bool lineClusterNumberIsIndecisive = voteResult.isIndecisive(); - int lineClusterNumber = voteResult.getVote(); - - // If there are to few votes on the lines cluster number, we keep the old one. - // This avoids switching lines because of damaged inter line readings, but - // may cause problems for barcodes with four or less rows. - if (lineClusterNumberIsIndecisive) { - lineClusterNumber = lastLineClusterNumber; - } - - if ((lineClusterNumber != ((lastLineClusterNumber + 3) % 9)) && (lastLineClusterNumber != -1)) { - lineClusterNumber = lastLineClusterNumber; - } - - // Ignore broken lines at the beginning of the barcode. - if ((lineClusterNumber == 0 && lastLineClusterNumber == -1) || (lastLineClusterNumber != -1)) { - if ((lineClusterNumber == ((lastLineClusterNumber + 3) % 9)) && (lastLineClusterNumber != -1)) { - currentRow++; - if ((int)votes.size() < currentRow + 1) { - votes.resize(currentRow + 1); - votes[currentRow].resize(symbolsPerLine); - } - } - - if ((lineClusterNumber == ((lastLineClusterNumber + 6) % 9)) && (lastLineClusterNumber != -1)) { - currentRow += 2; - if ((int)votes.size() < currentRow + 1) { - votes.resize(currentRow + 1); - votes[currentRow].resize(symbolsPerLine); - } - } - - for (int i = 0; i < (int)codewords[y].size(); i++) { - if (clusterNumbers[y][i] != -1) { - if (clusterNumbers[y][i] == lineClusterNumber) { - votes[currentRow][i][codewords[y][i]] = votes[currentRow][i][codewords[y][i]] + 1; - } else if (clusterNumbers[y][i] == ((lineClusterNumber + 3) % 9)) { - if ((int)votes.size() < currentRow + 2) { - votes.resize(currentRow + 2); - votes[currentRow + 1].resize(symbolsPerLine); - } - votes[currentRow + 1][i][codewords[y][i]] = votes[currentRow + 1][i][codewords[y][i]] + 1; - } else if ((clusterNumbers[y][i] == ((lineClusterNumber + 6) % 9)) && (currentRow > 0)) { - votes[currentRow - 1][i][codewords[y][i]] = votes[currentRow - 1][i][codewords[y][i]] + 1; - } - } - } - lastLineClusterNumber = lineClusterNumber; - } - } - } - - return votes; -} - - -vector -LinesSampler::findMissingLines(const int symbolsPerLine, vector > &detectedCodeWords) { - vector insertLinesAt; - if (detectedCodeWords.size() > 1) { - for (int i = 0; i < (int)detectedCodeWords.size() - 1; i++) { - int clusterNumberRow = -1; - for (int j = 0; j < (int)detectedCodeWords[i].size() && clusterNumberRow == -1; j++) { - int clusterNumber = calculateClusterNumber(detectedCodeWords[i][j]); - if (clusterNumber != -1) { - clusterNumberRow = clusterNumber; - } - } - if (i == 0) { - // The first line must have the cluster number 0. Insert empty lines to match this. - if (clusterNumberRow > 0) { - insertLinesAt.push_back(0); - if (clusterNumberRow > 3) { - insertLinesAt.push_back(0); - } - } - } - int clusterNumberNextRow = -1; - for (int j = 0; j < (int)detectedCodeWords[i + 1].size() && clusterNumberNextRow == -1; j++) { - int clusterNumber = calculateClusterNumber(detectedCodeWords[i + 1][j]); - if (clusterNumber != -1) { - clusterNumberNextRow = clusterNumber; - } - } - if ((clusterNumberRow + 3) % 9 != clusterNumberNextRow - && clusterNumberRow != -1 - && clusterNumberNextRow != -1) { - // The cluster numbers are not consecutive. Insert an empty line between them. - insertLinesAt.push_back(i + 1); - if (clusterNumberRow == clusterNumberNextRow) { - // There may be two lines missing. This is detected when two consecutive lines have the same cluster number. - insertLinesAt.push_back(i + 1); - } - } - } - } - - for (int i = 0; i < (int)insertLinesAt.size(); i++) { - detectedCodeWords.insert(detectedCodeWords.begin() + insertLinesAt[i] + i, vector(symbolsPerLine, 0)); - } - - return insertLinesAt; -} - -int LinesSampler::decodeRowCount(const int symbolsPerLine, vector > &detectedCodeWords, vector &insertLinesAt) -{ - // Use the information in the first and last column to determin the number of rows and find more missing rows. - // For missing rows insert blank space, so the error correction can try to fill them in. - - map rowCountVotes; - map ecLevelVotes; - map rowNumberVotes; - int lastRowNumber = -1; - insertLinesAt.clear(); - - for (int i = 0; i + 2 < (int)detectedCodeWords.size(); i += 3) { - rowNumberVotes.clear(); - int firstCodewordDecodedLeft = -1; - int secondCodewordDecodedLeft = -1; - int thirdCodewordDecodedLeft = -1; - int firstCodewordDecodedRight = -1; - int secondCodewordDecodedRight = -1; - int thirdCodewordDecodedRight = -1; - - if (detectedCodeWords[i][0] != 0) { - firstCodewordDecodedLeft = BitMatrixParser::getCodeword(detectedCodeWords[i][0]); - } - if (detectedCodeWords[i + 1][0] != 0) { - secondCodewordDecodedLeft = BitMatrixParser::getCodeword(detectedCodeWords[i + 1][0]); - } - if (detectedCodeWords[i + 2][0] != 0) { - thirdCodewordDecodedLeft = BitMatrixParser::getCodeword(detectedCodeWords[i + 2][0]); - } - - if (detectedCodeWords[i][detectedCodeWords[i].size() - 1] != 0) { - firstCodewordDecodedRight = BitMatrixParser::getCodeword(detectedCodeWords[i][detectedCodeWords[i].size() - 1]); - } - if (detectedCodeWords[i + 1][detectedCodeWords[i + 1].size() - 1] != 0) { - secondCodewordDecodedRight = BitMatrixParser::getCodeword(detectedCodeWords[i + 1][detectedCodeWords[i + 1].size() - 1]); - } - if (detectedCodeWords[i + 2][detectedCodeWords[i + 2].size() - 1] != 0) { - thirdCodewordDecodedRight = BitMatrixParser::getCodeword(detectedCodeWords[i + 2][detectedCodeWords[i + 2].size() - 1]); - } - - if (firstCodewordDecodedLeft != -1 && secondCodewordDecodedLeft != -1) { - int leftRowCount = ((firstCodewordDecodedLeft % 30) * 3) + ((secondCodewordDecodedLeft % 30) % 3); - int leftECLevel = (secondCodewordDecodedLeft % 30) / 3; - - rowCountVotes[leftRowCount] = rowCountVotes[leftRowCount] + 1; - ecLevelVotes[leftECLevel] = ecLevelVotes[leftECLevel] + 1; - } - - if (secondCodewordDecodedRight != -1 && thirdCodewordDecodedRight != -1) { - int rightRowCount = ((secondCodewordDecodedRight % 30) * 3) + ((thirdCodewordDecodedRight % 30) % 3); - int rightECLevel = (thirdCodewordDecodedRight % 30) / 3; - - rowCountVotes[rightRowCount] = rowCountVotes[rightRowCount] + 1; - ecLevelVotes[rightECLevel] = ecLevelVotes[rightECLevel] + 1; - } - - if (firstCodewordDecodedLeft != -1) { - int rowNumber = firstCodewordDecodedLeft / 30; - rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1; - } - if (secondCodewordDecodedLeft != -1) { - int rowNumber = secondCodewordDecodedLeft / 30; - rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1; - } - if (thirdCodewordDecodedLeft != -1) { - int rowNumber = thirdCodewordDecodedLeft / 30; - rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1; - } - if (firstCodewordDecodedRight != -1) { - int rowNumber = firstCodewordDecodedRight / 30; - rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1; - } - if (secondCodewordDecodedRight != -1) { - int rowNumber = secondCodewordDecodedRight / 30; - rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1; - } - if (thirdCodewordDecodedRight != -1) { - int rowNumber = thirdCodewordDecodedRight / 30; - rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1; - } - int rowNumber = getValueWithMaxVotes(rowNumberVotes).getVote(); - if (lastRowNumber + 1 < rowNumber) { - for (int j = lastRowNumber + 1; j < rowNumber; j++) { - insertLinesAt.push_back(i); - insertLinesAt.push_back(i); - insertLinesAt.push_back(i); - } - } - lastRowNumber = rowNumber; - } - - for (int i = 0; i < (int)insertLinesAt.size(); i++) { - detectedCodeWords.insert(detectedCodeWords.begin() + insertLinesAt[i] + i, vector(symbolsPerLine, 0)); - } - - int rowCount = getValueWithMaxVotes(rowCountVotes).getVote(); - // int ecLevel = getValueWithMaxVotes(ecLevelVotes); - -#if PDF417_DIAG && OUTPUT_EC_LEVEL - { - cout << "EC Level: " << ecLevel << " (" << ((1 << (ecLevel + 1)) - 2) << " EC Codewords)" << endl; - } -#endif - rowCount += 1; - return rowCount; -} - -/** - * Ends up being a bit faster than Math.round(). This merely rounds its - * argument to the nearest int, where x.5 rounds up. - */ -int LinesSampler::round(float d) -{ - return (int)(d + 0.5f); -} - -Point LinesSampler::intersection(Line a, Line b) { - float dxa = a.start.x - a.end.x; - float dxb = b.start.x - b.end.x; - float dya = a.start.y - a.end.y; - float dyb = b.start.y - b.end.y; - - float p = a.start.x * a.end.y - a.start.y * a.end.x; - float q = b.start.x * b.end.y - b.start.y * b.end.x; - float denom = dxa * dyb - dya * dxb; - if(abs(denom) < 1e-12) // Lines don't intersect (replaces "denom == 0") - return Point(std::numeric_limits::infinity(), - std::numeric_limits::infinity()); - - float x = (p * dxb - dxa * q) / denom; - float y = (p * dyb - dya * q) / denom; - - return Point(x, y); -} diff --git a/cpp/core/src/zxing/pdf417/detector/LinesSampler.h b/cpp/core/src/zxing/pdf417/detector/LinesSampler.h deleted file mode 100644 index b2de4bdbb..000000000 --- a/cpp/core/src/zxing/pdf417/detector/LinesSampler.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef __LINESSAMPLER_H__ -#define __LINESSAMPLER_H__ - -/* - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace pdf417 { -namespace detector { - -class LinesSampler { -private: - static const int MODULES_IN_SYMBOL = 17; - static const int BARS_IN_SYMBOL = 8; - static const int POSSIBLE_SYMBOLS = 2787; - static const std::vector RATIOS_TABLE; - static std::vector init_ratios_table(); - static const int BARCODE_START_OFFSET = 2; - - Ref linesMatrix_; - int symbolsPerLine_; - int dimension_; - - static std::vector > findVertices(Ref matrix, int rowStep); - static std::vector > findVertices180(Ref matrix, int rowStep); - - static ArrayRef findGuardPattern(Ref matrix, - int column, - int row, - int width, - bool whiteFirst, - const int pattern[], - int patternSize, - ArrayRef counters); - static int patternMatchVariance(ArrayRef counters, const int pattern[], - int maxIndividualVariance); - - static void correctVertices(Ref matrix, - std::vector > &vertices, - bool upsideDown); - static void findWideBarTopBottom(Ref matrix, - std::vector > &vertices, - int offsetVertice, - int startWideBar, - int lenWideBar, - int lenPattern, - int nIncrement); - static void findCrossingPoint(std::vector > &vertices, - int idxResult, - int idxLineA1,int idxLineA2, - int idxLineB1,int idxLineB2, - Ref matrix); - static float computeModuleWidth(std::vector > &vertices); - static int computeDimension(Ref topLeft, - Ref topRight, - Ref bottomLeft, - Ref bottomRight, - float moduleWidth); - int computeYDimension(Ref topLeft, - Ref topRight, - Ref bottomLeft, - Ref bottomRight, - float moduleWidth); - - Ref sampleLines(std::vector > const &vertices, - int dimensionY, - int dimension); - - static void codewordsToBitMatrix(std::vector > &codewords, - Ref &matrix); - static int calculateClusterNumber(int codeword); - static Ref sampleGrid(Ref image, - int dimension); - static void computeSymbolWidths(std::vector& symbolWidths, - const int symbolsPerLine, Ref linesMatrix); - static void linesMatrixToCodewords(std::vector > &clusterNumbers, - const int symbolsPerLine, - const std::vector &symbolWidths, - Ref linesMatrix, - std::vector > &codewords); - static std::vector > > - distributeVotes(const int symbolsPerLine, - const std::vector >& codewords, - const std::vector >& clusterNumbers); - static std::vector - findMissingLines(const int symbolsPerLine, - std::vector > &detectedCodeWords); - static int decodeRowCount(const int symbolsPerLine, - std::vector > &detectedCodeWords, - std::vector &insertLinesAt); - - static int round(float d); - static Point intersection(Line a, Line b); - -public: - LinesSampler(Ref linesMatrix, int dimension); - Ref sample(); -}; - -} -} -} - -#endif // __LINESSAMPLER_H__ diff --git a/cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp b/cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp deleted file mode 100644 index 16659a131..000000000 --- a/cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * ErrorCorrectionLevel.cpp - * zxing - * - * Created by Christian Brunschen on 15/05/2008. - * Copyright 2008-2011 ZXing authors All rights reserved. - * - * 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 - -using std::string; - -namespace zxing { -namespace qrcode { - -ErrorCorrectionLevel::ErrorCorrectionLevel(int inOrdinal, - int bits, - char const* name) : - ordinal_(inOrdinal), bits_(bits), name_(name) {} - -int ErrorCorrectionLevel::ordinal() const { - return ordinal_; -} - -int ErrorCorrectionLevel::bits() const { - return bits_; -} - -string const& ErrorCorrectionLevel::name() const { - return name_; -} - -ErrorCorrectionLevel::operator string const& () const { - return name_; -} - -ErrorCorrectionLevel& ErrorCorrectionLevel::forBits(int bits) { - if (bits < 0 || bits >= N_LEVELS) { - throw ReaderException("Ellegal error correction level bits"); - } - return *FOR_BITS[bits]; -} - - ErrorCorrectionLevel ErrorCorrectionLevel::L(0, 0x01, "L"); - ErrorCorrectionLevel ErrorCorrectionLevel::M(1, 0x00, "M"); - ErrorCorrectionLevel ErrorCorrectionLevel::Q(2, 0x03, "Q"); - ErrorCorrectionLevel ErrorCorrectionLevel::H(3, 0x02, "H"); -ErrorCorrectionLevel *ErrorCorrectionLevel::FOR_BITS[] = { &M, &L, &H, &Q }; -int ErrorCorrectionLevel::N_LEVELS = 4; - -} -} diff --git a/cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h b/cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h deleted file mode 100644 index ad8d64e21..000000000 --- a/cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef __ERROR_CORRECTION_LEVEL_H__ -#define __ERROR_CORRECTION_LEVEL_H__ - -/* - * ErrorCorrectionLevel.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -namespace qrcode { - -class ErrorCorrectionLevel { -private: - int ordinal_; - int bits_; - std::string name_; - ErrorCorrectionLevel(int inOrdinal, int bits, char const* name); - static ErrorCorrectionLevel *FOR_BITS[]; - static int N_LEVELS; -public: - static ErrorCorrectionLevel L; - static ErrorCorrectionLevel M; - static ErrorCorrectionLevel Q; - static ErrorCorrectionLevel H; - - int ordinal() const; - int bits() const; - std::string const& name() const; - operator std::string const& () const; - - static ErrorCorrectionLevel& forBits(int bits); -}; -} -} - -#endif // __ERROR_CORRECTION_LEVEL_H__ diff --git a/cpp/core/src/zxing/qrcode/FormatInformation.cpp b/cpp/core/src/zxing/qrcode/FormatInformation.cpp deleted file mode 100644 index a2b653c1d..000000000 --- a/cpp/core/src/zxing/qrcode/FormatInformation.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * FormatInformation.cpp - * zxing - * - * Created by Christian Brunschen on 18/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace qrcode { - -using namespace std; - -int FormatInformation::FORMAT_INFO_MASK_QR = 0x5412; -int FormatInformation::FORMAT_INFO_DECODE_LOOKUP[][2] = { { 0x5412, 0x00 }, { 0x5125, 0x01 }, { 0x5E7C, 0x02 }, { - 0x5B4B, 0x03 }, { 0x45F9, 0x04 }, { 0x40CE, 0x05 }, { 0x4F97, 0x06 }, { 0x4AA0, 0x07 }, { 0x77C4, 0x08 }, { - 0x72F3, 0x09 }, { 0x7DAA, 0x0A }, { 0x789D, 0x0B }, { 0x662F, 0x0C }, { 0x6318, 0x0D }, { 0x6C41, 0x0E }, { - 0x6976, 0x0F }, { 0x1689, 0x10 }, { 0x13BE, 0x11 }, { 0x1CE7, 0x12 }, { 0x19D0, 0x13 }, { 0x0762, 0x14 }, { - 0x0255, 0x15 }, { 0x0D0C, 0x16 }, { 0x083B, 0x17 }, { 0x355F, 0x18 }, { 0x3068, 0x19 }, { 0x3F31, 0x1A }, { - 0x3A06, 0x1B }, { 0x24B4, 0x1C }, { 0x2183, 0x1D }, { 0x2EDA, 0x1E }, { 0x2BED, 0x1F }, -}; -int FormatInformation::N_FORMAT_INFO_DECODE_LOOKUPS = 32; - -int FormatInformation::BITS_SET_IN_HALF_BYTE[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; - -FormatInformation::FormatInformation(int formatInfo) : - errorCorrectionLevel_(ErrorCorrectionLevel::forBits((formatInfo >> 3) & 0x03)), dataMask_((char)(formatInfo & 0x07)) { -} - -ErrorCorrectionLevel& FormatInformation::getErrorCorrectionLevel() { - return errorCorrectionLevel_; -} - -char FormatInformation::getDataMask() { - return dataMask_; -} - -int FormatInformation::numBitsDiffering(int a, int b) { - a ^= b; - return BITS_SET_IN_HALF_BYTE[a & 0x0F] + BITS_SET_IN_HALF_BYTE[(a >> 4 & 0x0F)] + BITS_SET_IN_HALF_BYTE[(a >> 8 - & 0x0F)] + BITS_SET_IN_HALF_BYTE[(a >> 12 & 0x0F)] + BITS_SET_IN_HALF_BYTE[(a >> 16 & 0x0F)] - + BITS_SET_IN_HALF_BYTE[(a >> 20 & 0x0F)] + BITS_SET_IN_HALF_BYTE[(a >> 24 & 0x0F)] - + BITS_SET_IN_HALF_BYTE[(a >> 28 & 0x0F)]; -} - -Ref FormatInformation::decodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2) { - Ref result(doDecodeFormatInformation(maskedFormatInfo1, maskedFormatInfo2)); - if (result != 0) { - return result; - } - // Should return null, but, some QR codes apparently - // do not mask this info. Try again by actually masking the pattern - // first - return doDecodeFormatInformation(maskedFormatInfo1 ^ FORMAT_INFO_MASK_QR, - maskedFormatInfo2 ^ FORMAT_INFO_MASK_QR); -} -Ref FormatInformation::doDecodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2) { - // Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing - int bestDifference = numeric_limits::max(); - int bestFormatInfo = 0; - for (int i = 0; i < N_FORMAT_INFO_DECODE_LOOKUPS; i++) { - int* decodeInfo = FORMAT_INFO_DECODE_LOOKUP[i]; - int targetInfo = decodeInfo[0]; - if (targetInfo == maskedFormatInfo1 || targetInfo == maskedFormatInfo2) { - // Found an exact match - Ref result(new FormatInformation(decodeInfo[1])); - return result; - } - int bitsDifference = numBitsDiffering(maskedFormatInfo1, targetInfo); - if (bitsDifference < bestDifference) { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - if (maskedFormatInfo1 != maskedFormatInfo2) { - // also try the other option - bitsDifference = numBitsDiffering(maskedFormatInfo2, targetInfo); - if (bitsDifference < bestDifference) { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - } - } - if (bestDifference <= 3) { - Ref result(new FormatInformation(bestFormatInfo)); - return result; - } - Ref result; - return result; -} - -bool operator==(const FormatInformation &a, const FormatInformation &b) { - return &(a.errorCorrectionLevel_) == &(b.errorCorrectionLevel_) && a.dataMask_ == b.dataMask_; -} - -ostream& operator<<(ostream& out, const FormatInformation& fi) { - const FormatInformation *fip = &fi; - out << "FormatInformation @ " << fip; - return out; -} - -} -} diff --git a/cpp/core/src/zxing/qrcode/FormatInformation.h b/cpp/core/src/zxing/qrcode/FormatInformation.h deleted file mode 100644 index 7770472c7..000000000 --- a/cpp/core/src/zxing/qrcode/FormatInformation.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef __FORMAT_INFORMATION_H__ -#define __FORMAT_INFORMATION_H__ - -/* - * FormatInformation.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace qrcode { - -class FormatInformation : public Counted { -private: - static int FORMAT_INFO_MASK_QR; - static int FORMAT_INFO_DECODE_LOOKUP[][2]; - static int N_FORMAT_INFO_DECODE_LOOKUPS; - static int BITS_SET_IN_HALF_BYTE[]; - - ErrorCorrectionLevel &errorCorrectionLevel_; - char dataMask_; - - FormatInformation(int formatInfo); - -public: - static int numBitsDiffering(int a, int b); - static Ref decodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2); - static Ref doDecodeFormatInformation(int maskedFormatInfo1, int maskedFormatInfo2); - ErrorCorrectionLevel &getErrorCorrectionLevel(); - char getDataMask(); - friend bool operator==(const FormatInformation &a, const FormatInformation &b); - friend std::ostream& operator<<(std::ostream& out, const FormatInformation& fi); -}; -} -} - -#endif // __FORMAT_INFORMATION_H__ diff --git a/cpp/core/src/zxing/qrcode/QRCodeReader.cpp b/cpp/core/src/zxing/qrcode/QRCodeReader.cpp deleted file mode 100644 index 0e647ea33..000000000 --- a/cpp/core/src/zxing/qrcode/QRCodeReader.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * QRCodeReader.cpp - * zxing - * - * Created by Christian Brunschen on 20/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include - -#include - -namespace zxing { - namespace qrcode { - - using namespace std; - - QRCodeReader::QRCodeReader() :decoder_() { - } - //TODO: see if any of the other files in the qrcode tree need tryHarder - Ref QRCodeReader::decode(Ref image, DecodeHints hints) { - Detector detector(image->getBlackMatrix()); - Ref detectorResult(detector.detect(hints)); - ArrayRef< Ref > points (detectorResult->getPoints()); - Ref decoderResult(decoder_.decode(detectorResult->getBits())); - Ref result( - new Result(decoderResult->getText(), decoderResult->getRawBytes(), points, BarcodeFormat::QR_CODE)); - return result; - } - - QRCodeReader::~QRCodeReader() { - } - - Decoder& QRCodeReader::getDecoder() { - return decoder_; - } - } -} diff --git a/cpp/core/src/zxing/qrcode/QRCodeReader.h b/cpp/core/src/zxing/qrcode/QRCodeReader.h deleted file mode 100644 index d5f9b863f..000000000 --- a/cpp/core/src/zxing/qrcode/QRCodeReader.h +++ /dev/null @@ -1,48 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __QR_CODE_READER_H__ -#define __QR_CODE_READER_H__ - -/* - * QRCodeReader.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace qrcode { - -class QRCodeReader : public Reader { - private: - Decoder decoder_; - - protected: - Decoder& getDecoder(); - - public: - QRCodeReader(); - virtual ~QRCodeReader(); - - Ref decode(Ref image, DecodeHints hints); -}; - -} -} - -#endif // __QR_CODE_READER_H__ diff --git a/cpp/core/src/zxing/qrcode/Version.cpp b/cpp/core/src/zxing/qrcode/Version.cpp deleted file mode 100644 index 39d6e8f75..000000000 --- a/cpp/core/src/zxing/qrcode/Version.cpp +++ /dev/null @@ -1,560 +0,0 @@ -/* - * Version.cpp - * zxing - * - * Created by Christian Brunschen on 14/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -using std::vector; -using std::numeric_limits; - -namespace zxing { -namespace qrcode { - -ECB::ECB(int count, int dataCodewords) : - count_(count), dataCodewords_(dataCodewords) { -} - -int ECB::getCount() { - return count_; -} - -int ECB::getDataCodewords() { - return dataCodewords_; -} - -ECBlocks::ECBlocks(int ecCodewords, ECB *ecBlocks) : - ecCodewords_(ecCodewords), ecBlocks_(1, ecBlocks) { -} - -ECBlocks::ECBlocks(int ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2) : - ecCodewords_(ecCodewords), ecBlocks_(1, ecBlocks1) { - ecBlocks_.push_back(ecBlocks2); -} - -int ECBlocks::getECCodewords() { - return ecCodewords_; -} - -std::vector& ECBlocks::getECBlocks() { - return ecBlocks_; -} - -ECBlocks::~ECBlocks() { - for (size_t i = 0; i < ecBlocks_.size(); i++) { - delete ecBlocks_[i]; - } -} - -unsigned int Version::VERSION_DECODE_INFO[] = { 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847, 0x0E60D, - 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, - 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, 0x2542E, 0x26A64, - 0x27541, 0x28C69 - }; -int Version::N_VERSION_DECODE_INFOS = 34; -vector > Version::VERSIONS; -static int N_VERSIONS = Version::buildVersions(); - -int Version::getVersionNumber() { - return versionNumber_; -} - -vector &Version::getAlignmentPatternCenters() { - return alignmentPatternCenters_; -} - -int Version::getTotalCodewords() { - return totalCodewords_; -} - -int Version::getDimensionForVersion() { - return 17 + 4 * versionNumber_; -} - -ECBlocks& Version::getECBlocksForLevel(ErrorCorrectionLevel &ecLevel) { - return *ecBlocks_[ecLevel.ordinal()]; -} - -Version *Version::getProvisionalVersionForDimension(int dimension) { - if (dimension % 4 != 1) { - throw FormatException(); - } - try { - return Version::getVersionForNumber((dimension - 17) >> 2); - } catch (IllegalArgumentException const& ignored) { - (void)ignored; - throw FormatException(); - } -} - -Version *Version::getVersionForNumber(int versionNumber) { - if (versionNumber < 1 || versionNumber > N_VERSIONS) { - throw ReaderException("versionNumber must be between 1 and 40"); - } - - return VERSIONS[versionNumber - 1]; -} - -Version::Version(int versionNumber, vector *alignmentPatternCenters, ECBlocks *ecBlocks1, ECBlocks *ecBlocks2, - ECBlocks *ecBlocks3, ECBlocks *ecBlocks4) : - versionNumber_(versionNumber), alignmentPatternCenters_(*alignmentPatternCenters), ecBlocks_(4), totalCodewords_(0) { - ecBlocks_[0] = ecBlocks1; - ecBlocks_[1] = ecBlocks2; - ecBlocks_[2] = ecBlocks3; - ecBlocks_[3] = ecBlocks4; - - int total = 0; - int ecCodewords = ecBlocks1->getECCodewords(); - vector &ecbArray = ecBlocks1->getECBlocks(); - for (size_t i = 0; i < ecbArray.size(); i++) { - ECB *ecBlock = ecbArray[i]; - total += ecBlock->getCount() * (ecBlock->getDataCodewords() + ecCodewords); - } - totalCodewords_ = total; -} - -Version::~Version() { - delete &alignmentPatternCenters_; - for (size_t i = 0; i < ecBlocks_.size(); i++) { - delete ecBlocks_[i]; - } -} - -Version *Version::decodeVersionInformation(unsigned int versionBits) { - int bestDifference = numeric_limits::max(); - size_t bestVersion = 0; - for (int i = 0; i < N_VERSION_DECODE_INFOS; i++) { - unsigned targetVersion = VERSION_DECODE_INFO[i]; - // Do the version info bits match exactly? done. - if (targetVersion == versionBits) { - return getVersionForNumber(i + 7); - } - // Otherwise see if this is the closest to a real version info bit - // string we have seen so far - int bitsDifference = FormatInformation::numBitsDiffering(versionBits, targetVersion); - if (bitsDifference < bestDifference) { - bestVersion = i + 7; - bestDifference = bitsDifference; - } - } - // We can tolerate up to 3 bits of error since no two version info codewords will - // differ in less than 4 bits. - if (bestDifference <= 3) { - return getVersionForNumber(bestVersion); - } - // If we didn't find a close enough match, fail - return 0; -} - -Ref Version::buildFunctionPattern() { - int dimension = getDimensionForVersion(); - Ref functionPattern(new BitMatrix(dimension)); - - - // Top left finder pattern + separator + format - functionPattern->setRegion(0, 0, 9, 9); - // Top right finder pattern + separator + format - functionPattern->setRegion(dimension - 8, 0, 8, 9); - // Bottom left finder pattern + separator + format - functionPattern->setRegion(0, dimension - 8, 9, 8); - - - // Alignment patterns - size_t max = alignmentPatternCenters_.size(); - for (size_t x = 0; x < max; x++) { - int i = alignmentPatternCenters_[x] - 2; - for (size_t y = 0; y < max; y++) { - if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { - // No alignment patterns near the three finder patterns - continue; - } - functionPattern->setRegion(alignmentPatternCenters_[y] - 2, i, 5, 5); - } - } - - // Vertical timing pattern - functionPattern->setRegion(6, 9, 1, dimension - 17); - // Horizontal timing pattern - functionPattern->setRegion(9, 6, dimension - 17, 1); - - if (versionNumber_ > 6) { - // Version info, top right - functionPattern->setRegion(dimension - 11, 0, 3, 6); - // Version info, bottom left - functionPattern->setRegion(0, dimension - 11, 6, 3); - } - - return functionPattern; -} - -static vector *intArray(size_t n...) { - va_list ap; - va_start(ap, n); - vector *result = new vector(n); - for (size_t i = 0; i < n; i++) { - (*result)[i] = va_arg(ap, int); - } - va_end(ap); - return result; -} - -int Version::buildVersions() { - VERSIONS.push_back(Ref(new Version(1, intArray(0), - new ECBlocks(7, new ECB(1, 19)), - new ECBlocks(10, new ECB(1, 16)), - new ECBlocks(13, new ECB(1, 13)), - new ECBlocks(17, new ECB(1, 9))))); - VERSIONS.push_back(Ref(new Version(2, intArray(2, 6, 18), - new ECBlocks(10, new ECB(1, 34)), - new ECBlocks(16, new ECB(1, 28)), - new ECBlocks(22, new ECB(1, 22)), - new ECBlocks(28, new ECB(1, 16))))); - VERSIONS.push_back(Ref(new Version(3, intArray(2, 6, 22), - new ECBlocks(15, new ECB(1, 55)), - new ECBlocks(26, new ECB(1, 44)), - new ECBlocks(18, new ECB(2, 17)), - new ECBlocks(22, new ECB(2, 13))))); - VERSIONS.push_back(Ref(new Version(4, intArray(2, 6, 26), - new ECBlocks(20, new ECB(1, 80)), - new ECBlocks(18, new ECB(2, 32)), - new ECBlocks(26, new ECB(2, 24)), - new ECBlocks(16, new ECB(4, 9))))); - VERSIONS.push_back(Ref(new Version(5, intArray(2, 6, 30), - new ECBlocks(26, new ECB(1, 108)), - new ECBlocks(24, new ECB(2, 43)), - new ECBlocks(18, new ECB(2, 15), - new ECB(2, 16)), - new ECBlocks(22, new ECB(2, 11), - new ECB(2, 12))))); - VERSIONS.push_back(Ref(new Version(6, intArray(2, 6, 34), - new ECBlocks(18, new ECB(2, 68)), - new ECBlocks(16, new ECB(4, 27)), - new ECBlocks(24, new ECB(4, 19)), - new ECBlocks(28, new ECB(4, 15))))); - VERSIONS.push_back(Ref(new Version(7, intArray(3, 6, 22, 38), - new ECBlocks(20, new ECB(2, 78)), - new ECBlocks(18, new ECB(4, 31)), - new ECBlocks(18, new ECB(2, 14), - new ECB(4, 15)), - new ECBlocks(26, new ECB(4, 13), - new ECB(1, 14))))); - VERSIONS.push_back(Ref(new Version(8, intArray(3, 6, 24, 42), - new ECBlocks(24, new ECB(2, 97)), - new ECBlocks(22, new ECB(2, 38), - new ECB(2, 39)), - new ECBlocks(22, new ECB(4, 18), - new ECB(2, 19)), - new ECBlocks(26, new ECB(4, 14), - new ECB(2, 15))))); - VERSIONS.push_back(Ref(new Version(9, intArray(3, 6, 26, 46), - new ECBlocks(30, new ECB(2, 116)), - new ECBlocks(22, new ECB(3, 36), - new ECB(2, 37)), - new ECBlocks(20, new ECB(4, 16), - new ECB(4, 17)), - new ECBlocks(24, new ECB(4, 12), - new ECB(4, 13))))); - VERSIONS.push_back(Ref(new Version(10, intArray(3, 6, 28, 50), - new ECBlocks(18, new ECB(2, 68), - new ECB(2, 69)), - new ECBlocks(26, new ECB(4, 43), - new ECB(1, 44)), - new ECBlocks(24, new ECB(6, 19), - new ECB(2, 20)), - new ECBlocks(28, new ECB(6, 15), - new ECB(2, 16))))); - VERSIONS.push_back(Ref(new Version(11, intArray(3, 6, 30, 54), - new ECBlocks(20, new ECB(4, 81)), - new ECBlocks(30, new ECB(1, 50), - new ECB(4, 51)), - new ECBlocks(28, new ECB(4, 22), - new ECB(4, 23)), - new ECBlocks(24, new ECB(3, 12), - new ECB(8, 13))))); - VERSIONS.push_back(Ref(new Version(12, intArray(3, 6, 32, 58), - new ECBlocks(24, new ECB(2, 92), - new ECB(2, 93)), - new ECBlocks(22, new ECB(6, 36), - new ECB(2, 37)), - new ECBlocks(26, new ECB(4, 20), - new ECB(6, 21)), - new ECBlocks(28, new ECB(7, 14), - new ECB(4, 15))))); - VERSIONS.push_back(Ref(new Version(13, intArray(3, 6, 34, 62), - new ECBlocks(26, new ECB(4, 107)), - new ECBlocks(22, new ECB(8, 37), - new ECB(1, 38)), - new ECBlocks(24, new ECB(8, 20), - new ECB(4, 21)), - new ECBlocks(22, new ECB(12, 11), - new ECB(4, 12))))); - VERSIONS.push_back(Ref(new Version(14, intArray(4, 6, 26, 46, 66), - new ECBlocks(30, new ECB(3, 115), - new ECB(1, 116)), - new ECBlocks(24, new ECB(4, 40), - new ECB(5, 41)), - new ECBlocks(20, new ECB(11, 16), - new ECB(5, 17)), - new ECBlocks(24, new ECB(11, 12), - new ECB(5, 13))))); - VERSIONS.push_back(Ref(new Version(15, intArray(4, 6, 26, 48, 70), - new ECBlocks(22, new ECB(5, 87), - new ECB(1, 88)), - new ECBlocks(24, new ECB(5, 41), - new ECB(5, 42)), - new ECBlocks(30, new ECB(5, 24), - new ECB(7, 25)), - new ECBlocks(24, new ECB(11, 12), - new ECB(7, 13))))); - VERSIONS.push_back(Ref(new Version(16, intArray(4, 6, 26, 50, 74), - new ECBlocks(24, new ECB(5, 98), - new ECB(1, 99)), - new ECBlocks(28, new ECB(7, 45), - new ECB(3, 46)), - new ECBlocks(24, new ECB(15, 19), - new ECB(2, 20)), - new ECBlocks(30, new ECB(3, 15), - new ECB(13, 16))))); - VERSIONS.push_back(Ref(new Version(17, intArray(4, 6, 30, 54, 78), - new ECBlocks(28, new ECB(1, 107), - new ECB(5, 108)), - new ECBlocks(28, new ECB(10, 46), - new ECB(1, 47)), - new ECBlocks(28, new ECB(1, 22), - new ECB(15, 23)), - new ECBlocks(28, new ECB(2, 14), - new ECB(17, 15))))); - VERSIONS.push_back(Ref(new Version(18, intArray(4, 6, 30, 56, 82), - new ECBlocks(30, new ECB(5, 120), - new ECB(1, 121)), - new ECBlocks(26, new ECB(9, 43), - new ECB(4, 44)), - new ECBlocks(28, new ECB(17, 22), - new ECB(1, 23)), - new ECBlocks(28, new ECB(2, 14), - new ECB(19, 15))))); - VERSIONS.push_back(Ref(new Version(19, intArray(4, 6, 30, 58, 86), - new ECBlocks(28, new ECB(3, 113), - new ECB(4, 114)), - new ECBlocks(26, new ECB(3, 44), - new ECB(11, 45)), - new ECBlocks(26, new ECB(17, 21), - new ECB(4, 22)), - new ECBlocks(26, new ECB(9, 13), - new ECB(16, 14))))); - VERSIONS.push_back(Ref(new Version(20, intArray(4, 6, 34, 62, 90), - new ECBlocks(28, new ECB(3, 107), - new ECB(5, 108)), - new ECBlocks(26, new ECB(3, 41), - new ECB(13, 42)), - new ECBlocks(30, new ECB(15, 24), - new ECB(5, 25)), - new ECBlocks(28, new ECB(15, 15), - new ECB(10, 16))))); - VERSIONS.push_back(Ref(new Version(21, intArray(5, 6, 28, 50, 72, 94), - new ECBlocks(28, new ECB(4, 116), - new ECB(4, 117)), - new ECBlocks(26, new ECB(17, 42)), - new ECBlocks(28, new ECB(17, 22), - new ECB(6, 23)), - new ECBlocks(30, new ECB(19, 16), - new ECB(6, 17))))); - VERSIONS.push_back(Ref(new Version(22, intArray(5, 6, 26, 50, 74, 98), - new ECBlocks(28, new ECB(2, 111), - new ECB(7, 112)), - new ECBlocks(28, new ECB(17, 46)), - new ECBlocks(30, new ECB(7, 24), - new ECB(16, 25)), - new ECBlocks(24, new ECB(34, 13))))); - VERSIONS.push_back(Ref(new Version(23, intArray(5, 6, 30, 54, 78, 102), - new ECBlocks(30, new ECB(4, 121), - new ECB(5, 122)), - new ECBlocks(28, new ECB(4, 47), - new ECB(14, 48)), - new ECBlocks(30, new ECB(11, 24), - new ECB(14, 25)), - new ECBlocks(30, new ECB(16, 15), - new ECB(14, 16))))); - VERSIONS.push_back(Ref(new Version(24, intArray(5, 6, 28, 54, 80, 106), - new ECBlocks(30, new ECB(6, 117), - new ECB(4, 118)), - new ECBlocks(28, new ECB(6, 45), - new ECB(14, 46)), - new ECBlocks(30, new ECB(11, 24), - new ECB(16, 25)), - new ECBlocks(30, new ECB(30, 16), - new ECB(2, 17))))); - VERSIONS.push_back(Ref(new Version(25, intArray(5, 6, 32, 58, 84, 110), - new ECBlocks(26, new ECB(8, 106), - new ECB(4, 107)), - new ECBlocks(28, new ECB(8, 47), - new ECB(13, 48)), - new ECBlocks(30, new ECB(7, 24), - new ECB(22, 25)), - new ECBlocks(30, new ECB(22, 15), - new ECB(13, 16))))); - VERSIONS.push_back(Ref(new Version(26, intArray(5, 6, 30, 58, 86, 114), - new ECBlocks(28, new ECB(10, 114), - new ECB(2, 115)), - new ECBlocks(28, new ECB(19, 46), - new ECB(4, 47)), - new ECBlocks(28, new ECB(28, 22), - new ECB(6, 23)), - new ECBlocks(30, new ECB(33, 16), - new ECB(4, 17))))); - VERSIONS.push_back(Ref(new Version(27, intArray(5, 6, 34, 62, 90, 118), - new ECBlocks(30, new ECB(8, 122), - new ECB(4, 123)), - new ECBlocks(28, new ECB(22, 45), - new ECB(3, 46)), - new ECBlocks(30, new ECB(8, 23), - new ECB(26, 24)), - new ECBlocks(30, new ECB(12, 15), - new ECB(28, 16))))); - VERSIONS.push_back(Ref(new Version(28, intArray(6, 6, 26, 50, 74, 98, 122), - new ECBlocks(30, new ECB(3, 117), - new ECB(10, 118)), - new ECBlocks(28, new ECB(3, 45), - new ECB(23, 46)), - new ECBlocks(30, new ECB(4, 24), - new ECB(31, 25)), - new ECBlocks(30, new ECB(11, 15), - new ECB(31, 16))))); - VERSIONS.push_back(Ref(new Version(29, intArray(6, 6, 30, 54, 78, 102, 126), - new ECBlocks(30, new ECB(7, 116), - new ECB(7, 117)), - new ECBlocks(28, new ECB(21, 45), - new ECB(7, 46)), - new ECBlocks(30, new ECB(1, 23), - new ECB(37, 24)), - new ECBlocks(30, new ECB(19, 15), - new ECB(26, 16))))); - VERSIONS.push_back(Ref(new Version(30, intArray(6, 6, 26, 52, 78, 104, 130), - new ECBlocks(30, new ECB(5, 115), - new ECB(10, 116)), - new ECBlocks(28, new ECB(19, 47), - new ECB(10, 48)), - new ECBlocks(30, new ECB(15, 24), - new ECB(25, 25)), - new ECBlocks(30, new ECB(23, 15), - new ECB(25, 16))))); - VERSIONS.push_back(Ref(new Version(31, intArray(6, 6, 30, 56, 82, 108, 134), - new ECBlocks(30, new ECB(13, 115), - new ECB(3, 116)), - new ECBlocks(28, new ECB(2, 46), - new ECB(29, 47)), - new ECBlocks(30, new ECB(42, 24), - new ECB(1, 25)), - new ECBlocks(30, new ECB(23, 15), - new ECB(28, 16))))); - VERSIONS.push_back(Ref(new Version(32, intArray(6, 6, 34, 60, 86, 112, 138), - new ECBlocks(30, new ECB(17, 115)), - new ECBlocks(28, new ECB(10, 46), - new ECB(23, 47)), - new ECBlocks(30, new ECB(10, 24), - new ECB(35, 25)), - new ECBlocks(30, new ECB(19, 15), - new ECB(35, 16))))); - VERSIONS.push_back(Ref(new Version(33, intArray(6, 6, 30, 58, 86, 114, 142), - new ECBlocks(30, new ECB(17, 115), - new ECB(1, 116)), - new ECBlocks(28, new ECB(14, 46), - new ECB(21, 47)), - new ECBlocks(30, new ECB(29, 24), - new ECB(19, 25)), - new ECBlocks(30, new ECB(11, 15), - new ECB(46, 16))))); - VERSIONS.push_back(Ref(new Version(34, intArray(6, 6, 34, 62, 90, 118, 146), - new ECBlocks(30, new ECB(13, 115), - new ECB(6, 116)), - new ECBlocks(28, new ECB(14, 46), - new ECB(23, 47)), - new ECBlocks(30, new ECB(44, 24), - new ECB(7, 25)), - new ECBlocks(30, new ECB(59, 16), - new ECB(1, 17))))); - VERSIONS.push_back(Ref(new Version(35, intArray(7, 6, 30, 54, 78, - 102, 126, 150), - new ECBlocks(30, new ECB(12, 121), - new ECB(7, 122)), - new ECBlocks(28, new ECB(12, 47), - new ECB(26, 48)), - new ECBlocks(30, new ECB(39, 24), - new ECB(14, 25)), - new ECBlocks(30, new ECB(22, 15), - new ECB(41, 16))))); - VERSIONS.push_back(Ref(new Version(36, intArray(7, 6, 24, 50, 76, - 102, 128, 154), - new ECBlocks(30, new ECB(6, 121), - new ECB(14, 122)), - new ECBlocks(28, new ECB(6, 47), - new ECB(34, 48)), - new ECBlocks(30, new ECB(46, 24), - new ECB(10, 25)), - new ECBlocks(30, new ECB(2, 15), - new ECB(64, 16))))); - VERSIONS.push_back(Ref(new Version(37, intArray(7, 6, 28, 54, 80, - 106, 132, 158), - new ECBlocks(30, new ECB(17, 122), - new ECB(4, 123)), - new ECBlocks(28, new ECB(29, 46), - new ECB(14, 47)), - new ECBlocks(30, new ECB(49, 24), - new ECB(10, 25)), - new ECBlocks(30, new ECB(24, 15), - new ECB(46, 16))))); - VERSIONS.push_back(Ref(new Version(38, intArray(7, 6, 32, 58, 84, - 110, 136, 162), - new ECBlocks(30, new ECB(4, 122), - new ECB(18, 123)), - new ECBlocks(28, new ECB(13, 46), - new ECB(32, 47)), - new ECBlocks(30, new ECB(48, 24), - new ECB(14, 25)), - new ECBlocks(30, new ECB(42, 15), - new ECB(32, 16))))); - VERSIONS.push_back(Ref(new Version(39, intArray(7, 6, 26, 54, 82, - 110, 138, 166), - new ECBlocks(30, new ECB(20, 117), - new ECB(4, 118)), - new ECBlocks(28, new ECB(40, 47), - new ECB(7, 48)), - new ECBlocks(30, new ECB(43, 24), - new ECB(22, 25)), - new ECBlocks(30, new ECB(10, 15), - new ECB(67, 16))))); - VERSIONS.push_back(Ref(new Version(40, intArray(7, 6, 30, 58, 86, - 114, 142, 170), - new ECBlocks(30, new ECB(19, 118), - new ECB(6, 119)), - new ECBlocks(28, new ECB(18, 47), - new ECB(31, 48)), - new ECBlocks(30, new ECB(34, 24), - new ECB(34, 25)), - new ECBlocks(30, new ECB(20, 15), - new ECB(61, 16))))); - return VERSIONS.size(); -} - -} -} diff --git a/cpp/core/src/zxing/qrcode/Version.h b/cpp/core/src/zxing/qrcode/Version.h deleted file mode 100644 index c111cdddd..000000000 --- a/cpp/core/src/zxing/qrcode/Version.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef __VERSION_H__ -#define __VERSION_H__ - -/* - * Version.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class ECB { -private: - int count_; - int dataCodewords_; -public: - ECB(int count, int dataCodewords); - int getCount(); - int getDataCodewords(); -}; - -class ECBlocks { -private: - int ecCodewords_; - std::vector ecBlocks_; -public: - ECBlocks(int ecCodewords, ECB *ecBlocks); - ECBlocks(int ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2); - int getECCodewords(); - std::vector& getECBlocks(); - ~ECBlocks(); -}; - -class Version : public Counted { - -private: - int versionNumber_; - std::vector &alignmentPatternCenters_; - std::vector ecBlocks_; - int totalCodewords_; - Version(int versionNumber, std::vector *alignmentPatternCenters, ECBlocks *ecBlocks1, ECBlocks *ecBlocks2, - ECBlocks *ecBlocks3, ECBlocks *ecBlocks4); - -public: - static unsigned int VERSION_DECODE_INFO[]; - static int N_VERSION_DECODE_INFOS; - static std::vector > VERSIONS; - - ~Version(); - int getVersionNumber(); - std::vector &getAlignmentPatternCenters(); - int getTotalCodewords(); - int getDimensionForVersion(); - ECBlocks &getECBlocksForLevel(ErrorCorrectionLevel &ecLevel); - static Version *getProvisionalVersionForDimension(int dimension); - static Version *getVersionForNumber(int versionNumber); - static Version *decodeVersionInformation(unsigned int versionBits); - Ref buildFunctionPattern(); - static int buildVersions(); -}; -} -} - -#endif // __VERSION_H__ diff --git a/cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp b/cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp deleted file mode 100644 index 467d8fcbb..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * BitMatrixParser.cpp - * zxing - * - * Created by Christian Brunschen on 20/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include - - -namespace zxing { -namespace qrcode { - -int BitMatrixParser::copyBit(size_t x, size_t y, int versionBits) { - return bitMatrix_->get(x, y) ? (versionBits << 1) | 0x1 : versionBits << 1; -} - -BitMatrixParser::BitMatrixParser(Ref bitMatrix) : - bitMatrix_(bitMatrix), parsedVersion_(0), parsedFormatInfo_() { - size_t dimension = bitMatrix->getHeight(); - if ((dimension < 21) || (dimension & 0x03) != 1) { - throw ReaderException("Dimension must be 1 mod 4 and >= 21"); - } -} - -Ref BitMatrixParser::readFormatInformation() { - if (parsedFormatInfo_ != 0) { - return parsedFormatInfo_; - } - - // Read top-left format info bits - int formatInfoBits1 = 0; - for (int i = 0; i < 6; i++) { - formatInfoBits1 = copyBit(i, 8, formatInfoBits1); - } - // .. and skip a bit in the timing pattern ... - formatInfoBits1 = copyBit(7, 8, formatInfoBits1); - formatInfoBits1 = copyBit(8, 8, formatInfoBits1); - formatInfoBits1 = copyBit(8, 7, formatInfoBits1); - // .. and skip a bit in the timing pattern ... - for (int j = 5; j >= 0; j--) { - formatInfoBits1 = copyBit(8, j, formatInfoBits1); - } - - // Read the top-right/bottom-left pattern - int dimension = bitMatrix_->getHeight(); - int formatInfoBits2 = 0; - int jMin = dimension - 7; - for (int j = dimension - 1; j >= jMin; j--) { - formatInfoBits2 = copyBit(8, j, formatInfoBits2); - } - for (int i = dimension - 8; i < dimension; i++) { - formatInfoBits2 = copyBit(i, 8, formatInfoBits2); - } - - parsedFormatInfo_ = FormatInformation::decodeFormatInformation(formatInfoBits1,formatInfoBits2); - if (parsedFormatInfo_ != 0) { - return parsedFormatInfo_; - } - throw ReaderException("Could not decode format information"); -} - -Version *BitMatrixParser::readVersion() { - if (parsedVersion_ != 0) { - return parsedVersion_; - } - - int dimension = bitMatrix_->getHeight(); - - int provisionalVersion = (dimension - 17) >> 2; - if (provisionalVersion <= 6) { - return Version::getVersionForNumber(provisionalVersion); - } - - // Read top-right version info: 3 wide by 6 tall - int versionBits = 0; - for (int y = 5; y >= 0; y--) { - int xMin = dimension - 11; - for (int x = dimension - 9; x >= xMin; x--) { - versionBits = copyBit(x, y, versionBits); - } - } - - parsedVersion_ = Version::decodeVersionInformation(versionBits); - if (parsedVersion_ != 0 && parsedVersion_->getDimensionForVersion() == dimension) { - return parsedVersion_; - } - - // Hmm, failed. Try bottom left: 6 wide by 3 tall - versionBits = 0; - for (int x = 5; x >= 0; x--) { - int yMin = dimension - 11; - for (int y = dimension - 9; y >= yMin; y--) { - versionBits = copyBit(x, y, versionBits); - } - } - - parsedVersion_ = Version::decodeVersionInformation(versionBits); - if (parsedVersion_ != 0 && parsedVersion_->getDimensionForVersion() == dimension) { - return parsedVersion_; - } - throw ReaderException("Could not decode version"); -} - -ArrayRef BitMatrixParser::readCodewords() { - Ref formatInfo = readFormatInformation(); - Version *version = readVersion(); - - - // Get the data mask for the format used in this QR Code. This will exclude - // some bits from reading as we wind through the bit matrix. - DataMask &dataMask = DataMask::forReference((int)formatInfo->getDataMask()); - // cout << (int)formatInfo->getDataMask() << endl; - int dimension = bitMatrix_->getHeight(); - dataMask.unmaskBitMatrix(*bitMatrix_, dimension); - - - // cerr << *bitMatrix_ << endl; - // cerr << version->getTotalCodewords() << endl; - - Ref functionPattern = version->buildFunctionPattern(); - - - // cout << *functionPattern << endl; - - bool readingUp = true; - ArrayRef result(version->getTotalCodewords()); - int resultOffset = 0; - int currentByte = 0; - int bitsRead = 0; - // Read columns in pairs, from right to left - for (int x = dimension - 1; x > 0; x -= 2) { - if (x == 6) { - // Skip whole column with vertical alignment pattern; - // saves time and makes the other code proceed more cleanly - x--; - } - // Read alternatingly from bottom to top then top to bottom - for (int counter = 0; counter < dimension; counter++) { - int y = readingUp ? dimension - 1 - counter : counter; - for (int col = 0; col < 2; col++) { - // Ignore bits covered by the function pattern - if (!functionPattern->get(x - col, y)) { - // Read a bit - bitsRead++; - currentByte <<= 1; - if (bitMatrix_->get(x - col, y)) { - currentByte |= 1; - } - // If we've made a whole byte, save it off - if (bitsRead == 8) { - result[resultOffset++] = (char)currentByte; - bitsRead = 0; - currentByte = 0; - } - } - } - } - readingUp = !readingUp; // switch directions - } - - if (resultOffset != version->getTotalCodewords()) { - throw ReaderException("Did not read all codewords"); - } - return result; -} - -} -} diff --git a/cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h b/cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h deleted file mode 100644 index 877d8958c..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __BIT_MATRIX_PARSER_H__ -#define __BIT_MATRIX_PARSER_H__ - -/* - * BitMatrixParser.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class BitMatrixParser : public Counted { -private: - Ref bitMatrix_; - Version *parsedVersion_; - Ref parsedFormatInfo_; - - int copyBit(size_t x, size_t y, int versionBits); - -public: - BitMatrixParser(Ref bitMatrix); - Ref readFormatInformation(); - Version *readVersion(); - ArrayRef readCodewords(); - -private: - BitMatrixParser(const BitMatrixParser&); - BitMatrixParser& operator =(const BitMatrixParser&); - -}; - -} -} - -#endif // __BIT_MATRIX_PARSER_H__ diff --git a/cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp b/cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp deleted file mode 100644 index 469b958d4..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * DataBlock.cpp - * zxing - * - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace qrcode { - -using namespace std; - -DataBlock::DataBlock(int numDataCodewords, ArrayRef codewords) : - numDataCodewords_(numDataCodewords), codewords_(codewords) { -} - -int DataBlock::getNumDataCodewords() { - return numDataCodewords_; -} - -ArrayRef DataBlock::getCodewords() { - return codewords_; -} - - -std::vector > DataBlock::getDataBlocks(ArrayRef rawCodewords, Version *version, - ErrorCorrectionLevel &ecLevel) { - - - // Figure out the number and size of data blocks used by this version and - // error correction level - ECBlocks &ecBlocks = version->getECBlocksForLevel(ecLevel); - - - // First count the total number of data blocks - int totalBlocks = 0; - vector ecBlockArray = ecBlocks.getECBlocks(); - for (size_t i = 0; i < ecBlockArray.size(); i++) { - totalBlocks += ecBlockArray[i]->getCount(); - } - - // Now establish DataBlocks of the appropriate size and number of data codewords - std::vector > result(totalBlocks); - int numResultBlocks = 0; - for (size_t j = 0; j < ecBlockArray.size(); j++) { - ECB *ecBlock = ecBlockArray[j]; - for (int i = 0; i < ecBlock->getCount(); i++) { - int numDataCodewords = ecBlock->getDataCodewords(); - int numBlockCodewords = ecBlocks.getECCodewords() + numDataCodewords; - ArrayRef buffer(numBlockCodewords); - Ref blockRef(new DataBlock(numDataCodewords, buffer)); - result[numResultBlocks++] = blockRef; - } - } - - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 more byte. Figure out where these start. - int shorterBlocksTotalCodewords = result[0]->codewords_->size(); - int longerBlocksStartAt = result.size() - 1; - while (longerBlocksStartAt >= 0) { - int numCodewords = result[longerBlocksStartAt]->codewords_->size(); - if (numCodewords == shorterBlocksTotalCodewords) { - break; - } - if (numCodewords != shorterBlocksTotalCodewords + 1) { - throw IllegalArgumentException("Data block sizes differ by more than 1"); - } - longerBlocksStartAt--; - } - longerBlocksStartAt++; - - int shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.getECCodewords(); - // The last elements of result may be 1 element longer; - // first fill out as many elements as all of them have - int rawCodewordsOffset = 0; - for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { - for (int j = 0; j < numResultBlocks; j++) { - result[j]->codewords_[i] = rawCodewords[rawCodewordsOffset++]; - } - } - // Fill out the last data block in the longer ones - for (int j = longerBlocksStartAt; j < numResultBlocks; j++) { - result[j]->codewords_[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++]; - } - // Now add in error correction blocks - int max = result[0]->codewords_->size(); - for (int i = shorterBlocksNumDataCodewords; i < max; i++) { - for (int j = 0; j < numResultBlocks; j++) { - int iOffset = j < longerBlocksStartAt ? i : i + 1; - result[j]->codewords_[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - - if (rawCodewordsOffset != rawCodewords->size()) { - throw IllegalArgumentException("rawCodewordsOffset != rawCodewords.length"); - } - - return result; -} - -} -} diff --git a/cpp/core/src/zxing/qrcode/decoder/DataBlock.h b/cpp/core/src/zxing/qrcode/decoder/DataBlock.h deleted file mode 100644 index f314530f0..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/DataBlock.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef __DATA_BLOCK_H__ -#define __DATA_BLOCK_H__ - -/* - * DataBlock.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class DataBlock : public Counted { -private: - int numDataCodewords_; - ArrayRef codewords_; - - DataBlock(int numDataCodewords, ArrayRef codewords); - -public: - static std::vector > - getDataBlocks(ArrayRef rawCodewords, Version *version, ErrorCorrectionLevel &ecLevel); - - int getNumDataCodewords(); - ArrayRef getCodewords(); -}; - -} -} - -#endif // __DATA_BLOCK_H__ diff --git a/cpp/core/src/zxing/qrcode/decoder/DataMask.cpp b/cpp/core/src/zxing/qrcode/decoder/DataMask.cpp deleted file mode 100644 index b231a17c1..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/DataMask.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* - * DataMask.cpp - * zxing - * - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -#include - -namespace zxing { -namespace qrcode { - -using namespace std; - -DataMask::DataMask() { -} - -DataMask::~DataMask() { -} - -vector > DataMask::DATA_MASKS; -static int N_DATA_MASKS = DataMask::buildDataMasks(); - -DataMask &DataMask::forReference(int reference) { - if (reference < 0 || reference > 7) { - throw IllegalArgumentException("reference must be between 0 and 7"); - } - return *DATA_MASKS[reference]; -} - -void DataMask::unmaskBitMatrix(BitMatrix& bits, size_t dimension) { - for (size_t y = 0; y < dimension; y++) { - for (size_t x = 0; x < dimension; x++) { - // TODO: check why the coordinates have to be swapped - if (isMasked(y, x)) { - bits.flip(x, y); - } - } - } -} - -/** - * 000: mask bits for which (x + y) mod 2 == 0 - */ -class DataMask000 : public DataMask { -public: - bool isMasked(size_t x, size_t y) { - // return ((x + y) & 0x01) == 0; - return ((x + y) % 2) == 0; - } -}; - -/** - * 001: mask bits for which x mod 2 == 0 - */ -class DataMask001 : public DataMask { -public: - bool isMasked(size_t x, size_t) { - // return (x & 0x01) == 0; - return (x % 2) == 0; - } -}; - -/** - * 010: mask bits for which y mod 3 == 0 - */ -class DataMask010 : public DataMask { -public: - bool isMasked(size_t, size_t y) { - return y % 3 == 0; - } -}; - -/** - * 011: mask bits for which (x + y) mod 3 == 0 - */ -class DataMask011 : public DataMask { -public: - bool isMasked(size_t x, size_t y) { - return (x + y) % 3 == 0; - } -}; - -/** - * 100: mask bits for which (x/2 + y/3) mod 2 == 0 - */ -class DataMask100 : public DataMask { -public: - bool isMasked(size_t x, size_t y) { - // return (((x >> 1) + (y / 3)) & 0x01) == 0; - return (((x >> 1) + (y / 3)) % 2) == 0; - } -}; - -/** - * 101: mask bits for which xy mod 2 + xy mod 3 == 0 - */ -class DataMask101 : public DataMask { -public: - bool isMasked(size_t x, size_t y) { - size_t temp = x * y; - // return (temp & 0x01) + (temp % 3) == 0; - return (temp % 2) + (temp % 3) == 0; - - } -}; - -/** - * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0 - */ -class DataMask110 : public DataMask { -public: - bool isMasked(size_t x, size_t y) { - size_t temp = x * y; - // return (((temp & 0x01) + (temp % 3)) & 0x01) == 0; - return (((temp % 2) + (temp % 3)) % 2) == 0; - } -}; - -/** - * 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0 - */ -class DataMask111 : public DataMask { -public: - bool isMasked(size_t x, size_t y) { - // return ((((x + y) & 0x01) + ((x * y) % 3)) & 0x01) == 0; - return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0; - } -}; - -int DataMask::buildDataMasks() { - DATA_MASKS.push_back(Ref (new DataMask000())); - DATA_MASKS.push_back(Ref (new DataMask001())); - DATA_MASKS.push_back(Ref (new DataMask010())); - DATA_MASKS.push_back(Ref (new DataMask011())); - DATA_MASKS.push_back(Ref (new DataMask100())); - DATA_MASKS.push_back(Ref (new DataMask101())); - DATA_MASKS.push_back(Ref (new DataMask110())); - DATA_MASKS.push_back(Ref (new DataMask111())); - return DATA_MASKS.size(); -} - -} -} diff --git a/cpp/core/src/zxing/qrcode/decoder/DataMask.h b/cpp/core/src/zxing/qrcode/decoder/DataMask.h deleted file mode 100644 index fa3088b19..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/DataMask.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef __DATA_MASK_H__ -#define __DATA_MASK_H__ - -/* - * DataMask.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -#include - -namespace zxing { -namespace qrcode { - -class DataMask : public Counted { -private: - static std::vector > DATA_MASKS; - -protected: - -public: - static int buildDataMasks(); - DataMask(); - virtual ~DataMask(); - void unmaskBitMatrix(BitMatrix& matrix, size_t dimension); - virtual bool isMasked(size_t x, size_t y) = 0; - static DataMask& forReference(int reference); -}; - -} -} - -#endif // __DATA_MASK_H__ diff --git a/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp b/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp deleted file mode 100644 index 41c587d56..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp +++ /dev/null @@ -1,425 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * DecodedBitStreamParser.cpp - * zxing - * - * Created by Christian Brunschen on 20/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#ifndef NO_ICONV -#include -#endif - -// Required for compatibility. TODO: test on Symbian -#ifdef ZXING_ICONV_CONST -#undef ICONV_CONST -#define ICONV_CONST const -#endif - -#ifndef ICONV_CONST -#define ICONV_CONST /**/ -#endif - -using namespace std; -using namespace zxing; -using namespace zxing::qrcode; -using namespace zxing::common; - -const char DecodedBitStreamParser::ALPHANUMERIC_CHARS[] = - { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z', ' ', '$', '%', '*', '+', '-', '.', '/', ':' - }; - -namespace {int GB2312_SUBSET = 1;} - -void DecodedBitStreamParser::append(std::string &result, - string const& in, - const char *src) { - append(result, (char const*)in.c_str(), in.length(), src); -} - -void DecodedBitStreamParser::append(std::string &result, - const char *bufIn, - size_t nIn, - const char *src) { -#ifndef NO_ICONV - if (nIn == 0) { - return; - } - - iconv_t cd = iconv_open(StringUtils::UTF8, src); - if (cd == (iconv_t)-1) { - result.append((const char *)bufIn, nIn); - return; - } - - const int maxOut = 4 * nIn + 1; - char* bufOut = new char[maxOut]; - - ICONV_CONST char *fromPtr = (ICONV_CONST char *)bufIn; - size_t nFrom = nIn; - char *toPtr = (char *)bufOut; - size_t nTo = maxOut; - - while (nFrom > 0) { - size_t oneway = iconv(cd, &fromPtr, &nFrom, &toPtr, &nTo); - if (oneway == (size_t)(-1)) { - iconv_close(cd); - delete[] bufOut; - throw ReaderException("error converting characters"); - } - } - iconv_close(cd); - - int nResult = maxOut - nTo; - bufOut[nResult] = '\0'; - result.append((const char *)bufOut); - delete[] bufOut; -#else - result.append((const char *)bufIn, nIn); -#endif -} - -void DecodedBitStreamParser::decodeHanziSegment(Ref bits_, - string& result, - int count) { - BitSource& bits (*bits_); - // Don't crash trying to read more bits than we have available. - if (count * 13 > bits.available()) { - throw FormatException(); - } - - // Each character will require 2 bytes. Read the characters as 2-byte pairs - // and decode as GB2312 afterwards - size_t nBytes = 2 * count; - char* buffer = new char[nBytes]; - int offset = 0; - while (count > 0) { - // Each 13 bits encodes a 2-byte character - int twoBytes = bits.readBits(13); - int assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060); - if (assembledTwoBytes < 0x003BF) { - // In the 0xA1A1 to 0xAAFE range - assembledTwoBytes += 0x0A1A1; - } else { - // In the 0xB0A1 to 0xFAFE range - assembledTwoBytes += 0x0A6A1; - } - buffer[offset] = (char) ((assembledTwoBytes >> 8) & 0xFF); - buffer[offset + 1] = (char) (assembledTwoBytes & 0xFF); - offset += 2; - count--; - } - - try { - append(result, buffer, nBytes, StringUtils::GB2312); - } catch (ReaderException const& ignored) { - (void)ignored; - delete [] buffer; - throw FormatException(); - } - - delete [] buffer; -} - -void DecodedBitStreamParser::decodeKanjiSegment(Ref bits, std::string &result, int count) { - // Each character will require 2 bytes. Read the characters as 2-byte pairs - // and decode as Shift_JIS afterwards - size_t nBytes = 2 * count; - char* buffer = new char[nBytes]; - int offset = 0; - while (count > 0) { - // Each 13 bits encodes a 2-byte character - - int twoBytes = bits->readBits(13); - int assembledTwoBytes = ((twoBytes / 0x0C0) << 8) | (twoBytes % 0x0C0); - if (assembledTwoBytes < 0x01F00) { - // In the 0x8140 to 0x9FFC range - assembledTwoBytes += 0x08140; - } else { - // In the 0xE040 to 0xEBBF range - assembledTwoBytes += 0x0C140; - } - buffer[offset] = (char)(assembledTwoBytes >> 8); - buffer[offset + 1] = (char)assembledTwoBytes; - offset += 2; - count--; - } - try { - append(result, buffer, nBytes, StringUtils::SHIFT_JIS); - } catch (ReaderException const& ignored) { - (void)ignored; - delete [] buffer; - throw FormatException(); - } - delete[] buffer; -} - -void DecodedBitStreamParser::decodeByteSegment(Ref bits_, - string& result, - int count, - CharacterSetECI* currentCharacterSetECI, - ArrayRef< ArrayRef >& byteSegments, - Hashtable const& hints) { - int nBytes = count; - BitSource& bits (*bits_); - // Don't crash trying to read more bits than we have available. - if (count << 3 > bits.available()) { - throw FormatException(); - } - - ArrayRef bytes_ (count); - char* readBytes = &(*bytes_)[0]; - for (int i = 0; i < count; i++) { - readBytes[i] = (char) bits.readBits(8); - } - string encoding; - if (currentCharacterSetECI == 0) { - // The spec isn't clear on this mode; see - // section 6.4.5: t does not say which encoding to assuming - // upon decoding. I have seen ISO-8859-1 used as well as - // Shift_JIS -- without anything like an ECI designator to - // give a hint. - encoding = StringUtils::guessEncoding(readBytes, count, hints); - } else { - encoding = currentCharacterSetECI->name(); - } - try { - append(result, readBytes, nBytes, encoding.c_str()); - } catch (ReaderException const& ignored) { - (void)ignored; - throw FormatException(); - } - byteSegments->values().push_back(bytes_); -} - -void DecodedBitStreamParser::decodeNumericSegment(Ref bits, std::string &result, int count) { - int nBytes = count; - char* bytes = new char[nBytes]; - int i = 0; - // Read three digits at a time - while (count >= 3) { - // Each 10 bits encodes three digits - if (bits->available() < 10) { - throw ReaderException("format exception"); - } - int threeDigitsBits = bits->readBits(10); - if (threeDigitsBits >= 1000) { - ostringstream s; - s << "Illegal value for 3-digit unit: " << threeDigitsBits; - delete[] bytes; - throw ReaderException(s.str().c_str()); - } - bytes[i++] = ALPHANUMERIC_CHARS[threeDigitsBits / 100]; - bytes[i++] = ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]; - bytes[i++] = ALPHANUMERIC_CHARS[threeDigitsBits % 10]; - count -= 3; - } - if (count == 2) { - if (bits->available() < 7) { - throw ReaderException("format exception"); - } - // Two digits left over to read, encoded in 7 bits - int twoDigitsBits = bits->readBits(7); - if (twoDigitsBits >= 100) { - ostringstream s; - s << "Illegal value for 2-digit unit: " << twoDigitsBits; - delete[] bytes; - throw ReaderException(s.str().c_str()); - } - bytes[i++] = ALPHANUMERIC_CHARS[twoDigitsBits / 10]; - bytes[i++] = ALPHANUMERIC_CHARS[twoDigitsBits % 10]; - } else if (count == 1) { - if (bits->available() < 4) { - throw ReaderException("format exception"); - } - // One digit left over to read - int digitBits = bits->readBits(4); - if (digitBits >= 10) { - ostringstream s; - s << "Illegal value for digit unit: " << digitBits; - delete[] bytes; - throw ReaderException(s.str().c_str()); - } - bytes[i++] = ALPHANUMERIC_CHARS[digitBits]; - } - append(result, bytes, nBytes, StringUtils::ASCII); - delete[] bytes; -} - -char DecodedBitStreamParser::toAlphaNumericChar(size_t value) { - if (value >= sizeof(DecodedBitStreamParser::ALPHANUMERIC_CHARS)) { - throw FormatException(); - } - return ALPHANUMERIC_CHARS[value]; -} - -void DecodedBitStreamParser::decodeAlphanumericSegment(Ref bits_, - string& result, - int count, - bool fc1InEffect) { - BitSource& bits (*bits_); - ostringstream bytes; - // Read two characters at a time - while (count > 1) { - if (bits.available() < 11) { - throw FormatException(); - } - int nextTwoCharsBits = bits.readBits(11); - bytes << toAlphaNumericChar(nextTwoCharsBits / 45); - bytes << toAlphaNumericChar(nextTwoCharsBits % 45); - count -= 2; - } - if (count == 1) { - // special case: one character left - if (bits.available() < 6) { - throw FormatException(); - } - bytes << toAlphaNumericChar(bits.readBits(6)); - } - // See section 6.4.8.1, 6.4.8.2 - string s = bytes.str(); - if (fc1InEffect) { - // We need to massage the result a bit if in an FNC1 mode: - ostringstream r; - for (size_t i = 0; i < s.length(); i++) { - if (s[i] != '%') { - r << s[i]; - } else { - if (i < s.length() - 1 && s[i + 1] == '%') { - // %% is rendered as % - r << s[i++]; - } else { - // In alpha mode, % should be converted to FNC1 separator 0x1D - r << (char)0x1D; - } - } - } - s = r.str(); - } - append(result, s, StringUtils::ASCII); -} - -namespace { - int parseECIValue(BitSource& bits) { - int firstByte = bits.readBits(8); - if ((firstByte & 0x80) == 0) { - // just one byte - return firstByte & 0x7F; - } - if ((firstByte & 0xC0) == 0x80) { - // two bytes - int secondByte = bits.readBits(8); - return ((firstByte & 0x3F) << 8) | secondByte; - } - if ((firstByte & 0xE0) == 0xC0) { - // three bytes - int secondThirdBytes = bits.readBits(16); - return ((firstByte & 0x1F) << 16) | secondThirdBytes; - } - throw FormatException(); - } -} - -Ref -DecodedBitStreamParser::decode(ArrayRef bytes, - Version* version, - ErrorCorrectionLevel const& ecLevel, - Hashtable const& hints) { - Ref bits_ (new BitSource(bytes)); - BitSource& bits (*bits_); - string result; - result.reserve(50); - ArrayRef< ArrayRef > byteSegments (0); - try { - CharacterSetECI* currentCharacterSetECI = 0; - bool fc1InEffect = false; - Mode* mode = 0; - do { - // While still another segment to read... - if (bits.available() < 4) { - // OK, assume we're done. Really, a TERMINATOR mode should have been recorded here - mode = &Mode::TERMINATOR; - } else { - try { - mode = &Mode::forBits(bits.readBits(4)); // mode is encoded by 4 bits - } catch (IllegalArgumentException const& iae) { - throw iae; - // throw FormatException.getFormatInstance(); - } - } - if (mode != &Mode::TERMINATOR) { - if ((mode == &Mode::FNC1_FIRST_POSITION) || (mode == &Mode::FNC1_SECOND_POSITION)) { - // We do little with FNC1 except alter the parsed result a bit according to the spec - fc1InEffect = true; - } else if (mode == &Mode::STRUCTURED_APPEND) { - if (bits.available() < 16) { - throw FormatException(); - } - // not really supported; all we do is ignore it - // Read next 8 bits (symbol sequence #) and 8 bits (parity data), then continue - bits.readBits(16); - } else if (mode == &Mode::ECI) { - // Count doesn't apply to ECI - int value = parseECIValue(bits); - currentCharacterSetECI = CharacterSetECI::getCharacterSetECIByValue(value); - if (currentCharacterSetECI == 0) { - throw FormatException(); - } - } else { - // First handle Hanzi mode which does not start with character count - if (mode == &Mode::HANZI) { - //chinese mode contains a sub set indicator right after mode indicator - int subset = bits.readBits(4); - int countHanzi = bits.readBits(mode->getCharacterCountBits(version)); - if (subset == GB2312_SUBSET) { - decodeHanziSegment(bits_, result, countHanzi); - } - } else { - // "Normal" QR code modes: - // How many characters will follow, encoded in this mode? - int count = bits.readBits(mode->getCharacterCountBits(version)); - if (mode == &Mode::NUMERIC) { - decodeNumericSegment(bits_, result, count); - } else if (mode == &Mode::ALPHANUMERIC) { - decodeAlphanumericSegment(bits_, result, count, fc1InEffect); - } else if (mode == &Mode::BYTE) { - decodeByteSegment(bits_, result, count, currentCharacterSetECI, byteSegments, hints); - } else if (mode == &Mode::KANJI) { - decodeKanjiSegment(bits_, result, count); - } else { - throw FormatException(); - } - } - } - } - } while (mode != &Mode::TERMINATOR); - } catch (IllegalArgumentException const& iae) { - (void)iae; - // from readBits() calls - throw FormatException(); - } - - return Ref(new DecoderResult(bytes, Ref(new String(result)), byteSegments, (string)ecLevel)); -} - diff --git a/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h b/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h deleted file mode 100644 index 6f4d7d3e5..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h +++ /dev/null @@ -1,72 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __DECODED_BIT_STREAM_PARSER_H__ -#define __DECODED_BIT_STREAM_PARSER_H__ - -/* - * DecodedBitStreamParser.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class DecodedBitStreamParser { -public: - typedef std::map Hashtable; - -private: - static char const ALPHANUMERIC_CHARS[]; - static char toAlphaNumericChar(size_t value); - - static void decodeHanziSegment(Ref bits, std::string &result, int count); - static void decodeKanjiSegment(Ref bits, std::string &result, int count); - static void decodeByteSegment(Ref bits, std::string &result, int count); - static void decodeByteSegment(Ref bits_, - std::string& result, - int count, - zxing::common::CharacterSetECI* currentCharacterSetECI, - ArrayRef< ArrayRef >& byteSegments, - Hashtable const& hints); - static void decodeAlphanumericSegment(Ref bits, std::string &result, int count, bool fc1InEffect); - static void decodeNumericSegment(Ref bits, std::string &result, int count); - - static void append(std::string &ost, const char *bufIn, size_t nIn, const char *src); - static void append(std::string &ost, std::string const& in, const char *src); - -public: - static Ref decode(ArrayRef bytes, - Version *version, - ErrorCorrectionLevel const& ecLevel, - Hashtable const& hints); -}; - -} -} - -#endif // __DECODED_BIT_STREAM_PARSER_H__ diff --git a/cpp/core/src/zxing/qrcode/decoder/Decoder.cpp b/cpp/core/src/zxing/qrcode/decoder/Decoder.cpp deleted file mode 100644 index d6cfe7b62..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/Decoder.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Decoder.cpp - * zxing - * - * Created by Christian Brunschen on 20/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include - -using zxing::qrcode::Decoder; -using zxing::DecoderResult; -using zxing::Ref; - -// VC++ -using zxing::ArrayRef; -using zxing::BitMatrix; - -Decoder::Decoder() : - rsDecoder_(GenericGF::QR_CODE_FIELD_256) { -} - -void Decoder::correctErrors(ArrayRef codewordBytes, int numDataCodewords) { - int numCodewords = codewordBytes->size(); - ArrayRef codewordInts(numCodewords); - for (int i = 0; i < numCodewords; i++) { - codewordInts[i] = codewordBytes[i] & 0xff; - } - int numECCodewords = numCodewords - numDataCodewords; - - try { - rsDecoder_.decode(codewordInts, numECCodewords); - } catch (ReedSolomonException const& ignored) { - (void)ignored; - throw ChecksumException(); - } - - for (int i = 0; i < numDataCodewords; i++) { - codewordBytes[i] = (char)codewordInts[i]; - } -} - -Ref Decoder::decode(Ref bits) { - // Construct a parser and read version, error-correction level - BitMatrixParser parser(bits); - - // std::cerr << *bits << std::endl; - - Version *version = parser.readVersion(); - ErrorCorrectionLevel &ecLevel = parser.readFormatInformation()->getErrorCorrectionLevel(); - - - // Read codewords - ArrayRef codewords(parser.readCodewords()); - - - // Separate into data blocks - std::vector > dataBlocks(DataBlock::getDataBlocks(codewords, version, ecLevel)); - - - // Count total number of data bytes - int totalBytes = 0; - for (size_t i = 0; i < dataBlocks.size(); i++) { - totalBytes += dataBlocks[i]->getNumDataCodewords(); - } - ArrayRef resultBytes(totalBytes); - int resultOffset = 0; - - - // Error-correct and copy data blocks together into a stream of bytes - for (size_t j = 0; j < dataBlocks.size(); j++) { - Ref dataBlock(dataBlocks[j]); - ArrayRef codewordBytes = dataBlock->getCodewords(); - int numDataCodewords = dataBlock->getNumDataCodewords(); - correctErrors(codewordBytes, numDataCodewords); - for (int i = 0; i < numDataCodewords; i++) { - resultBytes[resultOffset++] = codewordBytes[i]; - } - } - - return DecodedBitStreamParser::decode(resultBytes, - version, - ecLevel, - DecodedBitStreamParser::Hashtable()); -} - diff --git a/cpp/core/src/zxing/qrcode/decoder/Decoder.h b/cpp/core/src/zxing/qrcode/decoder/Decoder.h deleted file mode 100644 index 31ca6bd9a..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/Decoder.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __DECODER_H__ -#define __DECODER_H__ - -/* - * Decoder.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class Decoder { -private: - ReedSolomonDecoder rsDecoder_; - - void correctErrors(ArrayRef bytes, int numDataCodewords); - -public: - Decoder(); - Ref decode(Ref bits); -}; - -} -} - -#endif // __DECODER_H__ diff --git a/cpp/core/src/zxing/qrcode/decoder/Mode.cpp b/cpp/core/src/zxing/qrcode/decoder/Mode.cpp deleted file mode 100644 index 25e448347..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/Mode.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Mode.cpp - * zxing - * - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -using zxing::qrcode::Mode; -using std::ostringstream; - -// VC++ -using zxing::qrcode::Version; - -Mode Mode::TERMINATOR(0, 0, 0, 0x00, "TERMINATOR"); -Mode Mode::NUMERIC(10, 12, 14, 0x01, "NUMERIC"); -Mode Mode::ALPHANUMERIC(9, 11, 13, 0x02, "ALPHANUMERIC"); -Mode Mode::STRUCTURED_APPEND(0, 0, 0, 0x03, "STRUCTURED_APPEND"); -Mode Mode::BYTE(8, 16, 16, 0x04, "BYTE"); -Mode Mode::ECI(0, 0, 0, 0x07, "ECI"); -Mode Mode::KANJI(8, 10, 12, 0x08, "KANJI"); -Mode Mode::FNC1_FIRST_POSITION(0, 0, 0, 0x05, "FNC1_FIRST_POSITION"); -Mode Mode::FNC1_SECOND_POSITION(0, 0, 0, 0x09, "FNC1_SECOND_POSITION"); -Mode Mode::HANZI(8, 10, 12, 0x0D, "HANZI"); - -Mode::Mode(int cbv0_9, int cbv10_26, int cbv27, int /* bits */, char const* name) : - characterCountBitsForVersions0To9_(cbv0_9), characterCountBitsForVersions10To26_(cbv10_26), - characterCountBitsForVersions27AndHigher_(cbv27), name_(name) { -} - -Mode& Mode::forBits(int bits) { - switch (bits) { - case 0x0: - return TERMINATOR; - case 0x1: - return NUMERIC; - case 0x2: - return ALPHANUMERIC; - case 0x3: - return STRUCTURED_APPEND; - case 0x4: - return BYTE; - case 0x5: - return FNC1_FIRST_POSITION; - case 0x7: - return ECI; - case 0x8: - return KANJI; - case 0x9: - return FNC1_SECOND_POSITION; - case 0xD: - // 0xD is defined in GBT 18284-2000, may not be supported in foreign country - return HANZI; - default: - ostringstream s; - s << "Illegal mode bits: " << bits; - throw ReaderException(s.str().c_str()); - } -} - -int Mode::getCharacterCountBits(Version *version) { - int number = version->getVersionNumber(); - if (number <= 9) { - return characterCountBitsForVersions0To9_; - } else if (number <= 26) { - return characterCountBitsForVersions10To26_; - } else { - return characterCountBitsForVersions27AndHigher_; - } -} diff --git a/cpp/core/src/zxing/qrcode/decoder/Mode.h b/cpp/core/src/zxing/qrcode/decoder/Mode.h deleted file mode 100644 index a94a356b1..000000000 --- a/cpp/core/src/zxing/qrcode/decoder/Mode.h +++ /dev/null @@ -1,57 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __MODE_H__ -#define __MODE_H__ - -/* - * Mode.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { -namespace qrcode { - -class Mode { -private: - int characterCountBitsForVersions0To9_; - int characterCountBitsForVersions10To26_; - int characterCountBitsForVersions27AndHigher_; - std::string name_; - - Mode(int cbv0_9, int cbv10_26, int cbv27, int bits, char const* name); - -public: - static Mode TERMINATOR; - static Mode NUMERIC; - static Mode ALPHANUMERIC; - static Mode STRUCTURED_APPEND; - static Mode BYTE; - static Mode ECI; - static Mode KANJI; - static Mode FNC1_FIRST_POSITION; - static Mode FNC1_SECOND_POSITION; - static Mode HANZI; - - static Mode& forBits(int bits); - int getCharacterCountBits(Version *version); -}; -} -} - -#endif // __MODE_H__ diff --git a/cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp b/cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp deleted file mode 100644 index 9ab35eba8..000000000 --- a/cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * AlignmentPattern.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -using std::abs; -using zxing::Ref; -using zxing::qrcode::AlignmentPattern; - -AlignmentPattern::AlignmentPattern(float posX, float posY, float estimatedModuleSize) : - ResultPoint(posX,posY), estimatedModuleSize_(estimatedModuleSize) { -} - -bool AlignmentPattern::aboutEquals(float moduleSize, float i, float j) const { - if (abs(i - getY()) <= moduleSize && abs(j - getX()) <= moduleSize) { - float moduleSizeDiff = abs(moduleSize - estimatedModuleSize_); - return moduleSizeDiff <= 1.0f || moduleSizeDiff <= estimatedModuleSize_; - } - return false; -} - -Ref AlignmentPattern::combineEstimate(float i, float j, float newModuleSize) const { - float combinedX = (getX() + j) / 2.0f; - float combinedY = (getY() + i) / 2.0f; - float combinedModuleSize = (estimatedModuleSize_ + newModuleSize) / 2.0f; - Ref result - (new AlignmentPattern(combinedX, combinedY, combinedModuleSize)); - return result; -} diff --git a/cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h b/cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h deleted file mode 100644 index f95b92abe..000000000 --- a/cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h +++ /dev/null @@ -1,45 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- - -#ifndef __ALIGNMENT_PATTERN_H__ -#define __ALIGNMENT_PATTERN_H__ - -/* - * AlignmentPattern.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - namespace qrcode { - - class AlignmentPattern : public ResultPoint { - private: - float estimatedModuleSize_; - - public: - AlignmentPattern(float posX, float posY, float estimatedModuleSize); - bool aboutEquals(float moduleSize, float i, float j) const; - Ref combineEstimate(float i, float j, - float newModuleSize) const; - }; - - } -} - -#endif // __ALIGNMENT_PATTERN_H__ diff --git a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp b/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp deleted file mode 100644 index 8ce4321a9..000000000 --- a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +++ /dev/null @@ -1,208 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -using std::abs; -using std::vector; -using zxing::Ref; -using zxing::qrcode::AlignmentPatternFinder; -using zxing::qrcode::AlignmentPattern; - -// VC++ - -using zxing::BitMatrix; -using zxing::ResultPointCallback; - -float AlignmentPatternFinder::centerFromEnd(vector& stateCount, int end) { - return (float)(end - stateCount[2]) - stateCount[1] / 2.0f; -} - -bool AlignmentPatternFinder::foundPatternCross(vector &stateCount) { - float maxVariance = moduleSize_ / 2.0f; - for (int i = 0; i < 3; i++) { - if (abs(moduleSize_ - stateCount[i]) >= maxVariance) { - return false; - } - } - return true; -} - -float AlignmentPatternFinder::crossCheckVertical(int startI, int centerJ, int maxCount, - int originalStateCountTotal) { - int maxI = image_->getHeight(); - vector stateCount(3, 0); - - - // Start counting up from center - int i = startI; - while (i >= 0 && image_->get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) { - return nan(); - } - while (i >= 0 && !image_->get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) { - return nan(); - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image_->get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i++; - } - if (i == maxI || stateCount[1] > maxCount) { - return nan(); - } - while (i < maxI && !image_->get(centerJ, i) && stateCount[2] <= maxCount) { - stateCount[2]++; - i++; - } - if (stateCount[2] > maxCount) { - return nan(); - } - - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - if (5 * abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { - return nan(); - } - - return foundPatternCross(stateCount) ? centerFromEnd(stateCount, i) : nan(); -} - -Ref AlignmentPatternFinder::handlePossibleCenter(vector &stateCount, int i, int j) { - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - float centerJ = centerFromEnd(stateCount, j); - float centerI = crossCheckVertical(i, (int)centerJ, 2 * stateCount[1], stateCountTotal); - if (!isnan(centerI)) { - float estimatedModuleSize = (float)(stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f; - int max = possibleCenters_->size(); - for (int index = 0; index < max; index++) { - Ref center((*possibleCenters_)[index]); - // Look for about the same center and module size: - if (center->aboutEquals(estimatedModuleSize, centerI, centerJ)) { - return center->combineEstimate(centerI, centerJ, estimatedModuleSize); - } - } - AlignmentPattern *tmp = new AlignmentPattern(centerJ, centerI, estimatedModuleSize); - // Hadn't found this before; save it - tmp->retain(); - possibleCenters_->push_back(tmp); - if (callback_ != 0) { - callback_->foundPossibleResultPoint(*tmp); - } - } - Ref result; - return result; -} - -AlignmentPatternFinder::AlignmentPatternFinder(Ref image, int startX, int startY, int width, - int height, float moduleSize, - Refconst& callback) : - image_(image), possibleCenters_(new vector ()), startX_(startX), startY_(startY), - width_(width), height_(height), moduleSize_(moduleSize), callback_(callback) { -} - -AlignmentPatternFinder::~AlignmentPatternFinder() { - for (int i = 0; i < int(possibleCenters_->size()); i++) { - (*possibleCenters_)[i]->release(); - (*possibleCenters_)[i] = 0; - } - delete possibleCenters_; -} - -Ref AlignmentPatternFinder::find() { - int maxJ = startX_ + width_; - int middleI = startY_ + (height_ >> 1); - // Ref luminanceRow(new BitArray(width_)); - // We are looking for black/white/black modules in 1:1:1 ratio; - // this tracks the number of black/white/black modules seen so far - vector stateCount(3, 0); - for (int iGen = 0; iGen < height_; iGen++) { - // Search from middle outwards - int i = middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1)); - // image_->getBlackRow(i, luminanceRow, startX_, width_); - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - int j = startX_; - // Burn off leading white pixels before anything else; if we start in the middle of - // a white run, it doesn't make sense to count its length, since we don't know if the - // white run continued to the left of the start point - while (j < maxJ && !image_->get(j, i)) { - j++; - } - int currentState = 0; - while (j < maxJ) { - if (image_->get(j, i)) { - // Black pixel - if (currentState == 1) { // Counting black pixels - stateCount[currentState]++; - } else { // Counting white pixels - if (currentState == 2) { // A winner? - if (foundPatternCross(stateCount)) { // Yes - Ref confirmed(handlePossibleCenter(stateCount, i, j)); - if (confirmed != 0) { - return confirmed; - } - } - stateCount[0] = stateCount[2]; - stateCount[1] = 1; - stateCount[2] = 0; - currentState = 1; - } else { - stateCount[++currentState]++; - } - } - } else { // White pixel - if (currentState == 1) { // Counting black pixels - currentState++; - } - stateCount[currentState]++; - } - j++; - } - if (foundPatternCross(stateCount)) { - Ref confirmed(handlePossibleCenter(stateCount, i, maxJ)); - if (confirmed != 0) { - return confirmed; - } - } - - } - - // Hmm, nothing we saw was observed and confirmed twice. If we had - // any guess at all, return it. - if (possibleCenters_->size() > 0) { - Ref center((*possibleCenters_)[0]); - return center; - } - - throw zxing::ReaderException("Could not find alignment pattern"); -} diff --git a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h b/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h deleted file mode 100644 index 6bd948755..000000000 --- a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef __ALIGNMENT_PATTERN_FINDER_H__ -#define __ALIGNMENT_PATTERN_FINDER_H__ - -/* - * AlignmentPatternFinder.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 "AlignmentPattern.h" -#include -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class AlignmentPatternFinder : public Counted { -private: - static int CENTER_QUORUM; - static int MIN_SKIP; - static int MAX_MODULES; - - Ref image_; - std::vector *possibleCenters_; - int startX_; - int startY_; - int width_; - int height_; - float moduleSize_; - - static float centerFromEnd(std::vector &stateCount, int end); - bool foundPatternCross(std::vector &stateCount); - - float crossCheckVertical(int startI, int centerJ, int maxCount, int originalStateCountTotal); - - Ref handlePossibleCenter(std::vector &stateCount, int i, int j); - -public: - AlignmentPatternFinder(Ref image, int startX, int startY, int width, int height, - float moduleSize, Refconst& callback); - ~AlignmentPatternFinder(); - Ref find(); - -private: - AlignmentPatternFinder(const AlignmentPatternFinder&); - AlignmentPatternFinder& operator =(const AlignmentPatternFinder&); - - Ref callback_; -}; -} -} - -#endif // __ALIGNMENT_PATTERN_FINDER_H__ diff --git a/cpp/core/src/zxing/qrcode/detector/Detector.cpp b/cpp/core/src/zxing/qrcode/detector/Detector.cpp deleted file mode 100644 index d1e5506a1..000000000 --- a/cpp/core/src/zxing/qrcode/detector/Detector.cpp +++ /dev/null @@ -1,314 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Detector.cpp - * zxing - * - * Created by Christian Brunschen on 14/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using std::ostringstream; -using std::abs; -using std::min; -using std::max; -using zxing::qrcode::Detector; -using zxing::Ref; -using zxing::BitMatrix; -using zxing::ResultPointCallback; -using zxing::DetectorResult; -using zxing::PerspectiveTransform; -using zxing::qrcode::AlignmentPattern; -using zxing::common::detector::MathUtils; - -// VC++ -using zxing::DecodeHints; -using zxing::qrcode::FinderPatternFinder; -using zxing::qrcode::FinderPatternInfo; -using zxing::ResultPoint; - -Detector::Detector(Ref image) : - image_(image) { -} - -Ref Detector::getImage() const { - return image_; -} - -Ref Detector::getResultPointCallback() const { - return callback_; -} - -Ref Detector::detect(DecodeHints const& hints) { - callback_ = hints.getResultPointCallback(); - FinderPatternFinder finder(image_, hints.getResultPointCallback()); - Ref info(finder.find(hints)); - return processFinderPatternInfo(info); -} - -Ref Detector::processFinderPatternInfo(Ref info){ - Ref topLeft(info->getTopLeft()); - Ref topRight(info->getTopRight()); - Ref bottomLeft(info->getBottomLeft()); - - float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft); - if (moduleSize < 1.0f) { - throw zxing::ReaderException("bad module size"); - } - int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize); - Version *provisionalVersion = Version::getProvisionalVersionForDimension(dimension); - int modulesBetweenFPCenters = provisionalVersion->getDimensionForVersion() - 7; - - Ref alignmentPattern; - // Anything above version 1 has an alignment pattern - if (provisionalVersion->getAlignmentPatternCenters().size() > 0) { - - - // Guess where a "bottom right" finder pattern would have been - float bottomRightX = topRight->getX() - topLeft->getX() + bottomLeft->getX(); - float bottomRightY = topRight->getY() - topLeft->getY() + bottomLeft->getY(); - - - // Estimate that alignment pattern is closer by 3 modules - // from "bottom right" to known top left location - float correctionToTopLeft = 1.0f - 3.0f / (float)modulesBetweenFPCenters; - int estAlignmentX = (int)(topLeft->getX() + correctionToTopLeft * (bottomRightX - topLeft->getX())); - int estAlignmentY = (int)(topLeft->getY() + correctionToTopLeft * (bottomRightY - topLeft->getY())); - - - // Kind of arbitrary -- expand search radius before giving up - for (int i = 4; i <= 16; i <<= 1) { - try { - alignmentPattern = findAlignmentInRegion(moduleSize, estAlignmentX, estAlignmentY, (float)i); - break; - } catch (zxing::ReaderException const& re) { - (void)re; - // try next round - } - } - if (alignmentPattern == 0) { - // Try anyway - } - - } - - Ref transform = createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension); - Ref bits(sampleGrid(image_, dimension, transform)); - ArrayRef< Ref > points(new Array< Ref >(alignmentPattern == 0 ? 3 : 4)); - points[0].reset(bottomLeft); - points[1].reset(topLeft); - points[2].reset(topRight); - if (alignmentPattern != 0) { - points[3].reset(alignmentPattern); - } - - Ref result(new DetectorResult(bits, points)); - return result; -} - -Ref Detector::createTransform(Ref topLeft, Ref topRight, Ref < - ResultPoint > bottomLeft, Ref alignmentPattern, int dimension) { - - float dimMinusThree = (float)dimension - 3.5f; - float bottomRightX; - float bottomRightY; - float sourceBottomRightX; - float sourceBottomRightY; - if (alignmentPattern != 0) { - bottomRightX = alignmentPattern->getX(); - bottomRightY = alignmentPattern->getY(); - sourceBottomRightX = dimMinusThree - 3.0f; - sourceBottomRightY = sourceBottomRightX; - } else { - // Don't have an alignment pattern, just make up the bottom-right point - bottomRightX = (topRight->getX() - topLeft->getX()) + bottomLeft->getX(); - bottomRightY = (topRight->getY() - topLeft->getY()) + bottomLeft->getY(); - sourceBottomRightX = dimMinusThree; - sourceBottomRightY = dimMinusThree; - } - - Ref transform(PerspectiveTransform::quadrilateralToQuadrilateral(3.5f, 3.5f, dimMinusThree, 3.5f, sourceBottomRightX, - sourceBottomRightY, 3.5f, dimMinusThree, topLeft->getX(), topLeft->getY(), topRight->getX(), - topRight->getY(), bottomRightX, bottomRightY, bottomLeft->getX(), bottomLeft->getY())); - - return transform; -} - -Ref Detector::sampleGrid(Ref image, int dimension, Ref transform) { - GridSampler &sampler = GridSampler::getInstance(); - return sampler.sampleGrid(image, dimension, transform); -} - -int Detector::computeDimension(Ref topLeft, Ref topRight, Ref bottomLeft, - float moduleSize) { - int tltrCentersDimension = - MathUtils::round(ResultPoint::distance(topLeft, topRight) / moduleSize); - int tlblCentersDimension = - MathUtils::round(ResultPoint::distance(topLeft, bottomLeft) / moduleSize); - int dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7; - switch (dimension & 0x03) { // mod 4 - case 0: - dimension++; - break; - // 1? do nothing - case 2: - dimension--; - break; - case 3: - ostringstream s; - s << "Bad dimension: " << dimension; - throw zxing::ReaderException(s.str().c_str()); - } - return dimension; -} - -float Detector::calculateModuleSize(Ref topLeft, Ref topRight, Ref bottomLeft) { - // Take the average - return (calculateModuleSizeOneWay(topLeft, topRight) + calculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0f; -} - -float Detector::calculateModuleSizeOneWay(Ref pattern, Ref otherPattern) { - float moduleSizeEst1 = sizeOfBlackWhiteBlackRunBothWays((int)pattern->getX(), (int)pattern->getY(), - (int)otherPattern->getX(), (int)otherPattern->getY()); - float moduleSizeEst2 = sizeOfBlackWhiteBlackRunBothWays((int)otherPattern->getX(), (int)otherPattern->getY(), - (int)pattern->getX(), (int)pattern->getY()); - if (zxing::isnan(moduleSizeEst1)) { - return moduleSizeEst2; - } - if (zxing::isnan(moduleSizeEst2)) { - return moduleSizeEst1; - } - // Average them, and divide by 7 since we've counted the width of 3 black modules, - // and 1 white and 1 black module on either side. Ergo, divide sum by 14. - return (moduleSizeEst1 + moduleSizeEst2) / 14.0f; -} - -float Detector::sizeOfBlackWhiteBlackRunBothWays(int fromX, int fromY, int toX, int toY) { - - float result = sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); - - // Now count other way -- don't run off image though of course - float scale = 1.0f; - int otherToX = fromX - (toX - fromX); - if (otherToX < 0) { - scale = (float) fromX / (float) (fromX - otherToX); - otherToX = 0; - } else if (otherToX >= (int)image_->getWidth()) { - scale = (float) (image_->getWidth() - 1 - fromX) / (float) (otherToX - fromX); - otherToX = image_->getWidth() - 1; - } - int otherToY = (int) (fromY - (toY - fromY) * scale); - - scale = 1.0f; - if (otherToY < 0) { - scale = (float) fromY / (float) (fromY - otherToY); - otherToY = 0; - } else if (otherToY >= (int)image_->getHeight()) { - scale = (float) (image_->getHeight() - 1 - fromY) / (float) (otherToY - fromY); - otherToY = image_->getHeight() - 1; - } - otherToX = (int) (fromX + (otherToX - fromX) * scale); - - result += sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); - - // Middle pixel is double-counted this way; subtract 1 - return result - 1.0f; -} - -float Detector::sizeOfBlackWhiteBlackRun(int fromX, int fromY, int toX, int toY) { - // Mild variant of Bresenham's algorithm; - // see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm - bool steep = abs(toY - fromY) > abs(toX - fromX); - if (steep) { - int temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - - int dx = abs(toX - fromX); - int dy = abs(toY - fromY); - int error = -dx >> 1; - int xstep = fromX < toX ? 1 : -1; - int ystep = fromY < toY ? 1 : -1; - - // In black pixels, looking for white, first or second time. - int state = 0; - // Loop up until x == toX, but not beyond - int xLimit = toX + xstep; - for (int x = fromX, y = fromY; x != xLimit; x += xstep) { - int realX = steep ? y : x; - int realY = steep ? x : y; - - // Does current pixel mean we have moved white to black or vice versa? - if (!((state == 1) ^ image_->get(realX, realY))) { - if (state == 2) { - return MathUtils::distance(x, y, fromX, fromY); - } - state++; - } - - error += dy; - if (error > 0) { - if (y == toY) { - break; - } - y += ystep; - error -= dx; - } - } - // Found black-white-black; give the benefit of the doubt that the next pixel outside the image - // is "white" so this last point at (toX+xStep,toY) is the right ending. This is really a - // small approximation; (toX+xStep,toY+yStep) might be really correct. Ignore this. - if (state == 2) { - return MathUtils::distance(toX + xstep, toY, fromX, fromY); - } - // else we didn't find even black-white-black; no estimate is really possible - return nan(); -} - -Ref Detector::findAlignmentInRegion(float overallEstModuleSize, int estAlignmentX, int estAlignmentY, - float allowanceFactor) { - // Look for an alignment pattern (3 modules in size) around where it - // should be - int allowance = (int)(allowanceFactor * overallEstModuleSize); - int alignmentAreaLeftX = max(0, estAlignmentX - allowance); - int alignmentAreaRightX = min((int)(image_->getWidth() - 1), estAlignmentX + allowance); - if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { - throw zxing::ReaderException("region too small to hold alignment pattern"); - } - int alignmentAreaTopY = max(0, estAlignmentY - allowance); - int alignmentAreaBottomY = min((int)(image_->getHeight() - 1), estAlignmentY + allowance); - if (alignmentAreaBottomY - alignmentAreaTopY < overallEstModuleSize * 3) { - throw zxing::ReaderException("region too small to hold alignment pattern"); - } - - AlignmentPatternFinder alignmentFinder(image_, alignmentAreaLeftX, alignmentAreaTopY, alignmentAreaRightX - - alignmentAreaLeftX, alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize, callback_); - return alignmentFinder.find(); -} diff --git a/cpp/core/src/zxing/qrcode/detector/Detector.h b/cpp/core/src/zxing/qrcode/detector/Detector.h deleted file mode 100644 index 05ef04456..000000000 --- a/cpp/core/src/zxing/qrcode/detector/Detector.h +++ /dev/null @@ -1,69 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __DETECTOR_H__ -#define __DETECTOR_H__ - -/* - * Detector.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include -#include - -namespace zxing { - -class DecodeHints; - -namespace qrcode { - -class Detector : public Counted { -private: - Ref image_; - Ref callback_; - -protected: - Ref getImage() const; - Ref getResultPointCallback() const; - - static Ref sampleGrid(Ref image, int dimension, Ref); - static int computeDimension(Ref topLeft, Ref topRight, Ref bottomLeft, - float moduleSize); - float calculateModuleSize(Ref topLeft, Ref topRight, Ref bottomLeft); - float calculateModuleSizeOneWay(Ref pattern, Ref otherPattern); - float sizeOfBlackWhiteBlackRunBothWays(int fromX, int fromY, int toX, int toY); - float sizeOfBlackWhiteBlackRun(int fromX, int fromY, int toX, int toY); - Ref findAlignmentInRegion(float overallEstModuleSize, int estAlignmentX, int estAlignmentY, - float allowanceFactor); - Ref processFinderPatternInfo(Ref info); -public: - virtual Ref createTransform(Ref topLeft, Ref topRight, Ref < - ResultPoint > bottomLeft, Ref alignmentPattern, int dimension); - - Detector(Ref image); - Ref detect(DecodeHints const& hints); - - -}; -} -} - -#endif // __DETECTOR_H__ diff --git a/cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp b/cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp deleted file mode 100644 index f882cc0e4..000000000 --- a/cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * FinderPattern.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -using std::abs; -using zxing::Ref; -using zxing::qrcode::FinderPattern; - -FinderPattern::FinderPattern(float posX, float posY, float estimatedModuleSize) - : ResultPoint(posX,posY), estimatedModuleSize_(estimatedModuleSize), count_(1) {} - -FinderPattern::FinderPattern(float posX, float posY, float estimatedModuleSize, int count) - : ResultPoint(posX,posY), estimatedModuleSize_(estimatedModuleSize), count_(count) {} - -int FinderPattern::getCount() const { - return count_; -} - -float FinderPattern::getEstimatedModuleSize() const { - return estimatedModuleSize_; -} - -void FinderPattern::incrementCount() { - count_++; - // cerr << "ic " << getX() << " " << getY() << " " << count_ << endl; -} - -/* - bool FinderPattern::aboutEquals(float moduleSize, float i, float j) const { - return abs(i - posY_) <= moduleSize && abs(j - posX_) <= moduleSize && (abs(moduleSize - estimatedModuleSize_) - <= 1.0f || abs(moduleSize - estimatedModuleSize_) / estimatedModuleSize_ <= 0.1f); - } -*/ -bool FinderPattern::aboutEquals(float moduleSize, float i, float j) const { - if (abs(i - getY()) <= moduleSize && abs(j - getX()) <= moduleSize) { - float moduleSizeDiff = abs(moduleSize - estimatedModuleSize_); - return moduleSizeDiff <= 1.0f || moduleSizeDiff <= estimatedModuleSize_; - } - return false; -} - -Ref FinderPattern::combineEstimate(float i, float j, float newModuleSize) const { - // fprintf(stderr, "ce %f %f %f\n", i, j, newModuleSize); - - int combinedCount = count_ + 1; - float combinedX = (count_ * getX() + j) / combinedCount; - float combinedY = (count_ * getY() + i) / combinedCount; - float combinedModuleSize = (count_ * getEstimatedModuleSize() + newModuleSize) / combinedCount; - return Ref(new FinderPattern(combinedX, combinedY, combinedModuleSize, combinedCount)); -} diff --git a/cpp/core/src/zxing/qrcode/detector/FinderPattern.h b/cpp/core/src/zxing/qrcode/detector/FinderPattern.h deleted file mode 100644 index 87b61c8ae..000000000 --- a/cpp/core/src/zxing/qrcode/detector/FinderPattern.h +++ /dev/null @@ -1,48 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __FINDER_PATTERN_H__ -#define __FINDER_PATTERN_H__ - -/* - * FinderPattern.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -namespace zxing { - namespace qrcode { - - class FinderPattern : public ResultPoint { - private: - float estimatedModuleSize_; - int count_; - - FinderPattern(float posX, float posY, float estimatedModuleSize, int count); - - public: - FinderPattern(float posX, float posY, float estimatedModuleSize); - int getCount() const; - float getEstimatedModuleSize() const; - void incrementCount(); - bool aboutEquals(float moduleSize, float i, float j) const; - Ref combineEstimate(float i, float j, float newModuleSize) const; - }; - } -} - -#endif // __FINDER_PATTERN_H__ diff --git a/cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp b/cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp deleted file mode 100644 index 1f3228b71..000000000 --- a/cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp +++ /dev/null @@ -1,559 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * FinderPatternFinder.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -using std::sort; -using std::max; -using std::abs; -using std::vector; -using zxing::Ref; -using zxing::qrcode::FinderPatternFinder; -using zxing::qrcode::FinderPattern; -using zxing::qrcode::FinderPatternInfo; - -// VC++ - -using zxing::BitMatrix; -using zxing::ResultPointCallback; -using zxing::ResultPoint; -using zxing::DecodeHints; - -namespace { - -class FurthestFromAverageComparator { -private: - const float averageModuleSize_; -public: - FurthestFromAverageComparator(float averageModuleSize) : - averageModuleSize_(averageModuleSize) { - } - bool operator()(Ref a, Ref b) { - float dA = abs(a->getEstimatedModuleSize() - averageModuleSize_); - float dB = abs(b->getEstimatedModuleSize() - averageModuleSize_); - return dA > dB; - } -}; - -class CenterComparator { - const float averageModuleSize_; -public: - CenterComparator(float averageModuleSize) : - averageModuleSize_(averageModuleSize) { - } - bool operator()(Ref a, Ref b) { - // N.B.: we want the result in descending order ... - if (a->getCount() != b->getCount()) { - return a->getCount() > b->getCount(); - } else { - float dA = abs(a->getEstimatedModuleSize() - averageModuleSize_); - float dB = abs(b->getEstimatedModuleSize() - averageModuleSize_); - return dA < dB; - } - } -}; - -} - -int FinderPatternFinder::CENTER_QUORUM = 2; -int FinderPatternFinder::MIN_SKIP = 3; -int FinderPatternFinder::MAX_MODULES = 57; - -float FinderPatternFinder::centerFromEnd(int* stateCount, int end) { - return (float)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f; -} - -bool FinderPatternFinder::foundPatternCross(int* stateCount) { - int totalModuleSize = 0; - for (int i = 0; i < 5; i++) { - if (stateCount[i] == 0) { - return false; - } - totalModuleSize += stateCount[i]; - } - if (totalModuleSize < 7) { - return false; - } - float moduleSize = (float)totalModuleSize / 7.0f; - float maxVariance = moduleSize / 2.0f; - // Allow less than 50% variance from 1-1-3-1-1 proportions - return abs(moduleSize - stateCount[0]) < maxVariance && abs(moduleSize - stateCount[1]) < maxVariance && abs(3.0f - * moduleSize - stateCount[2]) < 3.0f * maxVariance && abs(moduleSize - stateCount[3]) < maxVariance && abs( - moduleSize - stateCount[4]) < maxVariance; -} - -float FinderPatternFinder::crossCheckVertical(size_t startI, size_t centerJ, int maxCount, int originalStateCountTotal) { - - int maxI = image_->getHeight(); - int stateCount[5]; - for (int i = 0; i < 5; i++) - stateCount[i] = 0; - - - // Start counting up from center - int i = startI; - while (i >= 0 && image_->get(centerJ, i)) { - stateCount[2]++; - i--; - } - if (i < 0) { - return nan(); - } - while (i >= 0 && !image_->get(centerJ, i) && stateCount[1] <= maxCount) { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) { - return nan(); - } - while (i >= 0 && image_->get(centerJ, i) && stateCount[0] <= maxCount) { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) { - return nan(); - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image_->get(centerJ, i)) { - stateCount[2]++; - i++; - } - if (i == maxI) { - return nan(); - } - while (i < maxI && !image_->get(centerJ, i) && stateCount[3] < maxCount) { - stateCount[3]++; - i++; - } - if (i == maxI || stateCount[3] >= maxCount) { - return nan(); - } - while (i < maxI && image_->get(centerJ, i) && stateCount[4] < maxCount) { - stateCount[4]++; - i++; - } - if (stateCount[4] >= maxCount) { - return nan(); - } - - // If we found a finder-pattern-like section, but its size is more than 40% different than - // the original, assume it's a false positive - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - if (5 * abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { - return nan(); - } - - return foundPatternCross(stateCount) ? centerFromEnd(stateCount, i) : nan(); -} - -float FinderPatternFinder::crossCheckHorizontal(size_t startJ, size_t centerI, int maxCount, - int originalStateCountTotal) { - - int maxJ = image_->getWidth(); - int stateCount[5]; - for (int i = 0; i < 5; i++) - stateCount[i] = 0; - - int j = startJ; - while (j >= 0 && image_->get(j, centerI)) { - stateCount[2]++; - j--; - } - if (j < 0) { - return nan(); - } - while (j >= 0 && !image_->get(j, centerI) && stateCount[1] <= maxCount) { - stateCount[1]++; - j--; - } - if (j < 0 || stateCount[1] > maxCount) { - return nan(); - } - while (j >= 0 && image_->get(j, centerI) && stateCount[0] <= maxCount) { - stateCount[0]++; - j--; - } - if (stateCount[0] > maxCount) { - return nan(); - } - - j = startJ + 1; - while (j < maxJ && image_->get(j, centerI)) { - stateCount[2]++; - j++; - } - if (j == maxJ) { - return nan(); - } - while (j < maxJ && !image_->get(j, centerI) && stateCount[3] < maxCount) { - stateCount[3]++; - j++; - } - if (j == maxJ || stateCount[3] >= maxCount) { - return nan(); - } - while (j < maxJ && image_->get(j, centerI) && stateCount[4] < maxCount) { - stateCount[4]++; - j++; - } - if (stateCount[4] >= maxCount) { - return nan(); - } - - // If we found a finder-pattern-like section, but its size is significantly different than - // the original, assume it's a false positive - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - if (5 * abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { - return nan(); - } - - return foundPatternCross(stateCount) ? centerFromEnd(stateCount, j) : nan(); -} - -bool FinderPatternFinder::handlePossibleCenter(int* stateCount, size_t i, size_t j) { - int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - float centerJ = centerFromEnd(stateCount, j); - float centerI = crossCheckVertical(i, (size_t)centerJ, stateCount[2], stateCountTotal); - if (!isnan(centerI)) { - // Re-cross check - centerJ = crossCheckHorizontal((size_t)centerJ, (size_t)centerI, stateCount[2], stateCountTotal); - if (!isnan(centerJ)) { - float estimatedModuleSize = (float)stateCountTotal / 7.0f; - bool found = false; - size_t max = possibleCenters_.size(); - for (size_t index = 0; index < max; index++) { - Ref center = possibleCenters_[index]; - // Look for about the same center and module size: - if (center->aboutEquals(estimatedModuleSize, centerI, centerJ)) { - possibleCenters_[index] = center->combineEstimate(centerI, centerJ, estimatedModuleSize); - found = true; - break; - } - } - if (!found) { - Ref newPattern(new FinderPattern(centerJ, centerI, estimatedModuleSize)); - possibleCenters_.push_back(newPattern); - if (callback_ != 0) { - callback_->foundPossibleResultPoint(*newPattern); - } - } - return true; - } - } - return false; -} - -int FinderPatternFinder::findRowSkip() { - size_t max = possibleCenters_.size(); - if (max <= 1) { - return 0; - } - Ref firstConfirmedCenter; - for (size_t i = 0; i < max; i++) { - Ref center = possibleCenters_[i]; - if (center->getCount() >= CENTER_QUORUM) { - if (firstConfirmedCenter == 0) { - firstConfirmedCenter = center; - } else { - // We have two confirmed centers - // How far down can we skip before resuming looking for the next - // pattern? In the worst case, only the difference between the - // difference in the x / y coordinates of the two centers. - // This is the case where you find top left first. Draw it out. - hasSkipped_ = true; - return (int)(abs(firstConfirmedCenter->getX() - center->getX()) - abs(firstConfirmedCenter->getY() - - center->getY()))/2; - } - } - } - return 0; -} - -bool FinderPatternFinder::haveMultiplyConfirmedCenters() { - int confirmedCount = 0; - float totalModuleSize = 0.0f; - size_t max = possibleCenters_.size(); - for (size_t i = 0; i < max; i++) { - Ref pattern = possibleCenters_[i]; - if (pattern->getCount() >= CENTER_QUORUM) { - confirmedCount++; - totalModuleSize += pattern->getEstimatedModuleSize(); - } - } - if (confirmedCount < 3) { - return false; - } - // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive" - // and that we need to keep looking. We detect this by asking if the estimated module sizes - // vary too much. We arbitrarily say that when the total deviation from average exceeds - // 5% of the total module size estimates, it's too much. - float average = totalModuleSize / max; - float totalDeviation = 0.0f; - for (size_t i = 0; i < max; i++) { - Ref pattern = possibleCenters_[i]; - totalDeviation += abs(pattern->getEstimatedModuleSize() - average); - } - return totalDeviation <= 0.05f * totalModuleSize; -} - -vector< Ref > FinderPatternFinder::selectBestPatterns() { - size_t startSize = possibleCenters_.size(); - - if (startSize < 3) { - // Couldn't find enough finder patterns - throw zxing::ReaderException("Could not find three finder patterns"); - } - - // Filter outlier possibilities whose module size is too different - if (startSize > 3) { - // But we can only afford to do so if we have at least 4 possibilities to choose from - float totalModuleSize = 0.0f; - float square = 0.0f; - for (size_t i = 0; i < startSize; i++) { - float size = possibleCenters_[i]->getEstimatedModuleSize(); - totalModuleSize += size; - square += size * size; - } - float average = totalModuleSize / (float) startSize; - float stdDev = (float)sqrt(square / startSize - average * average); - - sort(possibleCenters_.begin(), possibleCenters_.end(), FurthestFromAverageComparator(average)); - - float limit = max(0.2f * average, stdDev); - - for (size_t i = 0; i < possibleCenters_.size() && possibleCenters_.size() > 3; i++) { - if (abs(possibleCenters_[i]->getEstimatedModuleSize() - average) > limit) { - possibleCenters_.erase(possibleCenters_.begin()+i); - i--; - } - } - } - - if (possibleCenters_.size() > 3) { - // Throw away all but those first size candidate points we found. - float totalModuleSize = 0.0f; - for (size_t i = 0; i < possibleCenters_.size(); i++) { - float size = possibleCenters_[i]->getEstimatedModuleSize(); - totalModuleSize += size; - } - float average = totalModuleSize / (float) possibleCenters_.size(); - sort(possibleCenters_.begin(), possibleCenters_.end(), CenterComparator(average)); - } - - if (possibleCenters_.size() > 3) { - possibleCenters_.erase(possibleCenters_.begin()+3,possibleCenters_.end()); - } - - vector > result(3); - result[0] = possibleCenters_[0]; - result[1] = possibleCenters_[1]; - result[2] = possibleCenters_[2]; - return result; -} - -vector > FinderPatternFinder::orderBestPatterns(vector > patterns) { - // Find distances between pattern centers - float abDistance = distance(patterns[0], patterns[1]); - float bcDistance = distance(patterns[1], patterns[2]); - float acDistance = distance(patterns[0], patterns[2]); - - Ref topLeft; - Ref topRight; - Ref bottomLeft; - // Assume one closest to other two is top left; - // topRight and bottomLeft will just be guesses below at first - if (bcDistance >= abDistance && bcDistance >= acDistance) { - topLeft = patterns[0]; - topRight = patterns[1]; - bottomLeft = patterns[2]; - } else if (acDistance >= bcDistance && acDistance >= abDistance) { - topLeft = patterns[1]; - topRight = patterns[0]; - bottomLeft = patterns[2]; - } else { - topLeft = patterns[2]; - topRight = patterns[0]; - bottomLeft = patterns[1]; - } - - // Use cross product to figure out which of other1/2 is the bottom left - // pattern. The vector "top-left -> bottom-left" x "top-left -> top-right" - // should yield a vector with positive z component - if ((bottomLeft->getY() - topLeft->getY()) * (topRight->getX() - topLeft->getX()) < (bottomLeft->getX() - - topLeft->getX()) * (topRight->getY() - topLeft->getY())) { - Ref temp = topRight; - topRight = bottomLeft; - bottomLeft = temp; - } - - vector > results(3); - results[0] = bottomLeft; - results[1] = topLeft; - results[2] = topRight; - return results; -} - -float FinderPatternFinder::distance(Ref p1, Ref p2) { - float dx = p1->getX() - p2->getX(); - float dy = p1->getY() - p2->getY(); - return (float)sqrt(dx * dx + dy * dy); -} - -FinderPatternFinder::FinderPatternFinder(Ref image, - Refconst& callback) : - image_(image), possibleCenters_(), hasSkipped_(false), callback_(callback) { -} - -Ref FinderPatternFinder::find(DecodeHints const& hints) { - bool tryHarder = hints.getTryHarder(); - - size_t maxI = image_->getHeight(); - size_t maxJ = image_->getWidth(); - - - // We are looking for black/white/black/white/black modules in - // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far - - // As this is used often, we use an integer array instead of vector - int stateCount[5]; - bool done = false; - - - // Let's assume that the maximum version QR Code we support takes up 1/4 - // the height of the image, and then account for the center being 3 - // modules in size. This gives the smallest number of pixels the center - // could be, so skip this often. When trying harder, look for all - // QR versions regardless of how dense they are. - int iSkip = (3 * maxI) / (4 * MAX_MODULES); - if (iSkip < MIN_SKIP || tryHarder) { - iSkip = MIN_SKIP; - } - - // This is slightly faster than using the Ref. Efficiency is important here - BitMatrix& matrix = *image_; - - for (size_t i = iSkip - 1; i < maxI && !done; i += iSkip) { - // Get a row of black/white values - - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - int currentState = 0; - for (size_t j = 0; j < maxJ; j++) { - if (matrix.get(j, i)) { - // Black pixel - if ((currentState & 1) == 1) { // Counting white pixels - currentState++; - } - stateCount[currentState]++; - } else { // White pixel - if ((currentState & 1) == 0) { // Counting black pixels - if (currentState == 4) { // A winner? - if (foundPatternCross(stateCount)) { // Yes - bool confirmed = handlePossibleCenter(stateCount, i, j); - if (confirmed) { - // Start examining every other line. Checking each line turned out to be too - // expensive and didn't improve performance. - iSkip = 2; - if (hasSkipped_) { - done = haveMultiplyConfirmedCenters(); - } else { - int rowSkip = findRowSkip(); - if (rowSkip > stateCount[2]) { - // Skip rows between row of lower confirmed center - // and top of presumed third confirmed center - // but back up a bit to get a full chance of detecting - // it, entire width of center of finder pattern - - // Skip by rowSkip, but back off by stateCount[2] (size - // of last center of pattern we saw) to be conservative, - // and also back off by iSkip which is about to be - // re-added - i += rowSkip - stateCount[2] - iSkip; - j = maxJ - 1; - } - } - } else { - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - continue; - } - // Clear state to start looking again - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } else { // No, shift counts back by two - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } else { - stateCount[++currentState]++; - } - } else { // Counting white pixels - stateCount[currentState]++; - } - } - } - if (foundPatternCross(stateCount)) { - bool confirmed = handlePossibleCenter(stateCount, i, maxJ); - if (confirmed) { - iSkip = stateCount[0]; - if (hasSkipped_) { - // Found a third one - done = haveMultiplyConfirmedCenters(); - } - } - } - } - - vector > patternInfo = selectBestPatterns(); - patternInfo = orderBestPatterns(patternInfo); - - Ref result(new FinderPatternInfo(patternInfo)); - return result; -} - -Ref FinderPatternFinder::getImage() { - return image_; -} - -vector >& FinderPatternFinder::getPossibleCenters() { - return possibleCenters_; -} diff --git a/cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h b/cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h deleted file mode 100644 index 82d43652f..000000000 --- a/cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h +++ /dev/null @@ -1,76 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -#ifndef __FINDER_PATTERN_FINDER_H__ -#define __FINDER_PATTERN_FINDER_H__ - -/* - * FinderPatternFinder.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - -namespace zxing { - -class DecodeHints; - -namespace qrcode { - -class FinderPatternFinder { -private: - static int CENTER_QUORUM; - -protected: - static int MIN_SKIP; - static int MAX_MODULES; - - Ref image_; - std::vector > possibleCenters_; - bool hasSkipped_; - - Ref callback_; - - /** stateCount must be int[5] */ - static float centerFromEnd(int* stateCount, int end); - static bool foundPatternCross(int* stateCount); - - float crossCheckVertical(size_t startI, size_t centerJ, int maxCount, int originalStateCountTotal); - float crossCheckHorizontal(size_t startJ, size_t centerI, int maxCount, int originalStateCountTotal); - - /** stateCount must be int[5] */ - bool handlePossibleCenter(int* stateCount, size_t i, size_t j); - int findRowSkip(); - bool haveMultiplyConfirmedCenters(); - std::vector > selectBestPatterns(); - static std::vector > orderBestPatterns(std::vector > patterns); - - Ref getImage(); - std::vector >& getPossibleCenters(); - -public: - static float distance(Ref p1, Ref p2); - FinderPatternFinder(Ref image, Refconst&); - Ref find(DecodeHints const& hints); -}; -} -} - -#endif // __FINDER_PATTERN_FINDER_H__ diff --git a/cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp b/cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp deleted file mode 100644 index 088a0e760..000000000 --- a/cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * FinderPatternInfo.cpp - * zxing - * - * Created by Christian Brunschen on 13/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 - -namespace zxing { -namespace qrcode { - -FinderPatternInfo::FinderPatternInfo(std::vector > patternCenters) : - bottomLeft_(patternCenters[0]), topLeft_(patternCenters[1]), topRight_(patternCenters[2]) { -} - -Ref FinderPatternInfo::getBottomLeft() { - return bottomLeft_; -} -Ref FinderPatternInfo::getTopLeft() { - return topLeft_; -} -Ref FinderPatternInfo::getTopRight() { - return topRight_; -} - -} -} diff --git a/cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h b/cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h deleted file mode 100644 index 6d132540c..000000000 --- a/cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __FINDER_PATTERN_INFO_H__ -#define __FINDER_PATTERN_INFO_H__ - -/* - * FinderPatternInfo.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class FinderPatternInfo : public Counted { -private: - Ref bottomLeft_; - Ref topLeft_; - Ref topRight_; - -public: - FinderPatternInfo(std::vector > patternCenters); - - Ref getBottomLeft(); - Ref getTopLeft(); - Ref getTopRight(); -}; -} -} - -#endif // __FINDER_PATTERN_INFO_H__ diff --git a/cpp/core/tests/src/TestRunner.cpp b/cpp/core/tests/src/TestRunner.cpp deleted file mode 100644 index 7adb33a1b..000000000 --- a/cpp/core/tests/src/TestRunner.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - * TestRunner.cpp - * zxing - * - * Created by Christian Brunschen on 06/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 -#include - -int main(int, char**) { - CppUnit::TextUi::TestRunner runner; - CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry(); - runner.addTest(registry.makeTest()); - bool wasSuccessful = runner.run("", false); - return wasSuccessful ? 0 : 1; -} diff --git a/cpp/core/tests/src/common/BitArrayTest.cpp b/cpp/core/tests/src/common/BitArrayTest.cpp deleted file mode 100644 index 98ba4b6ef..000000000 --- a/cpp/core/tests/src/common/BitArrayTest.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - * BitArrayTest.cpp - * zxing - * - * Created by Christian Brunschen on 12/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 "BitArrayTest.h" -#include -#include - -using namespace std; - -namespace zxing { - -CPPUNIT_TEST_SUITE_REGISTRATION(BitArrayTest); - -void BitArrayTest::testGetSet() { - const int bits = BitArray::bitsPerWord + 1; - BitArray array(bits); - for(int i = 0; i < bits; i++) { - CPPUNIT_ASSERT_EQUAL(false, array.get(i)); - array.set(i); - CPPUNIT_ASSERT_EQUAL(true, array.get(i)); - } -} - -void BitArrayTest::testSetBulk() { - BitArray array(64); - array.setBulk(32, 0xFFFF0000); - for(int i = 0; i < 48; i++) { - CPPUNIT_ASSERT_EQUAL(false, array.get(i)); - } - for(int i = 48; i < 64; i++) { - CPPUNIT_ASSERT_EQUAL(true, array.get(i)); - } -} - -void BitArrayTest::testClear() { - const int bits = BitArray::bitsPerWord; - BitArray array(bits); - for(int i = 0; i < bits; i++) { - array.set(i); - } - array.clear(); - for(int i = 0; i < bits; i++) { - CPPUNIT_ASSERT_EQUAL(false, array.get(i)); - } -} - -void BitArrayTest::testGetArray() { - const int bits = BitArray::bitsPerWord; - BitArray array(2 * bits); - array.set(0); - array.set(2 * bits - 1); - vector words(array.getBitArray()); - CPPUNIT_ASSERT_EQUAL(1, words[0]); - CPPUNIT_ASSERT_EQUAL((1 << (bits - 1)), words[1]); -} - -void BitArrayTest::testIsRange() { - const int bits = BitArray::bitsPerWord; - int bits2 = 2 * bits; - BitArray array(bits2); - CPPUNIT_ASSERT_EQUAL(true, array.isRange(0, bits2, false)); - CPPUNIT_ASSERT_EQUAL(false, array.isRange(0, bits2, true)); - array.set(bits); - CPPUNIT_ASSERT_EQUAL(true, array.isRange(bits, bits + 1, true)); - array.set(bits - 1); - CPPUNIT_ASSERT_EQUAL(true, array.isRange(bits - 1, bits + 1, true)); - array.set(bits + 2); - CPPUNIT_ASSERT_EQUAL(false, array.isRange(bits - 1, bits + 3, true)); - for(int i = 0; i < bits - 1; i++) { - array.set(i); - } - CPPUNIT_ASSERT_EQUAL(true, array.isRange(0, bits + 1, true)); - for(int i = 33; i < 64; i++) { - array.set(i); - } - CPPUNIT_ASSERT_EQUAL(true, array.isRange(0, 64, true)); - CPPUNIT_ASSERT_EQUAL(false, array.isRange(0, 64, false)); -} - -// fills the two arrays with identical random bits -void BitArrayTest::fillRandom(BitArray& test, BitArray& reference) { - srandom(0xDEADBEEFL + test.getSize()); - for(int i = 0; i < test.getSize(); ++i) { - if(random() & 0x1) { - test.set(i); - reference.set(i); - } - } -} - -void BitArrayTest::testReverseHalves() { - // one word test, split in half - { - const int bits = BitArray::bitsPerWord; - BitArray test(bits); - - test.clear(); - for(int i = 0; i < bits / 2; ++i) { - test.set(i); - } - - test.reverse(); - for(int i = 0; i < bits / 2; ++i) { - CPPUNIT_ASSERT_EQUAL(test.get(i), !test.get(bits - 1 - i)); - } - } - - // two word test - { - const int bits2 = BitArray::bitsPerWord * 2; - BitArray test2(bits2); - - test2.clear(); - for(int i = 0; i < bits2 / 2; ++i) { - test2.set(i); - } - - test2.reverse(); - for(int i = 0; i < bits2 / 2; ++i) { - CPPUNIT_ASSERT_EQUAL(test2.get(i), !test2.get(bits2 - 1 - i)); - } - } -} - -void BitArrayTest::testReverseEven() { - const int bits = BitArray::bitsPerWord * 8; - BitArray test(bits); - BitArray reference(bits); - - test.clear(); - reference.clear(); - - fillRandom(test, reference); - - test.reverse(); - for(int i = 0; i < bits; ++i) { - CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i)); - } -} - -void BitArrayTest::testReverseOdd() { - const int bits = BitArray::bitsPerWord * 6 + 11; - BitArray test(bits); - BitArray reference(bits); - - test.clear(); - reference.clear(); - - fillRandom(test, reference); - - test.reverse(); - for(int i = 0; i < bits; ++i) { - CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i)); - } -} - -void BitArrayTest::testReverseSweep() { - int bits; - const int bitsHigh = BitArray::bitsPerWord * 10; - - for(bits = 1; bits < bitsHigh; ++bits) { - BitArray test(bits); - BitArray reference(bits); - - test.clear(); - reference.clear(); - - fillRandom(test, reference); - - test.reverse(); - for(int i = 0; i < bits; ++i) { - CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i)); - } - } -} - -void BitArrayTest::testReverseReverse() { - const int bits = BitArray::bitsPerWord * 4 + 17; - BitArray test(bits); - BitArray reference(bits); - - test.clear(); - reference.clear(); - - fillRandom(test, reference); - - // flip it once and test - test.reverse(); - for(int i = 0; i < bits; ++i) { - CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i)); - } - // flip it back and test - test.reverse(); - for(int i = 0; i < bits; ++i) { - CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(i)); - } -} -} - diff --git a/cpp/core/tests/src/common/BitArrayTest.h b/cpp/core/tests/src/common/BitArrayTest.h deleted file mode 100644 index 8f86ce663..000000000 --- a/cpp/core/tests/src/common/BitArrayTest.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef __BIT_ARRAY_TEST_H__ -#define __BIT_ARRAY_TEST_H__ - -/* - * BitArrayTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -class BitArrayTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(BitArrayTest); - CPPUNIT_TEST(testGetSet); - CPPUNIT_TEST(testSetBulk); - CPPUNIT_TEST(testClear); - CPPUNIT_TEST(testGetArray); - CPPUNIT_TEST(testIsRange); - CPPUNIT_TEST(testReverseHalves); - CPPUNIT_TEST(testReverseEven); - CPPUNIT_TEST(testReverseOdd); - CPPUNIT_TEST(testReverseSweep); - CPPUNIT_TEST(testReverseReverse); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testGetSet(); - void testSetBulk(); - void testClear(); - void testGetArray(); - void testIsRange(); - void testReverseHalves(); - void testReverseEven(); - void testReverseOdd(); - void testReverseSweep(); - void testReverseReverse(); - -private: - static void fillRandom(BitArray& test, BitArray& reference); -}; -} - -#endif // __BIT_ARRAY_TEST_H__ diff --git a/cpp/core/tests/src/common/BitMatrixTest.cpp b/cpp/core/tests/src/common/BitMatrixTest.cpp deleted file mode 100644 index 66e3ba3b7..000000000 --- a/cpp/core/tests/src/common/BitMatrixTest.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * BitMatrixTest.cpp - * zxing - * - * Created by Christian Brunschen on 12/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 "BitMatrixTest.h" -#include -#include -#include - -namespace zxing { -using namespace std; - -CPPUNIT_TEST_SUITE_REGISTRATION(BitMatrixTest); - -BitMatrixTest::BitMatrixTest() { - srand(getpid()); -} - -void BitMatrixTest::testGetSet() { - const int bits = BitMatrix::bitsPerWord; - BitMatrix matrix(bits + 1); - CPPUNIT_ASSERT_EQUAL(bits + 1, matrix.getHeight()); - for (int i = 0; i < bits + 1; i++) { - for (int j = 0; j < bits + 1; j++) { - if (i * j % 3 == 0) { - matrix.set(i, j); - } - } - } - for (int i = 0; i < bits + 1; i++) { - for (int j = 0; j < bits + 1; j++) { - CPPUNIT_ASSERT_EQUAL(i * j % 3 == 0, matrix.get(i, j)); - } - } -} - -void BitMatrixTest::testSetRegion() { - BitMatrix matrix(5); - matrix.setRegion(1, 1, 3, 3); - for (int i = 0; i < 5; i++) { - for (int j = 0; j < 5; j++) { - CPPUNIT_ASSERT_EQUAL(i >= 1 && i <= 3 && j >= 1 && j <= 3, - matrix.get(i, j)); - } - } -} - -void BitMatrixTest::testGetRow0() { - const int width = 2; - const int height = 2; - runBitMatrixGetRowTest(width, height); -} - -void BitMatrixTest::testGetRow1() { - const int width = 98; - const int height = 76; - runBitMatrixGetRowTest(width, height); -} - -void BitMatrixTest::testGetRow2() { - const int width = 320; - const int height = 320; - runBitMatrixGetRowTest(width, height); -} - -void BitMatrixTest::testGetRow3() { - const int width = 17; - const int height = 23; - runBitMatrixGetRowTest(width, height); -} - -void BitMatrixTest::runBitMatrixGetRowTest(int width, int height) { - BitMatrix mat(width, height); - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - bool v = ((rand() & 0x01) != 0); - if (v) { - mat.set(x, y); - } - } - } - Ref row(new BitArray(width)); - for (int y = 0; y < height; y++) { - row = mat.getRow(y, row); - for (int x = 0; x < width; x++) { - CPPUNIT_ASSERT_EQUAL(row->get(x), mat.get(x,y)); - } - } -} -} diff --git a/cpp/core/tests/src/common/BitMatrixTest.h b/cpp/core/tests/src/common/BitMatrixTest.h deleted file mode 100644 index 61641ccf4..000000000 --- a/cpp/core/tests/src/common/BitMatrixTest.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef __BIT_MATRIX_TEST_H__ -#define __BIT_MATRIX_TEST_H__ - -/* - * BitMatrixTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -class BitMatrixTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(BitMatrixTest); - CPPUNIT_TEST(testGetSet); - CPPUNIT_TEST(testSetRegion); - CPPUNIT_TEST(testGetRow0); - CPPUNIT_TEST(testGetRow1); - CPPUNIT_TEST(testGetRow2); - CPPUNIT_TEST(testGetRow3); - CPPUNIT_TEST_SUITE_END(); - -public: - BitMatrixTest(); - -protected: - void testGetSet(); - void testSetRegion(); - void testGetRow0(); - void testGetRow1(); - void testGetRow2(); - void testGetRow3(); - -private: - void runBitMatrixGetRowTest(int width, int height); -}; -} - - -#endif // __BIT_MATRIX_TEST_H__ diff --git a/cpp/core/tests/src/common/BitSourceTest.cpp b/cpp/core/tests/src/common/BitSourceTest.cpp deleted file mode 100644 index f1996c1c6..000000000 --- a/cpp/core/tests/src/common/BitSourceTest.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * BitSourceTest.cpp - * zxing - * - * Created by Christian Brunschen on 09/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 "BitSourceTest.h" - -namespace zxing { - -CPPUNIT_TEST_SUITE_REGISTRATION(BitSourceTest); - -typedef char byte; - -void BitSourceTest::testSource() { - byte rawBytes[] = {(byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5}; - ArrayRef bytes(rawBytes, 5); - BitSource source(bytes); - CPPUNIT_ASSERT_EQUAL(40, source.available()); - CPPUNIT_ASSERT_EQUAL(0, source.readBits(1)); - CPPUNIT_ASSERT_EQUAL(39, source.available()); - CPPUNIT_ASSERT_EQUAL(0, source.readBits(6)); - CPPUNIT_ASSERT_EQUAL(33, source.available()); - CPPUNIT_ASSERT_EQUAL(1, source.readBits(1)); - CPPUNIT_ASSERT_EQUAL(32, source.available()); - CPPUNIT_ASSERT_EQUAL(2, source.readBits(8)); - CPPUNIT_ASSERT_EQUAL(24, source.available()); - CPPUNIT_ASSERT_EQUAL(12, source.readBits(10)); - CPPUNIT_ASSERT_EQUAL(14, source.available()); - CPPUNIT_ASSERT_EQUAL(16, source.readBits(8)); - CPPUNIT_ASSERT_EQUAL(6, source.available()); - CPPUNIT_ASSERT_EQUAL(5, source.readBits(6)); - CPPUNIT_ASSERT_EQUAL(0, source.available()); -} -} diff --git a/cpp/core/tests/src/common/BitSourceTest.h b/cpp/core/tests/src/common/BitSourceTest.h deleted file mode 100644 index 576a1fc28..000000000 --- a/cpp/core/tests/src/common/BitSourceTest.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __BIT_SOURCE_TEST_H__ -#define __BIT_SOURCE_TEST_H__ - -/* - * BitSourceTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -class BitSourceTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(BitSourceTest); - CPPUNIT_TEST(testSource); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testSource(); - -private: -}; -} - -#endif // __BIT_SOURCE_TEST_H__ diff --git a/cpp/core/tests/src/common/CountedTest.cpp b/cpp/core/tests/src/common/CountedTest.cpp deleted file mode 100644 index 57b048994..000000000 --- a/cpp/core/tests/src/common/CountedTest.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * CountedTest.cpp - * zxing - * - * Created by Christian Brunschen on 08/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 "CountedTest.h" -#include -#include - -using namespace std; -using namespace CPPUNIT_NS; - -namespace zxing { - -class Foo : public Counted { -public: - void foo() { - cout << "foo!\n"; - } -}; - -//CPPUNIT_TEST_SUITE_REGISTRATION(CountedTest); - -void CountedTest::setUp() {} -void CountedTest::tearDown() {} - -void CountedTest::test() { - Foo foo; - CPPUNIT_ASSERT_EQUAL(0, foo.count()); - foo.retain(); - CPPUNIT_ASSERT_EQUAL(1, foo.count()); - Ref foobar(new Foo); - CPPUNIT_ASSERT_EQUAL(1, foobar->count()); - { - Ref secondRef(foobar); - CPPUNIT_ASSERT_EQUAL(1, foo.count()); - CPPUNIT_ASSERT_EQUAL(2, foobar->count()); - } - CPPUNIT_ASSERT_EQUAL(1, foo.count()); - CPPUNIT_ASSERT_EQUAL(1, foobar->count()); -} - -} diff --git a/cpp/core/tests/src/common/CountedTest.h b/cpp/core/tests/src/common/CountedTest.h deleted file mode 100644 index 185aad49f..000000000 --- a/cpp/core/tests/src/common/CountedTest.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __COUNTED_TEST_H__ -#define __COUNTED_TEST_H__ - -/* - * CountedTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include - -using namespace std; - -namespace zxing { - -class CountedTest : public CppUnit::TestFixture { - CPPUNIT_TEST_SUITE(CountedTest); - CPPUNIT_TEST(test); - CPPUNIT_TEST_SUITE_END(); - -public: - void setUp(); - void tearDown(); - -protected: - void test(); - -private: -}; -} - -#endif // __COUNTED_TEST_H__ diff --git a/cpp/core/tests/src/common/PerspectiveTransformTest.cpp b/cpp/core/tests/src/common/PerspectiveTransformTest.cpp deleted file mode 100644 index fc306f1e6..000000000 --- a/cpp/core/tests/src/common/PerspectiveTransformTest.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * PerspectiveTransformTest.cpp - * zxing - * - * Created by Christian Brunschen on 12/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 "PerspectiveTransformTest.h" - -namespace zxing { -using namespace std; - -static float EPSILON = 0.0001f; - -CPPUNIT_TEST_SUITE_REGISTRATION(PerspectiveTransformTest); - -void PerspectiveTransformTest::testSquareToQuadrilateral() { - Ref pt - (PerspectiveTransform::squareToQuadrilateral - (2.0f, 3.0f, 10.0f, 4.0f, 16.0f, 15.0f, 4.0f, 9.0f)); - assertPointEquals(2.0f, 3.0f, 0.0f, 0.0f, pt); - assertPointEquals(10.0f, 4.0f, 1.0f, 0.0f, pt); - assertPointEquals(4.0f, 9.0f, 0.0f, 1.0f, pt); - assertPointEquals(16.0f, 15.0f, 1.0f, 1.0f, pt); - assertPointEquals(6.535211f, 6.8873234f, 0.5f, 0.5f, pt); - assertPointEquals(48.0f, 42.42857f, 1.5f, 1.5f, pt); -} - -void PerspectiveTransformTest::testQuadrilateralToQuadrilateral() { - Ref pt - (PerspectiveTransform::quadrilateralToQuadrilateral - (2.0f, 3.0f, 10.0f, 4.0f, 16.0f, 15.0f, 4.0f, 9.0f, - 103.0f, 110.0f, 300.0f, 120.0f, 290.0f, 270.0f, 150.0f, 280.0f)); - assertPointEquals(103.0f, 110.0f, 2.0f, 3.0f, pt); - assertPointEquals(300.0f, 120.0f, 10.0f, 4.0f, pt); - assertPointEquals(290.0f, 270.0f, 16.0f, 15.0f, pt); - assertPointEquals(150.0f, 280.0f, 4.0f, 9.0f, pt); - assertPointEquals(7.1516876f, -64.60185f, 0.5f, 0.5f, pt); - assertPointEquals(328.09116f, 334.16385f, 50.0f, 50.0f, pt); -} - -void PerspectiveTransformTest::assertPointEquals(float expectedX, - float expectedY, - float sourceX, - float sourceY, - Ref pt) { - vector points(2); - points[0] = sourceX; - points[1] = sourceY; - pt->transformPoints(points); - CPPUNIT_ASSERT_DOUBLES_EQUAL(expectedX, points[0], EPSILON); - CPPUNIT_ASSERT_DOUBLES_EQUAL(expectedY, points[1], EPSILON); - -} - -} diff --git a/cpp/core/tests/src/common/PerspectiveTransformTest.h b/cpp/core/tests/src/common/PerspectiveTransformTest.h deleted file mode 100644 index a21e511c6..000000000 --- a/cpp/core/tests/src/common/PerspectiveTransformTest.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __PERSPECTIVE_TRANSFORM_TEST_H__ -#define __PERSPECTIVE_TRANSFORM_TEST_H__ - -/* - * PerspectiveTransformTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -class PerspectiveTransformTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(PerspectiveTransformTest); - CPPUNIT_TEST(testSquareToQuadrilateral); - CPPUNIT_TEST(testQuadrilateralToQuadrilateral); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testSquareToQuadrilateral(); - void testQuadrilateralToQuadrilateral(); - -private: - static void assertPointEquals(float expectedX, float expectedY, - float sourceX, float sourceY, - Ref pt); -}; -} - -#endif // __PERSPECTIVE_TRANSFORM_TEST_H__ diff --git a/cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp b/cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp deleted file mode 100644 index 0828b5917..000000000 --- a/cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * ReedSolomonTest.cpp - * zxing - * - * Created by Christian Brunschen on 06/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * 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 "ReedSolomonTest.h" -#include -#include -#include -#include -#include -#include - -namespace zxing { -using namespace std; - -CPPUNIT_TEST_SUITE_REGISTRATION(ReedSolomonTest); - -static inline ArrayRef makeVector(int n, int *items) { - ArrayRef v(new Array(items, n)); - return v; -} - -static int QR_CODE_TEST[] = { 0x10, 0x20, 0x0C, 0x56, 0x61, 0x80, 0xEC, 0x11, 0xEC, - 0x11, 0xEC, 0x11, 0xEC, 0x11, 0xEC, 0x11, 0xA5 - }; -static int QR_CODE_TEST_WITH_EC[] = { 0x10, 0x20, 0x0C, 0x56, 0x61, 0x80, 0xEC, 0x11, 0xEC, - 0x11, 0xEC, 0x11, 0xEC, 0x11, 0xEC, 0x11, 0xA5, 0x24, - 0xD4, 0xC1, 0xED, 0x36, 0xC7, 0x87, 0x2C, 0x55 - }; - -void ReedSolomonTest::setUp() { - qrCodeTest_ = - makeVector(sizeof(QR_CODE_TEST) / sizeof(QR_CODE_TEST[0]), - QR_CODE_TEST); - qrCodeTestWithEc_ = - makeVector(sizeof(QR_CODE_TEST_WITH_EC) / sizeof(QR_CODE_TEST_WITH_EC[0]), - QR_CODE_TEST_WITH_EC); - qrCodeCorrectable_ = - (qrCodeTestWithEc_->size() - qrCodeTest_->size()) / 2; - - qrRSDecoder_ = new ReedSolomonDecoder(GenericGF::QR_CODE_FIELD_256); -} - -void ReedSolomonTest::tearDown() { - delete qrRSDecoder_; -} - -void ReedSolomonTest::testNoError() { - ArrayRef received(new Array(qrCodeTestWithEc_->size())); - *received = *qrCodeTestWithEc_; - checkQRRSDecode(received); -} - -void ReedSolomonTest::testOneError() { - ArrayRef received(new Array(qrCodeTestWithEc_->size())); - srandom(0xDEADBEEFL); - for (int i = 0; i < received->size(); i++) { - *received = *qrCodeTestWithEc_; - received[i] = random() % 256; - checkQRRSDecode(received); - } -} - -void ReedSolomonTest::testMaxErrors() { - ArrayRef received(new Array(qrCodeTestWithEc_->size())); - srandom(0xDEADBEEFL); - for (int i = 0; i < qrCodeTest_->size(); i++) { - *received = *qrCodeTestWithEc_; - corrupt(received, qrCodeCorrectable_); - checkQRRSDecode(received); - } -} - -void ReedSolomonTest::testTooManyErrors() { - ArrayRef received(new Array(qrCodeTestWithEc_->size())); - srandom(0xDEADBEEFL); - *received = *qrCodeTestWithEc_; - try { - corrupt(received, qrCodeCorrectable_ + 1); - checkQRRSDecode(received); - cout << "expected exception!\n"; - CPPUNIT_FAIL("should not happen!"); - } catch (ReedSolomonException const& e) { - // expected - } catch (...) { - CPPUNIT_FAIL("unexpected exception!"); - } -} - - -void ReedSolomonTest::checkQRRSDecode(ArrayRef &received) { - int twoS = 2 * qrCodeCorrectable_; - qrRSDecoder_->decode(received, twoS); - for (int i = 0; i < qrCodeTest_->size(); i++) { - CPPUNIT_ASSERT_EQUAL(qrCodeTest_[i], received[i]); - } -} - -void ReedSolomonTest::corrupt(ArrayRef &received, int howMany) { - vector corrupted(received->size()); - for (int j = 0; j < howMany; j++) { - int location = floor(received->size() * ((double)(random() >> 1) / (double)((RAND_MAX >> 1) + 1))); - if (corrupted[location]) { - j--; - } else { - corrupted[location] = true; - int newByte = random() % 256; - received[location] = newByte; - } - } -} - -} diff --git a/cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h b/cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h deleted file mode 100644 index 6eb01ae0f..000000000 --- a/cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __REED_SOLOMON_TEST_H__ -#define __REED_SOLOMON_TEST_H__ - -/* - * ReedSolomonTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include -#include -#include - - -namespace zxing { -class ReedSolomonDecoder; - -class ReedSolomonTest : public CppUnit::TestFixture { - CPPUNIT_TEST_SUITE(ReedSolomonTest); - CPPUNIT_TEST(testNoError); - CPPUNIT_TEST(testOneError); - CPPUNIT_TEST(testMaxErrors); - CPPUNIT_TEST(testTooManyErrors); - CPPUNIT_TEST_SUITE_END(); - -public: - void setUp(); - void tearDown(); - -protected: - void testNoError(); - void testOneError(); - void testMaxErrors(); - void testTooManyErrors(); - -private: - ArrayRef qrCodeTest_; - ArrayRef qrCodeTestWithEc_; - int qrCodeCorrectable_; - ReedSolomonDecoder *qrRSDecoder_; - void checkQRRSDecode(ArrayRef &received); - static void corrupt(ArrayRef &received, int howMany); -}; -} - -#endif // __REED_SOLOMON_TEST_H__ diff --git a/cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp b/cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp deleted file mode 100644 index 9507ff431..000000000 --- a/cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ErrorCorrectionLevelTest.cpp - * zxing - * - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 "ErrorCorrectionLevelTest.h" -#include -#include - -namespace zxing { -namespace qrcode { - -CPPUNIT_TEST_SUITE_REGISTRATION(ErrorCorrectionLevelTest); - -void ErrorCorrectionLevelTest::testForBits() { - CPPUNIT_ASSERT_EQUAL(&ErrorCorrectionLevel::M, - &ErrorCorrectionLevel::forBits(0)); - CPPUNIT_ASSERT_EQUAL(&ErrorCorrectionLevel::L, - &ErrorCorrectionLevel::forBits(1)); - CPPUNIT_ASSERT_EQUAL(&ErrorCorrectionLevel::H, - &ErrorCorrectionLevel::forBits(2)); - CPPUNIT_ASSERT_EQUAL(&ErrorCorrectionLevel::Q, - &ErrorCorrectionLevel::forBits(3)); - try { - ErrorCorrectionLevel::forBits(4); - CPPUNIT_FAIL("should have thrown an exception"); - } catch (zxing::ReaderException const& ex) { - // expected - } -} -} -} diff --git a/cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h b/cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h deleted file mode 100644 index 2961aa071..000000000 --- a/cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef __ERROR_CORRECTION_LEVEL_TEST_H__ -#define __ERROR_CORRECTION_LEVEL_TEST_H__ - -/* - * ErrorCorrectionLevelTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace qrcode { - -class ErrorCorrectionLevelTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(ErrorCorrectionLevelTest); - CPPUNIT_TEST(testForBits); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testForBits(); - -private: -}; -} -} - -#endif // __ERROR_CORRECTION_LEVEL_TEST_H__ diff --git a/cpp/core/tests/src/qrcode/FormatInformationTest.cpp b/cpp/core/tests/src/qrcode/FormatInformationTest.cpp deleted file mode 100644 index 1e3973c8a..000000000 --- a/cpp/core/tests/src/qrcode/FormatInformationTest.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * FormatInformationTest.cpp - * zxing - * - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 "FormatInformationTest.h" - -#include "ErrorCorrectionLevelTest.h" -#include -#include -#include - -namespace zxing { -namespace qrcode { - -CPPUNIT_TEST_SUITE_REGISTRATION(FormatInformationTest); - -static const int MASKED_TEST_FORMAT_INFO = 0x2BED; -static const int UNMASKED_TEST_FORMAT_INFO = MASKED_TEST_FORMAT_INFO ^ 0x5412; - -static void assertEquals(Ref a, - Ref b) { - if (a == NULL || b == NULL) - { - CPPUNIT_ASSERT_EQUAL(a, b); - } - else - { - FormatInformation &aa = *a; - FormatInformation &bb = *b; - CPPUNIT_ASSERT_EQUAL(aa, bb); - } -} - -void FormatInformationTest::testBitsDiffering() { - CPPUNIT_ASSERT_EQUAL(0, FormatInformation::numBitsDiffering(1, 1)); - CPPUNIT_ASSERT_EQUAL(1, FormatInformation::numBitsDiffering(0, 2)); - CPPUNIT_ASSERT_EQUAL(2, FormatInformation::numBitsDiffering(1, 2)); - CPPUNIT_ASSERT_EQUAL(32, FormatInformation::numBitsDiffering(0xffffffff, - 0)); -} - -void FormatInformationTest::testDecode() { - // Normal case - Ref expected = - FormatInformation::decodeFormatInformation(MASKED_TEST_FORMAT_INFO, MASKED_TEST_FORMAT_INFO); - CPPUNIT_ASSERT_EQUAL((char)0x07, expected->getDataMask()); - CPPUNIT_ASSERT_EQUAL(&ErrorCorrectionLevel::Q, - &expected->getErrorCorrectionLevel()); - // where the code forgot the mask! - assertEquals(expected, - FormatInformation::decodeFormatInformation(UNMASKED_TEST_FORMAT_INFO, MASKED_TEST_FORMAT_INFO)); - - //TODO separate tests as in Java? - - // 1,2,3,4 bits difference - assertEquals(expected, FormatInformation::decodeFormatInformation( - MASKED_TEST_FORMAT_INFO ^ 0x01, MASKED_TEST_FORMAT_INFO ^ 0x01)); - assertEquals(expected, FormatInformation::decodeFormatInformation( - MASKED_TEST_FORMAT_INFO ^ 0x03, MASKED_TEST_FORMAT_INFO ^ 0x03)); - assertEquals(expected, FormatInformation::decodeFormatInformation( - MASKED_TEST_FORMAT_INFO ^ 0x07, MASKED_TEST_FORMAT_INFO ^ 0x07)); - - Ref expectedNull(NULL); - assertEquals(expectedNull, FormatInformation::decodeFormatInformation( - MASKED_TEST_FORMAT_INFO ^ 0x0F, MASKED_TEST_FORMAT_INFO ^ 0x0F)); - - // WithMisread - assertEquals(expected, FormatInformation::decodeFormatInformation( - MASKED_TEST_FORMAT_INFO ^ 0x03, MASKED_TEST_FORMAT_INFO ^ 0x0F)); -} -} -} diff --git a/cpp/core/tests/src/qrcode/FormatInformationTest.h b/cpp/core/tests/src/qrcode/FormatInformationTest.h deleted file mode 100644 index 477910688..000000000 --- a/cpp/core/tests/src/qrcode/FormatInformationTest.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __FORMAT_INFORMATION_TEST_H__ -#define __FORMAT_INFORMATION_TEST_H__ - -/* - * FormatInformationTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace qrcode { - -class FormatInformationTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(FormatInformationTest); - CPPUNIT_TEST(testBitsDiffering); - CPPUNIT_TEST(testDecode); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testBitsDiffering(); - void testDecode(); - -private: -}; -} -} - -#endif // __FORMAT_INFORMATION_TEST_H__ diff --git a/cpp/core/tests/src/qrcode/VersionTest.cpp b/cpp/core/tests/src/qrcode/VersionTest.cpp deleted file mode 100644 index 150d251d2..000000000 --- a/cpp/core/tests/src/qrcode/VersionTest.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * VersionTest.cpp - * zxing - * - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 "VersionTest.h" -#include -#include - -namespace zxing { -namespace qrcode { - -static void assertNotNull(ECBlocks *blocks) { - CPPUNIT_ASSERT_EQUAL(false, blocks == 0); -} - -static void checkVersion(Version *version, int number, int dimension) { - CPPUNIT_ASSERT_EQUAL(false, version == 0); - CPPUNIT_ASSERT_EQUAL(number, version->getVersionNumber()); - if (number > 1) { - CPPUNIT_ASSERT_EQUAL(true, - version->getAlignmentPatternCenters().size() > 0); - } - CPPUNIT_ASSERT_EQUAL(dimension, version->getDimensionForVersion()); - assertNotNull(&version->getECBlocksForLevel(ErrorCorrectionLevel::H)); - assertNotNull(&version->getECBlocksForLevel(ErrorCorrectionLevel::L)); - assertNotNull(&version->getECBlocksForLevel(ErrorCorrectionLevel::M)); - assertNotNull(&version->getECBlocksForLevel(ErrorCorrectionLevel::Q)); - CPPUNIT_ASSERT_EQUAL(false, version->buildFunctionPattern() == 0); -} - - -CPPUNIT_TEST_SUITE_REGISTRATION(VersionTest); - -void VersionTest::testVersionForNumber() { - for (int i = 1; i <= (int)Version::VERSIONS.size(); i++) { - Version *v = Version::VERSIONS[i-1]; - CPPUNIT_ASSERT_EQUAL((int)i, v->getVersionNumber()); - } - - try { - Version::getVersionForNumber(0); - CPPUNIT_FAIL("Should have thrown an exception"); - } catch (zxing::ReaderException const& re) { - // good - } - for (int i = 1; i <= 40; i++) { - checkVersion(Version::getVersionForNumber(i), i, 4*i + 17); - } -} - -void VersionTest::testGetProvisionalVersionForDimension() { - for (int i = 1; i <= 40; i++) { - int dimension = 4 * i + 17; - Version *v = Version::getProvisionalVersionForDimension(dimension); - int vi = v->getVersionNumber(); - CPPUNIT_ASSERT_EQUAL(i, vi); - } -} - -void VersionTest::testDecodeVersionInformation() { - // Spot check - CPPUNIT_ASSERT_EQUAL(7, Version::decodeVersionInformation(0x07C94)->getVersionNumber()); - CPPUNIT_ASSERT_EQUAL(12, Version::decodeVersionInformation(0x0C762)->getVersionNumber()); - CPPUNIT_ASSERT_EQUAL(17, Version::decodeVersionInformation(0x1145D)->getVersionNumber()); - CPPUNIT_ASSERT_EQUAL(22, Version::decodeVersionInformation(0x168C9)->getVersionNumber()); - CPPUNIT_ASSERT_EQUAL(27, Version::decodeVersionInformation(0x1B08E)->getVersionNumber()); - CPPUNIT_ASSERT_EQUAL(32, Version::decodeVersionInformation(0x209D5)->getVersionNumber()); -} - -} -} - diff --git a/cpp/core/tests/src/qrcode/VersionTest.h b/cpp/core/tests/src/qrcode/VersionTest.h deleted file mode 100644 index 7422ef9f4..000000000 --- a/cpp/core/tests/src/qrcode/VersionTest.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __VERSION_TEST_H__ -#define __VERSION_TEST_H__ - -/* - * VersionTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace qrcode { - -class VersionTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(VersionTest); - CPPUNIT_TEST(testVersionForNumber); - CPPUNIT_TEST(testGetProvisionalVersionForDimension); - CPPUNIT_TEST(testDecodeVersionInformation); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testVersionForNumber(); - void testGetProvisionalVersionForDimension(); - void testDecodeVersionInformation(); - -private: -}; -} -} - -#endif // __VERSION_TEST_H__ diff --git a/cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp b/cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp deleted file mode 100644 index ce4c6cab6..000000000 --- a/cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 "DataMaskTest.h" - -namespace zxing { -namespace qrcode { - -CPPUNIT_TEST_SUITE_REGISTRATION(DataMaskTest); - -class Mask0Condition : public MaskCondition { -public: - Mask0Condition() { } - bool isMasked(int i, int j) { - return (i + j) % 2 == 0; - } -}; - -class Mask1Condition : public MaskCondition { -public: - Mask1Condition() { } - bool isMasked(int i, int) { - return i % 2 == 0; - } -}; - -class Mask2Condition : public MaskCondition { -public: - Mask2Condition() { } - bool isMasked(int, int j) { - return j % 3 == 0; - } -}; - -class Mask3Condition : public MaskCondition { -public: - Mask3Condition() { } - bool isMasked(int i, int j) { - return (i + j) % 3 == 0; - } -}; - -class Mask4Condition : public MaskCondition { -public: - Mask4Condition() { } - bool isMasked(int i, int j) { - return (i / 2 + j / 3) % 2 == 0; - } -}; - -class Mask5Condition : public MaskCondition { -public: - Mask5Condition() { } - bool isMasked(int i, int j) { - return (i * j) % 2 + (i * j) % 3 == 0; - } -}; - -class Mask6Condition : public MaskCondition { -public: - Mask6Condition() { } - bool isMasked(int i, int j) { - return ((i * j) % 2 + (i * j) % 3) % 2 == 0; - } -}; - -class Mask7Condition : public MaskCondition { -public: - Mask7Condition() { } - bool isMasked(int i, int j) { - return ((i + j) % 2 + (i * j) % 3) % 2 == 0; - } -}; - - -void DataMaskTest::testMask0() { - Mask0Condition condition; - testMaskAcrossDimensions(0, condition); -} - -void DataMaskTest::testMask1() { - Mask1Condition condition; - testMaskAcrossDimensions(1, condition); -} - -void DataMaskTest::testMask2() { - Mask2Condition condition; - testMaskAcrossDimensions(2, condition); -} - -void DataMaskTest::testMask3() { - Mask3Condition condition; - testMaskAcrossDimensions(3, condition); -} - -void DataMaskTest::testMask4() { - Mask4Condition condition; - testMaskAcrossDimensions(4, condition); -} - -void DataMaskTest::testMask5() { - Mask5Condition condition; - testMaskAcrossDimensions(5, condition); -} - -void DataMaskTest::testMask6() { - Mask6Condition condition; - testMaskAcrossDimensions(6, condition); -} - -void DataMaskTest::testMask7() { - Mask7Condition condition; - testMaskAcrossDimensions(7, condition); -} - -} -} diff --git a/cpp/core/tests/src/qrcode/decoder/DataMaskTest.h b/cpp/core/tests/src/qrcode/decoder/DataMaskTest.h deleted file mode 100644 index 5535a0c58..000000000 --- a/cpp/core/tests/src/qrcode/decoder/DataMaskTest.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef __DATA_MASK_TEST_H__ -#define __DATA_MASK_TEST_H__ - -/* - * DataMaskTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include -#include - -namespace zxing { -namespace qrcode { - -class MaskCondition { -public: - MaskCondition() { } - virtual bool isMasked(int i, int j) = 0; - virtual ~MaskCondition() { } -}; - - -class DataMaskTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(DataMaskTest); - CPPUNIT_TEST(testMask0); - CPPUNIT_TEST(testMask1); - CPPUNIT_TEST(testMask2); - CPPUNIT_TEST(testMask3); - CPPUNIT_TEST(testMask4); - CPPUNIT_TEST(testMask5); - CPPUNIT_TEST(testMask6); - CPPUNIT_TEST(testMask7); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testMask0(); - void testMask1(); - void testMask2(); - void testMask3(); - void testMask4(); - void testMask5(); - void testMask6(); - void testMask7(); - -private: - void testMaskAcrossDimensions(int reference, - MaskCondition &condition) { - DataMask& mask = DataMask::forReference(reference); - for (int version = 1; version <= 40; version++) { - int dimension = 17 + 4 * version; - testMask(mask, dimension, condition); - } - } - - void testMask(DataMask& mask, int dimension, MaskCondition &condition) { - BitMatrix bits(dimension); - mask.unmaskBitMatrix(bits, dimension); - for (int i = 0; i < dimension; i++) { - for (int j = 0; j < dimension; j++) { - //TODO: check why the coordinates are swapped - CPPUNIT_ASSERT_EQUAL( - //"(" + i + ',' + j + ')', - condition.isMasked(i, j), - bits.get(j, i)); - } - } - } -}; - -} -} - -#endif // __DATA_MASK_TEST_H__ diff --git a/cpp/core/tests/src/qrcode/decoder/ModeTest.cpp b/cpp/core/tests/src/qrcode/decoder/ModeTest.cpp deleted file mode 100644 index 83498951d..000000000 --- a/cpp/core/tests/src/qrcode/decoder/ModeTest.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ModeTest.cpp - * zxing - * - * Created by Christian Brunschen on 19/05/2008. - * Copyright 2008 ZXing authors All rights reserved. - * - * 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 "ModeTest.h" -#include - -namespace zxing { -namespace qrcode { - -CPPUNIT_TEST_SUITE_REGISTRATION(ModeTest); - -void ModeTest::testForBits() { - CPPUNIT_ASSERT_EQUAL(&Mode::TERMINATOR, &(Mode::forBits(0x00))); - CPPUNIT_ASSERT_EQUAL(&Mode::NUMERIC, &(Mode::forBits(0x01))); - CPPUNIT_ASSERT_EQUAL(&Mode::ALPHANUMERIC, &(Mode::forBits(0x02))); - CPPUNIT_ASSERT_EQUAL(&Mode::BYTE, &(Mode::forBits(0x04))); - CPPUNIT_ASSERT_EQUAL(&Mode::KANJI, &(Mode::forBits(0x08))); - try { - Mode::forBits(0x10); - CPPUNIT_FAIL("should have thrown an exception"); - } catch (zxing::ReaderException const& ex) { - // expected - } -} - -void ModeTest::testCharacterCount() { - CPPUNIT_ASSERT_EQUAL(10, Mode::NUMERIC.getCharacterCountBits(Version::getVersionForNumber(5))); - CPPUNIT_ASSERT_EQUAL(12, Mode::NUMERIC.getCharacterCountBits(Version::getVersionForNumber(26))); - CPPUNIT_ASSERT_EQUAL(14, Mode::NUMERIC.getCharacterCountBits(Version::getVersionForNumber(40))); - CPPUNIT_ASSERT_EQUAL(9, Mode::ALPHANUMERIC.getCharacterCountBits(Version::getVersionForNumber(6))); - CPPUNIT_ASSERT_EQUAL(8, Mode::BYTE.getCharacterCountBits(Version::getVersionForNumber(7))); - CPPUNIT_ASSERT_EQUAL(8, Mode::KANJI.getCharacterCountBits(Version::getVersionForNumber(8))); -} -} -} diff --git a/cpp/core/tests/src/qrcode/decoder/ModeTest.h b/cpp/core/tests/src/qrcode/decoder/ModeTest.h deleted file mode 100644 index 8f44c092a..000000000 --- a/cpp/core/tests/src/qrcode/decoder/ModeTest.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef __MODE_TEST_H__ -#define __MODE_TEST_H__ - -/* - * ModeTest.h - * zxing - * - * Copyright 2010 ZXing authors All rights reserved. - * - * 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 -#include -#include - -namespace zxing { -namespace qrcode { - -class ModeTest : public CPPUNIT_NS::TestFixture { - CPPUNIT_TEST_SUITE(ModeTest); - CPPUNIT_TEST(testForBits); - CPPUNIT_TEST(testCharacterCount); - CPPUNIT_TEST_SUITE_END(); - -public: - -protected: - void testForBits(); - void testCharacterCount(); - -private: -}; -} -} - -#endif // __MODE_TEST_H__ diff --git a/cpp/format b/cpp/format deleted file mode 100755 index ced1f4f62..000000000 --- a/cpp/format +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -astyle --options=astyle-options --recursive --suffix=none "*.h" "*.cpp" diff --git a/cpp/ios.xcodeproj/.gitignore b/cpp/ios.xcodeproj/.gitignore deleted file mode 100644 index 367f348e5..000000000 --- a/cpp/ios.xcodeproj/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/*.mode1v3 -/*.pbxuser \ No newline at end of file diff --git a/cpp/ios.xcodeproj/project.pbxproj b/cpp/ios.xcodeproj/project.pbxproj deleted file mode 100644 index 5bb6a01f9..000000000 --- a/cpp/ios.xcodeproj/project.pbxproj +++ /dev/null @@ -1,586 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B15E73A12CE996800DC7062 /* LuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B15E73912CE996800DC7062 /* LuminanceSource.cpp */; }; - 3B15E78612CE9BF900DC7062 /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B15E78512CE9BF900DC7062 /* Exception.cpp */; }; - 3B1EEEC7144F1F5F0051C6A5 /* FormatException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B1EEEC6144F1F5F0051C6A5 /* FormatException.cpp */; }; - 3B1EEECF144F1FBE0051C6A5 /* CharacterSetECI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B1EEECC144F1FBE0051C6A5 /* CharacterSetECI.cpp */; }; - 3B1EEED1144F1FBE0051C6A5 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B1EEECE144F1FBE0051C6A5 /* StringUtils.cpp */; }; - 3B2A325212CE9D31001D9945 /* IllegalArgumentException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A325112CE9D31001D9945 /* IllegalArgumentException.cpp */; }; - 3B2A32B012CEA202001D9945 /* HybridBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A32AF12CEA202001D9945 /* HybridBinarizer.cpp */; }; - 3B2A32B412CEA238001D9945 /* GlobalHistogramBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A32B312CEA238001D9945 /* GlobalHistogramBinarizer.cpp */; }; - 3B2A32B812CEA285001D9945 /* Binarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A32B712CEA285001D9945 /* Binarizer.cpp */; }; - 3B2A32C612CEA2F9001D9945 /* BitArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A32C512CEA2F9001D9945 /* BitArray.cpp */; }; - 3B2A32CC12CEA380001D9945 /* BitMatrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A32CB12CEA380001D9945 /* BitMatrix.cpp */; }; - 3B2A32E812CEA43A001D9945 /* BinaryBitmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A32E712CEA43A001D9945 /* BinaryBitmap.cpp */; }; - 3B2A32FF12CEA53A001D9945 /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A32FE12CEA53A001D9945 /* Detector.cpp */; }; - 3B2A330312CEA55B001D9945 /* AlignmentPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A330212CEA55B001D9945 /* AlignmentPatternFinder.cpp */; }; - 3B2A330712CEA59E001D9945 /* ResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A330612CEA59E001D9945 /* ResultPoint.cpp */; }; - 3B2A330B12CEA5BF001D9945 /* ReaderException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A330A12CEA5BF001D9945 /* ReaderException.cpp */; }; - 3B2A330F12CEA5D2001D9945 /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A330E12CEA5D2001D9945 /* Version.cpp */; }; - 3B2A331312CEA5F3001D9945 /* FinderPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A331212CEA5F3001D9945 /* FinderPatternFinder.cpp */; }; - 3B2A331712CEA60A001D9945 /* DecodeHints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A331612CEA60A001D9945 /* DecodeHints.cpp */; }; - 3B2A331B12CEA624001D9945 /* FinderPatternInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A331A12CEA624001D9945 /* FinderPatternInfo.cpp */; }; - 3B2A331F12CEA638001D9945 /* GridSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A331E12CEA638001D9945 /* GridSampler.cpp */; }; - 3B2A332312CEA64F001D9945 /* PerspectiveTransform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A332212CEA64F001D9945 /* PerspectiveTransform.cpp */; }; - 3B2A332712CEA664001D9945 /* FinderPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A332612CEA664001D9945 /* FinderPattern.cpp */; }; - 3B2A332B12CEA67F001D9945 /* FormatInformation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A332A12CEA67F001D9945 /* FormatInformation.cpp */; }; - 3B2A332F12CEA696001D9945 /* ErrorCorrectionLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A332E12CEA696001D9945 /* ErrorCorrectionLevel.cpp */; }; - 3B2A333312CEA6C2001D9945 /* DetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A333212CEA6C2001D9945 /* DetectorResult.cpp */; }; - 3B2A335A12CEA925001D9945 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A335912CEA925001D9945 /* Decoder.cpp */; }; - 3B2A335E12CEA93D001D9945 /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A335D12CEA93D001D9945 /* BitMatrixParser.cpp */; }; - 3B2A336212CEA95C001D9945 /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A336112CEA95C001D9945 /* DataBlock.cpp */; }; - 3B2A336612CEA976001D9945 /* Str.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A336512CEA976001D9945 /* Str.cpp */; }; - 3B2A336A12CEA997001D9945 /* DataMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A336912CEA997001D9945 /* DataMask.cpp */; }; - 3B2A336E12CEA9B0001D9945 /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A336D12CEA9B0001D9945 /* DecodedBitStreamParser.cpp */; }; - 3B2A337212CEA9E2001D9945 /* Mode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A337112CEA9E2001D9945 /* Mode.cpp */; }; - 3B2A337612CEAA06001D9945 /* ReedSolomonDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A337512CEAA06001D9945 /* ReedSolomonDecoder.cpp */; }; - 3B2A338212CEAA4B001D9945 /* ReedSolomonException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A338112CEAA4B001D9945 /* ReedSolomonException.cpp */; }; - 3B2A338612CEAA63001D9945 /* BitSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A338512CEAA63001D9945 /* BitSource.cpp */; }; - 3B2A338E12CEAA95001D9945 /* DecoderResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B2A338D12CEAA95001D9945 /* DecoderResult.cpp */; }; - 3BBCB71E12DD108300B5936D /* Result.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB71D12DD108300B5936D /* Result.cpp */; }; - 3BBCB72012DD10BC00B5936D /* QRCodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB71F12DD10BC00B5936D /* QRCodeReader.cpp */; }; - 3BBCB72412DD10DC00B5936D /* Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB72312DD10DC00B5936D /* Reader.cpp */; }; - 3BBF0AEE12CBCAFC0061650E /* AlignmentPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BBF0AED12CBCAFC0061650E /* AlignmentPattern.cpp */; }; - AA747D9F0F9514B9006C5449 /* ios_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* ios_Prefix.pch */; }; - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; - E105A8FE14EC34270011473C /* GenericGF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A8FC14EC34270011473C /* GenericGF.cpp */; }; - E105A8FF14EC34270011473C /* GenericGFPoly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A8FD14EC34270011473C /* GenericGFPoly.cpp */; }; - E105A90414EC35070011473C /* AztecDetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A90214EC35070011473C /* AztecDetectorResult.cpp */; }; - E105A90514EC35070011473C /* AztecReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A90314EC35070011473C /* AztecReader.cpp */; }; - E105A90714EC35110011473C /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A90614EC35110011473C /* Decoder.cpp */; }; - E105A90914EC35190011473C /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A90814EC35190011473C /* Detector.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 3B15E73912CE996800DC7062 /* LuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LuminanceSource.cpp; path = core/src/zxing/LuminanceSource.cpp; sourceTree = ""; }; - 3B15E78512CE9BF900DC7062 /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Exception.cpp; path = core/src/zxing/Exception.cpp; sourceTree = ""; }; - 3B1EEEC6144F1F5F0051C6A5 /* FormatException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatException.cpp; path = core/src/zxing/FormatException.cpp; sourceTree = ""; }; - 3B1EEECC144F1FBE0051C6A5 /* CharacterSetECI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CharacterSetECI.cpp; path = core/src/zxing/common/CharacterSetECI.cpp; sourceTree = ""; }; - 3B1EEECE144F1FBE0051C6A5 /* StringUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringUtils.cpp; path = core/src/zxing/common/StringUtils.cpp; sourceTree = ""; }; - 3B2A325112CE9D31001D9945 /* IllegalArgumentException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = IllegalArgumentException.cpp; path = core/src/zxing/common/IllegalArgumentException.cpp; sourceTree = ""; }; - 3B2A32AF12CEA202001D9945 /* HybridBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HybridBinarizer.cpp; path = core/src/zxing/common/HybridBinarizer.cpp; sourceTree = ""; }; - 3B2A32B312CEA238001D9945 /* GlobalHistogramBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GlobalHistogramBinarizer.cpp; path = core/src/zxing/common/GlobalHistogramBinarizer.cpp; sourceTree = ""; }; - 3B2A32B712CEA285001D9945 /* Binarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Binarizer.cpp; path = core/src/zxing/Binarizer.cpp; sourceTree = ""; }; - 3B2A32C512CEA2F9001D9945 /* BitArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BitArray.cpp; path = core/src/zxing/common/BitArray.cpp; sourceTree = ""; }; - 3B2A32CB12CEA380001D9945 /* BitMatrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BitMatrix.cpp; path = core/src/zxing/common/BitMatrix.cpp; sourceTree = ""; }; - 3B2A32E712CEA43A001D9945 /* BinaryBitmap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryBitmap.cpp; path = core/src/zxing/BinaryBitmap.cpp; sourceTree = ""; }; - 3B2A32FE12CEA53A001D9945 /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Detector.cpp; path = core/src/zxing/qrcode/detector/Detector.cpp; sourceTree = ""; }; - 3B2A330212CEA55B001D9945 /* AlignmentPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AlignmentPatternFinder.cpp; path = core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp; sourceTree = ""; }; - 3B2A330612CEA59E001D9945 /* ResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ResultPoint.cpp; path = core/src/zxing/ResultPoint.cpp; sourceTree = ""; }; - 3B2A330A12CEA5BF001D9945 /* ReaderException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ReaderException.cpp; path = core/src/zxing/ReaderException.cpp; sourceTree = ""; }; - 3B2A330E12CEA5D2001D9945 /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Version.cpp; path = core/src/zxing/qrcode/Version.cpp; sourceTree = ""; }; - 3B2A331212CEA5F3001D9945 /* FinderPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FinderPatternFinder.cpp; path = core/src/zxing/qrcode/detector/FinderPatternFinder.cpp; sourceTree = ""; }; - 3B2A331612CEA60A001D9945 /* DecodeHints.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DecodeHints.cpp; path = core/src/zxing/DecodeHints.cpp; sourceTree = ""; }; - 3B2A331A12CEA624001D9945 /* FinderPatternInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FinderPatternInfo.cpp; path = core/src/zxing/qrcode/detector/FinderPatternInfo.cpp; sourceTree = ""; }; - 3B2A331E12CEA638001D9945 /* GridSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GridSampler.cpp; path = core/src/zxing/common/GridSampler.cpp; sourceTree = ""; }; - 3B2A332212CEA64F001D9945 /* PerspectiveTransform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PerspectiveTransform.cpp; path = core/src/zxing/common/PerspectiveTransform.cpp; sourceTree = ""; }; - 3B2A332612CEA664001D9945 /* FinderPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FinderPattern.cpp; path = core/src/zxing/qrcode/detector/FinderPattern.cpp; sourceTree = ""; }; - 3B2A332A12CEA67F001D9945 /* FormatInformation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatInformation.cpp; path = core/src/zxing/qrcode/FormatInformation.cpp; sourceTree = ""; }; - 3B2A332E12CEA696001D9945 /* ErrorCorrectionLevel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ErrorCorrectionLevel.cpp; path = core/src/zxing/qrcode/ErrorCorrectionLevel.cpp; sourceTree = ""; }; - 3B2A333212CEA6C2001D9945 /* DetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DetectorResult.cpp; path = core/src/zxing/common/DetectorResult.cpp; sourceTree = ""; }; - 3B2A335912CEA925001D9945 /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Decoder.cpp; path = core/src/zxing/qrcode/decoder/Decoder.cpp; sourceTree = ""; }; - 3B2A335D12CEA93D001D9945 /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BitMatrixParser.cpp; path = core/src/zxing/qrcode/decoder/BitMatrixParser.cpp; sourceTree = ""; }; - 3B2A336112CEA95C001D9945 /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DataBlock.cpp; path = core/src/zxing/qrcode/decoder/DataBlock.cpp; sourceTree = ""; }; - 3B2A336512CEA976001D9945 /* Str.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Str.cpp; path = core/src/zxing/common/Str.cpp; sourceTree = ""; }; - 3B2A336912CEA997001D9945 /* DataMask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DataMask.cpp; path = core/src/zxing/qrcode/decoder/DataMask.cpp; sourceTree = ""; }; - 3B2A336D12CEA9B0001D9945 /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DecodedBitStreamParser.cpp; path = core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp; sourceTree = ""; }; - 3B2A337112CEA9E2001D9945 /* Mode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Mode.cpp; path = core/src/zxing/qrcode/decoder/Mode.cpp; sourceTree = ""; }; - 3B2A337512CEAA06001D9945 /* ReedSolomonDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ReedSolomonDecoder.cpp; path = core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp; sourceTree = ""; }; - 3B2A338112CEAA4B001D9945 /* ReedSolomonException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ReedSolomonException.cpp; path = core/src/zxing/common/reedsolomon/ReedSolomonException.cpp; sourceTree = ""; }; - 3B2A338512CEAA63001D9945 /* BitSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BitSource.cpp; path = core/src/zxing/common/BitSource.cpp; sourceTree = ""; }; - 3B2A338D12CEAA95001D9945 /* DecoderResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DecoderResult.cpp; path = core/src/zxing/common/DecoderResult.cpp; sourceTree = ""; }; - 3BBCB71D12DD108300B5936D /* Result.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Result.cpp; path = core/src/zxing/Result.cpp; sourceTree = ""; }; - 3BBCB71F12DD10BC00B5936D /* QRCodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = QRCodeReader.cpp; path = core/src/zxing/qrcode/QRCodeReader.cpp; sourceTree = ""; }; - 3BBCB72312DD10DC00B5936D /* Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Reader.cpp; path = core/src/zxing/Reader.cpp; sourceTree = ""; }; - 3BBF0AED12CBCAFC0061650E /* AlignmentPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AlignmentPattern.cpp; path = core/src/zxing/qrcode/detector/AlignmentPattern.cpp; sourceTree = ""; }; - AA747D9E0F9514B9006C5449 /* ios_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios_Prefix.pch; sourceTree = SOURCE_ROOT; }; - AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - D2AAC07E0554694100DB518D /* libzxing.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libzxing.a; sourceTree = BUILT_PRODUCTS_DIR; }; - E105A8FC14EC34270011473C /* GenericGF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GenericGF.cpp; path = core/src/zxing/common/reedsolomon/GenericGF.cpp; sourceTree = ""; }; - E105A8FD14EC34270011473C /* GenericGFPoly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GenericGFPoly.cpp; path = core/src/zxing/common/reedsolomon/GenericGFPoly.cpp; sourceTree = ""; }; - E105A90214EC35070011473C /* AztecDetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AztecDetectorResult.cpp; path = core/src/zxing/aztec/AztecDetectorResult.cpp; sourceTree = ""; }; - E105A90314EC35070011473C /* AztecReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AztecReader.cpp; path = core/src/zxing/aztec/AztecReader.cpp; sourceTree = ""; }; - E105A90614EC35110011473C /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Decoder.cpp; path = core/src/zxing/aztec/decoder/Decoder.cpp; sourceTree = ""; }; - E105A90814EC35190011473C /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Detector.cpp; path = core/src/zxing/aztec/detector/Detector.cpp; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* libzxing.a */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* zxing */ = { - isa = PBXGroup; - children = ( - 08FB77AEFE84172EC02AAC07 /* Classes */, - 32C88DFF0371C24200C91783 /* Other Sources */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - name = zxing; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - AACBBE490F95108600F1A2B1 /* Foundation.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 08FB77AEFE84172EC02AAC07 /* Classes */ = { - isa = PBXGroup; - children = ( - E105A90114EC34E20011473C /* aztec */, - E105A90014EC34580011473C /* qrcode */, - 3B1EEECC144F1FBE0051C6A5 /* CharacterSetECI.cpp */, - 3B1EEECE144F1FBE0051C6A5 /* StringUtils.cpp */, - 3B1EEEC6144F1F5F0051C6A5 /* FormatException.cpp */, - 3BBCB72312DD10DC00B5936D /* Reader.cpp */, - 3BBCB71D12DD108300B5936D /* Result.cpp */, - 3B2A338D12CEAA95001D9945 /* DecoderResult.cpp */, - 3B2A338512CEAA63001D9945 /* BitSource.cpp */, - 3B2A338112CEAA4B001D9945 /* ReedSolomonException.cpp */, - 3B2A337512CEAA06001D9945 /* ReedSolomonDecoder.cpp */, - E105A8FC14EC34270011473C /* GenericGF.cpp */, - E105A8FD14EC34270011473C /* GenericGFPoly.cpp */, - 3B2A337112CEA9E2001D9945 /* Mode.cpp */, - 3B2A336D12CEA9B0001D9945 /* DecodedBitStreamParser.cpp */, - 3B2A336512CEA976001D9945 /* Str.cpp */, - 3B2A333212CEA6C2001D9945 /* DetectorResult.cpp */, - 3B2A332212CEA64F001D9945 /* PerspectiveTransform.cpp */, - 3B2A331E12CEA638001D9945 /* GridSampler.cpp */, - 3B2A331612CEA60A001D9945 /* DecodeHints.cpp */, - 3B2A330A12CEA5BF001D9945 /* ReaderException.cpp */, - 3B2A330612CEA59E001D9945 /* ResultPoint.cpp */, - 3B2A32E712CEA43A001D9945 /* BinaryBitmap.cpp */, - 3B2A32CB12CEA380001D9945 /* BitMatrix.cpp */, - 3B2A32C512CEA2F9001D9945 /* BitArray.cpp */, - 3B2A32B712CEA285001D9945 /* Binarizer.cpp */, - 3B2A32B312CEA238001D9945 /* GlobalHistogramBinarizer.cpp */, - 3B2A32AF12CEA202001D9945 /* HybridBinarizer.cpp */, - 3B2A325112CE9D31001D9945 /* IllegalArgumentException.cpp */, - 3B15E78512CE9BF900DC7062 /* Exception.cpp */, - 3B15E73912CE996800DC7062 /* LuminanceSource.cpp */, - ); - name = Classes; - sourceTree = ""; - }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { - isa = PBXGroup; - children = ( - AA747D9E0F9514B9006C5449 /* ios_Prefix.pch */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - E105A90014EC34580011473C /* qrcode */ = { - isa = PBXGroup; - children = ( - 3BBCB71F12DD10BC00B5936D /* QRCodeReader.cpp */, - 3B2A336912CEA997001D9945 /* DataMask.cpp */, - 3B2A336112CEA95C001D9945 /* DataBlock.cpp */, - 3B2A335D12CEA93D001D9945 /* BitMatrixParser.cpp */, - 3B2A335912CEA925001D9945 /* Decoder.cpp */, - 3B2A332E12CEA696001D9945 /* ErrorCorrectionLevel.cpp */, - 3B2A332A12CEA67F001D9945 /* FormatInformation.cpp */, - 3B2A332612CEA664001D9945 /* FinderPattern.cpp */, - 3B2A331A12CEA624001D9945 /* FinderPatternInfo.cpp */, - 3B2A331212CEA5F3001D9945 /* FinderPatternFinder.cpp */, - 3B2A330E12CEA5D2001D9945 /* Version.cpp */, - 3B2A330212CEA55B001D9945 /* AlignmentPatternFinder.cpp */, - 3B2A32FE12CEA53A001D9945 /* Detector.cpp */, - 3BBF0AED12CBCAFC0061650E /* AlignmentPattern.cpp */, - ); - name = qrcode; - sourceTree = ""; - }; - E105A90114EC34E20011473C /* aztec */ = { - isa = PBXGroup; - children = ( - E105A90814EC35190011473C /* Detector.cpp */, - E105A90614EC35110011473C /* Decoder.cpp */, - E105A90214EC35070011473C /* AztecDetectorResult.cpp */, - E105A90314EC35070011473C /* AztecReader.cpp */, - ); - name = aztec; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - AA747D9F0F9514B9006C5449 /* ios_Prefix.pch in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - D2AAC07D0554694100DB518D /* zxing */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "zxing" */; - buildPhases = ( - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = zxing; - productName = zxing; - productReference = D2AAC07E0554694100DB518D /* libzxing.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0450; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ios" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* zxing */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* zxing */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BBF0AEE12CBCAFC0061650E /* AlignmentPattern.cpp in Sources */, - 3B15E73A12CE996800DC7062 /* LuminanceSource.cpp in Sources */, - 3B15E78612CE9BF900DC7062 /* Exception.cpp in Sources */, - 3B2A325212CE9D31001D9945 /* IllegalArgumentException.cpp in Sources */, - 3B2A32B012CEA202001D9945 /* HybridBinarizer.cpp in Sources */, - 3B2A32B412CEA238001D9945 /* GlobalHistogramBinarizer.cpp in Sources */, - 3B2A32B812CEA285001D9945 /* Binarizer.cpp in Sources */, - 3B2A32C612CEA2F9001D9945 /* BitArray.cpp in Sources */, - 3B2A32CC12CEA380001D9945 /* BitMatrix.cpp in Sources */, - 3B2A32E812CEA43A001D9945 /* BinaryBitmap.cpp in Sources */, - 3B2A32FF12CEA53A001D9945 /* Detector.cpp in Sources */, - 3B2A330312CEA55B001D9945 /* AlignmentPatternFinder.cpp in Sources */, - 3B2A330712CEA59E001D9945 /* ResultPoint.cpp in Sources */, - 3B2A330B12CEA5BF001D9945 /* ReaderException.cpp in Sources */, - 3B2A330F12CEA5D2001D9945 /* Version.cpp in Sources */, - 3B2A331312CEA5F3001D9945 /* FinderPatternFinder.cpp in Sources */, - 3B2A331712CEA60A001D9945 /* DecodeHints.cpp in Sources */, - 3B2A331B12CEA624001D9945 /* FinderPatternInfo.cpp in Sources */, - 3B2A331F12CEA638001D9945 /* GridSampler.cpp in Sources */, - 3B2A332312CEA64F001D9945 /* PerspectiveTransform.cpp in Sources */, - 3B2A332712CEA664001D9945 /* FinderPattern.cpp in Sources */, - 3B2A332B12CEA67F001D9945 /* FormatInformation.cpp in Sources */, - 3B2A332F12CEA696001D9945 /* ErrorCorrectionLevel.cpp in Sources */, - 3B2A333312CEA6C2001D9945 /* DetectorResult.cpp in Sources */, - 3B2A335A12CEA925001D9945 /* Decoder.cpp in Sources */, - 3B2A335E12CEA93D001D9945 /* BitMatrixParser.cpp in Sources */, - 3B2A336212CEA95C001D9945 /* DataBlock.cpp in Sources */, - 3B2A336612CEA976001D9945 /* Str.cpp in Sources */, - 3B2A336A12CEA997001D9945 /* DataMask.cpp in Sources */, - 3B2A336E12CEA9B0001D9945 /* DecodedBitStreamParser.cpp in Sources */, - 3B2A337212CEA9E2001D9945 /* Mode.cpp in Sources */, - 3B2A337612CEAA06001D9945 /* ReedSolomonDecoder.cpp in Sources */, - 3B2A338212CEAA4B001D9945 /* ReedSolomonException.cpp in Sources */, - 3B2A338612CEAA63001D9945 /* BitSource.cpp in Sources */, - 3B2A338E12CEAA95001D9945 /* DecoderResult.cpp in Sources */, - 3BBCB71E12DD108300B5936D /* Result.cpp in Sources */, - 3BBCB72012DD10BC00B5936D /* QRCodeReader.cpp in Sources */, - 3BBCB72412DD10DC00B5936D /* Reader.cpp in Sources */, - 3B1EEEC7144F1F5F0051C6A5 /* FormatException.cpp in Sources */, - 3B1EEECF144F1FBE0051C6A5 /* CharacterSetECI.cpp in Sources */, - 3B1EEED1144F1FBE0051C6A5 /* StringUtils.cpp in Sources */, - E105A8FE14EC34270011473C /* GenericGF.cpp in Sources */, - E105A8FF14EC34270011473C /* GenericGFPoly.cpp in Sources */, - E105A90414EC35070011473C /* AztecDetectorResult.cpp in Sources */, - E105A90514EC35070011473C /* AztecReader.cpp in Sources */, - E105A90714EC35110011473C /* Decoder.cpp in Sources */, - E105A90914EC35190011473C /* Detector.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/zxing.dst; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxing; - WARNING_CFLAGS = ( - "-Werror", - "-Wextra", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - DSTROOT = /tmp/zxing.dst; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxing; - WARNING_CFLAGS = ( - "-Werror", - "-Wextra", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv7, - armv6, - ); - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wno-unused-parameter", - "-Werror", - "-Wextra", - "-Wall", - ); - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv7, - armv6, - ); - GCC_C_LANGUAGE_STANDARD = c99; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wno-unused-parameter", - "-Werror", - "-Wextra", - "-Wall", - ); - }; - name = Release; - }; - 3B6E55431491B89E00C0C401 /* Ad Hoc Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv7, - armv6, - ); - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wno-unused-parameter", - "-Werror", - "-Wextra", - "-Wall", - ); - }; - name = "Ad Hoc Debug"; - }; - 3B6E55441491B89E00C0C401 /* Ad Hoc Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/zxing.dst; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxing; - WARNING_CFLAGS = ( - "-Werror", - "-Wextra", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = "Ad Hoc Debug"; - }; - 3B6E55451491B8A600C0C401 /* Ad Hoc Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv7, - armv6, - ); - GCC_C_LANGUAGE_STANDARD = c99; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wno-unused-parameter", - "-Werror", - "-Wextra", - "-Wall", - ); - }; - name = "Ad Hoc Release"; - }; - 3B6E55461491B8A600C0C401 /* Ad Hoc Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - DSTROOT = /tmp/zxing.dst; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxing; - WARNING_CFLAGS = ( - "-Werror", - "-Wextra", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = "Ad Hoc Release"; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "zxing" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 3B6E55441491B89E00C0C401 /* Ad Hoc Debug */, - 1DEB922008733DC00010E9CD /* Release */, - 3B6E55461491B8A600C0C401 /* Ad Hoc Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ios" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 3B6E55431491B89E00C0C401 /* Ad Hoc Debug */, - 1DEB922408733DC00010E9CD /* Release */, - 3B6E55451491B8A600C0C401 /* Ad Hoc Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/cpp/ios_Prefix.pch b/cpp/ios_Prefix.pch deleted file mode 100644 index bfb739423..000000000 --- a/cpp/ios_Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project. -// - -#ifdef __OBJC__ - #import -#endif diff --git a/cpp/osx.xcodeproj/.gitignore b/cpp/osx.xcodeproj/.gitignore deleted file mode 100644 index 8302ebe38..000000000 --- a/cpp/osx.xcodeproj/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/*.mode1v3 -/*.pbxuser -/project.xcworkspace diff --git a/cpp/osx.xcodeproj/project.pbxproj b/cpp/osx.xcodeproj/project.pbxproj deleted file mode 100644 index 4d9b90288..000000000 --- a/cpp/osx.xcodeproj/project.pbxproj +++ /dev/null @@ -1,963 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 45; - objects = { - -/* Begin PBXBuildFile section */ - 3B5B0EA6121C52ED005698F8 /* BarcodeFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E10121C52ED005698F8 /* BarcodeFormat.cpp */; }; - 3B5B0EA7121C52ED005698F8 /* BarcodeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E11121C52ED005698F8 /* BarcodeFormat.h */; }; - 3B5B0EA8121C52ED005698F8 /* Binarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E12121C52ED005698F8 /* Binarizer.cpp */; }; - 3B5B0EA9121C52ED005698F8 /* Binarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E13121C52ED005698F8 /* Binarizer.h */; }; - 3B5B0EAA121C52ED005698F8 /* BinaryBitmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E14121C52ED005698F8 /* BinaryBitmap.cpp */; }; - 3B5B0EAB121C52ED005698F8 /* BinaryBitmap.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E15121C52ED005698F8 /* BinaryBitmap.h */; }; - 3B5B0EAC121C52ED005698F8 /* Array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E17121C52ED005698F8 /* Array.cpp */; }; - 3B5B0EAD121C52ED005698F8 /* Array.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E18121C52ED005698F8 /* Array.h */; }; - 3B5B0EAE121C52ED005698F8 /* BitArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E19121C52ED005698F8 /* BitArray.cpp */; }; - 3B5B0EAF121C52ED005698F8 /* BitArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E1A121C52ED005698F8 /* BitArray.h */; }; - 3B5B0EB0121C52ED005698F8 /* BitMatrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E1B121C52ED005698F8 /* BitMatrix.cpp */; }; - 3B5B0EB1121C52ED005698F8 /* BitMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E1C121C52ED005698F8 /* BitMatrix.h */; }; - 3B5B0EB2121C52ED005698F8 /* BitSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E1D121C52ED005698F8 /* BitSource.cpp */; }; - 3B5B0EB3121C52ED005698F8 /* BitSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E1E121C52ED005698F8 /* BitSource.h */; }; - 3B5B0EB4121C52ED005698F8 /* Counted.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E1F121C52ED005698F8 /* Counted.cpp */; }; - 3B5B0EB5121C52ED005698F8 /* Counted.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E20121C52ED005698F8 /* Counted.h */; }; - 3B5B0EB6121C52ED005698F8 /* DecoderResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E21121C52ED005698F8 /* DecoderResult.cpp */; }; - 3B5B0EB7121C52ED005698F8 /* DecoderResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E22121C52ED005698F8 /* DecoderResult.h */; }; - 3B5B0EB8121C52ED005698F8 /* DetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E23121C52ED005698F8 /* DetectorResult.cpp */; }; - 3B5B0EB9121C52ED005698F8 /* DetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E24121C52ED005698F8 /* DetectorResult.h */; }; - 3B5B0EBA121C52ED005698F8 /* EdgeDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E25121C52ED005698F8 /* EdgeDetector.cpp */; }; - 3B5B0EBB121C52ED005698F8 /* EdgeDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E26121C52ED005698F8 /* EdgeDetector.h */; }; - 3B5B0EBC121C52ED005698F8 /* GlobalHistogramBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E27121C52ED005698F8 /* GlobalHistogramBinarizer.cpp */; }; - 3B5B0EBD121C52ED005698F8 /* GlobalHistogramBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E28121C52ED005698F8 /* GlobalHistogramBinarizer.h */; }; - 3B5B0EBE121C52ED005698F8 /* GreyscaleLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E29121C52ED005698F8 /* GreyscaleLuminanceSource.cpp */; }; - 3B5B0EBF121C52ED005698F8 /* GreyscaleLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E2A121C52ED005698F8 /* GreyscaleLuminanceSource.h */; }; - 3B5B0EC0121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E2B121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.cpp */; }; - 3B5B0EC1121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E2C121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.h */; }; - 3B5B0EC2121C52ED005698F8 /* GridSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E2D121C52ED005698F8 /* GridSampler.cpp */; }; - 3B5B0EC3121C52ED005698F8 /* GridSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E2E121C52ED005698F8 /* GridSampler.h */; }; - 3B5B0EC4121C52ED005698F8 /* HybridBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E2F121C52ED005698F8 /* HybridBinarizer.cpp */; }; - 3B5B0EC5121C52ED005698F8 /* HybridBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E30121C52ED005698F8 /* HybridBinarizer.h */; }; - 3B5B0EC6121C52ED005698F8 /* IllegalArgumentException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E31121C52ED005698F8 /* IllegalArgumentException.cpp */; }; - 3B5B0EC7121C52ED005698F8 /* IllegalArgumentException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E32121C52ED005698F8 /* IllegalArgumentException.h */; }; - 3B5B0EC8121C52ED005698F8 /* PerspectiveTransform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E33121C52ED005698F8 /* PerspectiveTransform.cpp */; }; - 3B5B0EC9121C52ED005698F8 /* PerspectiveTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E34121C52ED005698F8 /* PerspectiveTransform.h */; }; - 3B5B0ECA121C52ED005698F8 /* Point.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E35121C52ED005698F8 /* Point.h */; }; - 3B5B0ECF121C52ED005698F8 /* ReedSolomonDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E3B121C52ED005698F8 /* ReedSolomonDecoder.cpp */; }; - 3B5B0ED0121C52ED005698F8 /* ReedSolomonDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E3C121C52ED005698F8 /* ReedSolomonDecoder.h */; }; - 3B5B0ED1121C52ED005698F8 /* ReedSolomonException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E3D121C52ED005698F8 /* ReedSolomonException.cpp */; }; - 3B5B0ED2121C52ED005698F8 /* ReedSolomonException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E3E121C52ED005698F8 /* ReedSolomonException.h */; }; - 3B5B0ED3121C52ED005698F8 /* Str.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E3F121C52ED005698F8 /* Str.cpp */; }; - 3B5B0ED4121C52ED005698F8 /* Str.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E40121C52ED005698F8 /* Str.h */; }; - 3B5B0ED5121C52ED005698F8 /* DataMatrixReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E42121C52ED005698F8 /* DataMatrixReader.cpp */; }; - 3B5B0ED6121C52ED005698F8 /* DataMatrixReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E43121C52ED005698F8 /* DataMatrixReader.h */; }; - 3B5B0ED7121C52ED005698F8 /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E45121C52ED005698F8 /* BitMatrixParser.cpp */; }; - 3B5B0ED8121C52ED005698F8 /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E46121C52ED005698F8 /* BitMatrixParser.h */; }; - 3B5B0ED9121C52ED005698F8 /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E47121C52ED005698F8 /* DataBlock.cpp */; }; - 3B5B0EDA121C52ED005698F8 /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E48121C52ED005698F8 /* DataBlock.h */; }; - 3B5B0EDB121C52ED005698F8 /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E49121C52ED005698F8 /* DecodedBitStreamParser.cpp */; }; - 3B5B0EDC121C52ED005698F8 /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E4A121C52ED005698F8 /* DecodedBitStreamParser.h */; }; - 3B5B0EDD121C52ED005698F8 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E4B121C52ED005698F8 /* Decoder.cpp */; }; - 3B5B0EDE121C52ED005698F8 /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E4C121C52ED005698F8 /* Decoder.h */; }; - 3B5B0EDF121C52ED005698F8 /* CornerPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E4E121C52ED005698F8 /* CornerPoint.cpp */; }; - 3B5B0EE0121C52ED005698F8 /* CornerPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E4F121C52ED005698F8 /* CornerPoint.h */; }; - 3B5B0EE1121C52ED005698F8 /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E50121C52ED005698F8 /* Detector.cpp */; }; - 3B5B0EE2121C52ED005698F8 /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E51121C52ED005698F8 /* Detector.h */; }; - 3B5B0EE3121C52ED005698F8 /* MonochromeRectangleDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E52121C52ED005698F8 /* MonochromeRectangleDetector.cpp */; }; - 3B5B0EE4121C52ED005698F8 /* MonochromeRectangleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E53121C52ED005698F8 /* MonochromeRectangleDetector.h */; }; - 3B5B0EE5121C52ED005698F8 /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E54121C52ED005698F8 /* Version.cpp */; }; - 3B5B0EE6121C52ED005698F8 /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E55121C52ED005698F8 /* Version.h */; }; - 3B5B0EE7121C52ED005698F8 /* DecodeHints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E56121C52ED005698F8 /* DecodeHints.cpp */; }; - 3B5B0EE8121C52ED005698F8 /* DecodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E57121C52ED005698F8 /* DecodeHints.h */; }; - 3B5B0EE9121C52ED005698F8 /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E58121C52ED005698F8 /* Exception.cpp */; }; - 3B5B0EEA121C52ED005698F8 /* Exception.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E59121C52ED005698F8 /* Exception.h */; }; - 3B5B0EEB121C52ED005698F8 /* LuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E5A121C52ED005698F8 /* LuminanceSource.cpp */; }; - 3B5B0EEC121C52ED005698F8 /* LuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E5B121C52ED005698F8 /* LuminanceSource.h */; }; - 3B5B0EED121C52ED005698F8 /* MultiFormatReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E5C121C52ED005698F8 /* MultiFormatReader.cpp */; }; - 3B5B0EEE121C52ED005698F8 /* MultiFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E5D121C52ED005698F8 /* MultiFormatReader.h */; }; - 3B5B0EEF121C52ED005698F8 /* Code128Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E5F121C52ED005698F8 /* Code128Reader.cpp */; }; - 3B5B0EF0121C52ED005698F8 /* Code128Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E60121C52ED005698F8 /* Code128Reader.h */; }; - 3B5B0EF1121C52ED005698F8 /* Code39Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E61121C52ED005698F8 /* Code39Reader.cpp */; }; - 3B5B0EF2121C52ED005698F8 /* Code39Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E62121C52ED005698F8 /* Code39Reader.h */; }; - 3B5B0EF3121C52ED005698F8 /* EAN13Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E63121C52ED005698F8 /* EAN13Reader.cpp */; }; - 3B5B0EF4121C52ED005698F8 /* EAN13Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E64121C52ED005698F8 /* EAN13Reader.h */; }; - 3B5B0EF5121C52ED005698F8 /* EAN8Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E65121C52ED005698F8 /* EAN8Reader.cpp */; }; - 3B5B0EF6121C52ED005698F8 /* EAN8Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E66121C52ED005698F8 /* EAN8Reader.h */; }; - 3B5B0EF7121C52ED005698F8 /* ITFReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E67121C52ED005698F8 /* ITFReader.cpp */; }; - 3B5B0EF8121C52ED005698F8 /* ITFReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E68121C52ED005698F8 /* ITFReader.h */; }; - 3B5B0EF9121C52ED005698F8 /* MultiFormatOneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E69121C52ED005698F8 /* MultiFormatOneDReader.cpp */; }; - 3B5B0EFA121C52ED005698F8 /* MultiFormatOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E6A121C52ED005698F8 /* MultiFormatOneDReader.h */; }; - 3B5B0EFB121C52ED005698F8 /* MultiFormatUPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E6B121C52ED005698F8 /* MultiFormatUPCEANReader.cpp */; }; - 3B5B0EFC121C52ED005698F8 /* MultiFormatUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E6C121C52ED005698F8 /* MultiFormatUPCEANReader.h */; }; - 3B5B0EFD121C52ED005698F8 /* OneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E6D121C52ED005698F8 /* OneDReader.cpp */; }; - 3B5B0EFE121C52ED005698F8 /* OneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E6E121C52ED005698F8 /* OneDReader.h */; }; - 3B5B0EFF121C52ED005698F8 /* OneDResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E6F121C52ED005698F8 /* OneDResultPoint.cpp */; }; - 3B5B0F00121C52ED005698F8 /* OneDResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E70121C52ED005698F8 /* OneDResultPoint.h */; }; - 3B5B0F01121C52ED005698F8 /* UPCAReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E71121C52ED005698F8 /* UPCAReader.cpp */; }; - 3B5B0F02121C52ED005698F8 /* UPCAReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E72121C52ED005698F8 /* UPCAReader.h */; }; - 3B5B0F03121C52ED005698F8 /* UPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E73121C52ED005698F8 /* UPCEANReader.cpp */; }; - 3B5B0F04121C52ED005698F8 /* UPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E74121C52ED005698F8 /* UPCEANReader.h */; }; - 3B5B0F05121C52ED005698F8 /* UPCEReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E75121C52ED005698F8 /* UPCEReader.cpp */; }; - 3B5B0F06121C52ED005698F8 /* UPCEReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E76121C52ED005698F8 /* UPCEReader.h */; }; - 3B5B0F07121C52ED005698F8 /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E79121C52ED005698F8 /* BitMatrixParser.cpp */; }; - 3B5B0F08121C52ED005698F8 /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E7A121C52ED005698F8 /* BitMatrixParser.h */; }; - 3B5B0F09121C52ED005698F8 /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E7B121C52ED005698F8 /* DataBlock.cpp */; }; - 3B5B0F0A121C52ED005698F8 /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E7C121C52ED005698F8 /* DataBlock.h */; }; - 3B5B0F0B121C52ED005698F8 /* DataMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E7D121C52ED005698F8 /* DataMask.cpp */; }; - 3B5B0F0C121C52ED005698F8 /* DataMask.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E7E121C52ED005698F8 /* DataMask.h */; }; - 3B5B0F0D121C52ED005698F8 /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E7F121C52ED005698F8 /* DecodedBitStreamParser.cpp */; }; - 3B5B0F0E121C52ED005698F8 /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E80121C52ED005698F8 /* DecodedBitStreamParser.h */; }; - 3B5B0F0F121C52ED005698F8 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E81121C52ED005698F8 /* Decoder.cpp */; }; - 3B5B0F10121C52ED005698F8 /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E82121C52ED005698F8 /* Decoder.h */; }; - 3B5B0F11121C52ED005698F8 /* Mode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E83121C52ED005698F8 /* Mode.cpp */; }; - 3B5B0F12121C52ED005698F8 /* Mode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E84121C52ED005698F8 /* Mode.h */; }; - 3B5B0F13121C52ED005698F8 /* AlignmentPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E86121C52ED005698F8 /* AlignmentPattern.cpp */; }; - 3B5B0F14121C52ED005698F8 /* AlignmentPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E87121C52ED005698F8 /* AlignmentPattern.h */; }; - 3B5B0F15121C52ED005698F8 /* AlignmentPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E88121C52ED005698F8 /* AlignmentPatternFinder.cpp */; }; - 3B5B0F16121C52ED005698F8 /* AlignmentPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E89121C52ED005698F8 /* AlignmentPatternFinder.h */; }; - 3B5B0F17121C52ED005698F8 /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E8A121C52ED005698F8 /* Detector.cpp */; }; - 3B5B0F18121C52ED005698F8 /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E8B121C52ED005698F8 /* Detector.h */; }; - 3B5B0F19121C52ED005698F8 /* FinderPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E8C121C52ED005698F8 /* FinderPattern.cpp */; }; - 3B5B0F1A121C52ED005698F8 /* FinderPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E8D121C52ED005698F8 /* FinderPattern.h */; }; - 3B5B0F1B121C52ED005698F8 /* FinderPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E8E121C52ED005698F8 /* FinderPatternFinder.cpp */; }; - 3B5B0F1C121C52ED005698F8 /* FinderPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E8F121C52ED005698F8 /* FinderPatternFinder.h */; }; - 3B5B0F1D121C52ED005698F8 /* FinderPatternInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E90121C52ED005698F8 /* FinderPatternInfo.cpp */; }; - 3B5B0F1E121C52ED005698F8 /* FinderPatternInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E91121C52ED005698F8 /* FinderPatternInfo.h */; }; - 3B5B0F1F121C52ED005698F8 /* QREdgeDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E92121C52ED005698F8 /* QREdgeDetector.cpp */; }; - 3B5B0F20121C52ED005698F8 /* QREdgeDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E93121C52ED005698F8 /* QREdgeDetector.h */; }; - 3B5B0F21121C52ED005698F8 /* ErrorCorrectionLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E94121C52ED005698F8 /* ErrorCorrectionLevel.cpp */; }; - 3B5B0F22121C52ED005698F8 /* ErrorCorrectionLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E95121C52ED005698F8 /* ErrorCorrectionLevel.h */; }; - 3B5B0F23121C52ED005698F8 /* FormatInformation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E96121C52ED005698F8 /* FormatInformation.cpp */; }; - 3B5B0F24121C52ED005698F8 /* FormatInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E97121C52ED005698F8 /* FormatInformation.h */; }; - 3B5B0F25121C52ED005698F8 /* QRCodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E98121C52ED005698F8 /* QRCodeReader.cpp */; }; - 3B5B0F26121C52ED005698F8 /* QRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E99121C52ED005698F8 /* QRCodeReader.h */; }; - 3B5B0F27121C52ED005698F8 /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E9A121C52ED005698F8 /* Version.cpp */; }; - 3B5B0F28121C52ED005698F8 /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E9B121C52ED005698F8 /* Version.h */; }; - 3B5B0F29121C52ED005698F8 /* Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E9C121C52ED005698F8 /* Reader.cpp */; }; - 3B5B0F2A121C52ED005698F8 /* Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E9D121C52ED005698F8 /* Reader.h */; }; - 3B5B0F2B121C52ED005698F8 /* ReaderException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0E9E121C52ED005698F8 /* ReaderException.cpp */; }; - 3B5B0F2C121C52ED005698F8 /* ReaderException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0E9F121C52ED005698F8 /* ReaderException.h */; }; - 3B5B0F2D121C52ED005698F8 /* Result.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0EA0121C52ED005698F8 /* Result.cpp */; }; - 3B5B0F2E121C52ED005698F8 /* Result.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0EA1121C52ED005698F8 /* Result.h */; }; - 3B5B0F2F121C52ED005698F8 /* ResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0EA2121C52ED005698F8 /* ResultPoint.cpp */; }; - 3B5B0F30121C52ED005698F8 /* ResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0EA3121C52ED005698F8 /* ResultPoint.h */; }; - 3B5B0F31121C52ED005698F8 /* ResultPointCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B0EA4121C52ED005698F8 /* ResultPointCallback.cpp */; }; - 3B5B0F32121C52ED005698F8 /* ResultPointCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5B0EA5121C52ED005698F8 /* ResultPointCallback.h */; }; - 3BB87D4314B54C480078117F /* FormatException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BB87D4214B54C480078117F /* FormatException.cpp */; }; - 3BB87D4714B54C610078117F /* CharacterSetECI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BB87D4414B54C610078117F /* CharacterSetECI.cpp */; }; - 3BB87D4914B54C610078117F /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BB87D4614B54C610078117F /* StringUtils.cpp */; }; - 3BB87D5014B54F1D0078117F /* WhiteRectangleDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BB87D4F14B54F1D0078117F /* WhiteRectangleDetector.cpp */; }; - 3BB87D5214B54F3F0078117F /* NotFoundException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BB87D5114B54F3F0078117F /* NotFoundException.cpp */; }; - E105A91214EC35860011473C /* GenericGF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A90E14EC35860011473C /* GenericGF.cpp */; }; - E105A91314EC35860011473C /* GenericGF.h in Headers */ = {isa = PBXBuildFile; fileRef = E105A90F14EC35860011473C /* GenericGF.h */; }; - E105A91414EC35860011473C /* GenericGFPoly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A91014EC35860011473C /* GenericGFPoly.cpp */; }; - E105A91514EC35860011473C /* GenericGFPoly.h in Headers */ = {isa = PBXBuildFile; fileRef = E105A91114EC35860011473C /* GenericGFPoly.h */; }; - E105A92114EC35AA0011473C /* AztecDetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A91714EC35AA0011473C /* AztecDetectorResult.cpp */; }; - E105A92214EC35AA0011473C /* AztecDetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E105A91814EC35AA0011473C /* AztecDetectorResult.h */; }; - E105A92314EC35AA0011473C /* AztecReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A91914EC35AA0011473C /* AztecReader.cpp */; }; - E105A92414EC35AA0011473C /* AztecReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E105A91A14EC35AA0011473C /* AztecReader.h */; }; - E105A92514EC35AA0011473C /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A91C14EC35AA0011473C /* Decoder.cpp */; }; - E105A92614EC35AA0011473C /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E105A91D14EC35AA0011473C /* Decoder.h */; }; - E105A92714EC35AA0011473C /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E105A91F14EC35AA0011473C /* Detector.cpp */; }; - E105A92814EC35AA0011473C /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = E105A92014EC35AA0011473C /* Detector.h */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 3B5B0DFF121C525D005698F8 /* libzxing.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libzxing.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B5B0E10121C52ED005698F8 /* BarcodeFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BarcodeFormat.cpp; sourceTree = ""; }; - 3B5B0E11121C52ED005698F8 /* BarcodeFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BarcodeFormat.h; sourceTree = ""; }; - 3B5B0E12121C52ED005698F8 /* Binarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Binarizer.cpp; sourceTree = ""; }; - 3B5B0E13121C52ED005698F8 /* Binarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Binarizer.h; sourceTree = ""; }; - 3B5B0E14121C52ED005698F8 /* BinaryBitmap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BinaryBitmap.cpp; sourceTree = ""; }; - 3B5B0E15121C52ED005698F8 /* BinaryBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BinaryBitmap.h; sourceTree = ""; }; - 3B5B0E17121C52ED005698F8 /* Array.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Array.cpp; sourceTree = ""; }; - 3B5B0E18121C52ED005698F8 /* Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Array.h; sourceTree = ""; }; - 3B5B0E19121C52ED005698F8 /* BitArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitArray.cpp; sourceTree = ""; }; - 3B5B0E1A121C52ED005698F8 /* BitArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitArray.h; sourceTree = ""; }; - 3B5B0E1B121C52ED005698F8 /* BitMatrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrix.cpp; sourceTree = ""; }; - 3B5B0E1C121C52ED005698F8 /* BitMatrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrix.h; sourceTree = ""; }; - 3B5B0E1D121C52ED005698F8 /* BitSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitSource.cpp; sourceTree = ""; }; - 3B5B0E1E121C52ED005698F8 /* BitSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitSource.h; sourceTree = ""; }; - 3B5B0E1F121C52ED005698F8 /* Counted.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Counted.cpp; sourceTree = ""; }; - 3B5B0E20121C52ED005698F8 /* Counted.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Counted.h; sourceTree = ""; }; - 3B5B0E21121C52ED005698F8 /* DecoderResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecoderResult.cpp; sourceTree = ""; }; - 3B5B0E22121C52ED005698F8 /* DecoderResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecoderResult.h; sourceTree = ""; }; - 3B5B0E23121C52ED005698F8 /* DetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DetectorResult.cpp; sourceTree = ""; }; - 3B5B0E24121C52ED005698F8 /* DetectorResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetectorResult.h; sourceTree = ""; }; - 3B5B0E25121C52ED005698F8 /* EdgeDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EdgeDetector.cpp; sourceTree = ""; }; - 3B5B0E26121C52ED005698F8 /* EdgeDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdgeDetector.h; sourceTree = ""; }; - 3B5B0E27121C52ED005698F8 /* GlobalHistogramBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GlobalHistogramBinarizer.cpp; sourceTree = ""; }; - 3B5B0E28121C52ED005698F8 /* GlobalHistogramBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlobalHistogramBinarizer.h; sourceTree = ""; }; - 3B5B0E29121C52ED005698F8 /* GreyscaleLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleLuminanceSource.cpp; sourceTree = ""; }; - 3B5B0E2A121C52ED005698F8 /* GreyscaleLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleLuminanceSource.h; sourceTree = ""; }; - 3B5B0E2B121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleRotatedLuminanceSource.cpp; sourceTree = ""; }; - 3B5B0E2C121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleRotatedLuminanceSource.h; sourceTree = ""; }; - 3B5B0E2D121C52ED005698F8 /* GridSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridSampler.cpp; sourceTree = ""; }; - 3B5B0E2E121C52ED005698F8 /* GridSampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridSampler.h; sourceTree = ""; }; - 3B5B0E2F121C52ED005698F8 /* HybridBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridBinarizer.cpp; sourceTree = ""; }; - 3B5B0E30121C52ED005698F8 /* HybridBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HybridBinarizer.h; sourceTree = ""; }; - 3B5B0E31121C52ED005698F8 /* IllegalArgumentException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IllegalArgumentException.cpp; sourceTree = ""; }; - 3B5B0E32121C52ED005698F8 /* IllegalArgumentException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IllegalArgumentException.h; sourceTree = ""; }; - 3B5B0E33121C52ED005698F8 /* PerspectiveTransform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerspectiveTransform.cpp; sourceTree = ""; }; - 3B5B0E34121C52ED005698F8 /* PerspectiveTransform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerspectiveTransform.h; sourceTree = ""; }; - 3B5B0E35121C52ED005698F8 /* Point.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Point.h; sourceTree = ""; }; - 3B5B0E3B121C52ED005698F8 /* ReedSolomonDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonDecoder.cpp; sourceTree = ""; }; - 3B5B0E3C121C52ED005698F8 /* ReedSolomonDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonDecoder.h; sourceTree = ""; }; - 3B5B0E3D121C52ED005698F8 /* ReedSolomonException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonException.cpp; sourceTree = ""; }; - 3B5B0E3E121C52ED005698F8 /* ReedSolomonException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonException.h; sourceTree = ""; }; - 3B5B0E3F121C52ED005698F8 /* Str.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Str.cpp; sourceTree = ""; }; - 3B5B0E40121C52ED005698F8 /* Str.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Str.h; sourceTree = ""; }; - 3B5B0E42121C52ED005698F8 /* DataMatrixReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMatrixReader.cpp; sourceTree = ""; }; - 3B5B0E43121C52ED005698F8 /* DataMatrixReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMatrixReader.h; sourceTree = ""; }; - 3B5B0E45121C52ED005698F8 /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - 3B5B0E46121C52ED005698F8 /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - 3B5B0E47121C52ED005698F8 /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; }; - 3B5B0E48121C52ED005698F8 /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; }; - 3B5B0E49121C52ED005698F8 /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - 3B5B0E4A121C52ED005698F8 /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - 3B5B0E4B121C52ED005698F8 /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3B5B0E4C121C52ED005698F8 /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3B5B0E4E121C52ED005698F8 /* CornerPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CornerPoint.cpp; sourceTree = ""; }; - 3B5B0E4F121C52ED005698F8 /* CornerPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CornerPoint.h; sourceTree = ""; }; - 3B5B0E50121C52ED005698F8 /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3B5B0E51121C52ED005698F8 /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3B5B0E52121C52ED005698F8 /* MonochromeRectangleDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MonochromeRectangleDetector.cpp; sourceTree = ""; }; - 3B5B0E53121C52ED005698F8 /* MonochromeRectangleDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MonochromeRectangleDetector.h; sourceTree = ""; }; - 3B5B0E54121C52ED005698F8 /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; }; - 3B5B0E55121C52ED005698F8 /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; - 3B5B0E56121C52ED005698F8 /* DecodeHints.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodeHints.cpp; sourceTree = ""; }; - 3B5B0E57121C52ED005698F8 /* DecodeHints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodeHints.h; sourceTree = ""; }; - 3B5B0E58121C52ED005698F8 /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Exception.cpp; sourceTree = ""; }; - 3B5B0E59121C52ED005698F8 /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = ""; }; - 3B5B0E5A121C52ED005698F8 /* LuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LuminanceSource.cpp; sourceTree = ""; }; - 3B5B0E5B121C52ED005698F8 /* LuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LuminanceSource.h; sourceTree = ""; }; - 3B5B0E5C121C52ED005698F8 /* MultiFormatReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatReader.cpp; sourceTree = ""; }; - 3B5B0E5D121C52ED005698F8 /* MultiFormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatReader.h; sourceTree = ""; }; - 3B5B0E5F121C52ED005698F8 /* Code128Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code128Reader.cpp; sourceTree = ""; }; - 3B5B0E60121C52ED005698F8 /* Code128Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code128Reader.h; sourceTree = ""; }; - 3B5B0E61121C52ED005698F8 /* Code39Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code39Reader.cpp; sourceTree = ""; }; - 3B5B0E62121C52ED005698F8 /* Code39Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code39Reader.h; sourceTree = ""; }; - 3B5B0E63121C52ED005698F8 /* EAN13Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN13Reader.cpp; sourceTree = ""; }; - 3B5B0E64121C52ED005698F8 /* EAN13Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN13Reader.h; sourceTree = ""; }; - 3B5B0E65121C52ED005698F8 /* EAN8Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN8Reader.cpp; sourceTree = ""; }; - 3B5B0E66121C52ED005698F8 /* EAN8Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN8Reader.h; sourceTree = ""; }; - 3B5B0E67121C52ED005698F8 /* ITFReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ITFReader.cpp; sourceTree = ""; }; - 3B5B0E68121C52ED005698F8 /* ITFReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITFReader.h; sourceTree = ""; }; - 3B5B0E69121C52ED005698F8 /* MultiFormatOneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatOneDReader.cpp; sourceTree = ""; }; - 3B5B0E6A121C52ED005698F8 /* MultiFormatOneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatOneDReader.h; sourceTree = ""; }; - 3B5B0E6B121C52ED005698F8 /* MultiFormatUPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatUPCEANReader.cpp; sourceTree = ""; }; - 3B5B0E6C121C52ED005698F8 /* MultiFormatUPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatUPCEANReader.h; sourceTree = ""; }; - 3B5B0E6D121C52ED005698F8 /* OneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDReader.cpp; sourceTree = ""; }; - 3B5B0E6E121C52ED005698F8 /* OneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDReader.h; sourceTree = ""; }; - 3B5B0E6F121C52ED005698F8 /* OneDResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDResultPoint.cpp; sourceTree = ""; }; - 3B5B0E70121C52ED005698F8 /* OneDResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDResultPoint.h; sourceTree = ""; }; - 3B5B0E71121C52ED005698F8 /* UPCAReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCAReader.cpp; sourceTree = ""; }; - 3B5B0E72121C52ED005698F8 /* UPCAReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCAReader.h; sourceTree = ""; }; - 3B5B0E73121C52ED005698F8 /* UPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEANReader.cpp; sourceTree = ""; }; - 3B5B0E74121C52ED005698F8 /* UPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEANReader.h; sourceTree = ""; }; - 3B5B0E75121C52ED005698F8 /* UPCEReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEReader.cpp; sourceTree = ""; }; - 3B5B0E76121C52ED005698F8 /* UPCEReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEReader.h; sourceTree = ""; }; - 3B5B0E79121C52ED005698F8 /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - 3B5B0E7A121C52ED005698F8 /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - 3B5B0E7B121C52ED005698F8 /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; }; - 3B5B0E7C121C52ED005698F8 /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; }; - 3B5B0E7D121C52ED005698F8 /* DataMask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMask.cpp; sourceTree = ""; }; - 3B5B0E7E121C52ED005698F8 /* DataMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMask.h; sourceTree = ""; }; - 3B5B0E7F121C52ED005698F8 /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - 3B5B0E80121C52ED005698F8 /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - 3B5B0E81121C52ED005698F8 /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3B5B0E82121C52ED005698F8 /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3B5B0E83121C52ED005698F8 /* Mode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode.cpp; sourceTree = ""; }; - 3B5B0E84121C52ED005698F8 /* Mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mode.h; sourceTree = ""; }; - 3B5B0E86121C52ED005698F8 /* AlignmentPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPattern.cpp; sourceTree = ""; }; - 3B5B0E87121C52ED005698F8 /* AlignmentPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPattern.h; sourceTree = ""; }; - 3B5B0E88121C52ED005698F8 /* AlignmentPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPatternFinder.cpp; sourceTree = ""; }; - 3B5B0E89121C52ED005698F8 /* AlignmentPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPatternFinder.h; sourceTree = ""; }; - 3B5B0E8A121C52ED005698F8 /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3B5B0E8B121C52ED005698F8 /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3B5B0E8C121C52ED005698F8 /* FinderPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPattern.cpp; sourceTree = ""; }; - 3B5B0E8D121C52ED005698F8 /* FinderPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPattern.h; sourceTree = ""; }; - 3B5B0E8E121C52ED005698F8 /* FinderPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternFinder.cpp; sourceTree = ""; }; - 3B5B0E8F121C52ED005698F8 /* FinderPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternFinder.h; sourceTree = ""; }; - 3B5B0E90121C52ED005698F8 /* FinderPatternInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternInfo.cpp; sourceTree = ""; }; - 3B5B0E91121C52ED005698F8 /* FinderPatternInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternInfo.h; sourceTree = ""; }; - 3B5B0E92121C52ED005698F8 /* QREdgeDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QREdgeDetector.cpp; sourceTree = ""; }; - 3B5B0E93121C52ED005698F8 /* QREdgeDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QREdgeDetector.h; sourceTree = ""; }; - 3B5B0E94121C52ED005698F8 /* ErrorCorrectionLevel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorCorrectionLevel.cpp; sourceTree = ""; }; - 3B5B0E95121C52ED005698F8 /* ErrorCorrectionLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorCorrectionLevel.h; sourceTree = ""; }; - 3B5B0E96121C52ED005698F8 /* FormatInformation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatInformation.cpp; sourceTree = ""; }; - 3B5B0E97121C52ED005698F8 /* FormatInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatInformation.h; sourceTree = ""; }; - 3B5B0E98121C52ED005698F8 /* QRCodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QRCodeReader.cpp; sourceTree = ""; }; - 3B5B0E99121C52ED005698F8 /* QRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QRCodeReader.h; sourceTree = ""; }; - 3B5B0E9A121C52ED005698F8 /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; }; - 3B5B0E9B121C52ED005698F8 /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; - 3B5B0E9C121C52ED005698F8 /* Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reader.cpp; sourceTree = ""; }; - 3B5B0E9D121C52ED005698F8 /* Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reader.h; sourceTree = ""; }; - 3B5B0E9E121C52ED005698F8 /* ReaderException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReaderException.cpp; sourceTree = ""; }; - 3B5B0E9F121C52ED005698F8 /* ReaderException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderException.h; sourceTree = ""; }; - 3B5B0EA0121C52ED005698F8 /* Result.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Result.cpp; sourceTree = ""; }; - 3B5B0EA1121C52ED005698F8 /* Result.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Result.h; sourceTree = ""; }; - 3B5B0EA2121C52ED005698F8 /* ResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPoint.cpp; sourceTree = ""; }; - 3B5B0EA3121C52ED005698F8 /* ResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPoint.h; sourceTree = ""; }; - 3B5B0EA4121C52ED005698F8 /* ResultPointCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPointCallback.cpp; sourceTree = ""; }; - 3B5B0EA5121C52ED005698F8 /* ResultPointCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPointCallback.h; sourceTree = ""; }; - 3BB87D4214B54C480078117F /* FormatException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatException.cpp; sourceTree = ""; }; - 3BB87D4414B54C610078117F /* CharacterSetECI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CharacterSetECI.cpp; path = common/CharacterSetECI.cpp; sourceTree = ""; }; - 3BB87D4614B54C610078117F /* StringUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringUtils.cpp; path = common/StringUtils.cpp; sourceTree = ""; }; - 3BB87D4F14B54F1D0078117F /* WhiteRectangleDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WhiteRectangleDetector.cpp; path = common/detector/WhiteRectangleDetector.cpp; sourceTree = ""; }; - 3BB87D5114B54F3F0078117F /* NotFoundException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotFoundException.cpp; sourceTree = ""; }; - E105A90E14EC35860011473C /* GenericGF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericGF.cpp; sourceTree = ""; }; - E105A90F14EC35860011473C /* GenericGF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericGF.h; sourceTree = ""; }; - E105A91014EC35860011473C /* GenericGFPoly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericGFPoly.cpp; sourceTree = ""; }; - E105A91114EC35860011473C /* GenericGFPoly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericGFPoly.h; sourceTree = ""; }; - E105A91714EC35AA0011473C /* AztecDetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AztecDetectorResult.cpp; path = aztec/AztecDetectorResult.cpp; sourceTree = ""; }; - E105A91814EC35AA0011473C /* AztecDetectorResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AztecDetectorResult.h; path = aztec/AztecDetectorResult.h; sourceTree = ""; }; - E105A91914EC35AA0011473C /* AztecReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AztecReader.cpp; path = aztec/AztecReader.cpp; sourceTree = ""; }; - E105A91A14EC35AA0011473C /* AztecReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AztecReader.h; path = aztec/AztecReader.h; sourceTree = ""; }; - E105A91C14EC35AA0011473C /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - E105A91D14EC35AA0011473C /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - E105A91F14EC35AA0011473C /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - E105A92014EC35AA0011473C /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3B5B0DFD121C525D005698F8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 3B5B0DFF121C525D005698F8 /* libzxing.a */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* osx */ = { - isa = PBXGroup; - children = ( - 08FB77AEFE84172EC02AAC07 /* Classes */, - 32C88DFF0371C24200C91783 /* Other Sources */, - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - name = osx; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { - isa = PBXGroup; - children = ( - 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, - 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, - ); - name = "External Frameworks and Libraries"; - sourceTree = ""; - }; - 08FB77AEFE84172EC02AAC07 /* Classes */ = { - isa = PBXGroup; - children = ( - 3B5B0E0F121C52ED005698F8 /* zxing */, - ); - name = Classes; - sourceTree = ""; - }; - 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { - isa = PBXGroup; - children = ( - ); - name = "Other Sources"; - sourceTree = ""; - }; - 3B5B0E0F121C52ED005698F8 /* zxing */ = { - isa = PBXGroup; - children = ( - E105A91614EC35980011473C /* aztec */, - 3BB87D5114B54F3F0078117F /* NotFoundException.cpp */, - 3BB87D4F14B54F1D0078117F /* WhiteRectangleDetector.cpp */, - 3BB87D4414B54C610078117F /* CharacterSetECI.cpp */, - 3BB87D4614B54C610078117F /* StringUtils.cpp */, - 3BB87D4214B54C480078117F /* FormatException.cpp */, - 3B5B0E10121C52ED005698F8 /* BarcodeFormat.cpp */, - 3B5B0E11121C52ED005698F8 /* BarcodeFormat.h */, - 3B5B0E12121C52ED005698F8 /* Binarizer.cpp */, - 3B5B0E13121C52ED005698F8 /* Binarizer.h */, - 3B5B0E14121C52ED005698F8 /* BinaryBitmap.cpp */, - 3B5B0E15121C52ED005698F8 /* BinaryBitmap.h */, - 3B5B0E16121C52ED005698F8 /* common */, - 3B5B0E41121C52ED005698F8 /* datamatrix */, - 3B5B0E56121C52ED005698F8 /* DecodeHints.cpp */, - 3B5B0E57121C52ED005698F8 /* DecodeHints.h */, - 3B5B0E58121C52ED005698F8 /* Exception.cpp */, - 3B5B0E59121C52ED005698F8 /* Exception.h */, - 3B5B0E5A121C52ED005698F8 /* LuminanceSource.cpp */, - 3B5B0E5B121C52ED005698F8 /* LuminanceSource.h */, - 3B5B0E5C121C52ED005698F8 /* MultiFormatReader.cpp */, - 3B5B0E5D121C52ED005698F8 /* MultiFormatReader.h */, - 3B5B0E5E121C52ED005698F8 /* oned */, - 3B5B0E77121C52ED005698F8 /* qrcode */, - 3B5B0E9C121C52ED005698F8 /* Reader.cpp */, - 3B5B0E9D121C52ED005698F8 /* Reader.h */, - 3B5B0E9E121C52ED005698F8 /* ReaderException.cpp */, - 3B5B0E9F121C52ED005698F8 /* ReaderException.h */, - 3B5B0EA0121C52ED005698F8 /* Result.cpp */, - 3B5B0EA1121C52ED005698F8 /* Result.h */, - 3B5B0EA2121C52ED005698F8 /* ResultPoint.cpp */, - 3B5B0EA3121C52ED005698F8 /* ResultPoint.h */, - 3B5B0EA4121C52ED005698F8 /* ResultPointCallback.cpp */, - 3B5B0EA5121C52ED005698F8 /* ResultPointCallback.h */, - ); - name = zxing; - path = core/src/zxing; - sourceTree = ""; - }; - 3B5B0E16121C52ED005698F8 /* common */ = { - isa = PBXGroup; - children = ( - 3B5B0E17121C52ED005698F8 /* Array.cpp */, - 3B5B0E18121C52ED005698F8 /* Array.h */, - 3B5B0E19121C52ED005698F8 /* BitArray.cpp */, - 3B5B0E1A121C52ED005698F8 /* BitArray.h */, - 3B5B0E1B121C52ED005698F8 /* BitMatrix.cpp */, - 3B5B0E1C121C52ED005698F8 /* BitMatrix.h */, - 3B5B0E1D121C52ED005698F8 /* BitSource.cpp */, - 3B5B0E1E121C52ED005698F8 /* BitSource.h */, - 3B5B0E1F121C52ED005698F8 /* Counted.cpp */, - 3B5B0E20121C52ED005698F8 /* Counted.h */, - 3B5B0E21121C52ED005698F8 /* DecoderResult.cpp */, - 3B5B0E22121C52ED005698F8 /* DecoderResult.h */, - 3B5B0E23121C52ED005698F8 /* DetectorResult.cpp */, - 3B5B0E24121C52ED005698F8 /* DetectorResult.h */, - 3B5B0E25121C52ED005698F8 /* EdgeDetector.cpp */, - 3B5B0E26121C52ED005698F8 /* EdgeDetector.h */, - 3B5B0E27121C52ED005698F8 /* GlobalHistogramBinarizer.cpp */, - 3B5B0E28121C52ED005698F8 /* GlobalHistogramBinarizer.h */, - 3B5B0E29121C52ED005698F8 /* GreyscaleLuminanceSource.cpp */, - 3B5B0E2A121C52ED005698F8 /* GreyscaleLuminanceSource.h */, - 3B5B0E2B121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.cpp */, - 3B5B0E2C121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.h */, - 3B5B0E2D121C52ED005698F8 /* GridSampler.cpp */, - 3B5B0E2E121C52ED005698F8 /* GridSampler.h */, - 3B5B0E2F121C52ED005698F8 /* HybridBinarizer.cpp */, - 3B5B0E30121C52ED005698F8 /* HybridBinarizer.h */, - 3B5B0E31121C52ED005698F8 /* IllegalArgumentException.cpp */, - 3B5B0E32121C52ED005698F8 /* IllegalArgumentException.h */, - 3B5B0E33121C52ED005698F8 /* PerspectiveTransform.cpp */, - 3B5B0E34121C52ED005698F8 /* PerspectiveTransform.h */, - 3B5B0E35121C52ED005698F8 /* Point.h */, - 3B5B0E36121C52ED005698F8 /* reedsolomon */, - 3B5B0E3F121C52ED005698F8 /* Str.cpp */, - 3B5B0E40121C52ED005698F8 /* Str.h */, - ); - path = common; - sourceTree = ""; - }; - 3B5B0E36121C52ED005698F8 /* reedsolomon */ = { - isa = PBXGroup; - children = ( - E105A90E14EC35860011473C /* GenericGF.cpp */, - E105A90F14EC35860011473C /* GenericGF.h */, - E105A91014EC35860011473C /* GenericGFPoly.cpp */, - E105A91114EC35860011473C /* GenericGFPoly.h */, - 3B5B0E3B121C52ED005698F8 /* ReedSolomonDecoder.cpp */, - 3B5B0E3C121C52ED005698F8 /* ReedSolomonDecoder.h */, - 3B5B0E3D121C52ED005698F8 /* ReedSolomonException.cpp */, - 3B5B0E3E121C52ED005698F8 /* ReedSolomonException.h */, - ); - path = reedsolomon; - sourceTree = ""; - }; - 3B5B0E41121C52ED005698F8 /* datamatrix */ = { - isa = PBXGroup; - children = ( - 3B5B0E42121C52ED005698F8 /* DataMatrixReader.cpp */, - 3B5B0E43121C52ED005698F8 /* DataMatrixReader.h */, - 3B5B0E44121C52ED005698F8 /* decoder */, - 3B5B0E4D121C52ED005698F8 /* detector */, - 3B5B0E54121C52ED005698F8 /* Version.cpp */, - 3B5B0E55121C52ED005698F8 /* Version.h */, - ); - path = datamatrix; - sourceTree = ""; - }; - 3B5B0E44121C52ED005698F8 /* decoder */ = { - isa = PBXGroup; - children = ( - 3B5B0E45121C52ED005698F8 /* BitMatrixParser.cpp */, - 3B5B0E46121C52ED005698F8 /* BitMatrixParser.h */, - 3B5B0E47121C52ED005698F8 /* DataBlock.cpp */, - 3B5B0E48121C52ED005698F8 /* DataBlock.h */, - 3B5B0E49121C52ED005698F8 /* DecodedBitStreamParser.cpp */, - 3B5B0E4A121C52ED005698F8 /* DecodedBitStreamParser.h */, - 3B5B0E4B121C52ED005698F8 /* Decoder.cpp */, - 3B5B0E4C121C52ED005698F8 /* Decoder.h */, - ); - path = decoder; - sourceTree = ""; - }; - 3B5B0E4D121C52ED005698F8 /* detector */ = { - isa = PBXGroup; - children = ( - 3B5B0E4E121C52ED005698F8 /* CornerPoint.cpp */, - 3B5B0E4F121C52ED005698F8 /* CornerPoint.h */, - 3B5B0E50121C52ED005698F8 /* Detector.cpp */, - 3B5B0E51121C52ED005698F8 /* Detector.h */, - 3B5B0E52121C52ED005698F8 /* MonochromeRectangleDetector.cpp */, - 3B5B0E53121C52ED005698F8 /* MonochromeRectangleDetector.h */, - ); - path = detector; - sourceTree = ""; - }; - 3B5B0E5E121C52ED005698F8 /* oned */ = { - isa = PBXGroup; - children = ( - 3B5B0E5F121C52ED005698F8 /* Code128Reader.cpp */, - 3B5B0E60121C52ED005698F8 /* Code128Reader.h */, - 3B5B0E61121C52ED005698F8 /* Code39Reader.cpp */, - 3B5B0E62121C52ED005698F8 /* Code39Reader.h */, - 3B5B0E63121C52ED005698F8 /* EAN13Reader.cpp */, - 3B5B0E64121C52ED005698F8 /* EAN13Reader.h */, - 3B5B0E65121C52ED005698F8 /* EAN8Reader.cpp */, - 3B5B0E66121C52ED005698F8 /* EAN8Reader.h */, - 3B5B0E67121C52ED005698F8 /* ITFReader.cpp */, - 3B5B0E68121C52ED005698F8 /* ITFReader.h */, - 3B5B0E69121C52ED005698F8 /* MultiFormatOneDReader.cpp */, - 3B5B0E6A121C52ED005698F8 /* MultiFormatOneDReader.h */, - 3B5B0E6B121C52ED005698F8 /* MultiFormatUPCEANReader.cpp */, - 3B5B0E6C121C52ED005698F8 /* MultiFormatUPCEANReader.h */, - 3B5B0E6D121C52ED005698F8 /* OneDReader.cpp */, - 3B5B0E6E121C52ED005698F8 /* OneDReader.h */, - 3B5B0E6F121C52ED005698F8 /* OneDResultPoint.cpp */, - 3B5B0E70121C52ED005698F8 /* OneDResultPoint.h */, - 3B5B0E71121C52ED005698F8 /* UPCAReader.cpp */, - 3B5B0E72121C52ED005698F8 /* UPCAReader.h */, - 3B5B0E73121C52ED005698F8 /* UPCEANReader.cpp */, - 3B5B0E74121C52ED005698F8 /* UPCEANReader.h */, - 3B5B0E75121C52ED005698F8 /* UPCEReader.cpp */, - 3B5B0E76121C52ED005698F8 /* UPCEReader.h */, - ); - path = oned; - sourceTree = ""; - }; - 3B5B0E77121C52ED005698F8 /* qrcode */ = { - isa = PBXGroup; - children = ( - 3B5B0E78121C52ED005698F8 /* decoder */, - 3B5B0E85121C52ED005698F8 /* detector */, - 3B5B0E94121C52ED005698F8 /* ErrorCorrectionLevel.cpp */, - 3B5B0E95121C52ED005698F8 /* ErrorCorrectionLevel.h */, - 3B5B0E96121C52ED005698F8 /* FormatInformation.cpp */, - 3B5B0E97121C52ED005698F8 /* FormatInformation.h */, - 3B5B0E98121C52ED005698F8 /* QRCodeReader.cpp */, - 3B5B0E99121C52ED005698F8 /* QRCodeReader.h */, - 3B5B0E9A121C52ED005698F8 /* Version.cpp */, - 3B5B0E9B121C52ED005698F8 /* Version.h */, - ); - path = qrcode; - sourceTree = ""; - }; - 3B5B0E78121C52ED005698F8 /* decoder */ = { - isa = PBXGroup; - children = ( - 3B5B0E79121C52ED005698F8 /* BitMatrixParser.cpp */, - 3B5B0E7A121C52ED005698F8 /* BitMatrixParser.h */, - 3B5B0E7B121C52ED005698F8 /* DataBlock.cpp */, - 3B5B0E7C121C52ED005698F8 /* DataBlock.h */, - 3B5B0E7D121C52ED005698F8 /* DataMask.cpp */, - 3B5B0E7E121C52ED005698F8 /* DataMask.h */, - 3B5B0E7F121C52ED005698F8 /* DecodedBitStreamParser.cpp */, - 3B5B0E80121C52ED005698F8 /* DecodedBitStreamParser.h */, - 3B5B0E81121C52ED005698F8 /* Decoder.cpp */, - 3B5B0E82121C52ED005698F8 /* Decoder.h */, - 3B5B0E83121C52ED005698F8 /* Mode.cpp */, - 3B5B0E84121C52ED005698F8 /* Mode.h */, - ); - path = decoder; - sourceTree = ""; - }; - 3B5B0E85121C52ED005698F8 /* detector */ = { - isa = PBXGroup; - children = ( - 3B5B0E86121C52ED005698F8 /* AlignmentPattern.cpp */, - 3B5B0E87121C52ED005698F8 /* AlignmentPattern.h */, - 3B5B0E88121C52ED005698F8 /* AlignmentPatternFinder.cpp */, - 3B5B0E89121C52ED005698F8 /* AlignmentPatternFinder.h */, - 3B5B0E8A121C52ED005698F8 /* Detector.cpp */, - 3B5B0E8B121C52ED005698F8 /* Detector.h */, - 3B5B0E8C121C52ED005698F8 /* FinderPattern.cpp */, - 3B5B0E8D121C52ED005698F8 /* FinderPattern.h */, - 3B5B0E8E121C52ED005698F8 /* FinderPatternFinder.cpp */, - 3B5B0E8F121C52ED005698F8 /* FinderPatternFinder.h */, - 3B5B0E90121C52ED005698F8 /* FinderPatternInfo.cpp */, - 3B5B0E91121C52ED005698F8 /* FinderPatternInfo.h */, - 3B5B0E92121C52ED005698F8 /* QREdgeDetector.cpp */, - 3B5B0E93121C52ED005698F8 /* QREdgeDetector.h */, - ); - path = detector; - sourceTree = ""; - }; - E105A91614EC35980011473C /* aztec */ = { - isa = PBXGroup; - children = ( - E105A91714EC35AA0011473C /* AztecDetectorResult.cpp */, - E105A91814EC35AA0011473C /* AztecDetectorResult.h */, - E105A91914EC35AA0011473C /* AztecReader.cpp */, - E105A91A14EC35AA0011473C /* AztecReader.h */, - E105A91B14EC35AA0011473C /* decoder */, - E105A91E14EC35AA0011473C /* detector */, - ); - name = aztec; - sourceTree = ""; - }; - E105A91B14EC35AA0011473C /* decoder */ = { - isa = PBXGroup; - children = ( - E105A91C14EC35AA0011473C /* Decoder.cpp */, - E105A91D14EC35AA0011473C /* Decoder.h */, - ); - name = decoder; - path = aztec/decoder; - sourceTree = ""; - }; - E105A91E14EC35AA0011473C /* detector */ = { - isa = PBXGroup; - children = ( - E105A91F14EC35AA0011473C /* Detector.cpp */, - E105A92014EC35AA0011473C /* Detector.h */, - ); - name = detector; - path = aztec/detector; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 3B5B0DFB121C525D005698F8 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5B0EA7121C52ED005698F8 /* BarcodeFormat.h in Headers */, - 3B5B0EA9121C52ED005698F8 /* Binarizer.h in Headers */, - 3B5B0EAB121C52ED005698F8 /* BinaryBitmap.h in Headers */, - 3B5B0EAD121C52ED005698F8 /* Array.h in Headers */, - 3B5B0EAF121C52ED005698F8 /* BitArray.h in Headers */, - 3B5B0EB1121C52ED005698F8 /* BitMatrix.h in Headers */, - 3B5B0EB3121C52ED005698F8 /* BitSource.h in Headers */, - 3B5B0EB5121C52ED005698F8 /* Counted.h in Headers */, - 3B5B0EB7121C52ED005698F8 /* DecoderResult.h in Headers */, - 3B5B0EB9121C52ED005698F8 /* DetectorResult.h in Headers */, - 3B5B0EBB121C52ED005698F8 /* EdgeDetector.h in Headers */, - 3B5B0EBD121C52ED005698F8 /* GlobalHistogramBinarizer.h in Headers */, - 3B5B0EBF121C52ED005698F8 /* GreyscaleLuminanceSource.h in Headers */, - 3B5B0EC1121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.h in Headers */, - 3B5B0EC3121C52ED005698F8 /* GridSampler.h in Headers */, - 3B5B0EC5121C52ED005698F8 /* HybridBinarizer.h in Headers */, - 3B5B0EC7121C52ED005698F8 /* IllegalArgumentException.h in Headers */, - 3B5B0EC9121C52ED005698F8 /* PerspectiveTransform.h in Headers */, - 3B5B0ECA121C52ED005698F8 /* Point.h in Headers */, - 3B5B0ED0121C52ED005698F8 /* ReedSolomonDecoder.h in Headers */, - 3B5B0ED2121C52ED005698F8 /* ReedSolomonException.h in Headers */, - 3B5B0ED4121C52ED005698F8 /* Str.h in Headers */, - 3B5B0ED6121C52ED005698F8 /* DataMatrixReader.h in Headers */, - 3B5B0ED8121C52ED005698F8 /* BitMatrixParser.h in Headers */, - 3B5B0EDA121C52ED005698F8 /* DataBlock.h in Headers */, - 3B5B0EDC121C52ED005698F8 /* DecodedBitStreamParser.h in Headers */, - 3B5B0EDE121C52ED005698F8 /* Decoder.h in Headers */, - 3B5B0EE0121C52ED005698F8 /* CornerPoint.h in Headers */, - 3B5B0EE2121C52ED005698F8 /* Detector.h in Headers */, - 3B5B0EE4121C52ED005698F8 /* MonochromeRectangleDetector.h in Headers */, - 3B5B0EE6121C52ED005698F8 /* Version.h in Headers */, - 3B5B0EE8121C52ED005698F8 /* DecodeHints.h in Headers */, - 3B5B0EEA121C52ED005698F8 /* Exception.h in Headers */, - 3B5B0EEC121C52ED005698F8 /* LuminanceSource.h in Headers */, - 3B5B0EEE121C52ED005698F8 /* MultiFormatReader.h in Headers */, - 3B5B0EF0121C52ED005698F8 /* Code128Reader.h in Headers */, - 3B5B0EF2121C52ED005698F8 /* Code39Reader.h in Headers */, - 3B5B0EF4121C52ED005698F8 /* EAN13Reader.h in Headers */, - 3B5B0EF6121C52ED005698F8 /* EAN8Reader.h in Headers */, - 3B5B0EF8121C52ED005698F8 /* ITFReader.h in Headers */, - 3B5B0EFA121C52ED005698F8 /* MultiFormatOneDReader.h in Headers */, - 3B5B0EFC121C52ED005698F8 /* MultiFormatUPCEANReader.h in Headers */, - 3B5B0EFE121C52ED005698F8 /* OneDReader.h in Headers */, - 3B5B0F00121C52ED005698F8 /* OneDResultPoint.h in Headers */, - 3B5B0F02121C52ED005698F8 /* UPCAReader.h in Headers */, - 3B5B0F04121C52ED005698F8 /* UPCEANReader.h in Headers */, - 3B5B0F06121C52ED005698F8 /* UPCEReader.h in Headers */, - 3B5B0F08121C52ED005698F8 /* BitMatrixParser.h in Headers */, - 3B5B0F0A121C52ED005698F8 /* DataBlock.h in Headers */, - 3B5B0F0C121C52ED005698F8 /* DataMask.h in Headers */, - 3B5B0F0E121C52ED005698F8 /* DecodedBitStreamParser.h in Headers */, - 3B5B0F10121C52ED005698F8 /* Decoder.h in Headers */, - 3B5B0F12121C52ED005698F8 /* Mode.h in Headers */, - 3B5B0F14121C52ED005698F8 /* AlignmentPattern.h in Headers */, - 3B5B0F16121C52ED005698F8 /* AlignmentPatternFinder.h in Headers */, - 3B5B0F18121C52ED005698F8 /* Detector.h in Headers */, - 3B5B0F1A121C52ED005698F8 /* FinderPattern.h in Headers */, - 3B5B0F1C121C52ED005698F8 /* FinderPatternFinder.h in Headers */, - 3B5B0F1E121C52ED005698F8 /* FinderPatternInfo.h in Headers */, - 3B5B0F20121C52ED005698F8 /* QREdgeDetector.h in Headers */, - 3B5B0F22121C52ED005698F8 /* ErrorCorrectionLevel.h in Headers */, - 3B5B0F24121C52ED005698F8 /* FormatInformation.h in Headers */, - 3B5B0F26121C52ED005698F8 /* QRCodeReader.h in Headers */, - 3B5B0F28121C52ED005698F8 /* Version.h in Headers */, - 3B5B0F2A121C52ED005698F8 /* Reader.h in Headers */, - 3B5B0F2C121C52ED005698F8 /* ReaderException.h in Headers */, - 3B5B0F2E121C52ED005698F8 /* Result.h in Headers */, - 3B5B0F30121C52ED005698F8 /* ResultPoint.h in Headers */, - 3B5B0F32121C52ED005698F8 /* ResultPointCallback.h in Headers */, - E105A91314EC35860011473C /* GenericGF.h in Headers */, - E105A91514EC35860011473C /* GenericGFPoly.h in Headers */, - E105A92214EC35AA0011473C /* AztecDetectorResult.h in Headers */, - E105A92414EC35AA0011473C /* AztecReader.h in Headers */, - E105A92614EC35AA0011473C /* Decoder.h in Headers */, - E105A92814EC35AA0011473C /* Detector.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 3B5B0DFE121C525D005698F8 /* zxing */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3B5B0E04121C52B4005698F8 /* Build configuration list for PBXNativeTarget "zxing" */; - buildPhases = ( - 3B5B0DFB121C525D005698F8 /* Headers */, - 3B5B0DFC121C525D005698F8 /* Sources */, - 3B5B0DFD121C525D005698F8 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = zxing; - productName = zxing; - productReference = 3B5B0DFF121C525D005698F8 /* libzxing.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "osx" */; - compatibilityVersion = "Xcode 3.1"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - en, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* osx */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 3B5B0DFE121C525D005698F8 /* zxing */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 3B5B0DFC121C525D005698F8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5B0EA6121C52ED005698F8 /* BarcodeFormat.cpp in Sources */, - 3B5B0EA8121C52ED005698F8 /* Binarizer.cpp in Sources */, - 3B5B0EAA121C52ED005698F8 /* BinaryBitmap.cpp in Sources */, - 3B5B0EAC121C52ED005698F8 /* Array.cpp in Sources */, - 3B5B0EAE121C52ED005698F8 /* BitArray.cpp in Sources */, - 3B5B0EB0121C52ED005698F8 /* BitMatrix.cpp in Sources */, - 3B5B0EB2121C52ED005698F8 /* BitSource.cpp in Sources */, - 3B5B0EB4121C52ED005698F8 /* Counted.cpp in Sources */, - 3B5B0EB6121C52ED005698F8 /* DecoderResult.cpp in Sources */, - 3B5B0EB8121C52ED005698F8 /* DetectorResult.cpp in Sources */, - 3B5B0EBA121C52ED005698F8 /* EdgeDetector.cpp in Sources */, - 3B5B0EBC121C52ED005698F8 /* GlobalHistogramBinarizer.cpp in Sources */, - 3B5B0EBE121C52ED005698F8 /* GreyscaleLuminanceSource.cpp in Sources */, - 3B5B0EC0121C52ED005698F8 /* GreyscaleRotatedLuminanceSource.cpp in Sources */, - 3B5B0EC2121C52ED005698F8 /* GridSampler.cpp in Sources */, - 3B5B0EC4121C52ED005698F8 /* HybridBinarizer.cpp in Sources */, - 3B5B0EC6121C52ED005698F8 /* IllegalArgumentException.cpp in Sources */, - 3B5B0EC8121C52ED005698F8 /* PerspectiveTransform.cpp in Sources */, - 3B5B0ECF121C52ED005698F8 /* ReedSolomonDecoder.cpp in Sources */, - 3B5B0ED1121C52ED005698F8 /* ReedSolomonException.cpp in Sources */, - 3B5B0ED3121C52ED005698F8 /* Str.cpp in Sources */, - 3B5B0ED5121C52ED005698F8 /* DataMatrixReader.cpp in Sources */, - 3B5B0ED7121C52ED005698F8 /* BitMatrixParser.cpp in Sources */, - 3B5B0ED9121C52ED005698F8 /* DataBlock.cpp in Sources */, - 3B5B0EDB121C52ED005698F8 /* DecodedBitStreamParser.cpp in Sources */, - 3B5B0EDD121C52ED005698F8 /* Decoder.cpp in Sources */, - 3B5B0EDF121C52ED005698F8 /* CornerPoint.cpp in Sources */, - 3B5B0EE1121C52ED005698F8 /* Detector.cpp in Sources */, - 3B5B0EE3121C52ED005698F8 /* MonochromeRectangleDetector.cpp in Sources */, - 3B5B0EE5121C52ED005698F8 /* Version.cpp in Sources */, - 3B5B0EE7121C52ED005698F8 /* DecodeHints.cpp in Sources */, - 3B5B0EE9121C52ED005698F8 /* Exception.cpp in Sources */, - 3B5B0EEB121C52ED005698F8 /* LuminanceSource.cpp in Sources */, - 3B5B0EED121C52ED005698F8 /* MultiFormatReader.cpp in Sources */, - 3B5B0EEF121C52ED005698F8 /* Code128Reader.cpp in Sources */, - 3B5B0EF1121C52ED005698F8 /* Code39Reader.cpp in Sources */, - 3B5B0EF3121C52ED005698F8 /* EAN13Reader.cpp in Sources */, - 3B5B0EF5121C52ED005698F8 /* EAN8Reader.cpp in Sources */, - 3B5B0EF7121C52ED005698F8 /* ITFReader.cpp in Sources */, - 3B5B0EF9121C52ED005698F8 /* MultiFormatOneDReader.cpp in Sources */, - 3B5B0EFB121C52ED005698F8 /* MultiFormatUPCEANReader.cpp in Sources */, - 3B5B0EFD121C52ED005698F8 /* OneDReader.cpp in Sources */, - 3B5B0EFF121C52ED005698F8 /* OneDResultPoint.cpp in Sources */, - 3B5B0F01121C52ED005698F8 /* UPCAReader.cpp in Sources */, - 3B5B0F03121C52ED005698F8 /* UPCEANReader.cpp in Sources */, - 3B5B0F05121C52ED005698F8 /* UPCEReader.cpp in Sources */, - 3B5B0F07121C52ED005698F8 /* BitMatrixParser.cpp in Sources */, - 3B5B0F09121C52ED005698F8 /* DataBlock.cpp in Sources */, - 3B5B0F0B121C52ED005698F8 /* DataMask.cpp in Sources */, - 3B5B0F0D121C52ED005698F8 /* DecodedBitStreamParser.cpp in Sources */, - 3B5B0F0F121C52ED005698F8 /* Decoder.cpp in Sources */, - 3B5B0F11121C52ED005698F8 /* Mode.cpp in Sources */, - 3B5B0F13121C52ED005698F8 /* AlignmentPattern.cpp in Sources */, - 3B5B0F15121C52ED005698F8 /* AlignmentPatternFinder.cpp in Sources */, - 3B5B0F17121C52ED005698F8 /* Detector.cpp in Sources */, - 3B5B0F19121C52ED005698F8 /* FinderPattern.cpp in Sources */, - 3B5B0F1B121C52ED005698F8 /* FinderPatternFinder.cpp in Sources */, - 3B5B0F1D121C52ED005698F8 /* FinderPatternInfo.cpp in Sources */, - 3B5B0F1F121C52ED005698F8 /* QREdgeDetector.cpp in Sources */, - 3B5B0F21121C52ED005698F8 /* ErrorCorrectionLevel.cpp in Sources */, - 3B5B0F23121C52ED005698F8 /* FormatInformation.cpp in Sources */, - 3B5B0F25121C52ED005698F8 /* QRCodeReader.cpp in Sources */, - 3B5B0F27121C52ED005698F8 /* Version.cpp in Sources */, - 3B5B0F29121C52ED005698F8 /* Reader.cpp in Sources */, - 3B5B0F2B121C52ED005698F8 /* ReaderException.cpp in Sources */, - 3B5B0F2D121C52ED005698F8 /* Result.cpp in Sources */, - 3B5B0F2F121C52ED005698F8 /* ResultPoint.cpp in Sources */, - 3B5B0F31121C52ED005698F8 /* ResultPointCallback.cpp in Sources */, - 3BB87D4314B54C480078117F /* FormatException.cpp in Sources */, - 3BB87D4714B54C610078117F /* CharacterSetECI.cpp in Sources */, - 3BB87D4914B54C610078117F /* StringUtils.cpp in Sources */, - 3BB87D5014B54F1D0078117F /* WhiteRectangleDetector.cpp in Sources */, - 3BB87D5214B54F3F0078117F /* NotFoundException.cpp in Sources */, - E105A91214EC35860011473C /* GenericGF.cpp in Sources */, - E105A91414EC35860011473C /* GenericGFPoly.cpp in Sources */, - E105A92114EC35AA0011473C /* AztecDetectorResult.cpp in Sources */, - E105A92314EC35AA0011473C /* AztecReader.cpp in Sources */, - E105A92514EC35AA0011473C /* Decoder.cpp in Sources */, - E105A92714EC35AA0011473C /* Detector.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - ONLY_ACTIVE_ARCH = YES; - PREBINDING = NO; - PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; - SDKROOT = macosx10.6; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - PREBINDING = NO; - PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; - SDKROOT = macosx10.6; - }; - name = Release; - }; - 3B5B0E00121C525D005698F8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_OPTIMIZATION_LEVEL = 0; - INSTALL_PATH = /usr/local/lib; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = zxing; - }; - name = Debug; - }; - 3B5B0E01121C525D005698F8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - INSTALL_PATH = /usr/local/lib; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = zxing; - ZERO_LINK = NO; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "osx" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3B5B0E04121C52B4005698F8 /* Build configuration list for PBXNativeTarget "zxing" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B5B0E00121C525D005698F8 /* Debug */, - 3B5B0E01121C525D005698F8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/cpp/scons/scons-LICENSE b/cpp/scons/scons-LICENSE deleted file mode 100644 index 790d9714b..000000000 --- a/cpp/scons/scons-LICENSE +++ /dev/null @@ -1,25 +0,0 @@ - Copyright and license for SCons - a software construction tool - - This copyright and license do not apply to any other software - with which this software may have been included. - -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cpp/scons/scons-README b/cpp/scons/scons-README deleted file mode 100644 index 32b691cfc..000000000 --- a/cpp/scons/scons-README +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation - - SCons - a software construction tool - -This is the scons-README file for a version of SCons packaged for local -execution--that is, execution out of a specific local directory, without -having to install SCons as a system-wide utility. - -You are likely reading this file in one of the following two situations: - - 1) You have unpacked an scons-local-{version} package and are - examining the contents. - - In this case, you are presumably interested in using this - package to include a local copy of SCons with some other - software that you package, so that you can use SCons to build - your software without forcing all of your users to have it fully - installed. Instructions for this can be found below. - - If you are not looking to use SCons in this way, then please - use either the scons-{version} package to install SCons on your - system, or the scons-src-{version} package if you want the full - source to SCons, including its packaging code and underlying - tests and testing infrastructure. - - 2) This file was included in some other software package so that - the package could be built using SCons. - - In this case, follow the instructions provided with the - rest of the software package for how to use SCons to build - and/or install the software. The file containing build and - installation instructions will typically be named README or - INSTALL. - -LATEST VERSION -============== - -Before going further, you can check for the latest version of the -scons-local package, or any SCons package, at the SCons download page: - - http://www.scons.org/download.html - - -EXECUTION REQUIREMENTS -====================== - -Running SCons requires Python version 2.4 or later. There should be -no other dependencies or requirements to run SCons. - -The default SCons configuration assumes use of the Microsoft Visual C++ -compiler suite on WIN32 systems, and assumes a C compiler named 'cc', -a C++ compiler named 'c++', and a Fortran compiler named 'g77' (such -as found in the GNU C compiler suite) on any other type of system. -You may, of course, override these default values by appropriate -configuration of Environment construction variables. - - -INSTALLATION -============ - -Installation of this package should be as simple as unpacking the -archive (either .tar.gz or .zip) in any directory (top-level or a -subdirectory) within the software package with which you want to ship -SCons. - -Once you have installed this package, you should write an SConstruct -file at the top level of your source tree to build your software as you -see fit. - -Then modify the build/install instructions for your package to instruct -your users to execute SCons as follows (if you installed this package in -your top-level directory): - - $ python scons.py - -Or (if, for example, you installed this package in a subdirectory named -"scons"): - - $ python scons/scons.py - -That should be all you have to do. (If it isn't that simple, please let -us know!) - - -CONTENTS OF THIS PACKAGE -======================== - -This scons-local package consists of the following: - -scons-LICENSE - A copy of the copyright and terms under which SCons is - distributed (the Open Source Initiative-approved MIT license). - - A disclaimer has been added to the beginning to make clear that - this license applies only to SCons, and not to any separate - software you've written with which you're planning to package - SCons. - -scons-README - What you're looking at right now. - -scons-local-{version}/ - The SCons build engine. This is structured as a Python - library. - -scons.py - The SCons script itself. The script sets up the Python - sys.path variable to use the build engine found in the - scons-local-{version}/ directory in preference to any other - SCons build engine installed on your system. - - -DOCUMENTATION -============= - -Because this package is intended to be included with other software by -experienced users, we have not included any SCons documentation in this -package (other than this scons-README file you're reading right now). - -If, however, you need documentation about SCons, then consult any of the -following from the corresponding scons-{version} or scons-src-{version} -package: - - The RELEASE.txt file (src/RELEASE.txt file in the - scons-src-{version} package), which contains notes about this - specific release, including known problems. - - The CHANGES.txt file (src/CHANGES.txt file in the - scons-src-{version} package), which contains a list of changes - since the previous release. - - The scons.1 man page (doc/man/scons.1 in the scons-src-{version} - package), which contains a section of small examples for getting - started using SCons. - -Additional documentation for SCons is available at: - - http://www.scons.org/doc.html - - -LICENSING -========= - -SCons is distributed under the MIT license, a full copy of which is -available in the scons-LICENSE file in this package. The MIT license is -an approved Open Source license, which means: - - This software is OSI Certified Open Source Software. OSI - Certified is a certification mark of the Open Source Initiative. - -More information about OSI certifications and Open Source software is -available at: - - http://www.opensource.org/ - - -REPORTING BUGS -============== - -You can report bugs either by following the "Tracker - Bugs" link -on the SCons project page: - - http://sourceforge.net/projects/scons/ - -or by sending mail to the SCons developers mailing list: - - scons-devel@lists.sourceforge.net - - -MAILING LISTS -============= - -A mailing list for users of SCons is available. You may send questions -or comments to the list at: - - scons-users@lists.sourceforge.net - -You may subscribe to the scons-users mailing list at: - - http://lists.sourceforge.net/lists/listinfo/scons-users - - -FOR MORE INFORMATION -==================== - -Check the SCons web site at: - - http://www.scons.org/ - - -AUTHOR INFO -=========== - -Steven Knight -knight at baldmt dot com -http://www.baldmt.com/~knight/ - -With plenty of help from the SCons Development team: - Chad Austin - Charles Crain - Steve Leblanc - Anthony Roach - Terrel Shumway - diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Action.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Action.py deleted file mode 100644 index 7cad8a531..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Action.py +++ /dev/null @@ -1,1241 +0,0 @@ -"""SCons.Action - -This encapsulates information about executing any sort of action that -can build one or more target Nodes (typically files) from one or more -source Nodes (also typically files) given a specific Environment. - -The base class here is ActionBase. The base class supplies just a few -OO utility methods and some generic methods for displaying information -about an Action in response to the various commands that control printing. - -A second-level base class is _ActionAction. This extends ActionBase -by providing the methods that can be used to show and perform an -action. True Action objects will subclass _ActionAction; Action -factory class objects will subclass ActionBase. - -The heavy lifting is handled by subclasses for the different types of -actions we might execute: - - CommandAction - CommandGeneratorAction - FunctionAction - ListAction - -The subclasses supply the following public interface methods used by -other modules: - - __call__() - THE public interface, "calling" an Action object executes the - command or Python function. This also takes care of printing - a pre-substitution command for debugging purposes. - - get_contents() - Fetches the "contents" of an Action for signature calculation - plus the varlist. This is what gets MD5 checksummed to decide - if a target needs to be rebuilt because its action changed. - - genstring() - Returns a string representation of the Action *without* - command substitution, but allows a CommandGeneratorAction to - generate the right action based on the specified target, - source and env. This is used by the Signature subsystem - (through the Executor) to obtain an (imprecise) representation - of the Action operation for informative purposes. - - -Subclasses also supply the following methods for internal use within -this module: - - __str__() - Returns a string approximation of the Action; no variable - substitution is performed. - - execute() - The internal method that really, truly, actually handles the - execution of a command or Python function. This is used so - that the __call__() methods can take care of displaying any - pre-substitution representations, and *then* execute an action - without worrying about the specific Actions involved. - - get_presig() - Fetches the "contents" of a subclass for signature calculation. - The varlist is added to this to produce the Action's contents. - - strfunction() - Returns a substituted string representation of the Action. - This is used by the _ActionAction.show() command to display the - command/function that will be executed to generate the target(s). - -There is a related independent ActionCaller class that looks like a -regular Action, and which serves as a wrapper for arbitrary functions -that we want to let the user specify the arguments to now, but actually -execute later (when an out-of-date check determines that it's needed to -be executed, for example). Objects of this class are returned by an -ActionFactory class that provides a __call__() method as a convenient -way for wrapping up the functions. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Action.py 5023 2010/06/14 22:05:46 scons" - -import SCons.compat - -import dis -import os -# compat layer imports "cPickle" for us if it's available. -import pickle -import re -import sys -import subprocess - -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Executor -import SCons.Util -import SCons.Subst - -# we use these a lot, so try to optimize them -is_String = SCons.Util.is_String -is_List = SCons.Util.is_List - -class _null(object): - pass - -print_actions = 1 -execute_actions = 1 -print_actions_presub = 0 - -def rfile(n): - try: - return n.rfile() - except AttributeError: - return n - -def default_exitstatfunc(s): - return s - -try: - SET_LINENO = dis.SET_LINENO - HAVE_ARGUMENT = dis.HAVE_ARGUMENT -except AttributeError: - remove_set_lineno_codes = lambda x: x -else: - def remove_set_lineno_codes(code): - result = [] - n = len(code) - i = 0 - while i < n: - c = code[i] - op = ord(c) - if op >= HAVE_ARGUMENT: - if op != SET_LINENO: - result.append(code[i:i+3]) - i = i+3 - else: - result.append(c) - i = i+1 - return ''.join(result) - -strip_quotes = re.compile('^[\'"](.*)[\'"]$') - - -def _callable_contents(obj): - """Return the signature contents of a callable Python object. - """ - try: - # Test if obj is a method. - return _function_contents(obj.im_func) - - except AttributeError: - try: - # Test if obj is a callable object. - return _function_contents(obj.__call__.im_func) - - except AttributeError: - try: - # Test if obj is a code object. - return _code_contents(obj) - - except AttributeError: - # Test if obj is a function object. - return _function_contents(obj) - - -def _object_contents(obj): - """Return the signature contents of any Python object. - - We have to handle the case where object contains a code object - since it can be pickled directly. - """ - try: - # Test if obj is a method. - return _function_contents(obj.im_func) - - except AttributeError: - try: - # Test if obj is a callable object. - return _function_contents(obj.__call__.im_func) - - except AttributeError: - try: - # Test if obj is a code object. - return _code_contents(obj) - - except AttributeError: - try: - # Test if obj is a function object. - return _function_contents(obj) - - except AttributeError: - # Should be a pickable Python object. - try: - return pickle.dumps(obj) - except (pickle.PicklingError, TypeError): - # This is weird, but it seems that nested classes - # are unpickable. The Python docs say it should - # always be a PicklingError, but some Python - # versions seem to return TypeError. Just do - # the best we can. - return str(obj) - - -def _code_contents(code): - """Return the signature contents of a code object. - - By providing direct access to the code object of the - function, Python makes this extremely easy. Hooray! - - Unfortunately, older versions of Python include line - number indications in the compiled byte code. Boo! - So we remove the line number byte codes to prevent - recompilations from moving a Python function. - """ - - contents = [] - - # The code contents depends on the number of local variables - # but not their actual names. - contents.append("%s,%s" % (code.co_argcount, len(code.co_varnames))) - try: - contents.append(",%s,%s" % (len(code.co_cellvars), len(code.co_freevars))) - except AttributeError: - # Older versions of Python do not support closures. - contents.append(",0,0") - - # The code contents depends on any constants accessed by the - # function. Note that we have to call _object_contents on each - # constants because the code object of nested functions can - # show-up among the constants. - # - # Note that we also always ignore the first entry of co_consts - # which contains the function doc string. We assume that the - # function does not access its doc string. - contents.append(',(' + ','.join(map(_object_contents,code.co_consts[1:])) + ')') - - # The code contents depends on the variable names used to - # accessed global variable, as changing the variable name changes - # the variable actually accessed and therefore changes the - # function result. - contents.append(',(' + ','.join(map(_object_contents,code.co_names)) + ')') - - - # The code contents depends on its actual code!!! - contents.append(',(' + str(remove_set_lineno_codes(code.co_code)) + ')') - - return ''.join(contents) - - -def _function_contents(func): - """Return the signature contents of a function.""" - - contents = [_code_contents(func.func_code)] - - # The function contents depends on the value of defaults arguments - if func.func_defaults: - contents.append(',(' + ','.join(map(_object_contents,func.func_defaults)) + ')') - else: - contents.append(',()') - - # The function contents depends on the closure captured cell values. - try: - closure = func.func_closure or [] - except AttributeError: - # Older versions of Python do not support closures. - closure = [] - - #xxx = [_object_contents(x.cell_contents) for x in closure] - try: - xxx = [_object_contents(x.cell_contents) for x in closure] - except AttributeError: - xxx = [] - contents.append(',(' + ','.join(xxx) + ')') - - return ''.join(contents) - - -def _actionAppend(act1, act2): - # This function knows how to slap two actions together. - # Mainly, it handles ListActions by concatenating into - # a single ListAction. - a1 = Action(act1) - a2 = Action(act2) - if a1 is None or a2 is None: - raise TypeError("Cannot append %s to %s" % (type(act1), type(act2))) - if isinstance(a1, ListAction): - if isinstance(a2, ListAction): - return ListAction(a1.list + a2.list) - else: - return ListAction(a1.list + [ a2 ]) - else: - if isinstance(a2, ListAction): - return ListAction([ a1 ] + a2.list) - else: - return ListAction([ a1, a2 ]) - -def _do_create_keywords(args, kw): - """This converts any arguments after the action argument into - their equivalent keywords and adds them to the kw argument. - """ - v = kw.get('varlist', ()) - # prevent varlist="FOO" from being interpreted as ['F', 'O', 'O'] - if is_String(v): v = (v,) - kw['varlist'] = tuple(v) - if args: - # turn positional args into equivalent keywords - cmdstrfunc = args[0] - if cmdstrfunc is None or is_String(cmdstrfunc): - kw['cmdstr'] = cmdstrfunc - elif callable(cmdstrfunc): - kw['strfunction'] = cmdstrfunc - else: - raise SCons.Errors.UserError( - 'Invalid command display variable type. ' - 'You must either pass a string or a callback which ' - 'accepts (target, source, env) as parameters.') - if len(args) > 1: - kw['varlist'] = args[1:] + kw['varlist'] - if kw.get('strfunction', _null) is not _null \ - and kw.get('cmdstr', _null) is not _null: - raise SCons.Errors.UserError( - 'Cannot have both strfunction and cmdstr args to Action()') - -def _do_create_action(act, kw): - """This is the actual "implementation" for the - Action factory method, below. This handles the - fact that passing lists to Action() itself has - different semantics than passing lists as elements - of lists. - - The former will create a ListAction, the latter - will create a CommandAction by converting the inner - list elements to strings.""" - - if isinstance(act, ActionBase): - return act - - if is_List(act): - return CommandAction(act, **kw) - - if callable(act): - try: - gen = kw['generator'] - del kw['generator'] - except KeyError: - gen = 0 - if gen: - action_type = CommandGeneratorAction - else: - action_type = FunctionAction - return action_type(act, kw) - - if is_String(act): - var=SCons.Util.get_environment_var(act) - if var: - # This looks like a string that is purely an Environment - # variable reference, like "$FOO" or "${FOO}". We do - # something special here...we lazily evaluate the contents - # of that Environment variable, so a user could put something - # like a function or a CommandGenerator in that variable - # instead of a string. - return LazyAction(var, kw) - commands = str(act).split('\n') - if len(commands) == 1: - return CommandAction(commands[0], **kw) - # The list of string commands may include a LazyAction, so we - # reprocess them via _do_create_list_action. - return _do_create_list_action(commands, kw) - return None - -def _do_create_list_action(act, kw): - """A factory for list actions. Convert the input list into Actions - and then wrap them in a ListAction.""" - acts = [] - for a in act: - aa = _do_create_action(a, kw) - if aa is not None: acts.append(aa) - if not acts: - return ListAction([]) - elif len(acts) == 1: - return acts[0] - else: - return ListAction(acts) - -def Action(act, *args, **kw): - """A factory for action objects.""" - # Really simple: the _do_create_* routines do the heavy lifting. - _do_create_keywords(args, kw) - if is_List(act): - return _do_create_list_action(act, kw) - return _do_create_action(act, kw) - -class ActionBase(object): - """Base class for all types of action objects that can be held by - other objects (Builders, Executors, etc.) This provides the - common methods for manipulating and combining those actions.""" - - def __cmp__(self, other): - return cmp(self.__dict__, other) - - def no_batch_key(self, env, target, source): - return None - - batch_key = no_batch_key - - def genstring(self, target, source, env): - return str(self) - - def get_contents(self, target, source, env): - result = [ self.get_presig(target, source, env) ] - # This should never happen, as the Action() factory should wrap - # the varlist, but just in case an action is created directly, - # we duplicate this check here. - vl = self.get_varlist(target, source, env) - if is_String(vl): vl = (vl,) - for v in vl: - result.append(env.subst('${'+v+'}')) - return ''.join(result) - - def __add__(self, other): - return _actionAppend(self, other) - - def __radd__(self, other): - return _actionAppend(other, self) - - def presub_lines(self, env): - # CommandGeneratorAction needs a real environment - # in order to return the proper string here, since - # it may call LazyAction, which looks up a key - # in that env. So we temporarily remember the env here, - # and CommandGeneratorAction will use this env - # when it calls its _generate method. - self.presub_env = env - lines = str(self).split('\n') - self.presub_env = None # don't need this any more - return lines - - def get_varlist(self, target, source, env, executor=None): - return self.varlist - - def get_targets(self, env, executor): - """ - Returns the type of targets ($TARGETS, $CHANGED_TARGETS) used - by this action. - """ - return self.targets - -class _ActionAction(ActionBase): - """Base class for actions that create output objects.""" - def __init__(self, cmdstr=_null, strfunction=_null, varlist=(), - presub=_null, chdir=None, exitstatfunc=None, - batch_key=None, targets='$TARGETS', - **kw): - self.cmdstr = cmdstr - if strfunction is not _null: - if strfunction is None: - self.cmdstr = None - else: - self.strfunction = strfunction - self.varlist = varlist - self.presub = presub - self.chdir = chdir - if not exitstatfunc: - exitstatfunc = default_exitstatfunc - self.exitstatfunc = exitstatfunc - - self.targets = targets - - if batch_key: - if not callable(batch_key): - # They have set batch_key, but not to their own - # callable. The default behavior here will batch - # *all* targets+sources using this action, separated - # for each construction environment. - def default_batch_key(self, env, target, source): - return (id(self), id(env)) - batch_key = default_batch_key - SCons.Util.AddMethod(self, batch_key, 'batch_key') - - def print_cmd_line(self, s, target, source, env): - sys.stdout.write(s + u"\n") - - def __call__(self, target, source, env, - exitstatfunc=_null, - presub=_null, - show=_null, - execute=_null, - chdir=_null, - executor=None): - if not is_List(target): - target = [target] - if not is_List(source): - source = [source] - - if presub is _null: - presub = self.presub - if presub is _null: - presub = print_actions_presub - if exitstatfunc is _null: exitstatfunc = self.exitstatfunc - if show is _null: show = print_actions - if execute is _null: execute = execute_actions - if chdir is _null: chdir = self.chdir - save_cwd = None - if chdir: - save_cwd = os.getcwd() - try: - chdir = str(chdir.abspath) - except AttributeError: - if not is_String(chdir): - if executor: - chdir = str(executor.batches[0].targets[0].dir) - else: - chdir = str(target[0].dir) - if presub: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - t = ' and '.join(map(str, target)) - l = '\n '.join(self.presub_lines(env)) - out = u"Building %s with action:\n %s\n" % (t, l) - sys.stdout.write(out) - cmd = None - if show and self.strfunction: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - try: - cmd = self.strfunction(target, source, env, executor) - except TypeError: - cmd = self.strfunction(target, source, env) - if cmd: - if chdir: - cmd = ('os.chdir(%s)\n' % repr(chdir)) + cmd - try: - get = env.get - except AttributeError: - print_func = self.print_cmd_line - else: - print_func = get('PRINT_CMD_LINE_FUNC') - if not print_func: - print_func = self.print_cmd_line - print_func(cmd, target, source, env) - stat = 0 - if execute: - if chdir: - os.chdir(chdir) - try: - stat = self.execute(target, source, env, executor=executor) - if isinstance(stat, SCons.Errors.BuildError): - s = exitstatfunc(stat.status) - if s: - stat.status = s - else: - stat = s - else: - stat = exitstatfunc(stat) - finally: - if save_cwd: - os.chdir(save_cwd) - if cmd and save_cwd: - print_func('os.chdir(%s)' % repr(save_cwd), target, source, env) - - return stat - - -def _string_from_cmd_list(cmd_list): - """Takes a list of command line arguments and returns a pretty - representation for printing.""" - cl = [] - for arg in map(str, cmd_list): - if ' ' in arg or '\t' in arg: - arg = '"' + arg + '"' - cl.append(arg) - return ' '.join(cl) - -# A fiddlin' little function that has an 'import SCons.Environment' which -# can't be moved to the top level without creating an import loop. Since -# this import creates a local variable named 'SCons', it blocks access to -# the global variable, so we move it here to prevent complaints about local -# variables being used uninitialized. -default_ENV = None -def get_default_ENV(env): - global default_ENV - try: - return env['ENV'] - except KeyError: - if not default_ENV: - import SCons.Environment - # This is a hideously expensive way to get a default shell - # environment. What it really should do is run the platform - # setup to get the default ENV. Fortunately, it's incredibly - # rare for an Environment not to have a shell environment, so - # we're not going to worry about it overmuch. - default_ENV = SCons.Environment.Environment()['ENV'] - return default_ENV - -# This function is still in draft mode. We're going to need something like -# it in the long run as more and more places use subprocess, but I'm sure -# it'll have to be tweaked to get the full desired functionality. -# one special arg (so far?), 'error', to tell what to do with exceptions. -def _subproc(scons_env, cmd, error = 'ignore', **kw): - """Do common setup for a subprocess.Popen() call""" - # allow std{in,out,err} to be "'devnull'" - io = kw.get('stdin') - if is_String(io) and io == 'devnull': - kw['stdin'] = open(os.devnull) - io = kw.get('stdout') - if is_String(io) and io == 'devnull': - kw['stdout'] = open(os.devnull, 'w') - io = kw.get('stderr') - if is_String(io) and io == 'devnull': - kw['stderr'] = open(os.devnull, 'w') - - # Figure out what shell environment to use - ENV = kw.get('env', None) - if ENV is None: ENV = get_default_ENV(scons_env) - - # Ensure that the ENV values are all strings: - new_env = {} - for key, value in ENV.items(): - if is_List(value): - # If the value is a list, then we assume it is a path list, - # because that's a pretty common list-like value to stick - # in an environment variable: - value = SCons.Util.flatten_sequence(value) - new_env[key] = os.pathsep.join(map(str, value)) - else: - # It's either a string or something else. If it's a string, - # we still want to call str() because it might be a *Unicode* - # string, which makes subprocess.Popen() gag. If it isn't a - # string or a list, then we just coerce it to a string, which - # is the proper way to handle Dir and File instances and will - # produce something reasonable for just about everything else: - new_env[key] = str(value) - kw['env'] = new_env - - try: - #FUTURE return subprocess.Popen(cmd, **kw) - return subprocess.Popen(cmd, **kw) - except EnvironmentError, e: - if error == 'raise': raise - # return a dummy Popen instance that only returns error - class dummyPopen(object): - def __init__(self, e): self.exception = e - def communicate(self): return ('','') - def wait(self): return -self.exception.errno - stdin = None - class f(object): - def read(self): return '' - def readline(self): return '' - stdout = stderr = f() - return dummyPopen(e) - -class CommandAction(_ActionAction): - """Class for command-execution actions.""" - def __init__(self, cmd, **kw): - # Cmd can actually be a list or a single item; if it's a - # single item it should be the command string to execute; if a - # list then it should be the words of the command string to - # execute. Only a single command should be executed by this - # object; lists of commands should be handled by embedding - # these objects in a ListAction object (which the Action() - # factory above does). cmd will be passed to - # Environment.subst_list() for substituting environment - # variables. - if __debug__: logInstanceCreation(self, 'Action.CommandAction') - - _ActionAction.__init__(self, **kw) - if is_List(cmd): - if list(filter(is_List, cmd)): - raise TypeError("CommandAction should be given only " \ - "a single command") - self.cmd_list = cmd - - def __str__(self): - if is_List(self.cmd_list): - return ' '.join(map(str, self.cmd_list)) - return str(self.cmd_list) - - def process(self, target, source, env, executor=None): - if executor: - result = env.subst_list(self.cmd_list, 0, executor=executor) - else: - result = env.subst_list(self.cmd_list, 0, target, source) - silent = None - ignore = None - while True: - try: c = result[0][0][0] - except IndexError: c = None - if c == '@': silent = 1 - elif c == '-': ignore = 1 - else: break - result[0][0] = result[0][0][1:] - try: - if not result[0][0]: - result[0] = result[0][1:] - except IndexError: - pass - return result, ignore, silent - - def strfunction(self, target, source, env, executor=None): - if self.cmdstr is None: - return None - if self.cmdstr is not _null: - from SCons.Subst import SUBST_RAW - if executor: - c = env.subst(self.cmdstr, SUBST_RAW, executor=executor) - else: - c = env.subst(self.cmdstr, SUBST_RAW, target, source) - if c: - return c - cmd_list, ignore, silent = self.process(target, source, env, executor) - if silent: - return '' - return _string_from_cmd_list(cmd_list[0]) - - def execute(self, target, source, env, executor=None): - """Execute a command action. - - This will handle lists of commands as well as individual commands, - because construction variable substitution may turn a single - "command" into a list. This means that this class can actually - handle lists of commands, even though that's not how we use it - externally. - """ - escape_list = SCons.Subst.escape_list - flatten_sequence = SCons.Util.flatten_sequence - - try: - shell = env['SHELL'] - except KeyError: - raise SCons.Errors.UserError('Missing SHELL construction variable.') - - try: - spawn = env['SPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing SPAWN construction variable.') - else: - if is_String(spawn): - spawn = env.subst(spawn, raw=1, conv=lambda x: x) - - escape = env.get('ESCAPE', lambda x: x) - - ENV = get_default_ENV(env) - - # Ensure that the ENV values are all strings: - for key, value in ENV.items(): - if not is_String(value): - if is_List(value): - # If the value is a list, then we assume it is a - # path list, because that's a pretty common list-like - # value to stick in an environment variable: - value = flatten_sequence(value) - ENV[key] = os.pathsep.join(map(str, value)) - else: - # If it isn't a string or a list, then we just coerce - # it to a string, which is the proper way to handle - # Dir and File instances and will produce something - # reasonable for just about everything else: - ENV[key] = str(value) - - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - cmd_list, ignore, silent = self.process(target, list(map(rfile, source)), env, executor) - - # Use len() to filter out any "command" that's zero-length. - for cmd_line in filter(len, cmd_list): - # Escape the command line for the interpreter we are using. - cmd_line = escape_list(cmd_line, escape) - result = spawn(shell, escape, cmd_line[0], cmd_line, ENV) - if not ignore and result: - msg = "Error %s" % result - return SCons.Errors.BuildError(errstr=msg, - status=result, - action=self, - command=cmd_line) - return 0 - - def get_presig(self, target, source, env, executor=None): - """Return the signature contents of this action's command line. - - This strips $(-$) and everything in between the string, - since those parts don't affect signatures. - """ - from SCons.Subst import SUBST_SIG - cmd = self.cmd_list - if is_List(cmd): - cmd = ' '.join(map(str, cmd)) - else: - cmd = str(cmd) - if executor: - return env.subst_target_source(cmd, SUBST_SIG, executor=executor) - else: - return env.subst_target_source(cmd, SUBST_SIG, target, source) - - def get_implicit_deps(self, target, source, env, executor=None): - icd = env.get('IMPLICIT_COMMAND_DEPENDENCIES', True) - if is_String(icd) and icd[:1] == '$': - icd = env.subst(icd) - if not icd or icd in ('0', 'None'): - return [] - from SCons.Subst import SUBST_SIG - if executor: - cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, executor=executor) - else: - cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, target, source) - res = [] - for cmd_line in cmd_list: - if cmd_line: - d = str(cmd_line[0]) - m = strip_quotes.match(d) - if m: - d = m.group(1) - d = env.WhereIs(d) - if d: - res.append(env.fs.File(d)) - return res - -class CommandGeneratorAction(ActionBase): - """Class for command-generator actions.""" - def __init__(self, generator, kw): - if __debug__: logInstanceCreation(self, 'Action.CommandGeneratorAction') - self.generator = generator - self.gen_kw = kw - self.varlist = kw.get('varlist', ()) - self.targets = kw.get('targets', '$TARGETS') - - def _generate(self, target, source, env, for_signature, executor=None): - # ensure that target is a list, to make it easier to write - # generator functions: - if not is_List(target): - target = [target] - - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - ret = self.generator(target=target, - source=source, - env=env, - for_signature=for_signature) - gen_cmd = Action(ret, **self.gen_kw) - if not gen_cmd: - raise SCons.Errors.UserError("Object returned from command generator: %s cannot be used to create an Action." % repr(ret)) - return gen_cmd - - def __str__(self): - try: - env = self.presub_env - except AttributeError: - env = None - if env is None: - env = SCons.Defaults.DefaultEnvironment() - act = self._generate([], [], env, 1) - return str(act) - - def batch_key(self, env, target, source): - return self._generate(target, source, env, 1).batch_key(env, target, source) - - def genstring(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).genstring(target, source, env) - - def __call__(self, target, source, env, exitstatfunc=_null, presub=_null, - show=_null, execute=_null, chdir=_null, executor=None): - act = self._generate(target, source, env, 0, executor) - if act is None: - raise UserError("While building `%s': " - "Cannot deduce file extension from source files: %s" - % (repr(list(map(str, target))), repr(list(map(str, source))))) - return act(target, source, env, exitstatfunc, presub, - show, execute, chdir, executor) - - def get_presig(self, target, source, env, executor=None): - """Return the signature contents of this action's command line. - - This strips $(-$) and everything in between the string, - since those parts don't affect signatures. - """ - return self._generate(target, source, env, 1, executor).get_presig(target, source, env) - - def get_implicit_deps(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).get_implicit_deps(target, source, env) - - def get_varlist(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).get_varlist(target, source, env, executor) - - def get_targets(self, env, executor): - return self._generate(None, None, env, 1, executor).get_targets(env, executor) - - - -# A LazyAction is a kind of hybrid generator and command action for -# strings of the form "$VAR". These strings normally expand to other -# strings (think "$CCCOM" to "$CC -c -o $TARGET $SOURCE"), but we also -# want to be able to replace them with functions in the construction -# environment. Consequently, we want lazy evaluation and creation of -# an Action in the case of the function, but that's overkill in the more -# normal case of expansion to other strings. -# -# So we do this with a subclass that's both a generator *and* -# a command action. The overridden methods all do a quick check -# of the construction variable, and if it's a string we just call -# the corresponding CommandAction method to do the heavy lifting. -# If not, then we call the same-named CommandGeneratorAction method. -# The CommandGeneratorAction methods work by using the overridden -# _generate() method, that is, our own way of handling "generation" of -# an action based on what's in the construction variable. - -class LazyAction(CommandGeneratorAction, CommandAction): - - def __init__(self, var, kw): - if __debug__: logInstanceCreation(self, 'Action.LazyAction') - #FUTURE CommandAction.__init__(self, '${'+var+'}', **kw) - CommandAction.__init__(self, '${'+var+'}', **kw) - self.var = SCons.Util.to_String(var) - self.gen_kw = kw - - def get_parent_class(self, env): - c = env.get(self.var) - if is_String(c) and not '\n' in c: - return CommandAction - return CommandGeneratorAction - - def _generate_cache(self, env): - if env: - c = env.get(self.var, '') - else: - c = '' - gen_cmd = Action(c, **self.gen_kw) - if not gen_cmd: - raise SCons.Errors.UserError("$%s value %s cannot be used to create an Action." % (self.var, repr(c))) - return gen_cmd - - def _generate(self, target, source, env, for_signature, executor=None): - return self._generate_cache(env) - - def __call__(self, target, source, env, *args, **kw): - c = self.get_parent_class(env) - return c.__call__(self, target, source, env, *args, **kw) - - def get_presig(self, target, source, env): - c = self.get_parent_class(env) - return c.get_presig(self, target, source, env) - - def get_varlist(self, target, source, env, executor=None): - c = self.get_parent_class(env) - return c.get_varlist(self, target, source, env, executor) - - -class FunctionAction(_ActionAction): - """Class for Python function actions.""" - - def __init__(self, execfunction, kw): - if __debug__: logInstanceCreation(self, 'Action.FunctionAction') - - self.execfunction = execfunction - try: - self.funccontents = _callable_contents(execfunction) - except AttributeError: - try: - # See if execfunction will do the heavy lifting for us. - self.gc = execfunction.get_contents - except AttributeError: - # This is weird, just do the best we can. - self.funccontents = _object_contents(execfunction) - - _ActionAction.__init__(self, **kw) - - def function_name(self): - try: - return self.execfunction.__name__ - except AttributeError: - try: - return self.execfunction.__class__.__name__ - except AttributeError: - return "unknown_python_function" - - def strfunction(self, target, source, env, executor=None): - if self.cmdstr is None: - return None - if self.cmdstr is not _null: - from SCons.Subst import SUBST_RAW - if executor: - c = env.subst(self.cmdstr, SUBST_RAW, executor=executor) - else: - c = env.subst(self.cmdstr, SUBST_RAW, target, source) - if c: - return c - def array(a): - def quote(s): - try: - str_for_display = s.str_for_display - except AttributeError: - s = repr(s) - else: - s = str_for_display() - return s - return '[' + ", ".join(map(quote, a)) + ']' - try: - strfunc = self.execfunction.strfunction - except AttributeError: - pass - else: - if strfunc is None: - return None - if callable(strfunc): - return strfunc(target, source, env) - name = self.function_name() - tstr = array(target) - sstr = array(source) - return "%s(%s, %s)" % (name, tstr, sstr) - - def __str__(self): - name = self.function_name() - if name == 'ActionCaller': - return str(self.execfunction) - return "%s(target, source, env)" % name - - def execute(self, target, source, env, executor=None): - exc_info = (None,None,None) - try: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - rsources = list(map(rfile, source)) - try: - result = self.execfunction(target=target, source=rsources, env=env) - except KeyboardInterrupt, e: - raise - except SystemExit, e: - raise - except Exception, e: - result = e - exc_info = sys.exc_info() - - if result: - result = SCons.Errors.convert_to_BuildError(result, exc_info) - result.node=target - result.action=self - try: - result.command=self.strfunction(target, source, env, executor) - except TypeError: - result.command=self.strfunction(target, source, env) - - # FIXME: This maintains backward compatibility with respect to - # which type of exceptions were returned by raising an - # exception and which ones were returned by value. It would - # probably be best to always return them by value here, but - # some codes do not check the return value of Actions and I do - # not have the time to modify them at this point. - if (exc_info[1] and - not isinstance(exc_info[1],EnvironmentError)): - raise result - - return result - finally: - # Break the cycle between the traceback object and this - # function stack frame. See the sys.exc_info() doc info for - # more information about this issue. - del exc_info - - - def get_presig(self, target, source, env): - """Return the signature contents of this callable action.""" - try: - return self.gc(target, source, env) - except AttributeError: - return self.funccontents - - def get_implicit_deps(self, target, source, env): - return [] - -class ListAction(ActionBase): - """Class for lists of other actions.""" - def __init__(self, actionlist): - if __debug__: logInstanceCreation(self, 'Action.ListAction') - def list_of_actions(x): - if isinstance(x, ActionBase): - return x - return Action(x) - self.list = list(map(list_of_actions, actionlist)) - # our children will have had any varlist - # applied; we don't need to do it again - self.varlist = () - self.targets = '$TARGETS' - - def genstring(self, target, source, env): - return '\n'.join([a.genstring(target, source, env) for a in self.list]) - - def __str__(self): - return '\n'.join(map(str, self.list)) - - def presub_lines(self, env): - return SCons.Util.flatten_sequence( - [a.presub_lines(env) for a in self.list]) - - def get_presig(self, target, source, env): - """Return the signature contents of this action list. - - Simple concatenation of the signatures of the elements. - """ - return "".join([x.get_contents(target, source, env) for x in self.list]) - - def __call__(self, target, source, env, exitstatfunc=_null, presub=_null, - show=_null, execute=_null, chdir=_null, executor=None): - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - for act in self.list: - stat = act(target, source, env, exitstatfunc, presub, - show, execute, chdir, executor) - if stat: - return stat - return 0 - - def get_implicit_deps(self, target, source, env): - result = [] - for act in self.list: - result.extend(act.get_implicit_deps(target, source, env)) - return result - - def get_varlist(self, target, source, env, executor=None): - result = SCons.Util.OrderedDict() - for act in self.list: - for var in act.get_varlist(target, source, env, executor): - result[var] = True - return list(result.keys()) - -class ActionCaller(object): - """A class for delaying calling an Action function with specific - (positional and keyword) arguments until the Action is actually - executed. - - This class looks to the rest of the world like a normal Action object, - but what it's really doing is hanging on to the arguments until we - have a target, source and env to use for the expansion. - """ - def __init__(self, parent, args, kw): - self.parent = parent - self.args = args - self.kw = kw - - def get_contents(self, target, source, env): - actfunc = self.parent.actfunc - try: - # "self.actfunc" is a function. - contents = str(actfunc.func_code.co_code) - except AttributeError: - # "self.actfunc" is a callable object. - try: - contents = str(actfunc.__call__.im_func.func_code.co_code) - except AttributeError: - # No __call__() method, so it might be a builtin - # or something like that. Do the best we can. - contents = str(actfunc) - contents = remove_set_lineno_codes(contents) - return contents - - def subst(self, s, target, source, env): - # If s is a list, recursively apply subst() - # to every element in the list - if is_List(s): - result = [] - for elem in s: - result.append(self.subst(elem, target, source, env)) - return self.parent.convert(result) - - # Special-case hack: Let a custom function wrapped in an - # ActionCaller get at the environment through which the action - # was called by using this hard-coded value as a special return. - if s == '$__env__': - return env - elif is_String(s): - return env.subst(s, 1, target, source) - return self.parent.convert(s) - - def subst_args(self, target, source, env): - return [self.subst(x, target, source, env) for x in self.args] - - def subst_kw(self, target, source, env): - kw = {} - for key in self.kw.keys(): - kw[key] = self.subst(self.kw[key], target, source, env) - return kw - - def __call__(self, target, source, env, executor=None): - args = self.subst_args(target, source, env) - kw = self.subst_kw(target, source, env) - return self.parent.actfunc(*args, **kw) - - def strfunction(self, target, source, env): - args = self.subst_args(target, source, env) - kw = self.subst_kw(target, source, env) - return self.parent.strfunc(*args, **kw) - - def __str__(self): - return self.parent.strfunc(*self.args, **self.kw) - -class ActionFactory(object): - """A factory class that will wrap up an arbitrary function - as an SCons-executable Action object. - - The real heavy lifting here is done by the ActionCaller class. - We just collect the (positional and keyword) arguments that we're - called with and give them to the ActionCaller object we create, - so it can hang onto them until it needs them. - """ - def __init__(self, actfunc, strfunc, convert=lambda x: x): - self.actfunc = actfunc - self.strfunc = strfunc - self.convert = convert - - def __call__(self, *args, **kw): - ac = ActionCaller(self, args, kw) - action = Action(ac, strfunction=ac.strfunction) - return action - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Builder.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Builder.py deleted file mode 100644 index 3b4f2e8af..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Builder.py +++ /dev/null @@ -1,877 +0,0 @@ -"""SCons.Builder - -Builder object subsystem. - -A Builder object is a callable that encapsulates information about how -to execute actions to create a target Node (file) from source Nodes -(files), and how to create those dependencies for tracking. - -The main entry point here is the Builder() factory method. This provides -a procedural interface that creates the right underlying Builder object -based on the keyword arguments supplied and the types of the arguments. - -The goal is for this external interface to be simple enough that the -vast majority of users can create new Builders as necessary to support -building new types of files in their configurations, without having to -dive any deeper into this subsystem. - -The base class here is BuilderBase. This is a concrete base class which -does, in fact, represent the Builder objects that we (or users) create. - -There is also a proxy that looks like a Builder: - - CompositeBuilder - - This proxies for a Builder with an action that is actually a - dictionary that knows how to map file suffixes to a specific - action. This is so that we can invoke different actions - (compilers, compile options) for different flavors of source - files. - -Builders and their proxies have the following public interface methods -used by other modules: - - __call__() - THE public interface. Calling a Builder object (with the - use of internal helper methods) sets up the target and source - dependencies, appropriate mapping to a specific action, and the - environment manipulation necessary for overridden construction - variable. This also takes care of warning about possible mistakes - in keyword arguments. - - add_emitter() - Adds an emitter for a specific file suffix, used by some Tool - modules to specify that (for example) a yacc invocation on a .y - can create a .h *and* a .c file. - - add_action() - Adds an action for a specific file suffix, heavily used by - Tool modules to add their specific action(s) for turning - a source file into an object file to the global static - and shared object file Builders. - -There are the following methods for internal use within this module: - - _execute() - The internal method that handles the heavily lifting when a - Builder is called. This is used so that the __call__() methods - can set up warning about possible mistakes in keyword-argument - overrides, and *then* execute all of the steps necessary so that - the warnings only occur once. - - get_name() - Returns the Builder's name within a specific Environment, - primarily used to try to return helpful information in error - messages. - - adjust_suffix() - get_prefix() - get_suffix() - get_src_suffix() - set_src_suffix() - Miscellaneous stuff for handling the prefix and suffix - manipulation we use in turning source file names into target - file names. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Builder.py 5023 2010/06/14 22:05:46 scons" - -import collections - -import SCons.Action -from SCons.Debug import logInstanceCreation -from SCons.Errors import InternalError, UserError -import SCons.Executor -import SCons.Memoize -import SCons.Node -import SCons.Node.FS -import SCons.Util -import SCons.Warnings - -class _Null(object): - pass - -_null = _Null - -def match_splitext(path, suffixes = []): - if suffixes: - matchsuf = [S for S in suffixes if path[-len(S):] == S] - if matchsuf: - suf = max([(len(_f),_f) for _f in matchsuf])[1] - return [path[:-len(suf)], path[-len(suf):]] - return SCons.Util.splitext(path) - -class DictCmdGenerator(SCons.Util.Selector): - """This is a callable class that can be used as a - command generator function. It holds on to a dictionary - mapping file suffixes to Actions. It uses that dictionary - to return the proper action based on the file suffix of - the source file.""" - - def __init__(self, dict=None, source_ext_match=1): - SCons.Util.Selector.__init__(self, dict) - self.source_ext_match = source_ext_match - - def src_suffixes(self): - return list(self.keys()) - - def add_action(self, suffix, action): - """Add a suffix-action pair to the mapping. - """ - self[suffix] = action - - def __call__(self, target, source, env, for_signature): - if not source: - return [] - - if self.source_ext_match: - suffixes = self.src_suffixes() - ext = None - for src in map(str, source): - my_ext = match_splitext(src, suffixes)[1] - if ext and my_ext != ext: - raise UserError("While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %s" - % (repr(list(map(str, target))), src, ext, my_ext)) - ext = my_ext - else: - ext = match_splitext(str(source[0]), self.src_suffixes())[1] - - if not ext: - #return ext - raise UserError("While building `%s': " - "Cannot deduce file extension from source files: %s" - % (repr(list(map(str, target))), repr(list(map(str, source))))) - - try: - ret = SCons.Util.Selector.__call__(self, env, source, ext) - except KeyError, e: - raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e.args[0], e.args[1], e.args[2])) - if ret is None: - raise UserError("While building `%s' from `%s': Don't know how to build from a source file with suffix `%s'. Expected a suffix in this list: %s." % \ - (repr(list(map(str, target))), repr(list(map(str, source))), ext, repr(list(self.keys())))) - return ret - -class CallableSelector(SCons.Util.Selector): - """A callable dictionary that will, in turn, call the value it - finds if it can.""" - def __call__(self, env, source): - value = SCons.Util.Selector.__call__(self, env, source) - if callable(value): - value = value(env, source) - return value - -class DictEmitter(SCons.Util.Selector): - """A callable dictionary that maps file suffixes to emitters. - When called, it finds the right emitter in its dictionary for the - suffix of the first source file, and calls that emitter to get the - right lists of targets and sources to return. If there's no emitter - for the suffix in its dictionary, the original target and source are - returned. - """ - def __call__(self, target, source, env): - emitter = SCons.Util.Selector.__call__(self, env, source) - if emitter: - target, source = emitter(target, source, env) - return (target, source) - -class ListEmitter(collections.UserList): - """A callable list of emitters that calls each in sequence, - returning the result. - """ - def __call__(self, target, source, env): - for e in self.data: - target, source = e(target, source, env) - return (target, source) - -# These are a common errors when calling a Builder; -# they are similar to the 'target' and 'source' keyword args to builders, -# so we issue warnings when we see them. The warnings can, of course, -# be disabled. -misleading_keywords = { - 'targets' : 'target', - 'sources' : 'source', -} - -class OverrideWarner(collections.UserDict): - """A class for warning about keyword arguments that we use as - overrides in a Builder call. - - This class exists to handle the fact that a single Builder call - can actually invoke multiple builders. This class only emits the - warnings once, no matter how many Builders are invoked. - """ - def __init__(self, dict): - collections.UserDict.__init__(self, dict) - if __debug__: logInstanceCreation(self, 'Builder.OverrideWarner') - self.already_warned = None - def warn(self): - if self.already_warned: - return - for k in self.keys(): - if k in misleading_keywords: - alt = misleading_keywords[k] - msg = "Did you mean to use `%s' instead of `%s'?" % (alt, k) - SCons.Warnings.warn(SCons.Warnings.MisleadingKeywordsWarning, msg) - self.already_warned = 1 - -def Builder(**kw): - """A factory for builder objects.""" - composite = None - if 'generator' in kw: - if 'action' in kw: - raise UserError("You must not specify both an action and a generator.") - kw['action'] = SCons.Action.CommandGeneratorAction(kw['generator'], {}) - del kw['generator'] - elif 'action' in kw: - source_ext_match = kw.get('source_ext_match', 1) - if 'source_ext_match' in kw: - del kw['source_ext_match'] - if SCons.Util.is_Dict(kw['action']): - composite = DictCmdGenerator(kw['action'], source_ext_match) - kw['action'] = SCons.Action.CommandGeneratorAction(composite, {}) - kw['src_suffix'] = composite.src_suffixes() - else: - kw['action'] = SCons.Action.Action(kw['action']) - - if 'emitter' in kw: - emitter = kw['emitter'] - if SCons.Util.is_String(emitter): - # This allows users to pass in an Environment - # variable reference (like "$FOO") as an emitter. - # We will look in that Environment variable for - # a callable to use as the actual emitter. - var = SCons.Util.get_environment_var(emitter) - if not var: - raise UserError("Supplied emitter '%s' does not appear to refer to an Environment variable" % emitter) - kw['emitter'] = EmitterProxy(var) - elif SCons.Util.is_Dict(emitter): - kw['emitter'] = DictEmitter(emitter) - elif SCons.Util.is_List(emitter): - kw['emitter'] = ListEmitter(emitter) - - result = BuilderBase(**kw) - - if not composite is None: - result = CompositeBuilder(result, composite) - - return result - -def _node_errors(builder, env, tlist, slist): - """Validate that the lists of target and source nodes are - legal for this builder and environment. Raise errors or - issue warnings as appropriate. - """ - - # First, figure out if there are any errors in the way the targets - # were specified. - for t in tlist: - if t.side_effect: - raise UserError("Multiple ways to build the same target were specified for: %s" % t) - if t.has_explicit_builder(): - if not t.env is None and not t.env is env: - action = t.builder.action - t_contents = action.get_contents(tlist, slist, t.env) - contents = action.get_contents(tlist, slist, env) - - if t_contents == contents: - msg = "Two different environments were specified for target %s,\n\tbut they appear to have the same action: %s" % (t, action.genstring(tlist, slist, t.env)) - SCons.Warnings.warn(SCons.Warnings.DuplicateEnvironmentWarning, msg) - else: - msg = "Two environments with different actions were specified for the same target: %s" % t - raise UserError(msg) - if builder.multi: - if t.builder != builder: - msg = "Two different builders (%s and %s) were specified for the same target: %s" % (t.builder.get_name(env), builder.get_name(env), t) - raise UserError(msg) - # TODO(batch): list constructed each time! - if t.get_executor().get_all_targets() != tlist: - msg = "Two different target lists have a target in common: %s (from %s and from %s)" % (t, list(map(str, t.get_executor().get_all_targets())), list(map(str, tlist))) - raise UserError(msg) - elif t.sources != slist: - msg = "Multiple ways to build the same target were specified for: %s (from %s and from %s)" % (t, list(map(str, t.sources)), list(map(str, slist))) - raise UserError(msg) - - if builder.single_source: - if len(slist) > 1: - raise UserError("More than one source given for single-source builder: targets=%s sources=%s" % (list(map(str,tlist)), list(map(str,slist)))) - -class EmitterProxy(object): - """This is a callable class that can act as a - Builder emitter. It holds on to a string that - is a key into an Environment dictionary, and will - look there at actual build time to see if it holds - a callable. If so, we will call that as the actual - emitter.""" - def __init__(self, var): - self.var = SCons.Util.to_String(var) - - def __call__(self, target, source, env): - emitter = self.var - - # Recursively substitute the variable. - # We can't use env.subst() because it deals only - # in strings. Maybe we should change that? - while SCons.Util.is_String(emitter) and emitter in env: - emitter = env[emitter] - if callable(emitter): - target, source = emitter(target, source, env) - elif SCons.Util.is_List(emitter): - for e in emitter: - target, source = e(target, source, env) - - return (target, source) - - - def __cmp__(self, other): - return cmp(self.var, other.var) - -class BuilderBase(object): - """Base class for Builders, objects that create output - nodes (files) from input nodes (files). - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self, action = None, - prefix = '', - suffix = '', - src_suffix = '', - target_factory = None, - source_factory = None, - target_scanner = None, - source_scanner = None, - emitter = None, - multi = 0, - env = None, - single_source = 0, - name = None, - chdir = _null, - is_explicit = 1, - src_builder = None, - ensure_suffix = False, - **overrides): - if __debug__: logInstanceCreation(self, 'Builder.BuilderBase') - self._memo = {} - self.action = action - self.multi = multi - if SCons.Util.is_Dict(prefix): - prefix = CallableSelector(prefix) - self.prefix = prefix - if SCons.Util.is_Dict(suffix): - suffix = CallableSelector(suffix) - self.env = env - self.single_source = single_source - if 'overrides' in overrides: - SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning, - "The \"overrides\" keyword to Builder() creation has been deprecated;\n" +\ - "\tspecify the items as keyword arguments to the Builder() call instead.") - overrides.update(overrides['overrides']) - del overrides['overrides'] - if 'scanner' in overrides: - SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning, - "The \"scanner\" keyword to Builder() creation has been deprecated;\n" - "\tuse: source_scanner or target_scanner as appropriate.") - del overrides['scanner'] - self.overrides = overrides - - self.set_suffix(suffix) - self.set_src_suffix(src_suffix) - self.ensure_suffix = ensure_suffix - - self.target_factory = target_factory - self.source_factory = source_factory - self.target_scanner = target_scanner - self.source_scanner = source_scanner - - self.emitter = emitter - - # Optional Builder name should only be used for Builders - # that don't get attached to construction environments. - if name: - self.name = name - self.executor_kw = {} - if not chdir is _null: - self.executor_kw['chdir'] = chdir - self.is_explicit = is_explicit - - if src_builder is None: - src_builder = [] - elif not SCons.Util.is_List(src_builder): - src_builder = [ src_builder ] - self.src_builder = src_builder - - def __nonzero__(self): - raise InternalError("Do not test for the Node.builder attribute directly; use Node.has_builder() instead") - - def get_name(self, env): - """Attempts to get the name of the Builder. - - Look at the BUILDERS variable of env, expecting it to be a - dictionary containing this Builder, and return the key of the - dictionary. If there's no key, then return a directly-configured - name (if there is one) or the name of the class (by default).""" - - try: - index = list(env['BUILDERS'].values()).index(self) - return list(env['BUILDERS'].keys())[index] - except (AttributeError, KeyError, TypeError, ValueError): - try: - return self.name - except AttributeError: - return str(self.__class__) - - def __cmp__(self, other): - return cmp(self.__dict__, other.__dict__) - - def splitext(self, path, env=None): - if not env: - env = self.env - if env: - suffixes = self.src_suffixes(env) - else: - suffixes = [] - return match_splitext(path, suffixes) - - def _adjustixes(self, files, pre, suf, ensure_suffix=False): - if not files: - return [] - result = [] - if not SCons.Util.is_List(files): - files = [files] - - for f in files: - if SCons.Util.is_String(f): - f = SCons.Util.adjustixes(f, pre, suf, ensure_suffix) - result.append(f) - return result - - def _create_nodes(self, env, target = None, source = None): - """Create and return lists of target and source nodes. - """ - src_suf = self.get_src_suffix(env) - - target_factory = env.get_factory(self.target_factory) - source_factory = env.get_factory(self.source_factory) - - source = self._adjustixes(source, None, src_suf) - slist = env.arg2nodes(source, source_factory) - - pre = self.get_prefix(env, slist) - suf = self.get_suffix(env, slist) - - if target is None: - try: - t_from_s = slist[0].target_from_source - except AttributeError: - raise UserError("Do not know how to create a target from source `%s'" % slist[0]) - except IndexError: - tlist = [] - else: - splitext = lambda S: self.splitext(S,env) - tlist = [ t_from_s(pre, suf, splitext) ] - else: - target = self._adjustixes(target, pre, suf, self.ensure_suffix) - tlist = env.arg2nodes(target, target_factory, target=target, source=source) - - if self.emitter: - # The emitter is going to do str(node), but because we're - # being called *from* a builder invocation, the new targets - # don't yet have a builder set on them and will look like - # source files. Fool the emitter's str() calls by setting - # up a temporary builder on the new targets. - new_targets = [] - for t in tlist: - if not t.is_derived(): - t.builder_set(self) - new_targets.append(t) - - orig_tlist = tlist[:] - orig_slist = slist[:] - - target, source = self.emitter(target=tlist, source=slist, env=env) - - # Now delete the temporary builders that we attached to any - # new targets, so that _node_errors() doesn't do weird stuff - # to them because it thinks they already have builders. - for t in new_targets: - if t.builder is self: - # Only delete the temporary builder if the emitter - # didn't change it on us. - t.builder_set(None) - - # Have to call arg2nodes yet again, since it is legal for - # emitters to spit out strings as well as Node instances. - tlist = env.arg2nodes(target, target_factory, - target=orig_tlist, source=orig_slist) - slist = env.arg2nodes(source, source_factory, - target=orig_tlist, source=orig_slist) - - return tlist, slist - - def _execute(self, env, target, source, overwarn={}, executor_kw={}): - # We now assume that target and source are lists or None. - if self.src_builder: - source = self.src_builder_sources(env, source, overwarn) - - if self.single_source and len(source) > 1 and target is None: - result = [] - if target is None: target = [None]*len(source) - for tgt, src in zip(target, source): - if not tgt is None: tgt = [tgt] - if not src is None: src = [src] - result.extend(self._execute(env, tgt, src, overwarn)) - return SCons.Node.NodeList(result) - - overwarn.warn() - - tlist, slist = self._create_nodes(env, target, source) - - # Check for errors with the specified target/source lists. - _node_errors(self, env, tlist, slist) - - # The targets are fine, so find or make the appropriate Executor to - # build this particular list of targets from this particular list of - # sources. - - executor = None - key = None - - if self.multi: - try: - executor = tlist[0].get_executor(create = 0) - except (AttributeError, IndexError): - pass - else: - executor.add_sources(slist) - - if executor is None: - if not self.action: - fmt = "Builder %s must have an action to build %s." - raise UserError(fmt % (self.get_name(env or self.env), - list(map(str,tlist)))) - key = self.action.batch_key(env or self.env, tlist, slist) - if key: - try: - executor = SCons.Executor.GetBatchExecutor(key) - except KeyError: - pass - else: - executor.add_batch(tlist, slist) - - if executor is None: - executor = SCons.Executor.Executor(self.action, env, [], - tlist, slist, executor_kw) - if key: - SCons.Executor.AddBatchExecutor(key, executor) - - # Now set up the relevant information in the target Nodes themselves. - for t in tlist: - t.cwd = env.fs.getcwd() - t.builder_set(self) - t.env_set(env) - t.add_source(slist) - t.set_executor(executor) - t.set_explicit(self.is_explicit) - - return SCons.Node.NodeList(tlist) - - def __call__(self, env, target=None, source=None, chdir=_null, **kw): - # We now assume that target and source are lists or None. - # The caller (typically Environment.BuilderWrapper) is - # responsible for converting any scalar values to lists. - if chdir is _null: - ekw = self.executor_kw - else: - ekw = self.executor_kw.copy() - ekw['chdir'] = chdir - if kw: - if 'srcdir' in kw: - def prependDirIfRelative(f, srcdir=kw['srcdir']): - import os.path - if SCons.Util.is_String(f) and not os.path.isabs(f): - f = os.path.join(srcdir, f) - return f - if not SCons.Util.is_List(source): - source = [source] - source = list(map(prependDirIfRelative, source)) - del kw['srcdir'] - if self.overrides: - env_kw = self.overrides.copy() - env_kw.update(kw) - else: - env_kw = kw - else: - env_kw = self.overrides - env = env.Override(env_kw) - return self._execute(env, target, source, OverrideWarner(kw), ekw) - - def adjust_suffix(self, suff): - if suff and not suff[0] in [ '.', '_', '$' ]: - return '.' + suff - return suff - - def get_prefix(self, env, sources=[]): - prefix = self.prefix - if callable(prefix): - prefix = prefix(env, sources) - return env.subst(prefix) - - def set_suffix(self, suffix): - if not callable(suffix): - suffix = self.adjust_suffix(suffix) - self.suffix = suffix - - def get_suffix(self, env, sources=[]): - suffix = self.suffix - if callable(suffix): - suffix = suffix(env, sources) - return env.subst(suffix) - - def set_src_suffix(self, src_suffix): - if not src_suffix: - src_suffix = [] - elif not SCons.Util.is_List(src_suffix): - src_suffix = [ src_suffix ] - self.src_suffix = [callable(suf) and suf or self.adjust_suffix(suf) for suf in src_suffix] - - def get_src_suffix(self, env): - """Get the first src_suffix in the list of src_suffixes.""" - ret = self.src_suffixes(env) - if not ret: - return '' - return ret[0] - - def add_emitter(self, suffix, emitter): - """Add a suffix-emitter mapping to this Builder. - - This assumes that emitter has been initialized with an - appropriate dictionary type, and will throw a TypeError if - not, so the caller is responsible for knowing that this is an - appropriate method to call for the Builder in question. - """ - self.emitter[suffix] = emitter - - def add_src_builder(self, builder): - """ - Add a new Builder to the list of src_builders. - - This requires wiping out cached values so that the computed - lists of source suffixes get re-calculated. - """ - self._memo = {} - self.src_builder.append(builder) - - def _get_sdict(self, env): - """ - Returns a dictionary mapping all of the source suffixes of all - src_builders of this Builder to the underlying Builder that - should be called first. - - This dictionary is used for each target specified, so we save a - lot of extra computation by memoizing it for each construction - environment. - - Note that this is re-computed each time, not cached, because there - might be changes to one of our source Builders (or one of their - source Builders, and so on, and so on...) that we can't "see." - - The underlying methods we call cache their computed values, - though, so we hope repeatedly aggregating them into a dictionary - like this won't be too big a hit. We may need to look for a - better way to do this if performance data show this has turned - into a significant bottleneck. - """ - sdict = {} - for bld in self.get_src_builders(env): - for suf in bld.src_suffixes(env): - sdict[suf] = bld - return sdict - - def src_builder_sources(self, env, source, overwarn={}): - sdict = self._get_sdict(env) - - src_suffixes = self.src_suffixes(env) - - lengths = list(set(map(len, src_suffixes))) - - def match_src_suffix(name, src_suffixes=src_suffixes, lengths=lengths): - node_suffixes = [name[-l:] for l in lengths] - for suf in src_suffixes: - if suf in node_suffixes: - return suf - return None - - result = [] - for s in SCons.Util.flatten(source): - if SCons.Util.is_String(s): - match_suffix = match_src_suffix(env.subst(s)) - if not match_suffix and not '.' in s: - src_suf = self.get_src_suffix(env) - s = self._adjustixes(s, None, src_suf)[0] - else: - match_suffix = match_src_suffix(s.name) - if match_suffix: - try: - bld = sdict[match_suffix] - except KeyError: - result.append(s) - else: - tlist = bld._execute(env, None, [s], overwarn) - # If the subsidiary Builder returned more than one - # target, then filter out any sources that this - # Builder isn't capable of building. - if len(tlist) > 1: - tlist = [t for t in tlist if match_src_suffix(t.name)] - result.extend(tlist) - else: - result.append(s) - - source_factory = env.get_factory(self.source_factory) - - return env.arg2nodes(result, source_factory) - - def _get_src_builders_key(self, env): - return id(env) - - memoizer_counters.append(SCons.Memoize.CountDict('get_src_builders', _get_src_builders_key)) - - def get_src_builders(self, env): - """ - Returns the list of source Builders for this Builder. - - This exists mainly to look up Builders referenced as - strings in the 'BUILDER' variable of the construction - environment and cache the result. - """ - memo_key = id(env) - try: - memo_dict = self._memo['get_src_builders'] - except KeyError: - memo_dict = {} - self._memo['get_src_builders'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - builders = [] - for bld in self.src_builder: - if SCons.Util.is_String(bld): - try: - bld = env['BUILDERS'][bld] - except KeyError: - continue - builders.append(bld) - - memo_dict[memo_key] = builders - return builders - - def _subst_src_suffixes_key(self, env): - return id(env) - - memoizer_counters.append(SCons.Memoize.CountDict('subst_src_suffixes', _subst_src_suffixes_key)) - - def subst_src_suffixes(self, env): - """ - The suffix list may contain construction variable expansions, - so we have to evaluate the individual strings. To avoid doing - this over and over, we memoize the results for each construction - environment. - """ - memo_key = id(env) - try: - memo_dict = self._memo['subst_src_suffixes'] - except KeyError: - memo_dict = {} - self._memo['subst_src_suffixes'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - suffixes = [env.subst(x) for x in self.src_suffix] - memo_dict[memo_key] = suffixes - return suffixes - - def src_suffixes(self, env): - """ - Returns the list of source suffixes for all src_builders of this - Builder. - - This is essentially a recursive descent of the src_builder "tree." - (This value isn't cached because there may be changes in a - src_builder many levels deep that we can't see.) - """ - sdict = {} - suffixes = self.subst_src_suffixes(env) - for s in suffixes: - sdict[s] = 1 - for builder in self.get_src_builders(env): - for s in builder.src_suffixes(env): - if s not in sdict: - sdict[s] = 1 - suffixes.append(s) - return suffixes - -class CompositeBuilder(SCons.Util.Proxy): - """A Builder Proxy whose main purpose is to always have - a DictCmdGenerator as its action, and to provide access - to the DictCmdGenerator's add_action() method. - """ - - def __init__(self, builder, cmdgen): - if __debug__: logInstanceCreation(self, 'Builder.CompositeBuilder') - SCons.Util.Proxy.__init__(self, builder) - - # cmdgen should always be an instance of DictCmdGenerator. - self.cmdgen = cmdgen - self.builder = builder - - __call__ = SCons.Util.Delegate('__call__') - - def add_action(self, suffix, action): - self.cmdgen.add_action(suffix, action) - self.set_src_suffix(self.cmdgen.src_suffixes()) - -def is_a_Builder(obj): - """"Returns True iff the specified obj is one of our Builder classes. - - The test is complicated a bit by the fact that CompositeBuilder - is a proxy, not a subclass of BuilderBase. - """ - return (isinstance(obj, BuilderBase) - or isinstance(obj, CompositeBuilder) - or callable(obj)) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/CacheDir.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/CacheDir.py deleted file mode 100644 index 6b2e174ce..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/CacheDir.py +++ /dev/null @@ -1,216 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/CacheDir.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """ -CacheDir support -""" - -import os.path -import stat -import sys - -import SCons.Action - -cache_enabled = True -cache_debug = False -cache_force = False -cache_show = False - -def CacheRetrieveFunc(target, source, env): - t = target[0] - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if not fs.exists(cachefile): - cd.CacheDebug('CacheRetrieve(%s): %s not in cache\n', t, cachefile) - return 1 - cd.CacheDebug('CacheRetrieve(%s): retrieving from %s\n', t, cachefile) - if SCons.Action.execute_actions: - if fs.islink(cachefile): - fs.symlink(fs.readlink(cachefile), t.path) - else: - env.copy_from_cache(cachefile, t.path) - st = fs.stat(cachefile) - fs.chmod(t.path, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - return 0 - -def CacheRetrieveString(target, source, env): - t = target[0] - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if t.fs.exists(cachefile): - return "Retrieved `%s' from cache" % t.path - return None - -CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString) - -CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None) - -def CachePushFunc(target, source, env): - t = target[0] - if t.nocache: - return - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if fs.exists(cachefile): - # Don't bother copying it if it's already there. Note that - # usually this "shouldn't happen" because if the file already - # existed in cache, we'd have retrieved the file from there, - # not built it. This can happen, though, in a race, if some - # other person running the same build pushes their copy to - # the cache after we decide we need to build it but before our - # build completes. - cd.CacheDebug('CachePush(%s): %s already exists in cache\n', t, cachefile) - return - - cd.CacheDebug('CachePush(%s): pushing to %s\n', t, cachefile) - - tempfile = cachefile+'.tmp'+str(os.getpid()) - errfmt = "Unable to copy %s to cache. Cache file is %s" - - if not fs.isdir(cachedir): - try: - fs.makedirs(cachedir) - except EnvironmentError: - # We may have received an exception because another process - # has beaten us creating the directory. - if not fs.isdir(cachedir): - msg = errfmt % (str(target), cachefile) - raise SCons.Errors.EnvironmentError(msg) - - try: - if fs.islink(t.path): - fs.symlink(fs.readlink(t.path), tempfile) - else: - fs.copy2(t.path, tempfile) - fs.rename(tempfile, cachefile) - st = fs.stat(t.path) - fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - except EnvironmentError: - # It's possible someone else tried writing the file at the - # same time we did, or else that there was some problem like - # the CacheDir being on a separate file system that's full. - # In any case, inability to push a file to cache doesn't affect - # the correctness of the build, so just print a warning. - msg = errfmt % (str(target), cachefile) - SCons.Warnings.warn(SCons.Warnings.CacheWriteErrorWarning, msg) - -CachePush = SCons.Action.Action(CachePushFunc, None) - -class CacheDir(object): - - def __init__(self, path): - try: - import hashlib - except ImportError: - msg = "No hashlib or MD5 module available, CacheDir() not supported" - SCons.Warnings.warn(SCons.Warnings.NoMD5ModuleWarning, msg) - self.path = None - else: - self.path = path - self.current_cache_debug = None - self.debugFP = None - - def CacheDebug(self, fmt, target, cachefile): - if cache_debug != self.current_cache_debug: - if cache_debug == '-': - self.debugFP = sys.stdout - elif cache_debug: - self.debugFP = open(cache_debug, 'w') - else: - self.debugFP = None - self.current_cache_debug = cache_debug - if self.debugFP: - self.debugFP.write(fmt % (target, os.path.split(cachefile)[1])) - - def is_enabled(self): - return (cache_enabled and not self.path is None) - - def cachepath(self, node): - """ - """ - if not self.is_enabled(): - return None, None - - sig = node.get_cachedir_bsig() - subdir = sig[0].upper() - dir = os.path.join(self.path, subdir) - return dir, os.path.join(dir, sig) - - def retrieve(self, node): - """ - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Note that there's a special trick here with the execute flag - (one that's not normally done for other actions). Basically - if the user requested a no_exec (-n) build, then - SCons.Action.execute_actions is set to 0 and when any action - is called, it does its showing but then just returns zero - instead of actually calling the action execution operation. - The problem for caching is that if the file does NOT exist in - cache then the CacheRetrieveString won't return anything to - show for the task, but the Action.__call__ won't call - CacheRetrieveFunc; instead it just returns zero, which makes - the code below think that the file *was* successfully - retrieved from the cache, therefore it doesn't do any - subsequent building. However, the CacheRetrieveString didn't - print anything because it didn't actually exist in the cache, - and no more build actions will be performed, so the user just - sees nothing. The fix is to tell Action.__call__ to always - execute the CacheRetrieveFunc and then have the latter - explicitly check SCons.Action.execute_actions itself. - """ - if not self.is_enabled(): - return False - - env = node.get_build_env() - if cache_show: - if CacheRetrieveSilent(node, [], env, execute=1) == 0: - node.build(presub=0, execute=0) - return True - else: - if CacheRetrieve(node, [], env, execute=1) == 0: - return True - - return False - - def push(self, node): - if not self.is_enabled(): - return - return CachePush(node, [], node.get_build_env()) - - def push_if_forced(self, node): - if cache_force: - return self.push(node) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Conftest.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Conftest.py deleted file mode 100644 index 04a6bc2aa..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Conftest.py +++ /dev/null @@ -1,793 +0,0 @@ -"""SCons.Conftest - -Autoconf-like configuration support; low level implementation of tests. -""" - -# -# Copyright (c) 2003 Stichting NLnet Labs -# Copyright (c) 2001, 2002, 2003 Steven Knight -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -# -# The purpose of this module is to define how a check is to be performed. -# Use one of the Check...() functions below. -# - -# -# A context class is used that defines functions for carrying out the tests, -# logging and messages. The following methods and members must be present: -# -# context.Display(msg) Function called to print messages that are normally -# displayed for the user. Newlines are explicitly used. -# The text should also be written to the logfile! -# -# context.Log(msg) Function called to write to a log file. -# -# context.BuildProg(text, ext) -# Function called to build a program, using "ext" for the -# file extention. Must return an empty string for -# success, an error message for failure. -# For reliable test results building should be done just -# like an actual program would be build, using the same -# command and arguments (including configure results so -# far). -# -# context.CompileProg(text, ext) -# Function called to compile a program, using "ext" for -# the file extention. Must return an empty string for -# success, an error message for failure. -# For reliable test results compiling should be done just -# like an actual source file would be compiled, using the -# same command and arguments (including configure results -# so far). -# -# context.AppendLIBS(lib_name_list) -# Append "lib_name_list" to the value of LIBS. -# "lib_namelist" is a list of strings. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later.) -# -# context.PrependLIBS(lib_name_list) -# Prepend "lib_name_list" to the value of LIBS. -# "lib_namelist" is a list of strings. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later.) -# -# context.SetLIBS(value) -# Set LIBS to "value". The type of "value" is what -# AppendLIBS() returned. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later.) -# -# context.headerfilename -# Name of file to append configure results to, usually -# "confdefs.h". -# The file must not exist or be empty when starting. -# Empty or None to skip this (some tests will not work!). -# -# context.config_h (may be missing). If present, must be a string, which -# will be filled with the contents of a config_h file. -# -# context.vardict Dictionary holding variables used for the tests and -# stores results from the tests, used for the build -# commands. -# Normally contains "CC", "LIBS", "CPPFLAGS", etc. -# -# context.havedict Dictionary holding results from the tests that are to -# be used inside a program. -# Names often start with "HAVE_". These are zero -# (feature not present) or one (feature present). Other -# variables may have any value, e.g., "PERLVERSION" can -# be a number and "SYSTEMNAME" a string. -# - -import re -from types import IntType - -# -# PUBLIC VARIABLES -# - -LogInputFiles = 1 # Set that to log the input files in case of a failed test -LogErrorMessages = 1 # Set that to log Conftest-generated error messages - -# -# PUBLIC FUNCTIONS -# - -# Generic remarks: -# - When a language is specified which is not supported the test fails. The -# message is a bit different, because not all the arguments for the normal -# message are available yet (chicken-egg problem). - - -def CheckBuilder(context, text = None, language = None): - """ - Configure check to see if the compiler works. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - "text" may be used to specify the code to be build. - Returns an empty string for success, an error message for failure. - """ - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("%s\n" % msg) - return msg - - if not text: - text = """ -int main() { - return 0; -} -""" - - context.Display("Checking if building a %s file works... " % lang) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, None, text) - return ret - -def CheckCC(context): - """ - Configure check for a working C compiler. - - This checks whether the C compiler, as defined in the $CC construction - variable, can compile a C source file. It uses the current $CCCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the C compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'CC', text, 'C') - _YesNoResult(context, ret, None, text) - return ret - -def CheckSHCC(context): - """ - Configure check for a working shared C compiler. - - This checks whether the C compiler, as defined in the $SHCC construction - variable, can compile a C source file. It uses the current $SHCCCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the (shared) C compiler works") - text = """ -int foo() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'SHCC', text, 'C', use_shared = True) - _YesNoResult(context, ret, None, text) - return ret - -def CheckCXX(context): - """ - Configure check for a working CXX compiler. - - This checks whether the CXX compiler, as defined in the $CXX construction - variable, can compile a CXX source file. It uses the current $CXXCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the C++ compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'CXX', text, 'C++') - _YesNoResult(context, ret, None, text) - return ret - -def CheckSHCXX(context): - """ - Configure check for a working shared CXX compiler. - - This checks whether the CXX compiler, as defined in the $SHCXX construction - variable, can compile a CXX source file. It uses the current $SHCXXCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the (shared) C++ compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'SHCXX', text, 'C++', use_shared = True) - _YesNoResult(context, ret, None, text) - return ret - -def _check_empty_program(context, comp, text, language, use_shared = False): - """Return 0 on success, 1 otherwise.""" - if comp not in context.env or not context.env[comp]: - # The compiler construction variable is not set or empty - return 1 - - lang, suffix, msg = _lang2suffix(language) - if msg: - return 1 - - if use_shared: - return context.CompileSharedObject(text, suffix) - else: - return context.CompileProg(text, suffix) - - -def CheckFunc(context, function_name, header = None, language = None): - """ - Configure check for a function "function_name". - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Optional "header" can be defined to define a function prototype, include a - header file or anything else that comes before main(). - Sets HAVE_function_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - - # Remarks from autoconf: - # - Don't include because on OSF/1 3.0 it includes - # which includes which contains a prototype for select. - # Similarly for bzero. - # - assert.h is included to define __stub macros and hopefully few - # prototypes, which can conflict with char $1(); below. - # - Override any gcc2 internal prototype to avoid an error. - # - We use char for the function declaration because int might match the - # return type of a gcc2 builtin and then its argument prototype would - # still apply. - # - The GNU C library defines this for functions which it implements to - # always fail with ENOSYS. Some functions are actually named something - # starting with __ and the normal name is an alias. - - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = """ -#ifdef __cplusplus -extern "C" -#endif -char %s();""" % function_name - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s(): %s\n" % (function_name, msg)) - return msg - - text = """ -%(include)s -#include -%(hdr)s - -int main() { -#if defined (__stub_%(name)s) || defined (__stub___%(name)s) - fail fail fail -#else - %(name)s(); -#endif - - return 0; -} -""" % { 'name': function_name, - 'include': includetext, - 'hdr': header } - - context.Display("Checking for %s function %s()... " % (lang, function_name)) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + function_name, text, - "Define to 1 if the system has the function `%s'." %\ - function_name) - return ret - - -def CheckHeader(context, header_name, header = None, language = None, - include_quotes = None): - """ - Configure check for a C or C++ header file "header_name". - Optional "header" can be defined to do something before including the - header file (unusual, supported for consistency). - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Sets HAVE_header_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS and $CPPFLAGS are set correctly. - Returns an empty string for success, an error message for failure. - """ - # Why compile the program instead of just running the preprocessor? - # It is possible that the header file exists, but actually using it may - # fail (e.g., because it depends on other header files). Thus this test is - # more strict. It may require using the "header" argument. - # - # Use <> by default, because the check is normally used for system header - # files. SCons passes '""' to overrule this. - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"\n' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for header file %s: %s\n" - % (header_name, msg)) - return msg - - if not include_quotes: - include_quotes = "<>" - - text = "%s%s\n#include %s%s%s\n\n" % (includetext, header, - include_quotes[0], header_name, include_quotes[1]) - - context.Display("Checking for %s header file %s... " % (lang, header_name)) - ret = context.CompileProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + header_name, text, - "Define to 1 if you have the <%s> header file." % header_name) - return ret - - -def CheckType(context, type_name, fallback = None, - header = None, language = None): - """ - Configure check for a C or C++ type "type_name". - Optional "header" can be defined to include a header file. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Sets HAVE_type_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s type: %s\n" % (type_name, msg)) - return msg - - # Remarks from autoconf about this test: - # - Grepping for the type in include files is not reliable (grep isn't - # portable anyway). - # - Using "TYPE my_var;" doesn't work for const qualified types in C++. - # Adding an initializer is not valid for some C++ classes. - # - Using the type as parameter to a function either fails for K&$ C or for - # C++. - # - Using "TYPE *my_var;" is valid in C for some types that are not - # declared (struct something). - # - Using "sizeof(TYPE)" is valid when TYPE is actually a variable. - # - Using the previous two together works reliably. - text = """ -%(include)s -%(header)s - -int main() { - if ((%(name)s *) 0) - return 0; - if (sizeof (%(name)s)) - return 0; -} -""" % { 'include': includetext, - 'header': header, - 'name': type_name } - - context.Display("Checking for %s type %s... " % (lang, type_name)) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + type_name, text, - "Define to 1 if the system has the type `%s'." % type_name) - if ret and fallback and context.headerfilename: - f = open(context.headerfilename, "a") - f.write("typedef %s %s;\n" % (fallback, type_name)) - f.close() - - return ret - -def CheckTypeSize(context, type_name, header = None, language = None, expect = None): - """This check can be used to get the size of a given type, or to check whether - the type is of expected size. - - Arguments: - - type : str - the type to check - - includes : sequence - list of headers to include in the test code before testing the type - - language : str - 'C' or 'C++' - - expect : int - if given, will test wether the type has the given number of bytes. - If not given, will automatically find the size. - - Returns: - status : int - 0 if the check failed, or the found size of the type if the check succeeded.""" - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s type: %s\n" % (type_name, msg)) - return msg - - src = includetext + header - if not expect is None: - # Only check if the given size is the right one - context.Display('Checking %s is %d bytes... ' % (type_name, expect)) - - # test code taken from autoconf: this is a pretty clever hack to find that - # a type is of a given size using only compilation. This speeds things up - # quite a bit compared to straightforward code using TryRun - src = src + r""" -typedef %s scons_check_type; - -int main() -{ - static int test_array[1 - 2 * !(((long int) (sizeof(scons_check_type))) == %d)]; - test_array[0] = 0; - - return 0; -} -""" - - st = context.CompileProg(src % (type_name, expect), suffix) - if not st: - context.Display("yes\n") - _Have(context, "SIZEOF_%s" % type_name, expect, - "The size of `%s', as computed by sizeof." % type_name) - return expect - else: - context.Display("no\n") - _LogFailed(context, src, st) - return 0 - else: - # Only check if the given size is the right one - context.Message('Checking size of %s ... ' % type_name) - - # We have to be careful with the program we wish to test here since - # compilation will be attempted using the current environment's flags. - # So make sure that the program will compile without any warning. For - # example using: 'int main(int argc, char** argv)' will fail with the - # '-Wall -Werror' flags since the variables argc and argv would not be - # used in the program... - # - src = src + """ -#include -#include -int main() { - printf("%d", (int)sizeof(""" + type_name + """)); - return 0; -} - """ - st, out = context.RunProg(src, suffix) - try: - size = int(out) - except ValueError: - # If cannot convert output of test prog to an integer (the size), - # something went wront, so just fail - st = 1 - size = 0 - - if not st: - context.Display("yes\n") - _Have(context, "SIZEOF_%s" % type_name, size, - "The size of `%s', as computed by sizeof." % type_name) - return size - else: - context.Display("no\n") - _LogFailed(context, src, st) - return 0 - - return 0 - -def CheckDeclaration(context, symbol, includes = None, language = None): - """Checks whether symbol is declared. - - Use the same test as autoconf, that is test whether the symbol is defined - as a macro or can be used as an r-value. - - Arguments: - symbol : str - the symbol to check - includes : str - Optional "header" can be defined to include a header file. - language : str - only C and C++ supported. - - Returns: - status : bool - True if the check failed, False if succeeded.""" - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - - if not includes: - includes = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for declaration %s: %s\n" % (type_name, msg)) - return msg - - src = includetext + includes - context.Display('Checking whether %s is declared... ' % symbol) - - src = src + r""" -int main() -{ -#ifndef %s - (void) %s; -#endif - ; - return 0; -} -""" % (symbol, symbol) - - st = context.CompileProg(src, suffix) - _YesNoResult(context, st, "HAVE_DECL_" + symbol, src, - "Set to 1 if %s is defined." % symbol) - return st - -def CheckLib(context, libs, func_name = None, header = None, - extra_libs = None, call = None, language = None, autoadd = 1, - append = True): - """ - Configure check for a C or C++ libraries "libs". Searches through - the list of libraries, until one is found where the test succeeds. - Tests if "func_name" or "call" exists in the library. Note: if it exists - in another library the test succeeds anyway! - Optional "header" can be defined to include a header file. If not given a - default prototype for "func_name" is added. - Optional "extra_libs" is a list of library names to be added after - "lib_name" in the build command. To be used for libraries that "lib_name" - depends on. - Optional "call" replaces the call to "func_name" in the test code. It must - consist of complete C statements, including a trailing ";". - Both "func_name" and "call" arguments are optional, and in that case, just - linking against the libs is tested. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - text = """ -%s -%s""" % (includetext, header) - - # Add a function declaration if needed. - if func_name and func_name != "main": - if not header: - text = text + """ -#ifdef __cplusplus -extern "C" -#endif -char %s(); -""" % func_name - - # The actual test code. - if not call: - call = "%s();" % func_name - - # if no function to test, leave main() blank - text = text + """ -int -main() { - %s -return 0; -} -""" % (call or "") - - if call: - i = call.find("\n") - if i > 0: - calltext = call[:i] + ".." - elif call[-1] == ';': - calltext = call[:-1] - else: - calltext = call - - for lib_name in libs: - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for library %s: %s\n" % (lib_name, msg)) - return msg - - # if a function was specified to run in main(), say it - if call: - context.Display("Checking for %s in %s library %s... " - % (calltext, lang, lib_name)) - # otherwise, just say the name of library and language - else: - context.Display("Checking for %s library %s... " - % (lang, lib_name)) - - if lib_name: - l = [ lib_name ] - if extra_libs: - l.extend(extra_libs) - if append: - oldLIBS = context.AppendLIBS(l) - else: - oldLIBS = context.PrependLIBS(l) - sym = "HAVE_LIB" + lib_name - else: - oldLIBS = -1 - sym = None - - ret = context.BuildProg(text, suffix) - - _YesNoResult(context, ret, sym, text, - "Define to 1 if you have the `%s' library." % lib_name) - if oldLIBS != -1 and (ret or not autoadd): - context.SetLIBS(oldLIBS) - - if not ret: - return ret - - return ret - -# -# END OF PUBLIC FUNCTIONS -# - -def _YesNoResult(context, ret, key, text, comment = None): - """ - Handle the result of a test with a "yes" or "no" result. - "ret" is the return value: empty if OK, error message when not. - "key" is the name of the symbol to be defined (HAVE_foo). - "text" is the source code of the program used for testing. - "comment" is the C comment to add above the line defining the symbol (the - comment is automatically put inside a /* */). If None, no comment is added. - """ - if key: - _Have(context, key, not ret, comment) - if ret: - context.Display("no\n") - _LogFailed(context, text, ret) - else: - context.Display("yes\n") - - -def _Have(context, key, have, comment = None): - """ - Store result of a test in context.havedict and context.headerfilename. - "key" is a "HAVE_abc" name. It is turned into all CAPITALS and non- - alphanumerics are replaced by an underscore. - The value of "have" can be: - 1 - Feature is defined, add "#define key". - 0 - Feature is not defined, add "/* #undef key */". - Adding "undef" is what autoconf does. Not useful for the - compiler, but it shows that the test was done. - number - Feature is defined to this number "#define key have". - Doesn't work for 0 or 1, use a string then. - string - Feature is defined to this string "#define key have". - Give "have" as is should appear in the header file, include quotes - when desired and escape special characters! - """ - key_up = key.upper() - key_up = re.sub('[^A-Z0-9_]', '_', key_up) - context.havedict[key_up] = have - if have == 1: - line = "#define %s 1\n" % key_up - elif have == 0: - line = "/* #undef %s */\n" % key_up - elif isinstance(have, IntType): - line = "#define %s %d\n" % (key_up, have) - else: - line = "#define %s %s\n" % (key_up, str(have)) - - if comment is not None: - lines = "\n/* %s */\n" % comment + line - else: - lines = "\n" + line - - if context.headerfilename: - f = open(context.headerfilename, "a") - f.write(lines) - f.close() - elif hasattr(context,'config_h'): - context.config_h = context.config_h + lines - - -def _LogFailed(context, text, msg): - """ - Write to the log about a failed program. - Add line numbers, so that error messages can be understood. - """ - if LogInputFiles: - context.Log("Failed program was:\n") - lines = text.split('\n') - if len(lines) and lines[-1] == '': - lines = lines[:-1] # remove trailing empty line - n = 1 - for line in lines: - context.Log("%d: %s\n" % (n, line)) - n = n + 1 - if LogErrorMessages: - context.Log("Error message: %s\n" % msg) - - -def _lang2suffix(lang): - """ - Convert a language name to a suffix. - When "lang" is empty or None C is assumed. - Returns a tuple (lang, suffix, None) when it works. - For an unrecognized language returns (None, None, msg). - Where: - lang = the unified language name - suffix = the suffix, including the leading dot - msg = an error message - """ - if not lang or lang in ["C", "c"]: - return ("C", ".c", None) - if lang in ["c++", "C++", "cpp", "CXX", "cxx"]: - return ("C++", ".cpp", None) - - return None, None, "Unsupported language: %s" % lang - - -# vim: set sw=4 et sts=4 tw=79 fo+=l: - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Debug.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Debug.py deleted file mode 100644 index ec7dbbd6e..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Debug.py +++ /dev/null @@ -1,220 +0,0 @@ -"""SCons.Debug - -Code for debugging SCons internal things. Shouldn't be -needed by most users. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Debug.py 5023 2010/06/14 22:05:46 scons" - -import os -import sys -import time -import weakref - -tracked_classes = {} - -def logInstanceCreation(instance, name=None): - if name is None: - name = instance.__class__.__name__ - if name not in tracked_classes: - tracked_classes[name] = [] - tracked_classes[name].append(weakref.ref(instance)) - -def string_to_classes(s): - if s == '*': - return sorted(tracked_classes.keys()) - else: - return s.split() - -def fetchLoggedInstances(classes="*"): - classnames = string_to_classes(classes) - return [(cn, len(tracked_classes[cn])) for cn in classnames] - -def countLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write("%s: %d\n" % (classname, len(tracked_classes[classname]))) - -def listLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write('\n%s:\n' % classname) - for ref in tracked_classes[classname]: - obj = ref() - if obj is not None: - file.write(' %s\n' % repr(obj)) - -def dumpLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write('\n%s:\n' % classname) - for ref in tracked_classes[classname]: - obj = ref() - if obj is not None: - file.write(' %s:\n' % obj) - for key, value in obj.__dict__.items(): - file.write(' %20s : %s\n' % (key, value)) - - - -if sys.platform[:5] == "linux": - # Linux doesn't actually support memory usage stats from getrusage(). - def memory(): - mstr = open('/proc/self/stat').read() - mstr = mstr.split()[22] - return int(mstr) -elif sys.platform[:6] == 'darwin': - #TODO really get memory stats for OS X - def memory(): - return 0 -else: - try: - import resource - except ImportError: - try: - import win32process - import win32api - except ImportError: - def memory(): - return 0 - else: - def memory(): - process_handle = win32api.GetCurrentProcess() - memory_info = win32process.GetProcessMemoryInfo( process_handle ) - return memory_info['PeakWorkingSetSize'] - else: - def memory(): - res = resource.getrusage(resource.RUSAGE_SELF) - return res[4] - -# returns caller's stack -def caller_stack(*backlist): - import traceback - if not backlist: - backlist = [0] - result = [] - for back in backlist: - tb = traceback.extract_stack(limit=3+back) - key = tb[0][:3] - result.append('%s:%d(%s)' % func_shorten(key)) - return result - -caller_bases = {} -caller_dicts = {} - -# trace a caller's stack -def caller_trace(back=0): - import traceback - tb = traceback.extract_stack(limit=3+back) - tb.reverse() - callee = tb[1][:3] - caller_bases[callee] = caller_bases.get(callee, 0) + 1 - for caller in tb[2:]: - caller = callee + caller[:3] - try: - entry = caller_dicts[callee] - except KeyError: - caller_dicts[callee] = entry = {} - entry[caller] = entry.get(caller, 0) + 1 - callee = caller - -# print a single caller and its callers, if any -def _dump_one_caller(key, file, level=0): - leader = ' '*level - for v,c in sorted([(-v,c) for c,v in caller_dicts[key].items()]): - file.write("%s %6d %s:%d(%s)\n" % ((leader,-v) + func_shorten(c[-3:]))) - if c in caller_dicts: - _dump_one_caller(c, file, level+1) - -# print each call tree -def dump_caller_counts(file=sys.stdout): - for k in sorted(caller_bases.keys()): - file.write("Callers of %s:%d(%s), %d calls:\n" - % (func_shorten(k) + (caller_bases[k],))) - _dump_one_caller(k, file) - -shorten_list = [ - ( '/scons/SCons/', 1), - ( '/src/engine/SCons/', 1), - ( '/usr/lib/python', 0), -] - -if os.sep != '/': - shorten_list = [(t[0].replace('/', os.sep), t[1]) for t in shorten_list] - -def func_shorten(func_tuple): - f = func_tuple[0] - for t in shorten_list: - i = f.find(t[0]) - if i >= 0: - if t[1]: - i = i + len(t[0]) - return (f[i:],)+func_tuple[1:] - return func_tuple - - -TraceFP = {} -if sys.platform == 'win32': - TraceDefault = 'con' -else: - TraceDefault = '/dev/tty' - -TimeStampDefault = None -StartTime = time.time() -PreviousTime = StartTime - -def Trace(msg, file=None, mode='w', tstamp=None): - """Write a trace message to a file. Whenever a file is specified, - it becomes the default for the next call to Trace().""" - global TraceDefault - global TimeStampDefault - global PreviousTime - if file is None: - file = TraceDefault - else: - TraceDefault = file - if tstamp is None: - tstamp = TimeStampDefault - else: - TimeStampDefault = tstamp - try: - fp = TraceFP[file] - except KeyError: - try: - fp = TraceFP[file] = open(file, mode) - except TypeError: - # Assume we were passed an open file pointer. - fp = file - if tstamp: - now = time.time() - fp.write('%8.4f %8.4f: ' % (now - StartTime, now - PreviousTime)) - PreviousTime = now - fp.write(msg) - fp.flush() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Defaults.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Defaults.py deleted file mode 100644 index 8530aa31b..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Defaults.py +++ /dev/null @@ -1,480 +0,0 @@ -"""SCons.Defaults - -Builders and other things for the local site. Here's where we'll -duplicate the functionality of autoconf until we move it into the -installation procedure or use something like qmconf. - -The code that reads the registry to find MSVC components was borrowed -from distutils.msvccompiler. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -from __future__ import division - -__revision__ = "src/engine/SCons/Defaults.py 5023 2010/06/14 22:05:46 scons" - - -import os -import errno -import shutil -import stat -import time -import sys - -import SCons.Action -import SCons.Builder -import SCons.CacheDir -import SCons.Environment -import SCons.PathList -import SCons.Subst -import SCons.Tool - -# A placeholder for a default Environment (for fetching source files -# from source code management systems and the like). This must be -# initialized later, after the top-level directory is set by the calling -# interface. -_default_env = None - -# Lazily instantiate the default environment so the overhead of creating -# it doesn't apply when it's not needed. -def _fetch_DefaultEnvironment(*args, **kw): - """ - Returns the already-created default construction environment. - """ - global _default_env - return _default_env - -def DefaultEnvironment(*args, **kw): - """ - Initial public entry point for creating the default construction - Environment. - - After creating the environment, we overwrite our name - (DefaultEnvironment) with the _fetch_DefaultEnvironment() function, - which more efficiently returns the initialized default construction - environment without checking for its existence. - - (This function still exists with its _default_check because someone - else (*cough* Script/__init__.py *cough*) may keep a reference - to this function. So we can't use the fully functional idiom of - having the name originally be a something that *only* creates the - construction environment and then overwrites the name.) - """ - global _default_env - if not _default_env: - import SCons.Util - _default_env = SCons.Environment.Environment(*args, **kw) - if SCons.Util.md5: - _default_env.Decider('MD5') - else: - _default_env.Decider('timestamp-match') - global DefaultEnvironment - DefaultEnvironment = _fetch_DefaultEnvironment - _default_env._CacheDir_path = None - return _default_env - -# Emitters for setting the shared attribute on object files, -# and an action for checking that all of the source files -# going into a shared library are, in fact, shared. -def StaticObjectEmitter(target, source, env): - for tgt in target: - tgt.attributes.shared = None - return (target, source) - -def SharedObjectEmitter(target, source, env): - for tgt in target: - tgt.attributes.shared = 1 - return (target, source) - -def SharedFlagChecker(source, target, env): - same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME') - if same == '0' or same == '' or same == 'False': - for src in source: - try: - shared = src.attributes.shared - except AttributeError: - shared = None - if not shared: - raise SCons.Errors.UserError("Source file: %s is static and is not compatible with shared target: %s" % (src, target[0])) - -SharedCheck = SCons.Action.Action(SharedFlagChecker, None) - -# Some people were using these variable name before we made -# SourceFileScanner part of the public interface. Don't break their -# SConscript files until we've given them some fair warning and a -# transition period. -CScan = SCons.Tool.CScanner -DScan = SCons.Tool.DScanner -LaTeXScan = SCons.Tool.LaTeXScanner -ObjSourceScan = SCons.Tool.SourceFileScanner -ProgScan = SCons.Tool.ProgramScanner - -# These aren't really tool scanners, so they don't quite belong with -# the rest of those in Tool/__init__.py, but I'm not sure where else -# they should go. Leave them here for now. -import SCons.Scanner.Dir -DirScanner = SCons.Scanner.Dir.DirScanner() -DirEntryScanner = SCons.Scanner.Dir.DirEntryScanner() - -# Actions for common languages. -CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR") -ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR") -CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR") -ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR") - -ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR") -ASPPAction = SCons.Action.Action("$ASPPCOM", "$ASPPCOMSTR") - -LinkAction = SCons.Action.Action("$LINKCOM", "$LINKCOMSTR") -ShLinkAction = SCons.Action.Action("$SHLINKCOM", "$SHLINKCOMSTR") - -LdModuleLinkAction = SCons.Action.Action("$LDMODULECOM", "$LDMODULECOMSTR") - -# Common tasks that we allow users to perform in platform-independent -# ways by creating ActionFactory instances. -ActionFactory = SCons.Action.ActionFactory - -def get_paths_str(dest): - # If dest is a list, we need to manually call str() on each element - if SCons.Util.is_List(dest): - elem_strs = [] - for element in dest: - elem_strs.append('"' + str(element) + '"') - return '[' + ', '.join(elem_strs) + ']' - else: - return '"' + str(dest) + '"' - -def chmod_func(dest, mode): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for element in dest: - os.chmod(str(element), mode) - -def chmod_strfunc(dest, mode): - return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode) - -Chmod = ActionFactory(chmod_func, chmod_strfunc) - -def copy_func(dest, src): - SCons.Node.FS.invalidate_node_memos(dest) - if SCons.Util.is_List(src) and os.path.isdir(dest): - for file in src: - shutil.copy2(file, dest) - return 0 - elif os.path.isfile(src): - return shutil.copy2(src, dest) - else: - return shutil.copytree(src, dest, 1) - -Copy = ActionFactory(copy_func, - lambda dest, src: 'Copy("%s", "%s")' % (dest, src), - convert=str) - -def delete_func(dest, must_exist=0): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for entry in dest: - entry = str(entry) - if not must_exist and not os.path.exists(entry): - continue - if not os.path.exists(entry) or os.path.isfile(entry): - os.unlink(entry) - continue - else: - shutil.rmtree(entry, 1) - continue - -def delete_strfunc(dest, must_exist=0): - return 'Delete(%s)' % get_paths_str(dest) - -Delete = ActionFactory(delete_func, delete_strfunc) - -def mkdir_func(dest): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for entry in dest: - try: - os.makedirs(str(entry)) - except os.error, e: - p = str(entry) - if (e.args[0] == errno.EEXIST or - (sys.platform=='win32' and e.args[0]==183)) \ - and os.path.isdir(str(entry)): - pass # not an error if already exists - else: - raise - -Mkdir = ActionFactory(mkdir_func, - lambda dir: 'Mkdir(%s)' % get_paths_str(dir)) - -def move_func(dest, src): - SCons.Node.FS.invalidate_node_memos(dest) - SCons.Node.FS.invalidate_node_memos(src) - shutil.move(src, dest) - -Move = ActionFactory(move_func, - lambda dest, src: 'Move("%s", "%s")' % (dest, src), - convert=str) - -def touch_func(dest): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for file in dest: - file = str(file) - mtime = int(time.time()) - if os.path.exists(file): - atime = os.path.getatime(file) - else: - open(file, 'w') - atime = mtime - os.utime(file, (atime, mtime)) - -Touch = ActionFactory(touch_func, - lambda file: 'Touch(%s)' % get_paths_str(file)) - -# Internal utility functions - -def _concat(prefix, list, suffix, env, f=lambda x: x, target=None, source=None): - """ - Creates a new list from 'list' by first interpolating each element - in the list using the 'env' dictionary and then calling f on the - list, and finally calling _concat_ixes to concatenate 'prefix' and - 'suffix' onto each element of the list. - """ - if not list: - return list - - l = f(SCons.PathList.PathList(list).subst_path(env, target, source)) - if l is not None: - list = l - - return _concat_ixes(prefix, list, suffix, env) - -def _concat_ixes(prefix, list, suffix, env): - """ - Creates a new list from 'list' by concatenating the 'prefix' and - 'suffix' arguments onto each element of the list. A trailing space - on 'prefix' or leading space on 'suffix' will cause them to be put - into separate list elements rather than being concatenated. - """ - - result = [] - - # ensure that prefix and suffix are strings - prefix = str(env.subst(prefix, SCons.Subst.SUBST_RAW)) - suffix = str(env.subst(suffix, SCons.Subst.SUBST_RAW)) - - for x in list: - if isinstance(x, SCons.Node.FS.File): - result.append(x) - continue - x = str(x) - if x: - - if prefix: - if prefix[-1] == ' ': - result.append(prefix[:-1]) - elif x[:len(prefix)] != prefix: - x = prefix + x - - result.append(x) - - if suffix: - if suffix[0] == ' ': - result.append(suffix[1:]) - elif x[-len(suffix):] != suffix: - result[-1] = result[-1]+suffix - - return result - -def _stripixes(prefix, itms, suffix, stripprefixes, stripsuffixes, env, c=None): - """ - This is a wrapper around _concat()/_concat_ixes() that checks for - the existence of prefixes or suffixes on list items and strips them - where it finds them. This is used by tools (like the GNU linker) - that need to turn something like 'libfoo.a' into '-lfoo'. - """ - - if not itms: - return itms - - if not callable(c): - env_c = env['_concat'] - if env_c != _concat and callable(env_c): - # There's a custom _concat() method in the construction - # environment, and we've allowed people to set that in - # the past (see test/custom-concat.py), so preserve the - # backwards compatibility. - c = env_c - else: - c = _concat_ixes - - stripprefixes = list(map(env.subst, SCons.Util.flatten(stripprefixes))) - stripsuffixes = list(map(env.subst, SCons.Util.flatten(stripsuffixes))) - - stripped = [] - for l in SCons.PathList.PathList(itms).subst_path(env, None, None): - if isinstance(l, SCons.Node.FS.File): - stripped.append(l) - continue - - if not SCons.Util.is_String(l): - l = str(l) - - for stripprefix in stripprefixes: - lsp = len(stripprefix) - if l[:lsp] == stripprefix: - l = l[lsp:] - # Do not strip more than one prefix - break - - for stripsuffix in stripsuffixes: - lss = len(stripsuffix) - if l[-lss:] == stripsuffix: - l = l[:-lss] - # Do not strip more than one suffix - break - - stripped.append(l) - - return c(prefix, stripped, suffix, env) - -def processDefines(defs): - """process defines, resolving strings, lists, dictionaries, into a list of - strings - """ - if SCons.Util.is_List(defs): - l = [] - for d in defs: - if SCons.Util.is_List(d) or isinstance(d, tuple): - l.append(str(d[0]) + '=' + str(d[1])) - else: - l.append(str(d)) - elif SCons.Util.is_Dict(defs): - # The items in a dictionary are stored in random order, but - # if the order of the command-line options changes from - # invocation to invocation, then the signature of the command - # line will change and we'll get random unnecessary rebuilds. - # Consequently, we have to sort the keys to ensure a - # consistent order... - l = [] - for k,v in sorted(defs.items()): - if v is None: - l.append(str(k)) - else: - l.append(str(k) + '=' + str(v)) - else: - l = [str(defs)] - return l - -def _defines(prefix, defs, suffix, env, c=_concat_ixes): - """A wrapper around _concat_ixes that turns a list or string - into a list of C preprocessor command-line definitions. - """ - - return c(prefix, env.subst_path(processDefines(defs)), suffix, env) - -class NullCmdGenerator(object): - """This is a callable class that can be used in place of other - command generators if you don't want them to do anything. - - The __call__ method for this class simply returns the thing - you instantiated it with. - - Example usage: - env["DO_NOTHING"] = NullCmdGenerator - env["LINKCOM"] = "${DO_NOTHING('$LINK $SOURCES $TARGET')}" - """ - - def __init__(self, cmd): - self.cmd = cmd - - def __call__(self, target, source, env, for_signature=None): - return self.cmd - -class Variable_Method_Caller(object): - """A class for finding a construction variable on the stack and - calling one of its methods. - - We use this to support "construction variables" in our string - eval()s that actually stand in for methods--specifically, use - of "RDirs" in call to _concat that should actually execute the - "TARGET.RDirs" method. (We used to support this by creating a little - "build dictionary" that mapped RDirs to the method, but this got in - the way of Memoizing construction environments, because we had to - create new environment objects to hold the variables.) - """ - def __init__(self, variable, method): - self.variable = variable - self.method = method - def __call__(self, *args, **kw): - try: 1//0 - except ZeroDivisionError: - # Don't start iterating with the current stack-frame to - # prevent creating reference cycles (f_back is safe). - frame = sys.exc_info()[2].tb_frame.f_back - variable = self.variable - while frame: - if variable in frame.f_locals: - v = frame.f_locals[variable] - if v: - method = getattr(v, self.method) - return method(*args, **kw) - frame = frame.f_back - return None - -ConstructionEnvironment = { - 'BUILDERS' : {}, - 'SCANNERS' : [], - 'CONFIGUREDIR' : '#/.sconf_temp', - 'CONFIGURELOG' : '#/config.log', - 'CPPSUFFIXES' : SCons.Tool.CSuffixes, - 'DSUFFIXES' : SCons.Tool.DSuffixes, - 'ENV' : {}, - 'IDLSUFFIXES' : SCons.Tool.IDLSuffixes, -# 'LATEXSUFFIXES' : SCons.Tool.LaTeXSuffixes, # moved to the TeX tools generate functions - '_concat' : _concat, - '_defines' : _defines, - '_stripixes' : _stripixes, - '_LIBFLAGS' : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}', - '_LIBDIRFLAGS' : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)', - '_CPPINCFLAGS' : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)', - '_CPPDEFFLAGS' : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}', - 'TEMPFILE' : NullCmdGenerator, - 'Dir' : Variable_Method_Caller('TARGET', 'Dir'), - 'Dirs' : Variable_Method_Caller('TARGET', 'Dirs'), - 'File' : Variable_Method_Caller('TARGET', 'File'), - 'RDirs' : Variable_Method_Caller('TARGET', 'RDirs'), -} - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Environment.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Environment.py deleted file mode 100644 index 50a357df3..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Environment.py +++ /dev/null @@ -1,2318 +0,0 @@ -"""SCons.Environment - -Base class for construction Environments. These are -the primary objects used to communicate dependency and -construction information to the build engine. - -Keyword arguments supplied when the construction Environment -is created are construction variables used to initialize the -Environment -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Environment.py 5023 2010/06/14 22:05:46 scons" - - -import copy -import os -import sys -import re -import shlex -from collections import UserDict - -import SCons.Action -import SCons.Builder -from SCons.Debug import logInstanceCreation -import SCons.Defaults -import SCons.Errors -import SCons.Memoize -import SCons.Node -import SCons.Node.Alias -import SCons.Node.FS -import SCons.Node.Python -import SCons.Platform -import SCons.SConf -import SCons.SConsign -import SCons.Subst -import SCons.Tool -import SCons.Util -import SCons.Warnings - -class _Null(object): - pass - -_null = _Null - -_warn_copy_deprecated = True -_warn_source_signatures_deprecated = True -_warn_target_signatures_deprecated = True - -CleanTargets = {} -CalculatorArgs = {} - -semi_deepcopy = SCons.Util.semi_deepcopy - -# Pull UserError into the global name space for the benefit of -# Environment().SourceSignatures(), which has some import statements -# which seem to mess up its ability to reference SCons directly. -UserError = SCons.Errors.UserError - -def alias_builder(env, target, source): - pass - -AliasBuilder = SCons.Builder.Builder(action = alias_builder, - target_factory = SCons.Node.Alias.default_ans.Alias, - source_factory = SCons.Node.FS.Entry, - multi = 1, - is_explicit = None, - name='AliasBuilder') - -def apply_tools(env, tools, toolpath): - # Store the toolpath in the Environment. - if toolpath is not None: - env['toolpath'] = toolpath - - if not tools: - return - # Filter out null tools from the list. - for tool in [_f for _f in tools if _f]: - if SCons.Util.is_List(tool) or isinstance(tool, tuple): - toolname = tool[0] - toolargs = tool[1] # should be a dict of kw args - tool = env.Tool(toolname, **toolargs) - else: - env.Tool(tool) - -# These names are (or will be) controlled by SCons; users should never -# set or override them. This warning can optionally be turned off, -# but scons will still ignore the illegal variable names even if it's off. -reserved_construction_var_names = [ - 'CHANGED_SOURCES', - 'CHANGED_TARGETS', - 'SOURCE', - 'SOURCES', - 'TARGET', - 'TARGETS', - 'UNCHANGED_SOURCES', - 'UNCHANGED_TARGETS', -] - -future_reserved_construction_var_names = [ - #'HOST_OS', - #'HOST_ARCH', - #'HOST_CPU', - ] - -def copy_non_reserved_keywords(dict): - result = semi_deepcopy(dict) - for k in result.keys(): - if k in reserved_construction_var_names: - msg = "Ignoring attempt to set reserved variable `$%s'" - SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % k) - del result[k] - return result - -def _set_reserved(env, key, value): - msg = "Ignoring attempt to set reserved variable `$%s'" - SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % key) - -def _set_future_reserved(env, key, value): - env._dict[key] = value - msg = "`$%s' will be reserved in a future release and setting it will become ignored" - SCons.Warnings.warn(SCons.Warnings.FutureReservedVariableWarning, msg % key) - -def _set_BUILDERS(env, key, value): - try: - bd = env._dict[key] - for k in bd.keys(): - del bd[k] - except KeyError: - bd = BuilderDict(kwbd, env) - env._dict[key] = bd - for k, v in value.items(): - if not SCons.Builder.is_a_Builder(v): - raise SCons.Errors.UserError('%s is not a Builder.' % repr(v)) - bd.update(value) - -def _del_SCANNERS(env, key): - del env._dict[key] - env.scanner_map_delete() - -def _set_SCANNERS(env, key, value): - env._dict[key] = value - env.scanner_map_delete() - -def _delete_duplicates(l, keep_last): - """Delete duplicates from a sequence, keeping the first or last.""" - seen={} - result=[] - if keep_last: # reverse in & out, then keep first - l.reverse() - for i in l: - try: - if i not in seen: - result.append(i) - seen[i]=1 - except TypeError: - # probably unhashable. Just keep it. - result.append(i) - if keep_last: - result.reverse() - return result - - - -# The following is partly based on code in a comment added by Peter -# Shannon at the following page (there called the "transplant" class): -# -# ASPN : Python Cookbook : Dynamically added methods to a class -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732 -# -# We had independently been using the idiom as BuilderWrapper, but -# factoring out the common parts into this base class, and making -# BuilderWrapper a subclass that overrides __call__() to enforce specific -# Builder calling conventions, simplified some of our higher-layer code. - -class MethodWrapper(object): - """ - A generic Wrapper class that associates a method (which can - actually be any callable) with an object. As part of creating this - MethodWrapper object an attribute with the specified (by default, - the name of the supplied method) is added to the underlying object. - When that new "method" is called, our __call__() method adds the - object as the first argument, simulating the Python behavior of - supplying "self" on method calls. - - We hang on to the name by which the method was added to the underlying - base class so that we can provide a method to "clone" ourselves onto - a new underlying object being copied (without which we wouldn't need - to save that info). - """ - def __init__(self, object, method, name=None): - if name is None: - name = method.__name__ - self.object = object - self.method = method - self.name = name - setattr(self.object, name, self) - - def __call__(self, *args, **kwargs): - nargs = (self.object,) + args - return self.method(*nargs, **kwargs) - - def clone(self, new_object): - """ - Returns an object that re-binds the underlying "method" to - the specified new object. - """ - return self.__class__(new_object, self.method, self.name) - -class BuilderWrapper(MethodWrapper): - """ - A MethodWrapper subclass that that associates an environment with - a Builder. - - This mainly exists to wrap the __call__() function so that all calls - to Builders can have their argument lists massaged in the same way - (treat a lone argument as the source, treat two arguments as target - then source, make sure both target and source are lists) without - having to have cut-and-paste code to do it. - - As a bit of obsessive backwards compatibility, we also intercept - attempts to get or set the "env" or "builder" attributes, which were - the names we used before we put the common functionality into the - MethodWrapper base class. We'll keep this around for a while in case - people shipped Tool modules that reached into the wrapper (like the - Tool/qt.py module does, or did). There shouldn't be a lot attribute - fetching or setting on these, so a little extra work shouldn't hurt. - """ - def __call__(self, target=None, source=_null, *args, **kw): - if source is _null: - source = target - target = None - if target is not None and not SCons.Util.is_List(target): - target = [target] - if source is not None and not SCons.Util.is_List(source): - source = [source] - return MethodWrapper.__call__(self, target, source, *args, **kw) - - def __repr__(self): - return '' % repr(self.name) - - def __str__(self): - return self.__repr__() - - def __getattr__(self, name): - if name == 'env': - return self.object - elif name == 'builder': - return self.method - else: - raise AttributeError(name) - - def __setattr__(self, name, value): - if name == 'env': - self.object = value - elif name == 'builder': - self.method = value - else: - self.__dict__[name] = value - - # This allows a Builder to be executed directly - # through the Environment to which it's attached. - # In practice, we shouldn't need this, because - # builders actually get executed through a Node. - # But we do have a unit test for this, and can't - # yet rule out that it would be useful in the - # future, so leave it for now. - #def execute(self, **kw): - # kw['env'] = self.env - # self.builder.execute(**kw) - -class BuilderDict(UserDict): - """This is a dictionary-like class used by an Environment to hold - the Builders. We need to do this because every time someone changes - the Builders in the Environment's BUILDERS dictionary, we must - update the Environment's attributes.""" - def __init__(self, dict, env): - # Set self.env before calling the superclass initialization, - # because it will end up calling our other methods, which will - # need to point the values in this dictionary to self.env. - self.env = env - UserDict.__init__(self, dict) - - def __semi_deepcopy__(self): - return self.__class__(self.data, self.env) - - def __setitem__(self, item, val): - try: - method = getattr(self.env, item).method - except AttributeError: - pass - else: - self.env.RemoveMethod(method) - UserDict.__setitem__(self, item, val) - BuilderWrapper(self.env, val, item) - - def __delitem__(self, item): - UserDict.__delitem__(self, item) - delattr(self.env, item) - - def update(self, dict): - for i, v in dict.items(): - self.__setitem__(i, v) - - - -_is_valid_var = re.compile(r'[_a-zA-Z]\w*$') - -def is_valid_construction_var(varstr): - """Return if the specified string is a legitimate construction - variable. - """ - return _is_valid_var.match(varstr) - - - -class SubstitutionEnvironment(object): - """Base class for different flavors of construction environments. - - This class contains a minimal set of methods that handle contruction - variable expansion and conversion of strings to Nodes, which may or - may not be actually useful as a stand-alone class. Which methods - ended up in this class is pretty arbitrary right now. They're - basically the ones which we've empirically determined are common to - the different construction environment subclasses, and most of the - others that use or touch the underlying dictionary of construction - variables. - - Eventually, this class should contain all the methods that we - determine are necessary for a "minimal" interface to the build engine. - A full "native Python" SCons environment has gotten pretty heavyweight - with all of the methods and Tools and construction variables we've - jammed in there, so it would be nice to have a lighter weight - alternative for interfaces that don't need all of the bells and - whistles. (At some point, we'll also probably rename this class - "Base," since that more reflects what we want this class to become, - but because we've released comments that tell people to subclass - Environment.Base to create their own flavors of construction - environment, we'll save that for a future refactoring when this - class actually becomes useful.) - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - def __init__(self, **kw): - """Initialization of an underlying SubstitutionEnvironment class. - """ - if __debug__: logInstanceCreation(self, 'Environment.SubstitutionEnvironment') - self.fs = SCons.Node.FS.get_default_fs() - self.ans = SCons.Node.Alias.default_ans - self.lookup_list = SCons.Node.arg2nodes_lookups - self._dict = kw.copy() - self._init_special() - self.added_methods = [] - #self._memo = {} - - def _init_special(self): - """Initial the dispatch tables for special handling of - special construction variables.""" - self._special_del = {} - self._special_del['SCANNERS'] = _del_SCANNERS - - self._special_set = {} - for key in reserved_construction_var_names: - self._special_set[key] = _set_reserved - for key in future_reserved_construction_var_names: - self._special_set[key] = _set_future_reserved - self._special_set['BUILDERS'] = _set_BUILDERS - self._special_set['SCANNERS'] = _set_SCANNERS - - # Freeze the keys of self._special_set in a list for use by - # methods that need to check. (Empirically, list scanning has - # gotten better than dict.has_key() in Python 2.5.) - self._special_set_keys = list(self._special_set.keys()) - - def __cmp__(self, other): - return cmp(self._dict, other._dict) - - def __delitem__(self, key): - special = self._special_del.get(key) - if special: - special(self, key) - else: - del self._dict[key] - - def __getitem__(self, key): - return self._dict[key] - - def __setitem__(self, key, value): - # This is heavily used. This implementation is the best we have - # according to the timings in bench/env.__setitem__.py. - # - # The "key in self._special_set_keys" test here seems to perform - # pretty well for the number of keys we have. A hard-coded - # list works a little better in Python 2.5, but that has the - # disadvantage of maybe getting out of sync if we ever add more - # variable names. Using self._special_set.has_key() works a - # little better in Python 2.4, but is worse than this test. - # So right now it seems like a good trade-off, but feel free to - # revisit this with bench/env.__setitem__.py as needed (and - # as newer versions of Python come out). - if key in self._special_set_keys: - self._special_set[key](self, key, value) - else: - # If we already have the entry, then it's obviously a valid - # key and we don't need to check. If we do check, using a - # global, pre-compiled regular expression directly is more - # efficient than calling another function or a method. - if key not in self._dict \ - and not _is_valid_var.match(key): - raise SCons.Errors.UserError("Illegal construction variable `%s'" % key) - self._dict[key] = value - - def get(self, key, default=None): - """Emulates the get() method of dictionaries.""" - return self._dict.get(key, default) - - def has_key(self, key): - return key in self._dict - - def __contains__(self, key): - return self._dict.__contains__(key) - - def items(self): - return list(self._dict.items()) - - def arg2nodes(self, args, node_factory=_null, lookup_list=_null, **kw): - if node_factory is _null: - node_factory = self.fs.File - if lookup_list is _null: - lookup_list = self.lookup_list - - if not args: - return [] - - args = SCons.Util.flatten(args) - - nodes = [] - for v in args: - if SCons.Util.is_String(v): - n = None - for l in lookup_list: - n = l(v) - if n is not None: - break - if n is not None: - if SCons.Util.is_String(n): - # n = self.subst(n, raw=1, **kw) - kw['raw'] = 1 - n = self.subst(n, **kw) - if node_factory: - n = node_factory(n) - if SCons.Util.is_List(n): - nodes.extend(n) - else: - nodes.append(n) - elif node_factory: - # v = node_factory(self.subst(v, raw=1, **kw)) - kw['raw'] = 1 - v = node_factory(self.subst(v, **kw)) - if SCons.Util.is_List(v): - nodes.extend(v) - else: - nodes.append(v) - else: - nodes.append(v) - - return nodes - - def gvars(self): - return self._dict - - def lvars(self): - return {} - - def subst(self, string, raw=0, target=None, source=None, conv=None, executor=None): - """Recursively interpolates construction variables from the - Environment into the specified string, returning the expanded - result. Construction variables are specified by a $ prefix - in the string and begin with an initial underscore or - alphabetic character followed by any number of underscores - or alphanumeric characters. The construction variable names - may be surrounded by curly braces to separate the name from - trailing characters. - """ - gvars = self.gvars() - lvars = self.lvars() - lvars['__env__'] = self - if executor: - lvars.update(executor.get_lvars()) - return SCons.Subst.scons_subst(string, self, raw, target, source, gvars, lvars, conv) - - def subst_kw(self, kw, raw=0, target=None, source=None): - nkw = {} - for k, v in kw.items(): - k = self.subst(k, raw, target, source) - if SCons.Util.is_String(v): - v = self.subst(v, raw, target, source) - nkw[k] = v - return nkw - - def subst_list(self, string, raw=0, target=None, source=None, conv=None, executor=None): - """Calls through to SCons.Subst.scons_subst_list(). See - the documentation for that function.""" - gvars = self.gvars() - lvars = self.lvars() - lvars['__env__'] = self - if executor: - lvars.update(executor.get_lvars()) - return SCons.Subst.scons_subst_list(string, self, raw, target, source, gvars, lvars, conv) - - def subst_path(self, path, target=None, source=None): - """Substitute a path list, turning EntryProxies into Nodes - and leaving Nodes (and other objects) as-is.""" - - if not SCons.Util.is_List(path): - path = [path] - - def s(obj): - """This is the "string conversion" routine that we have our - substitutions use to return Nodes, not strings. This relies - on the fact that an EntryProxy object has a get() method that - returns the underlying Node that it wraps, which is a bit of - architectural dependence that we might need to break or modify - in the future in response to additional requirements.""" - try: - get = obj.get - except AttributeError: - obj = SCons.Util.to_String_for_subst(obj) - else: - obj = get() - return obj - - r = [] - for p in path: - if SCons.Util.is_String(p): - p = self.subst(p, target=target, source=source, conv=s) - if SCons.Util.is_List(p): - if len(p) == 1: - p = p[0] - else: - # We have an object plus a string, or multiple - # objects that we need to smush together. No choice - # but to make them into a string. - p = ''.join(map(SCons.Util.to_String_for_subst, p)) - else: - p = s(p) - r.append(p) - return r - - subst_target_source = subst - - def backtick(self, command): - import subprocess - # common arguments - kw = { 'stdin' : 'devnull', - 'stdout' : subprocess.PIPE, - 'stderr' : subprocess.PIPE, - 'universal_newlines' : True, - } - # if the command is a list, assume it's been quoted - # othewise force a shell - if not SCons.Util.is_List(command): kw['shell'] = True - # run constructed command - p = SCons.Action._subproc(self, command, **kw) - out,err = p.communicate() - status = p.wait() - if err: - sys.stderr.write(unicode(err)) - if status: - raise OSError("'%s' exited %d" % (command, status)) - return out - - def AddMethod(self, function, name=None): - """ - Adds the specified function as a method of this construction - environment with the specified name. If the name is omitted, - the default name is the name of the function itself. - """ - method = MethodWrapper(self, function, name) - self.added_methods.append(method) - - def RemoveMethod(self, function): - """ - Removes the specified function's MethodWrapper from the - added_methods list, so we don't re-bind it when making a clone. - """ - self.added_methods = [dm for dm in self.added_methods if not dm.method is function] - - def Override(self, overrides): - """ - Produce a modified environment whose variables are overriden by - the overrides dictionaries. "overrides" is a dictionary that - will override the variables of this environment. - - This function is much more efficient than Clone() or creating - a new Environment because it doesn't copy the construction - environment dictionary, it just wraps the underlying construction - environment, and doesn't even create a wrapper object if there - are no overrides. - """ - if not overrides: return self - o = copy_non_reserved_keywords(overrides) - if not o: return self - overrides = {} - merges = None - for key, value in o.items(): - if key == 'parse_flags': - merges = value - else: - overrides[key] = SCons.Subst.scons_subst_once(value, self, key) - env = OverrideEnvironment(self, overrides) - if merges: env.MergeFlags(merges) - return env - - def ParseFlags(self, *flags): - """ - Parse the set of flags and return a dict with the flags placed - in the appropriate entry. The flags are treated as a typical - set of command-line flags for a GNU-like toolchain and used to - populate the entries in the dict immediately below. If one of - the flag strings begins with a bang (exclamation mark), it is - assumed to be a command and the rest of the string is executed; - the result of that evaluation is then added to the dict. - """ - dict = { - 'ASFLAGS' : SCons.Util.CLVar(''), - 'CFLAGS' : SCons.Util.CLVar(''), - 'CCFLAGS' : SCons.Util.CLVar(''), - 'CPPDEFINES' : [], - 'CPPFLAGS' : SCons.Util.CLVar(''), - 'CPPPATH' : [], - 'FRAMEWORKPATH' : SCons.Util.CLVar(''), - 'FRAMEWORKS' : SCons.Util.CLVar(''), - 'LIBPATH' : [], - 'LIBS' : [], - 'LINKFLAGS' : SCons.Util.CLVar(''), - 'RPATH' : [], - } - - def do_parse(arg): - # if arg is a sequence, recurse with each element - if not arg: - return - - if not SCons.Util.is_String(arg): - for t in arg: do_parse(t) - return - - # if arg is a command, execute it - if arg[0] == '!': - arg = self.backtick(arg[1:]) - - # utility function to deal with -D option - def append_define(name, dict = dict): - t = name.split('=') - if len(t) == 1: - dict['CPPDEFINES'].append(name) - else: - dict['CPPDEFINES'].append([t[0], '='.join(t[1:])]) - - # Loop through the flags and add them to the appropriate option. - # This tries to strike a balance between checking for all possible - # flags and keeping the logic to a finite size, so it doesn't - # check for some that don't occur often. It particular, if the - # flag is not known to occur in a config script and there's a way - # of passing the flag to the right place (by wrapping it in a -W - # flag, for example) we don't check for it. Note that most - # preprocessor options are not handled, since unhandled options - # are placed in CCFLAGS, so unless the preprocessor is invoked - # separately, these flags will still get to the preprocessor. - # Other options not currently handled: - # -iqoutedir (preprocessor search path) - # -u symbol (linker undefined symbol) - # -s (linker strip files) - # -static* (linker static binding) - # -shared* (linker dynamic binding) - # -symbolic (linker global binding) - # -R dir (deprecated linker rpath) - # IBM compilers may also accept -qframeworkdir=foo - - params = shlex.split(arg) - append_next_arg_to = None # for multi-word args - for arg in params: - if append_next_arg_to: - if append_next_arg_to == 'CPPDEFINES': - append_define(arg) - elif append_next_arg_to == '-include': - t = ('-include', self.fs.File(arg)) - dict['CCFLAGS'].append(t) - elif append_next_arg_to == '-isysroot': - t = ('-isysroot', arg) - dict['CCFLAGS'].append(t) - dict['LINKFLAGS'].append(t) - elif append_next_arg_to == '-arch': - t = ('-arch', arg) - dict['CCFLAGS'].append(t) - dict['LINKFLAGS'].append(t) - else: - dict[append_next_arg_to].append(arg) - append_next_arg_to = None - elif not arg[0] in ['-', '+']: - dict['LIBS'].append(self.fs.File(arg)) - elif arg[:2] == '-L': - if arg[2:]: - dict['LIBPATH'].append(arg[2:]) - else: - append_next_arg_to = 'LIBPATH' - elif arg[:2] == '-l': - if arg[2:]: - dict['LIBS'].append(arg[2:]) - else: - append_next_arg_to = 'LIBS' - elif arg[:2] == '-I': - if arg[2:]: - dict['CPPPATH'].append(arg[2:]) - else: - append_next_arg_to = 'CPPPATH' - elif arg[:4] == '-Wa,': - dict['ASFLAGS'].append(arg[4:]) - dict['CCFLAGS'].append(arg) - elif arg[:4] == '-Wl,': - if arg[:11] == '-Wl,-rpath=': - dict['RPATH'].append(arg[11:]) - elif arg[:7] == '-Wl,-R,': - dict['RPATH'].append(arg[7:]) - elif arg[:6] == '-Wl,-R': - dict['RPATH'].append(arg[6:]) - else: - dict['LINKFLAGS'].append(arg) - elif arg[:4] == '-Wp,': - dict['CPPFLAGS'].append(arg) - elif arg[:2] == '-D': - if arg[2:]: - append_define(arg[2:]) - else: - append_next_arg_to = 'CPPDEFINES' - elif arg == '-framework': - append_next_arg_to = 'FRAMEWORKS' - elif arg[:14] == '-frameworkdir=': - dict['FRAMEWORKPATH'].append(arg[14:]) - elif arg[:2] == '-F': - if arg[2:]: - dict['FRAMEWORKPATH'].append(arg[2:]) - else: - append_next_arg_to = 'FRAMEWORKPATH' - elif arg == '-mno-cygwin': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg == '-mwindows': - dict['LINKFLAGS'].append(arg) - elif arg == '-pthread': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg[:5] == '-std=': - dict['CFLAGS'].append(arg) # C only - elif arg[0] == '+': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg in ['-include', '-isysroot', '-arch']: - append_next_arg_to = arg - else: - dict['CCFLAGS'].append(arg) - - for arg in flags: - do_parse(arg) - return dict - - def MergeFlags(self, args, unique=1, dict=None): - """ - Merge the dict in args into the construction variables of this - env, or the passed-in dict. If args is not a dict, it is - converted into a dict using ParseFlags. If unique is not set, - the flags are appended rather than merged. - """ - - if dict is None: - dict = self - if not SCons.Util.is_Dict(args): - args = self.ParseFlags(args) - if not unique: - self.Append(**args) - return self - for key, value in args.items(): - if not value: - continue - try: - orig = self[key] - except KeyError: - orig = value - else: - if not orig: - orig = value - elif value: - # Add orig and value. The logic here was lifted from - # part of env.Append() (see there for a lot of comments - # about the order in which things are tried) and is - # used mainly to handle coercion of strings to CLVar to - # "do the right thing" given (e.g.) an original CCFLAGS - # string variable like '-pipe -Wall'. - try: - orig = orig + value - except (KeyError, TypeError): - try: - add_to_orig = orig.append - except AttributeError: - value.insert(0, orig) - orig = value - else: - add_to_orig(value) - t = [] - if key[-4:] == 'PATH': - ### keep left-most occurence - for v in orig: - if v not in t: - t.append(v) - else: - ### keep right-most occurence - orig.reverse() - for v in orig: - if v not in t: - t.insert(0, v) - self[key] = t - return self - -# def MergeShellPaths(self, args, prepend=1): -# """ -# Merge the dict in args into the shell environment in env['ENV']. -# Shell path elements are appended or prepended according to prepend. - -# Uses Pre/AppendENVPath, so it always appends or prepends uniquely. - -# Example: env.MergeShellPaths({'LIBPATH': '/usr/local/lib'}) -# prepends /usr/local/lib to env['ENV']['LIBPATH']. -# """ - -# for pathname, pathval in args.items(): -# if not pathval: -# continue -# if prepend: -# self.PrependENVPath(pathname, pathval) -# else: -# self.AppendENVPath(pathname, pathval) - - -def default_decide_source(dependency, target, prev_ni): - f = SCons.Defaults.DefaultEnvironment().decide_source - return f(dependency, target, prev_ni) - -def default_decide_target(dependency, target, prev_ni): - f = SCons.Defaults.DefaultEnvironment().decide_target - return f(dependency, target, prev_ni) - -def default_copy_from_cache(src, dst): - f = SCons.Defaults.DefaultEnvironment().copy_from_cache - return f(src, dst) - -class Base(SubstitutionEnvironment): - """Base class for "real" construction Environments. These are the - primary objects used to communicate dependency and construction - information to the build engine. - - Keyword arguments supplied when the construction Environment - is created are construction variables used to initialize the - Environment. - """ - - memoizer_counters = [] - - ####################################################################### - # This is THE class for interacting with the SCons build engine, - # and it contains a lot of stuff, so we're going to try to keep this - # a little organized by grouping the methods. - ####################################################################### - - ####################################################################### - # Methods that make an Environment act like a dictionary. These have - # the expected standard names for Python mapping objects. Note that - # we don't actually make an Environment a subclass of UserDict for - # performance reasons. Note also that we only supply methods for - # dictionary functionality that we actually need and use. - ####################################################################### - - def __init__(self, - platform=None, - tools=None, - toolpath=None, - variables=None, - parse_flags = None, - **kw): - """ - Initialization of a basic SCons construction environment, - including setting up special construction variables like BUILDER, - PLATFORM, etc., and searching for and applying available Tools. - - Note that we do *not* call the underlying base class - (SubsitutionEnvironment) initialization, because we need to - initialize things in a very specific order that doesn't work - with the much simpler base class initialization. - """ - if __debug__: logInstanceCreation(self, 'Environment.Base') - self._memo = {} - self.fs = SCons.Node.FS.get_default_fs() - self.ans = SCons.Node.Alias.default_ans - self.lookup_list = SCons.Node.arg2nodes_lookups - self._dict = semi_deepcopy(SCons.Defaults.ConstructionEnvironment) - self._init_special() - self.added_methods = [] - - # We don't use AddMethod, or define these as methods in this - # class, because we *don't* want these functions to be bound - # methods. They need to operate independently so that the - # settings will work properly regardless of whether a given - # target ends up being built with a Base environment or an - # OverrideEnvironment or what have you. - self.decide_target = default_decide_target - self.decide_source = default_decide_source - - self.copy_from_cache = default_copy_from_cache - - self._dict['BUILDERS'] = BuilderDict(self._dict['BUILDERS'], self) - - if platform is None: - platform = self._dict.get('PLATFORM', None) - if platform is None: - platform = SCons.Platform.Platform() - if SCons.Util.is_String(platform): - platform = SCons.Platform.Platform(platform) - self._dict['PLATFORM'] = str(platform) - platform(self) - - self._dict['HOST_OS'] = self._dict.get('HOST_OS',None) - self._dict['HOST_ARCH'] = self._dict.get('HOST_ARCH',None) - - # Now set defaults for TARGET_{OS|ARCH} - self._dict['TARGET_OS'] = self._dict.get('HOST_OS',None) - self._dict['TARGET_ARCH'] = self._dict.get('HOST_ARCH',None) - - - # Apply the passed-in and customizable variables to the - # environment before calling the tools, because they may use - # some of them during initialization. - if 'options' in kw: - # Backwards compatibility: they may stll be using the - # old "options" keyword. - variables = kw['options'] - del kw['options'] - self.Replace(**kw) - keys = list(kw.keys()) - if variables: - keys = keys + list(variables.keys()) - variables.Update(self) - - save = {} - for k in keys: - try: - save[k] = self._dict[k] - except KeyError: - # No value may have been set if they tried to pass in a - # reserved variable name like TARGETS. - pass - - SCons.Tool.Initializers(self) - - if tools is None: - tools = self._dict.get('TOOLS', None) - if tools is None: - tools = ['default'] - apply_tools(self, tools, toolpath) - - # Now restore the passed-in and customized variables - # to the environment, since the values the user set explicitly - # should override any values set by the tools. - for key, val in save.items(): - self._dict[key] = val - - # Finally, apply any flags to be merged in - if parse_flags: self.MergeFlags(parse_flags) - - ####################################################################### - # Utility methods that are primarily for internal use by SCons. - # These begin with lower-case letters. - ####################################################################### - - def get_builder(self, name): - """Fetch the builder with the specified name from the environment. - """ - try: - return self._dict['BUILDERS'][name] - except KeyError: - return None - - def get_CacheDir(self): - try: - path = self._CacheDir_path - except AttributeError: - path = SCons.Defaults.DefaultEnvironment()._CacheDir_path - try: - if path == self._last_CacheDir_path: - return self._last_CacheDir - except AttributeError: - pass - cd = SCons.CacheDir.CacheDir(path) - self._last_CacheDir_path = path - self._last_CacheDir = cd - return cd - - def get_factory(self, factory, default='File'): - """Return a factory function for creating Nodes for this - construction environment. - """ - name = default - try: - is_node = issubclass(factory, SCons.Node.FS.Base) - except TypeError: - # The specified factory isn't a Node itself--it's - # most likely None, or possibly a callable. - pass - else: - if is_node: - # The specified factory is a Node (sub)class. Try to - # return the FS method that corresponds to the Node's - # name--that is, we return self.fs.Dir if they want a Dir, - # self.fs.File for a File, etc. - try: name = factory.__name__ - except AttributeError: pass - else: factory = None - if not factory: - # They passed us None, or we picked up a name from a specified - # class, so return the FS method. (Note that we *don't* - # use our own self.{Dir,File} methods because that would - # cause env.subst() to be called twice on the file name, - # interfering with files that have $$ in them.) - factory = getattr(self.fs, name) - return factory - - memoizer_counters.append(SCons.Memoize.CountValue('_gsm')) - - def _gsm(self): - try: - return self._memo['_gsm'] - except KeyError: - pass - - result = {} - - try: - scanners = self._dict['SCANNERS'] - except KeyError: - pass - else: - # Reverse the scanner list so that, if multiple scanners - # claim they can scan the same suffix, earlier scanners - # in the list will overwrite later scanners, so that - # the result looks like a "first match" to the user. - if not SCons.Util.is_List(scanners): - scanners = [scanners] - else: - scanners = scanners[:] # copy so reverse() doesn't mod original - scanners.reverse() - for scanner in scanners: - for k in scanner.get_skeys(self): - if k and self['PLATFORM'] == 'win32': - k = k.lower() - result[k] = scanner - - self._memo['_gsm'] = result - - return result - - def get_scanner(self, skey): - """Find the appropriate scanner given a key (usually a file suffix). - """ - if skey and self['PLATFORM'] == 'win32': - skey = skey.lower() - return self._gsm().get(skey) - - def scanner_map_delete(self, kw=None): - """Delete the cached scanner map (if we need to). - """ - try: - del self._memo['_gsm'] - except KeyError: - pass - - def _update(self, dict): - """Update an environment's values directly, bypassing the normal - checks that occur when users try to set items. - """ - self._dict.update(dict) - - def get_src_sig_type(self): - try: - return self.src_sig_type - except AttributeError: - t = SCons.Defaults.DefaultEnvironment().src_sig_type - self.src_sig_type = t - return t - - def get_tgt_sig_type(self): - try: - return self.tgt_sig_type - except AttributeError: - t = SCons.Defaults.DefaultEnvironment().tgt_sig_type - self.tgt_sig_type = t - return t - - ####################################################################### - # Public methods for manipulating an Environment. These begin with - # upper-case letters. The essential characteristic of methods in - # this section is that they do *not* have corresponding same-named - # global functions. For example, a stand-alone Append() function - # makes no sense, because Append() is all about appending values to - # an Environment's construction variables. - ####################################################################### - - def Append(self, **kw): - """Append values to existing construction variables - in an Environment. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - # It would be easier on the eyes to write this using - # "continue" statements whenever we finish processing an item, - # but Python 1.5.2 apparently doesn't let you use "continue" - # within try:-except: blocks, so we have to nest our code. - try: - orig = self._dict[key] - except KeyError: - # No existing variable in the environment, so just set - # it to the new value. - self._dict[key] = val - else: - try: - # Check if the original looks like a dictionary. - # If it is, we can't just try adding the value because - # dictionaries don't have __add__() methods, and - # things like UserList will incorrectly coerce the - # original dict to a list (which we don't want). - update_dict = orig.update - except AttributeError: - try: - # Most straightforward: just try to add them - # together. This will work in most cases, when the - # original and new values are of compatible types. - self._dict[key] = orig + val - except (KeyError, TypeError): - try: - # Check if the original is a list. - add_to_orig = orig.append - except AttributeError: - # The original isn't a list, but the new - # value is (by process of elimination), - # so insert the original in the new value - # (if there's one to insert) and replace - # the variable with it. - if orig: - val.insert(0, orig) - self._dict[key] = val - else: - # The original is a list, so append the new - # value to it (if there's a value to append). - if val: - add_to_orig(val) - else: - # The original looks like a dictionary, so update it - # based on what we think the value looks like. - if SCons.Util.is_List(val): - for v in val: - orig[v] = None - else: - try: - update_dict(val) - except (AttributeError, TypeError, ValueError): - if SCons.Util.is_Dict(val): - for k, v in val.items(): - orig[k] = v - else: - orig[val] = None - self.scanner_map_delete(kw) - - # allow Dirs and strings beginning with # for top-relative - # Note this uses the current env's fs (in self). - def _canonicalize(self, path): - if not SCons.Util.is_String(path): # typically a Dir - path = str(path) - if path and path[0] == '#': - path = str(self.fs.Dir(path)) - return path - - def AppendENVPath(self, name, newpath, envname = 'ENV', - sep = os.pathsep, delete_existing=1): - """Append path elements to the path 'name' in the 'ENV' - dictionary for this environment. Will only add any particular - path once, and will normpath and normcase all paths to help - assure this. This can also handle the case where the env - variable is a list instead of a string. - - If delete_existing is 0, a newpath which is already in the path - will not be moved to the end (it will be left where it is). - """ - - orig = '' - if envname in self._dict and name in self._dict[envname]: - orig = self._dict[envname][name] - - nv = SCons.Util.AppendPath(orig, newpath, sep, delete_existing, - canonicalize=self._canonicalize) - - if envname not in self._dict: - self._dict[envname] = {} - - self._dict[envname][name] = nv - - def AppendUnique(self, delete_existing=0, **kw): - """Append values to existing construction variables - in an Environment, if they're not already there. - If delete_existing is 1, removes existing values first, so - values move to end. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - if SCons.Util.is_List(val): - val = _delete_duplicates(val, delete_existing) - if key not in self._dict or self._dict[key] in ('', None): - self._dict[key] = val - elif SCons.Util.is_Dict(self._dict[key]) and \ - SCons.Util.is_Dict(val): - self._dict[key].update(val) - elif SCons.Util.is_List(val): - dk = self._dict[key] - if not SCons.Util.is_List(dk): - dk = [dk] - if delete_existing: - dk = [x for x in dk if x not in val] - else: - val = [x for x in val if x not in dk] - self._dict[key] = dk + val - else: - dk = self._dict[key] - if SCons.Util.is_List(dk): - # By elimination, val is not a list. Since dk is a - # list, wrap val in a list first. - if delete_existing: - dk = [x for x in dk if x not in val] - self._dict[key] = dk + [val] - else: - if not val in dk: - self._dict[key] = dk + [val] - else: - if delete_existing: - dk = [x for x in dk if x not in val] - self._dict[key] = dk + val - self.scanner_map_delete(kw) - - def Clone(self, tools=[], toolpath=None, parse_flags = None, **kw): - """Return a copy of a construction Environment. The - copy is like a Python "deep copy"--that is, independent - copies are made recursively of each objects--except that - a reference is copied when an object is not deep-copyable - (like a function). There are no references to any mutable - objects in the original Environment. - """ - clone = copy.copy(self) - clone._dict = semi_deepcopy(self._dict) - - try: - cbd = clone._dict['BUILDERS'] - except KeyError: - pass - else: - clone._dict['BUILDERS'] = BuilderDict(cbd, clone) - - # Check the methods added via AddMethod() and re-bind them to - # the cloned environment. Only do this if the attribute hasn't - # been overwritten by the user explicitly and still points to - # the added method. - clone.added_methods = [] - for mw in self.added_methods: - if mw == getattr(self, mw.name): - clone.added_methods.append(mw.clone(clone)) - - clone._memo = {} - - # Apply passed-in variables before the tools - # so the tools can use the new variables - kw = copy_non_reserved_keywords(kw) - new = {} - for key, value in kw.items(): - new[key] = SCons.Subst.scons_subst_once(value, self, key) - clone.Replace(**new) - - apply_tools(clone, tools, toolpath) - - # apply them again in case the tools overwrote them - clone.Replace(**new) - - # Finally, apply any flags to be merged in - if parse_flags: clone.MergeFlags(parse_flags) - - if __debug__: logInstanceCreation(self, 'Environment.EnvironmentClone') - return clone - - def Copy(self, *args, **kw): - global _warn_copy_deprecated - if _warn_copy_deprecated: - msg = "The env.Copy() method is deprecated; use the env.Clone() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedCopyWarning, msg) - _warn_copy_deprecated = False - return self.Clone(*args, **kw) - - def _changed_build(self, dependency, target, prev_ni): - if dependency.changed_state(target, prev_ni): - return 1 - return self.decide_source(dependency, target, prev_ni) - - def _changed_content(self, dependency, target, prev_ni): - return dependency.changed_content(target, prev_ni) - - def _changed_source(self, dependency, target, prev_ni): - target_env = dependency.get_build_env() - type = target_env.get_tgt_sig_type() - if type == 'source': - return target_env.decide_source(dependency, target, prev_ni) - else: - return target_env.decide_target(dependency, target, prev_ni) - - def _changed_timestamp_then_content(self, dependency, target, prev_ni): - return dependency.changed_timestamp_then_content(target, prev_ni) - - def _changed_timestamp_newer(self, dependency, target, prev_ni): - return dependency.changed_timestamp_newer(target, prev_ni) - - def _changed_timestamp_match(self, dependency, target, prev_ni): - return dependency.changed_timestamp_match(target, prev_ni) - - def _copy_from_cache(self, src, dst): - return self.fs.copy(src, dst) - - def _copy2_from_cache(self, src, dst): - return self.fs.copy2(src, dst) - - def Decider(self, function): - copy_function = self._copy2_from_cache - if function in ('MD5', 'content'): - if not SCons.Util.md5: - raise UserError("MD5 signatures are not available in this version of Python.") - function = self._changed_content - elif function == 'MD5-timestamp': - function = self._changed_timestamp_then_content - elif function in ('timestamp-newer', 'make'): - function = self._changed_timestamp_newer - copy_function = self._copy_from_cache - elif function == 'timestamp-match': - function = self._changed_timestamp_match - elif not callable(function): - raise UserError("Unknown Decider value %s" % repr(function)) - - # We don't use AddMethod because we don't want to turn the - # function, which only expects three arguments, into a bound - # method, which would add self as an initial, fourth argument. - self.decide_target = function - self.decide_source = function - - self.copy_from_cache = copy_function - - def Detect(self, progs): - """Return the first available program in progs. - """ - if not SCons.Util.is_List(progs): - progs = [ progs ] - for prog in progs: - path = self.WhereIs(prog) - if path: return prog - return None - - def Dictionary(self, *args): - if not args: - return self._dict - dlist = [self._dict[x] for x in args] - if len(dlist) == 1: - dlist = dlist[0] - return dlist - - def Dump(self, key = None): - """ - Using the standard Python pretty printer, dump the contents of the - scons build environment to stdout. - - If the key passed in is anything other than None, then that will - be used as an index into the build environment dictionary and - whatever is found there will be fed into the pretty printer. Note - that this key is case sensitive. - """ - import pprint - pp = pprint.PrettyPrinter(indent=2) - if key: - dict = self.Dictionary(key) - else: - dict = self.Dictionary() - return pp.pformat(dict) - - def FindIxes(self, paths, prefix, suffix): - """ - Search a list of paths for something that matches the prefix and suffix. - - paths - the list of paths or nodes. - prefix - construction variable for the prefix. - suffix - construction variable for the suffix. - """ - - suffix = self.subst('$'+suffix) - prefix = self.subst('$'+prefix) - - for path in paths: - dir,name = os.path.split(str(path)) - if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix: - return path - - def ParseConfig(self, command, function=None, unique=1): - """ - Use the specified function to parse the output of the command - in order to modify the current environment. The 'command' can - be a string or a list of strings representing a command and - its arguments. 'Function' is an optional argument that takes - the environment, the output of the command, and the unique flag. - If no function is specified, MergeFlags, which treats the output - as the result of a typical 'X-config' command (i.e. gtk-config), - will merge the output into the appropriate variables. - """ - if function is None: - def parse_conf(env, cmd, unique=unique): - return env.MergeFlags(cmd, unique) - function = parse_conf - if SCons.Util.is_List(command): - command = ' '.join(command) - command = self.subst(command) - return function(self, self.backtick(command)) - - def ParseDepends(self, filename, must_exist=None, only_one=0): - """ - Parse a mkdep-style file for explicit dependencies. This is - completely abusable, and should be unnecessary in the "normal" - case of proper SCons configuration, but it may help make - the transition from a Make hierarchy easier for some people - to swallow. It can also be genuinely useful when using a tool - that can write a .d file, but for which writing a scanner would - be too complicated. - """ - filename = self.subst(filename) - try: - fp = open(filename, 'r') - except IOError: - if must_exist: - raise - return - lines = SCons.Util.LogicalLines(fp).readlines() - lines = [l for l in lines if l[0] != '#'] - tdlist = [] - for line in lines: - try: - target, depends = line.split(':', 1) - except (AttributeError, ValueError): - # Throws AttributeError if line isn't a string. Can throw - # ValueError if line doesn't split into two or more elements. - pass - else: - tdlist.append((target.split(), depends.split())) - if only_one: - targets = [] - for td in tdlist: - targets.extend(td[0]) - if len(targets) > 1: - raise SCons.Errors.UserError( - "More than one dependency target found in `%s': %s" - % (filename, targets)) - for target, depends in tdlist: - self.Depends(target, depends) - - def Platform(self, platform): - platform = self.subst(platform) - return SCons.Platform.Platform(platform)(self) - - def Prepend(self, **kw): - """Prepend values to existing construction variables - in an Environment. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - # It would be easier on the eyes to write this using - # "continue" statements whenever we finish processing an item, - # but Python 1.5.2 apparently doesn't let you use "continue" - # within try:-except: blocks, so we have to nest our code. - try: - orig = self._dict[key] - except KeyError: - # No existing variable in the environment, so just set - # it to the new value. - self._dict[key] = val - else: - try: - # Check if the original looks like a dictionary. - # If it is, we can't just try adding the value because - # dictionaries don't have __add__() methods, and - # things like UserList will incorrectly coerce the - # original dict to a list (which we don't want). - update_dict = orig.update - except AttributeError: - try: - # Most straightforward: just try to add them - # together. This will work in most cases, when the - # original and new values are of compatible types. - self._dict[key] = val + orig - except (KeyError, TypeError): - try: - # Check if the added value is a list. - add_to_val = val.append - except AttributeError: - # The added value isn't a list, but the - # original is (by process of elimination), - # so insert the the new value in the original - # (if there's one to insert). - if val: - orig.insert(0, val) - else: - # The added value is a list, so append - # the original to it (if there's a value - # to append). - if orig: - add_to_val(orig) - self._dict[key] = val - else: - # The original looks like a dictionary, so update it - # based on what we think the value looks like. - if SCons.Util.is_List(val): - for v in val: - orig[v] = None - else: - try: - update_dict(val) - except (AttributeError, TypeError, ValueError): - if SCons.Util.is_Dict(val): - for k, v in val.items(): - orig[k] = v - else: - orig[val] = None - self.scanner_map_delete(kw) - - def PrependENVPath(self, name, newpath, envname = 'ENV', sep = os.pathsep, - delete_existing=1): - """Prepend path elements to the path 'name' in the 'ENV' - dictionary for this environment. Will only add any particular - path once, and will normpath and normcase all paths to help - assure this. This can also handle the case where the env - variable is a list instead of a string. - - If delete_existing is 0, a newpath which is already in the path - will not be moved to the front (it will be left where it is). - """ - - orig = '' - if envname in self._dict and name in self._dict[envname]: - orig = self._dict[envname][name] - - nv = SCons.Util.PrependPath(orig, newpath, sep, delete_existing, - canonicalize=self._canonicalize) - - if envname not in self._dict: - self._dict[envname] = {} - - self._dict[envname][name] = nv - - def PrependUnique(self, delete_existing=0, **kw): - """Prepend values to existing construction variables - in an Environment, if they're not already there. - If delete_existing is 1, removes existing values first, so - values move to front. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - if SCons.Util.is_List(val): - val = _delete_duplicates(val, not delete_existing) - if key not in self._dict or self._dict[key] in ('', None): - self._dict[key] = val - elif SCons.Util.is_Dict(self._dict[key]) and \ - SCons.Util.is_Dict(val): - self._dict[key].update(val) - elif SCons.Util.is_List(val): - dk = self._dict[key] - if not SCons.Util.is_List(dk): - dk = [dk] - if delete_existing: - dk = [x for x in dk if x not in val] - else: - val = [x for x in val if x not in dk] - self._dict[key] = val + dk - else: - dk = self._dict[key] - if SCons.Util.is_List(dk): - # By elimination, val is not a list. Since dk is a - # list, wrap val in a list first. - if delete_existing: - dk = [x for x in dk if x not in val] - self._dict[key] = [val] + dk - else: - if not val in dk: - self._dict[key] = [val] + dk - else: - if delete_existing: - dk = [x for x in dk if x not in val] - self._dict[key] = val + dk - self.scanner_map_delete(kw) - - def Replace(self, **kw): - """Replace existing construction variables in an Environment - with new construction variables and/or values. - """ - try: - kwbd = kw['BUILDERS'] - except KeyError: - pass - else: - kwbd = semi_deepcopy(kwbd) - del kw['BUILDERS'] - self.__setitem__('BUILDERS', kwbd) - kw = copy_non_reserved_keywords(kw) - self._update(semi_deepcopy(kw)) - self.scanner_map_delete(kw) - - def ReplaceIxes(self, path, old_prefix, old_suffix, new_prefix, new_suffix): - """ - Replace old_prefix with new_prefix and old_suffix with new_suffix. - - env - Environment used to interpolate variables. - path - the path that will be modified. - old_prefix - construction variable for the old prefix. - old_suffix - construction variable for the old suffix. - new_prefix - construction variable for the new prefix. - new_suffix - construction variable for the new suffix. - """ - old_prefix = self.subst('$'+old_prefix) - old_suffix = self.subst('$'+old_suffix) - - new_prefix = self.subst('$'+new_prefix) - new_suffix = self.subst('$'+new_suffix) - - dir,name = os.path.split(str(path)) - if name[:len(old_prefix)] == old_prefix: - name = name[len(old_prefix):] - if name[-len(old_suffix):] == old_suffix: - name = name[:-len(old_suffix)] - return os.path.join(dir, new_prefix+name+new_suffix) - - def SetDefault(self, **kw): - for k in kw.keys(): - if k in self._dict: - del kw[k] - self.Replace(**kw) - - def _find_toolpath_dir(self, tp): - return self.fs.Dir(self.subst(tp)).srcnode().abspath - - def Tool(self, tool, toolpath=None, **kw): - if SCons.Util.is_String(tool): - tool = self.subst(tool) - if toolpath is None: - toolpath = self.get('toolpath', []) - toolpath = list(map(self._find_toolpath_dir, toolpath)) - tool = SCons.Tool.Tool(tool, toolpath, **kw) - tool(self) - - def WhereIs(self, prog, path=None, pathext=None, reject=[]): - """Find prog in the path. - """ - if path is None: - try: - path = self['ENV']['PATH'] - except KeyError: - pass - elif SCons.Util.is_String(path): - path = self.subst(path) - if pathext is None: - try: - pathext = self['ENV']['PATHEXT'] - except KeyError: - pass - elif SCons.Util.is_String(pathext): - pathext = self.subst(pathext) - prog = self.subst(prog) - path = SCons.Util.WhereIs(prog, path, pathext, reject) - if path: return path - return None - - ####################################################################### - # Public methods for doing real "SCons stuff" (manipulating - # dependencies, setting attributes on targets, etc.). These begin - # with upper-case letters. The essential characteristic of methods - # in this section is that they all *should* have corresponding - # same-named global functions. - ####################################################################### - - def Action(self, *args, **kw): - def subst_string(a, self=self): - if SCons.Util.is_String(a): - a = self.subst(a) - return a - nargs = list(map(subst_string, args)) - nkw = self.subst_kw(kw) - return SCons.Action.Action(*nargs, **nkw) - - def AddPreAction(self, files, action): - nodes = self.arg2nodes(files, self.fs.Entry) - action = SCons.Action.Action(action) - uniq = {} - for executor in [n.get_executor() for n in nodes]: - uniq[executor] = 1 - for executor in uniq.keys(): - executor.add_pre_action(action) - return nodes - - def AddPostAction(self, files, action): - nodes = self.arg2nodes(files, self.fs.Entry) - action = SCons.Action.Action(action) - uniq = {} - for executor in [n.get_executor() for n in nodes]: - uniq[executor] = 1 - for executor in uniq.keys(): - executor.add_post_action(action) - return nodes - - def Alias(self, target, source=[], action=None, **kw): - tlist = self.arg2nodes(target, self.ans.Alias) - if not SCons.Util.is_List(source): - source = [source] - source = [_f for _f in source if _f] - - if not action: - if not source: - # There are no source files and no action, so just - # return a target list of classic Alias Nodes, without - # any builder. The externally visible effect is that - # this will make the wrapping Script.BuildTask class - # say that there's "Nothing to be done" for this Alias, - # instead of that it's "up to date." - return tlist - - # No action, but there are sources. Re-call all the target - # builders to add the sources to each target. - result = [] - for t in tlist: - bld = t.get_builder(AliasBuilder) - result.extend(bld(self, t, source)) - return result - - nkw = self.subst_kw(kw) - nkw.update({ - 'action' : SCons.Action.Action(action), - 'source_factory' : self.fs.Entry, - 'multi' : 1, - 'is_explicit' : None, - }) - bld = SCons.Builder.Builder(**nkw) - - # Apply the Builder separately to each target so that the Aliases - # stay separate. If we did one "normal" Builder call with the - # whole target list, then all of the target Aliases would be - # associated under a single Executor. - result = [] - for t in tlist: - # Calling the convert() method will cause a new Executor to be - # created from scratch, so we have to explicitly initialize - # it with the target's existing sources, plus our new ones, - # so nothing gets lost. - b = t.get_builder() - if b is None or b is AliasBuilder: - b = bld - else: - nkw['action'] = b.action + action - b = SCons.Builder.Builder(**nkw) - t.convert() - result.extend(b(self, t, t.sources + source)) - return result - - def AlwaysBuild(self, *targets): - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_always_build() - return tlist - - def BuildDir(self, *args, **kw): - msg = """BuildDir() and the build_dir keyword have been deprecated;\n\tuse VariantDir() and the variant_dir keyword instead.""" - SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg) - if 'build_dir' in kw: - kw['variant_dir'] = kw['build_dir'] - del kw['build_dir'] - return self.VariantDir(*args, **kw) - - def Builder(self, **kw): - nkw = self.subst_kw(kw) - return SCons.Builder.Builder(**nkw) - - def CacheDir(self, path): - import SCons.CacheDir - if path is not None: - path = self.subst(path) - self._CacheDir_path = path - - def Clean(self, targets, files): - global CleanTargets - tlist = self.arg2nodes(targets, self.fs.Entry) - flist = self.arg2nodes(files, self.fs.Entry) - for t in tlist: - try: - CleanTargets[t].extend(flist) - except KeyError: - CleanTargets[t] = flist - - def Configure(self, *args, **kw): - nargs = [self] - if args: - nargs = nargs + self.subst_list(args)[0] - nkw = self.subst_kw(kw) - nkw['_depth'] = kw.get('_depth', 0) + 1 - try: - nkw['custom_tests'] = self.subst_kw(nkw['custom_tests']) - except KeyError: - pass - return SCons.SConf.SConf(*nargs, **nkw) - - def Command(self, target, source, action, **kw): - """Builds the supplied target files from the supplied - source files using the supplied action. Action may - be any type that the Builder constructor will accept - for an action.""" - bkw = { - 'action' : action, - 'target_factory' : self.fs.Entry, - 'source_factory' : self.fs.Entry, - } - try: bkw['source_scanner'] = kw['source_scanner'] - except KeyError: pass - else: del kw['source_scanner'] - bld = SCons.Builder.Builder(**bkw) - return bld(self, target, source, **kw) - - def Depends(self, target, dependency): - """Explicity specify that 'target's depend on 'dependency'.""" - tlist = self.arg2nodes(target, self.fs.Entry) - dlist = self.arg2nodes(dependency, self.fs.Entry) - for t in tlist: - t.add_dependency(dlist) - return tlist - - def Dir(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(self.fs.Dir(e, *args, **kw)) - return result - return self.fs.Dir(s, *args, **kw) - - def NoClean(self, *targets): - """Tags a target so that it will not be cleaned by -c""" - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_noclean() - return tlist - - def NoCache(self, *targets): - """Tags a target so that it will not be cached""" - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_nocache() - return tlist - - def Entry(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(self.fs.Entry(e, *args, **kw)) - return result - return self.fs.Entry(s, *args, **kw) - - def Environment(self, **kw): - return SCons.Environment.Environment(**self.subst_kw(kw)) - - def Execute(self, action, *args, **kw): - """Directly execute an action through an Environment - """ - action = self.Action(action, *args, **kw) - result = action([], [], self) - if isinstance(result, SCons.Errors.BuildError): - errstr = result.errstr - if result.filename: - errstr = result.filename + ': ' + errstr - sys.stderr.write("scons: *** %s\n" % errstr) - return result.status - else: - return result - - def File(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(self.fs.File(e, *args, **kw)) - return result - return self.fs.File(s, *args, **kw) - - def FindFile(self, file, dirs): - file = self.subst(file) - nodes = self.arg2nodes(dirs, self.fs.Dir) - return SCons.Node.FS.find_file(file, tuple(nodes)) - - def Flatten(self, sequence): - return SCons.Util.flatten(sequence) - - def GetBuildPath(self, files): - result = list(map(str, self.arg2nodes(files, self.fs.Entry))) - if SCons.Util.is_List(files): - return result - else: - return result[0] - - def Glob(self, pattern, ondisk=True, source=False, strings=False): - return self.fs.Glob(self.subst(pattern), ondisk, source, strings) - - def Ignore(self, target, dependency): - """Ignore a dependency.""" - tlist = self.arg2nodes(target, self.fs.Entry) - dlist = self.arg2nodes(dependency, self.fs.Entry) - for t in tlist: - t.add_ignore(dlist) - return tlist - - def Literal(self, string): - return SCons.Subst.Literal(string) - - def Local(self, *targets): - ret = [] - for targ in targets: - if isinstance(targ, SCons.Node.Node): - targ.set_local() - ret.append(targ) - else: - for t in self.arg2nodes(targ, self.fs.Entry): - t.set_local() - ret.append(t) - return ret - - def Precious(self, *targets): - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_precious() - return tlist - - def Repository(self, *dirs, **kw): - dirs = self.arg2nodes(list(dirs), self.fs.Dir) - self.fs.Repository(*dirs, **kw) - - def Requires(self, target, prerequisite): - """Specify that 'prerequisite' must be built before 'target', - (but 'target' does not actually depend on 'prerequisite' - and need not be rebuilt if it changes).""" - tlist = self.arg2nodes(target, self.fs.Entry) - plist = self.arg2nodes(prerequisite, self.fs.Entry) - for t in tlist: - t.add_prerequisite(plist) - return tlist - - def Scanner(self, *args, **kw): - nargs = [] - for arg in args: - if SCons.Util.is_String(arg): - arg = self.subst(arg) - nargs.append(arg) - nkw = self.subst_kw(kw) - return SCons.Scanner.Base(*nargs, **nkw) - - def SConsignFile(self, name=".sconsign", dbm_module=None): - if name is not None: - name = self.subst(name) - if not os.path.isabs(name): - name = os.path.join(str(self.fs.SConstruct_dir), name) - if name: - name = os.path.normpath(name) - sconsign_dir = os.path.dirname(name) - if sconsign_dir and not os.path.exists(sconsign_dir): - self.Execute(SCons.Defaults.Mkdir(sconsign_dir)) - SCons.SConsign.File(name, dbm_module) - - def SideEffect(self, side_effect, target): - """Tell scons that side_effects are built as side - effects of building targets.""" - side_effects = self.arg2nodes(side_effect, self.fs.Entry) - targets = self.arg2nodes(target, self.fs.Entry) - - for side_effect in side_effects: - if side_effect.multiple_side_effect_has_builder(): - raise SCons.Errors.UserError("Multiple ways to build the same target were specified for: %s" % str(side_effect)) - side_effect.add_source(targets) - side_effect.side_effect = 1 - self.Precious(side_effect) - for target in targets: - target.side_effects.append(side_effect) - return side_effects - - def SourceCode(self, entry, builder): - """Arrange for a source code builder for (part of) a tree.""" - msg = """SourceCode() has been deprecated and there is no replacement. -\tIf you need this function, please contact dev@scons.tigris.org.""" - SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceCodeWarning, msg) - entries = self.arg2nodes(entry, self.fs.Entry) - for entry in entries: - entry.set_src_builder(builder) - return entries - - def SourceSignatures(self, type): - global _warn_source_signatures_deprecated - if _warn_source_signatures_deprecated: - msg = "The env.SourceSignatures() method is deprecated;\n" + \ - "\tconvert your build to use the env.Decider() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceSignaturesWarning, msg) - _warn_source_signatures_deprecated = False - type = self.subst(type) - self.src_sig_type = type - if type == 'MD5': - if not SCons.Util.md5: - raise UserError("MD5 signatures are not available in this version of Python.") - self.decide_source = self._changed_content - elif type == 'timestamp': - self.decide_source = self._changed_timestamp_match - else: - raise UserError("Unknown source signature type '%s'" % type) - - def Split(self, arg): - """This function converts a string or list into a list of strings - or Nodes. This makes things easier for users by allowing files to - be specified as a white-space separated list to be split. - The input rules are: - - A single string containing names separated by spaces. These will be - split apart at the spaces. - - A single Node instance - - A list containing either strings or Node instances. Any strings - in the list are not split at spaces. - In all cases, the function returns a list of Nodes and strings.""" - if SCons.Util.is_List(arg): - return list(map(self.subst, arg)) - elif SCons.Util.is_String(arg): - return self.subst(arg).split() - else: - return [self.subst(arg)] - - def TargetSignatures(self, type): - global _warn_target_signatures_deprecated - if _warn_target_signatures_deprecated: - msg = "The env.TargetSignatures() method is deprecated;\n" + \ - "\tconvert your build to use the env.Decider() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedTargetSignaturesWarning, msg) - _warn_target_signatures_deprecated = False - type = self.subst(type) - self.tgt_sig_type = type - if type in ('MD5', 'content'): - if not SCons.Util.md5: - raise UserError("MD5 signatures are not available in this version of Python.") - self.decide_target = self._changed_content - elif type == 'timestamp': - self.decide_target = self._changed_timestamp_match - elif type == 'build': - self.decide_target = self._changed_build - elif type == 'source': - self.decide_target = self._changed_source - else: - raise UserError("Unknown target signature type '%s'"%type) - - def Value(self, value, built_value=None): - """ - """ - return SCons.Node.Python.Value(value, built_value) - - def VariantDir(self, variant_dir, src_dir, duplicate=1): - variant_dir = self.arg2nodes(variant_dir, self.fs.Dir)[0] - src_dir = self.arg2nodes(src_dir, self.fs.Dir)[0] - self.fs.VariantDir(variant_dir, src_dir, duplicate) - - def FindSourceFiles(self, node='.'): - """ returns a list of all source files. - """ - node = self.arg2nodes(node, self.fs.Entry)[0] - - sources = [] - def build_source(ss): - for s in ss: - if isinstance(s, SCons.Node.FS.Dir): - build_source(s.all_children()) - elif s.has_builder(): - build_source(s.sources) - elif isinstance(s.disambiguate(), SCons.Node.FS.File): - sources.append(s) - build_source(node.all_children()) - - # THIS CODE APPEARS TO HAVE NO EFFECT - # # get the final srcnode for all nodes, this means stripping any - # # attached build node by calling the srcnode function - # for file in sources: - # srcnode = file.srcnode() - # while srcnode != file.srcnode(): - # srcnode = file.srcnode() - - # remove duplicates - return list(set(sources)) - - def FindInstalledFiles(self): - """ returns the list of all targets of the Install and InstallAs Builder. - """ - from SCons.Tool import install - if install._UNIQUE_INSTALLED_FILES is None: - install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES) - return install._UNIQUE_INSTALLED_FILES - -class OverrideEnvironment(Base): - """A proxy that overrides variables in a wrapped construction - environment by returning values from an overrides dictionary in - preference to values from the underlying subject environment. - - This is a lightweight (I hope) proxy that passes through most use of - attributes to the underlying Environment.Base class, but has just - enough additional methods defined to act like a real construction - environment with overridden values. It can wrap either a Base - construction environment, or another OverrideEnvironment, which - can in turn nest arbitrary OverrideEnvironments... - - Note that we do *not* call the underlying base class - (SubsitutionEnvironment) initialization, because we get most of those - from proxying the attributes of the subject construction environment. - But because we subclass SubstitutionEnvironment, this class also - has inherited arg2nodes() and subst*() methods; those methods can't - be proxied because they need *this* object's methods to fetch the - values from the overrides dictionary. - """ - - def __init__(self, subject, overrides={}): - if __debug__: logInstanceCreation(self, 'Environment.OverrideEnvironment') - self.__dict__['__subject'] = subject - self.__dict__['overrides'] = overrides - - # Methods that make this class act like a proxy. - def __getattr__(self, name): - return getattr(self.__dict__['__subject'], name) - def __setattr__(self, name, value): - setattr(self.__dict__['__subject'], name, value) - - # Methods that make this class act like a dictionary. - def __getitem__(self, key): - try: - return self.__dict__['overrides'][key] - except KeyError: - return self.__dict__['__subject'].__getitem__(key) - def __setitem__(self, key, value): - if not is_valid_construction_var(key): - raise SCons.Errors.UserError("Illegal construction variable `%s'" % key) - self.__dict__['overrides'][key] = value - def __delitem__(self, key): - try: - del self.__dict__['overrides'][key] - except KeyError: - deleted = 0 - else: - deleted = 1 - try: - result = self.__dict__['__subject'].__delitem__(key) - except KeyError: - if not deleted: - raise - result = None - return result - def get(self, key, default=None): - """Emulates the get() method of dictionaries.""" - try: - return self.__dict__['overrides'][key] - except KeyError: - return self.__dict__['__subject'].get(key, default) - def has_key(self, key): - try: - self.__dict__['overrides'][key] - return 1 - except KeyError: - return key in self.__dict__['__subject'] - def __contains__(self, key): - if self.__dict__['overrides'].__contains__(key): - return 1 - return self.__dict__['__subject'].__contains__(key) - def Dictionary(self): - """Emulates the items() method of dictionaries.""" - d = self.__dict__['__subject'].Dictionary().copy() - d.update(self.__dict__['overrides']) - return d - def items(self): - """Emulates the items() method of dictionaries.""" - return list(self.Dictionary().items()) - - # Overridden private construction environment methods. - def _update(self, dict): - """Update an environment's values directly, bypassing the normal - checks that occur when users try to set items. - """ - self.__dict__['overrides'].update(dict) - - def gvars(self): - return self.__dict__['__subject'].gvars() - - def lvars(self): - lvars = self.__dict__['__subject'].lvars() - lvars.update(self.__dict__['overrides']) - return lvars - - # Overridden public construction environment methods. - def Replace(self, **kw): - kw = copy_non_reserved_keywords(kw) - self.__dict__['overrides'].update(semi_deepcopy(kw)) - -# The entry point that will be used by the external world -# to refer to a construction environment. This allows the wrapper -# interface to extend a construction environment for its own purposes -# by subclassing SCons.Environment.Base and then assigning the -# class to SCons.Environment.Environment. - -Environment = Base - -# An entry point for returning a proxy subclass instance that overrides -# the subst*() methods so they don't actually perform construction -# variable substitution. This is specifically intended to be the shim -# layer in between global function calls (which don't want construction -# variable substitution) and the DefaultEnvironment() (which would -# substitute variables if left to its own devices).""" -# -# We have to wrap this in a function that allows us to delay definition of -# the class until it's necessary, so that when it subclasses Environment -# it will pick up whatever Environment subclass the wrapper interface -# might have assigned to SCons.Environment.Environment. - -def NoSubstitutionProxy(subject): - class _NoSubstitutionProxy(Environment): - def __init__(self, subject): - self.__dict__['__subject'] = subject - def __getattr__(self, name): - return getattr(self.__dict__['__subject'], name) - def __setattr__(self, name, value): - return setattr(self.__dict__['__subject'], name, value) - def raw_to_mode(self, dict): - try: - raw = dict['raw'] - except KeyError: - pass - else: - del dict['raw'] - dict['mode'] = raw - def subst(self, string, *args, **kwargs): - return string - def subst_kw(self, kw, *args, **kwargs): - return kw - def subst_list(self, string, *args, **kwargs): - nargs = (string, self,) + args - nkw = kwargs.copy() - nkw['gvars'] = {} - self.raw_to_mode(nkw) - return SCons.Subst.scons_subst_list(*nargs, **nkw) - def subst_target_source(self, string, *args, **kwargs): - nargs = (string, self,) + args - nkw = kwargs.copy() - nkw['gvars'] = {} - self.raw_to_mode(nkw) - return SCons.Subst.scons_subst(*nargs, **nkw) - return _NoSubstitutionProxy(subject) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Errors.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Errors.py deleted file mode 100644 index 542bc47e8..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Errors.py +++ /dev/null @@ -1,205 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -"""SCons.Errors - -This file contains the exception classes used to handle internal -and user errors in SCons. - -""" - -__revision__ = "src/engine/SCons/Errors.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Util - -import exceptions - -class BuildError(Exception): - """ Errors occuring while building. - - BuildError have the following attributes: - - Information about the cause of the build error: - ----------------------------------------------- - - errstr : a description of the error message - - status : the return code of the action that caused the build - error. Must be set to a non-zero value even if the - build error is not due to an action returning a - non-zero returned code. - - exitstatus : SCons exit status due to this build error. - Must be nonzero unless due to an explicit Exit() - call. Not always the same as status, since - actions return a status code that should be - respected, but SCons typically exits with 2 - irrespective of the return value of the failed - action. - - filename : The name of the file or directory that caused the - build error. Set to None if no files are associated with - this error. This might be different from the target - being built. For example, failure to create the - directory in which the target file will appear. It - can be None if the error is not due to a particular - filename. - - exc_info : Info about exception that caused the build - error. Set to (None, None, None) if this build - error is not due to an exception. - - - Information about the cause of the location of the error: - --------------------------------------------------------- - - node : the error occured while building this target node(s) - - executor : the executor that caused the build to fail (might - be None if the build failures is not due to the - executor failing) - - action : the action that caused the build to fail (might be - None if the build failures is not due to the an - action failure) - - command : the command line for the action that caused the - build to fail (might be None if the build failures - is not due to the an action failure) - """ - - def __init__(self, - node=None, errstr="Unknown error", status=2, exitstatus=2, - filename=None, executor=None, action=None, command=None, - exc_info=(None, None, None)): - - self.errstr = errstr - self.status = status - self.exitstatus = exitstatus - self.filename = filename - self.exc_info = exc_info - - self.node = node - self.executor = executor - self.action = action - self.command = command - - Exception.__init__(self, node, errstr, status, exitstatus, filename, - executor, action, command, exc_info) - - def __str__(self): - if self.filename: - return self.filename + ': ' + self.errstr - else: - return self.errstr - -class InternalError(Exception): - pass - -class UserError(Exception): - pass - -class StopError(Exception): - pass - -class EnvironmentError(Exception): - pass - -class MSVCError(IOError): - pass - -class ExplicitExit(Exception): - def __init__(self, node=None, status=None, *args): - self.node = node - self.status = status - self.exitstatus = status - Exception.__init__(self, *args) - -def convert_to_BuildError(status, exc_info=None): - """ - Convert any return code a BuildError Exception. - - `status' can either be a return code or an Exception. - The buildError.status we set here will normally be - used as the exit status of the "scons" process. - """ - if not exc_info and isinstance(status, Exception): - exc_info = (status.__class__, status, None) - - if isinstance(status, BuildError): - buildError = status - buildError.exitstatus = 2 # always exit with 2 on build errors - elif isinstance(status, ExplicitExit): - status = status.status - errstr = 'Explicit exit, status %s' % status - buildError = BuildError( - errstr=errstr, - status=status, # might be 0, OK here - exitstatus=status, # might be 0, OK here - exc_info=exc_info) - elif isinstance(status, (StopError, UserError)): - buildError = BuildError( - errstr=str(status), - status=2, - exitstatus=2, - exc_info=exc_info) - elif isinstance(status, exceptions.EnvironmentError): - # If an IOError/OSError happens, raise a BuildError. - # Report the name of the file or directory that caused the - # error, which might be different from the target being built - # (for example, failure to create the directory in which the - # target file will appear). - try: filename = status.filename - except AttributeError: filename = None - buildError = BuildError( - errstr=status.strerror, - status=status.errno, - exitstatus=2, - filename=filename, - exc_info=exc_info) - elif isinstance(status, Exception): - buildError = BuildError( - errstr='%s : %s' % (status.__class__.__name__, status), - status=2, - exitstatus=2, - exc_info=exc_info) - elif SCons.Util.is_String(status): - buildError = BuildError( - errstr=status, - status=2, - exitstatus=2) - else: - buildError = BuildError( - errstr="Error %s" % status, - status=status, - exitstatus=2) - - #import sys - #sys.stderr.write("convert_to_BuildError: status %s => (errstr %s, status %s)"%(status,buildError.errstr, buildError.status)) - return buildError - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Executor.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Executor.py deleted file mode 100644 index 7bb450aa0..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Executor.py +++ /dev/null @@ -1,633 +0,0 @@ -"""SCons.Executor - -A module for executing actions with specific lists of target and source -Nodes. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Executor.py 5023 2010/06/14 22:05:46 scons" - -import collections - -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Memoize - - -class Batch(object): - """Remembers exact association between targets - and sources of executor.""" - def __init__(self, targets=[], sources=[]): - self.targets = targets - self.sources = sources - - - -class TSList(collections.UserList): - """A class that implements $TARGETS or $SOURCES expansions by wrapping - an executor Method. This class is used in the Executor.lvars() - to delay creation of NodeList objects until they're needed. - - Note that we subclass collections.UserList purely so that the - is_Sequence() function will identify an object of this class as - a list during variable expansion. We're not really using any - collections.UserList methods in practice. - """ - def __init__(self, func): - self.func = func - def __getattr__(self, attr): - nl = self.func() - return getattr(nl, attr) - def __getitem__(self, i): - nl = self.func() - return nl[i] - def __getslice__(self, i, j): - nl = self.func() - i = max(i, 0); j = max(j, 0) - return nl[i:j] - def __str__(self): - nl = self.func() - return str(nl) - def __repr__(self): - nl = self.func() - return repr(nl) - -class TSObject(object): - """A class that implements $TARGET or $SOURCE expansions by wrapping - an Executor method. - """ - def __init__(self, func): - self.func = func - def __getattr__(self, attr): - n = self.func() - return getattr(n, attr) - def __str__(self): - n = self.func() - if n: - return str(n) - return '' - def __repr__(self): - n = self.func() - if n: - return repr(n) - return '' - -def rfile(node): - """ - A function to return the results of a Node's rfile() method, - if it exists, and the Node itself otherwise (if it's a Value - Node, e.g.). - """ - try: - rfile = node.rfile - except AttributeError: - return node - else: - return rfile() - - -class Executor(object): - """A class for controlling instances of executing an action. - - This largely exists to hold a single association of an action, - environment, list of environment override dictionaries, targets - and sources for later processing as needed. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self, action, env=None, overridelist=[{}], - targets=[], sources=[], builder_kw={}): - if __debug__: logInstanceCreation(self, 'Executor.Executor') - self.set_action_list(action) - self.pre_actions = [] - self.post_actions = [] - self.env = env - self.overridelist = overridelist - if targets or sources: - self.batches = [Batch(targets[:], sources[:])] - else: - self.batches = [] - self.builder_kw = builder_kw - self._memo = {} - - def get_lvars(self): - try: - return self.lvars - except AttributeError: - self.lvars = { - 'CHANGED_SOURCES' : TSList(self._get_changed_sources), - 'CHANGED_TARGETS' : TSList(self._get_changed_targets), - 'SOURCE' : TSObject(self._get_source), - 'SOURCES' : TSList(self._get_sources), - 'TARGET' : TSObject(self._get_target), - 'TARGETS' : TSList(self._get_targets), - 'UNCHANGED_SOURCES' : TSList(self._get_unchanged_sources), - 'UNCHANGED_TARGETS' : TSList(self._get_unchanged_targets), - } - return self.lvars - - def _get_changes(self): - cs = [] - ct = [] - us = [] - ut = [] - for b in self.batches: - if b.targets[0].is_up_to_date(): - us.extend(list(map(rfile, b.sources))) - ut.extend(b.targets) - else: - cs.extend(list(map(rfile, b.sources))) - ct.extend(b.targets) - self._changed_sources_list = SCons.Util.NodeList(cs) - self._changed_targets_list = SCons.Util.NodeList(ct) - self._unchanged_sources_list = SCons.Util.NodeList(us) - self._unchanged_targets_list = SCons.Util.NodeList(ut) - - def _get_changed_sources(self, *args, **kw): - try: - return self._changed_sources_list - except AttributeError: - self._get_changes() - return self._changed_sources_list - - def _get_changed_targets(self, *args, **kw): - try: - return self._changed_targets_list - except AttributeError: - self._get_changes() - return self._changed_targets_list - - def _get_source(self, *args, **kw): - #return SCons.Util.NodeList([rfile(self.batches[0].sources[0]).get_subst_proxy()]) - return rfile(self.batches[0].sources[0]).get_subst_proxy() - - def _get_sources(self, *args, **kw): - return SCons.Util.NodeList([rfile(n).get_subst_proxy() for n in self.get_all_sources()]) - - def _get_target(self, *args, **kw): - #return SCons.Util.NodeList([self.batches[0].targets[0].get_subst_proxy()]) - return self.batches[0].targets[0].get_subst_proxy() - - def _get_targets(self, *args, **kw): - return SCons.Util.NodeList([n.get_subst_proxy() for n in self.get_all_targets()]) - - def _get_unchanged_sources(self, *args, **kw): - try: - return self._unchanged_sources_list - except AttributeError: - self._get_changes() - return self._unchanged_sources_list - - def _get_unchanged_targets(self, *args, **kw): - try: - return self._unchanged_targets_list - except AttributeError: - self._get_changes() - return self._unchanged_targets_list - - def get_action_targets(self): - if not self.action_list: - return [] - targets_string = self.action_list[0].get_targets(self.env, self) - if targets_string[0] == '$': - targets_string = targets_string[1:] - return self.get_lvars()[targets_string] - - def set_action_list(self, action): - import SCons.Util - if not SCons.Util.is_List(action): - if not action: - import SCons.Errors - raise SCons.Errors.UserError("Executor must have an action.") - action = [action] - self.action_list = action - - def get_action_list(self): - return self.pre_actions + self.action_list + self.post_actions - - def get_all_targets(self): - """Returns all targets for all batches of this Executor.""" - result = [] - for batch in self.batches: - result.extend(batch.targets) - return result - - def get_all_sources(self): - """Returns all sources for all batches of this Executor.""" - result = [] - for batch in self.batches: - result.extend(batch.sources) - return result - - def get_all_children(self): - """Returns all unique children (dependencies) for all batches - of this Executor. - - The Taskmaster can recognize when it's already evaluated a - Node, so we don't have to make this list unique for its intended - canonical use case, but we expect there to be a lot of redundancy - (long lists of batched .cc files #including the same .h files - over and over), so removing the duplicates once up front should - save the Taskmaster a lot of work. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_all_targets(): - result.extend(target.children()) - return result - - def get_all_prerequisites(self): - """Returns all unique (order-only) prerequisites for all batches - of this Executor. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_all_targets(): - result.extend(target.prerequisites) - return result - - def get_action_side_effects(self): - - """Returns all side effects for all batches of this - Executor used by the underlying Action. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_action_targets(): - result.extend(target.side_effects) - return result - - memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - - def get_build_env(self): - """Fetch or create the appropriate build Environment - for this Executor. - """ - try: - return self._memo['get_build_env'] - except KeyError: - pass - - # Create the build environment instance with appropriate - # overrides. These get evaluated against the current - # environment's construction variables so that users can - # add to existing values by referencing the variable in - # the expansion. - overrides = {} - for odict in self.overridelist: - overrides.update(odict) - - import SCons.Defaults - env = self.env or SCons.Defaults.DefaultEnvironment() - build_env = env.Override(overrides) - - self._memo['get_build_env'] = build_env - - return build_env - - def get_build_scanner_path(self, scanner): - """Fetch the scanner path for this executor's targets and sources. - """ - env = self.get_build_env() - try: - cwd = self.batches[0].targets[0].cwd - except (IndexError, AttributeError): - cwd = None - return scanner.path(env, cwd, - self.get_all_targets(), - self.get_all_sources()) - - def get_kw(self, kw={}): - result = self.builder_kw.copy() - result.update(kw) - result['executor'] = self - return result - - def do_nothing(self, target, kw): - return 0 - - def do_execute(self, target, kw): - """Actually execute the action list.""" - env = self.get_build_env() - kw = self.get_kw(kw) - status = 0 - for act in self.get_action_list(): - #args = (self.get_all_targets(), self.get_all_sources(), env) - args = ([], [], env) - status = act(*args, **kw) - if isinstance(status, SCons.Errors.BuildError): - status.executor = self - raise status - elif status: - msg = "Error %s" % status - raise SCons.Errors.BuildError( - errstr=msg, - node=self.batches[0].targets, - executor=self, - action=act) - return status - - # use extra indirection because with new-style objects (Python 2.2 - # and above) we can't override special methods, and nullify() needs - # to be able to do this. - - def __call__(self, target, **kw): - return self.do_execute(target, kw) - - def cleanup(self): - self._memo = {} - - def add_sources(self, sources): - """Add source files to this Executor's list. This is necessary - for "multi" Builders that can be called repeatedly to build up - a source file list for a given target.""" - # TODO(batch): extend to multiple batches - assert (len(self.batches) == 1) - # TODO(batch): remove duplicates? - sources = [x for x in sources if x not in self.batches[0].sources] - self.batches[0].sources.extend(sources) - - def get_sources(self): - return self.batches[0].sources - - def add_batch(self, targets, sources): - """Add pair of associated target and source to this Executor's list. - This is necessary for "batch" Builders that can be called repeatedly - to build up a list of matching target and source files that will be - used in order to update multiple target files at once from multiple - corresponding source files, for tools like MSVC that support it.""" - self.batches.append(Batch(targets, sources)) - - def prepare(self): - """ - Preparatory checks for whether this Executor can go ahead - and (try to) build its targets. - """ - for s in self.get_all_sources(): - if s.missing(): - msg = "Source `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError(msg % (s, self.batches[0].targets[0])) - - def add_pre_action(self, action): - self.pre_actions.append(action) - - def add_post_action(self, action): - self.post_actions.append(action) - - # another extra indirection for new-style objects and nullify... - - def my_str(self): - env = self.get_build_env() - return "\n".join([action.genstring(self.get_all_targets(), - self.get_all_sources(), - env) - for action in self.get_action_list()]) - - - def __str__(self): - return self.my_str() - - def nullify(self): - self.cleanup() - self.do_execute = self.do_nothing - self.my_str = lambda: '' - - memoizer_counters.append(SCons.Memoize.CountValue('get_contents')) - - def get_contents(self): - """Fetch the signature contents. This is the main reason this - class exists, so we can compute this once and cache it regardless - of how many target or source Nodes there are. - """ - try: - return self._memo['get_contents'] - except KeyError: - pass - env = self.get_build_env() - result = "".join([action.get_contents(self.get_all_targets(), - self.get_all_sources(), - env) - for action in self.get_action_list()]) - self._memo['get_contents'] = result - return result - - def get_timestamp(self): - """Fetch a time stamp for this Executor. We don't have one, of - course (only files do), but this is the interface used by the - timestamp module. - """ - return 0 - - def scan_targets(self, scanner): - # TODO(batch): scan by batches - self.scan(scanner, self.get_all_targets()) - - def scan_sources(self, scanner): - # TODO(batch): scan by batches - if self.batches[0].sources: - self.scan(scanner, self.get_all_sources()) - - def scan(self, scanner, node_list): - """Scan a list of this Executor's files (targets or sources) for - implicit dependencies and update all of the targets with them. - This essentially short-circuits an N*M scan of the sources for - each individual target, which is a hell of a lot more efficient. - """ - env = self.get_build_env() - - # TODO(batch): scan by batches) - deps = [] - if scanner: - for node in node_list: - node.disambiguate() - s = scanner.select(node) - if not s: - continue - path = self.get_build_scanner_path(s) - deps.extend(node.get_implicit_deps(env, s, path)) - else: - kw = self.get_kw() - for node in node_list: - node.disambiguate() - scanner = node.get_env_scanner(env, kw) - if not scanner: - continue - scanner = scanner.select(node) - if not scanner: - continue - path = self.get_build_scanner_path(scanner) - deps.extend(node.get_implicit_deps(env, scanner, path)) - - deps.extend(self.get_implicit_deps()) - - for tgt in self.get_all_targets(): - tgt.add_to_implicit(deps) - - def _get_unignored_sources_key(self, node, ignore=()): - return (node,) + tuple(ignore) - - memoizer_counters.append(SCons.Memoize.CountDict('get_unignored_sources', _get_unignored_sources_key)) - - def get_unignored_sources(self, node, ignore=()): - key = (node,) + tuple(ignore) - try: - memo_dict = self._memo['get_unignored_sources'] - except KeyError: - memo_dict = {} - self._memo['get_unignored_sources'] = memo_dict - else: - try: - return memo_dict[key] - except KeyError: - pass - - if node: - # TODO: better way to do this (it's a linear search, - # but it may not be critical path)? - sourcelist = [] - for b in self.batches: - if node in b.targets: - sourcelist = b.sources - break - else: - sourcelist = self.get_all_sources() - if ignore: - idict = {} - for i in ignore: - idict[i] = 1 - sourcelist = [s for s in sourcelist if s not in idict] - - memo_dict[key] = sourcelist - - return sourcelist - - def get_implicit_deps(self): - """Return the executor's implicit dependencies, i.e. the nodes of - the commands to be executed.""" - result = [] - build_env = self.get_build_env() - for act in self.get_action_list(): - deps = act.get_implicit_deps(self.get_all_targets(), - self.get_all_sources(), - build_env) - result.extend(deps) - return result - - - -_batch_executors = {} - -def GetBatchExecutor(key): - return _batch_executors[key] - -def AddBatchExecutor(key, executor): - assert key not in _batch_executors - _batch_executors[key] = executor - -nullenv = None - - -def get_NullEnvironment(): - """Use singleton pattern for Null Environments.""" - global nullenv - - import SCons.Util - class NullEnvironment(SCons.Util.Null): - import SCons.CacheDir - _CacheDir_path = None - _CacheDir = SCons.CacheDir.CacheDir(None) - def get_CacheDir(self): - return self._CacheDir - - if not nullenv: - nullenv = NullEnvironment() - return nullenv - -class Null(object): - """A null Executor, with a null build Environment, that does - nothing when the rest of the methods call it. - - This might be able to disapper when we refactor things to - disassociate Builders from Nodes entirely, so we're not - going to worry about unit tests for this--at least for now. - """ - def __init__(self, *args, **kw): - if __debug__: logInstanceCreation(self, 'Executor.Null') - self.batches = [Batch(kw['targets'][:], [])] - def get_build_env(self): - return get_NullEnvironment() - def get_build_scanner_path(self): - return None - def cleanup(self): - pass - def prepare(self): - pass - def get_unignored_sources(self, *args, **kw): - return tuple(()) - def get_action_targets(self): - return [] - def get_action_list(self): - return [] - def get_all_targets(self): - return self.batches[0].targets - def get_all_sources(self): - return self.batches[0].targets[0].sources - def get_all_children(self): - return self.get_all_sources() - def get_all_prerequisites(self): - return [] - def get_action_side_effects(self): - return [] - def __call__(self, *args, **kw): - return 0 - def get_contents(self): - return '' - def _morph(self): - """Morph this Null executor to a real Executor object.""" - batches = self.batches - self.__class__ = Executor - self.__init__([]) - self.batches = batches - - # The following methods require morphing this Null Executor to a - # real Executor object. - - def add_pre_action(self, action): - self._morph() - self.add_pre_action(action) - def add_post_action(self, action): - self._morph() - self.add_post_action(action) - def set_action_list(self, action): - self._morph() - self.set_action_list(action) - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Job.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Job.py deleted file mode 100644 index bbf1def43..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Job.py +++ /dev/null @@ -1,435 +0,0 @@ -"""SCons.Job - -This module defines the Serial and Parallel classes that execute tasks to -complete a build. The Jobs class provides a higher level interface to start, -stop, and wait on jobs. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Job.py 5023 2010/06/14 22:05:46 scons" - -import SCons.compat - -import os -import signal - -import SCons.Errors - -# The default stack size (in kilobytes) of the threads used to execute -# jobs in parallel. -# -# We use a stack size of 256 kilobytes. The default on some platforms -# is too large and prevents us from creating enough threads to fully -# parallelized the build. For example, the default stack size on linux -# is 8 MBytes. - -explicit_stack_size = None -default_stack_size = 256 - -interrupt_msg = 'Build interrupted.' - - -class InterruptState(object): - def __init__(self): - self.interrupted = False - - def set(self): - self.interrupted = True - - def __call__(self): - return self.interrupted - - -class Jobs(object): - """An instance of this class initializes N jobs, and provides - methods for starting, stopping, and waiting on all N jobs. - """ - - def __init__(self, num, taskmaster): - """ - create 'num' jobs using the given taskmaster. - - If 'num' is 1 or less, then a serial job will be used, - otherwise a parallel job with 'num' worker threads will - be used. - - The 'num_jobs' attribute will be set to the actual number of jobs - allocated. If more than one job is requested but the Parallel - class can't do it, it gets reset to 1. Wrapping interfaces that - care should check the value of 'num_jobs' after initialization. - """ - - self.job = None - if num > 1: - stack_size = explicit_stack_size - if stack_size is None: - stack_size = default_stack_size - - try: - self.job = Parallel(taskmaster, num, stack_size) - self.num_jobs = num - except NameError: - pass - if self.job is None: - self.job = Serial(taskmaster) - self.num_jobs = 1 - - def run(self, postfunc=lambda: None): - """Run the jobs. - - postfunc() will be invoked after the jobs has run. It will be - invoked even if the jobs are interrupted by a keyboard - interrupt (well, in fact by a signal such as either SIGINT, - SIGTERM or SIGHUP). The execution of postfunc() is protected - against keyboard interrupts and is guaranteed to run to - completion.""" - self._setup_sig_handler() - try: - self.job.start() - finally: - postfunc() - self._reset_sig_handler() - - def were_interrupted(self): - """Returns whether the jobs were interrupted by a signal.""" - return self.job.interrupted() - - def _setup_sig_handler(self): - """Setup an interrupt handler so that SCons can shutdown cleanly in - various conditions: - - a) SIGINT: Keyboard interrupt - b) SIGTERM: kill or system shutdown - c) SIGHUP: Controlling shell exiting - - We handle all of these cases by stopping the taskmaster. It - turns out that it very difficult to stop the build process - by throwing asynchronously an exception such as - KeyboardInterrupt. For example, the python Condition - variables (threading.Condition) and queue's do not seem to - asynchronous-exception-safe. It would require adding a whole - bunch of try/finally block and except KeyboardInterrupt all - over the place. - - Note also that we have to be careful to handle the case when - SCons forks before executing another process. In that case, we - want the child to exit immediately. - """ - def handler(signum, stack, self=self, parentpid=os.getpid()): - if os.getpid() == parentpid: - self.job.taskmaster.stop() - self.job.interrupted.set() - else: - os._exit(2) - - self.old_sigint = signal.signal(signal.SIGINT, handler) - self.old_sigterm = signal.signal(signal.SIGTERM, handler) - try: - self.old_sighup = signal.signal(signal.SIGHUP, handler) - except AttributeError: - pass - - def _reset_sig_handler(self): - """Restore the signal handlers to their previous state (before the - call to _setup_sig_handler().""" - - signal.signal(signal.SIGINT, self.old_sigint) - signal.signal(signal.SIGTERM, self.old_sigterm) - try: - signal.signal(signal.SIGHUP, self.old_sighup) - except AttributeError: - pass - -class Serial(object): - """This class is used to execute tasks in series, and is more efficient - than Parallel, but is only appropriate for non-parallel builds. Only - one instance of this class should be in existence at a time. - - This class is not thread safe. - """ - - def __init__(self, taskmaster): - """Create a new serial job given a taskmaster. - - The taskmaster's next_task() method should return the next task - that needs to be executed, or None if there are no more tasks. The - taskmaster's executed() method will be called for each task when it - is successfully executed or failed() will be called if it failed to - execute (e.g. execute() raised an exception).""" - - self.taskmaster = taskmaster - self.interrupted = InterruptState() - - def start(self): - """Start the job. This will begin pulling tasks from the taskmaster - and executing them, and return when there are no more tasks. If a task - fails to execute (i.e. execute() raises an exception), then the job will - stop.""" - - while True: - task = self.taskmaster.next_task() - - if task is None: - break - - try: - task.prepare() - if task.needs_execute(): - task.execute() - except: - if self.interrupted(): - try: - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - except: - task.exception_set() - else: - task.exception_set() - - # Let the failed() callback function arrange for the - # build to stop if that's appropriate. - task.failed() - else: - task.executed() - - task.postprocess() - self.taskmaster.cleanup() - - -# Trap import failure so that everything in the Job module but the -# Parallel class (and its dependent classes) will work if the interpreter -# doesn't support threads. -try: - import queue - import threading -except ImportError: - pass -else: - class Worker(threading.Thread): - """A worker thread waits on a task to be posted to its request queue, - dequeues the task, executes it, and posts a tuple including the task - and a boolean indicating whether the task executed successfully. """ - - def __init__(self, requestQueue, resultsQueue, interrupted): - threading.Thread.__init__(self) - self.setDaemon(1) - self.requestQueue = requestQueue - self.resultsQueue = resultsQueue - self.interrupted = interrupted - self.start() - - def run(self): - while True: - task = self.requestQueue.get() - - if task is None: - # The "None" value is used as a sentinel by - # ThreadPool.cleanup(). This indicates that there - # are no more tasks, so we should quit. - break - - try: - if self.interrupted(): - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - task.execute() - except: - task.exception_set() - ok = False - else: - ok = True - - self.resultsQueue.put((task, ok)) - - class ThreadPool(object): - """This class is responsible for spawning and managing worker threads.""" - - def __init__(self, num, stack_size, interrupted): - """Create the request and reply queues, and 'num' worker threads. - - One must specify the stack size of the worker threads. The - stack size is specified in kilobytes. - """ - self.requestQueue = queue.Queue(0) - self.resultsQueue = queue.Queue(0) - - try: - prev_size = threading.stack_size(stack_size*1024) - except AttributeError, e: - # Only print a warning if the stack size has been - # explicitly set. - if not explicit_stack_size is None: - msg = "Setting stack size is unsupported by this version of Python:\n " + \ - e.args[0] - SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg) - except ValueError, e: - msg = "Setting stack size failed:\n " + str(e) - SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg) - - # Create worker threads - self.workers = [] - for _ in range(num): - worker = Worker(self.requestQueue, self.resultsQueue, interrupted) - self.workers.append(worker) - - if 'prev_size' in locals(): - threading.stack_size(prev_size) - - def put(self, task): - """Put task into request queue.""" - self.requestQueue.put(task) - - def get(self): - """Remove and return a result tuple from the results queue.""" - return self.resultsQueue.get() - - def preparation_failed(self, task): - self.resultsQueue.put((task, False)) - - def cleanup(self): - """ - Shuts down the thread pool, giving each worker thread a - chance to shut down gracefully. - """ - # For each worker thread, put a sentinel "None" value - # on the requestQueue (indicating that there's no work - # to be done) so that each worker thread will get one and - # terminate gracefully. - for _ in self.workers: - self.requestQueue.put(None) - - # Wait for all of the workers to terminate. - # - # If we don't do this, later Python versions (2.4, 2.5) often - # seem to raise exceptions during shutdown. This happens - # in requestQueue.get(), as an assertion failure that - # requestQueue.not_full is notified while not acquired, - # seemingly because the main thread has shut down (or is - # in the process of doing so) while the workers are still - # trying to pull sentinels off the requestQueue. - # - # Normally these terminations should happen fairly quickly, - # but we'll stick a one-second timeout on here just in case - # someone gets hung. - for worker in self.workers: - worker.join(1.0) - self.workers = [] - - class Parallel(object): - """This class is used to execute tasks in parallel, and is somewhat - less efficient than Serial, but is appropriate for parallel builds. - - This class is thread safe. - """ - - def __init__(self, taskmaster, num, stack_size): - """Create a new parallel job given a taskmaster. - - The taskmaster's next_task() method should return the next - task that needs to be executed, or None if there are no more - tasks. The taskmaster's executed() method will be called - for each task when it is successfully executed or failed() - will be called if the task failed to execute (i.e. execute() - raised an exception). - - Note: calls to taskmaster are serialized, but calls to - execute() on distinct tasks are not serialized, because - that is the whole point of parallel jobs: they can execute - multiple tasks simultaneously. """ - - self.taskmaster = taskmaster - self.interrupted = InterruptState() - self.tp = ThreadPool(num, stack_size, self.interrupted) - - self.maxjobs = num - - def start(self): - """Start the job. This will begin pulling tasks from the - taskmaster and executing them, and return when there are no - more tasks. If a task fails to execute (i.e. execute() raises - an exception), then the job will stop.""" - - jobs = 0 - - while True: - # Start up as many available tasks as we're - # allowed to. - while jobs < self.maxjobs: - task = self.taskmaster.next_task() - if task is None: - break - - try: - # prepare task for execution - task.prepare() - except: - task.exception_set() - task.failed() - task.postprocess() - else: - if task.needs_execute(): - # dispatch task - self.tp.put(task) - jobs = jobs + 1 - else: - task.executed() - task.postprocess() - - if not task and not jobs: break - - # Let any/all completed tasks finish up before we go - # back and put the next batch of tasks on the queue. - while True: - task, ok = self.tp.get() - jobs = jobs - 1 - - if ok: - task.executed() - else: - if self.interrupted(): - try: - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - except: - task.exception_set() - - # Let the failed() callback function arrange - # for the build to stop if that's appropriate. - task.failed() - - task.postprocess() - - if self.tp.resultsQueue.empty(): - break - - self.tp.cleanup() - self.taskmaster.cleanup() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Memoize.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Memoize.py deleted file mode 100644 index 6be415b22..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Memoize.py +++ /dev/null @@ -1,244 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Memoize.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Memoizer - -A metaclass implementation to count hits and misses of the computed -values that various methods cache in memory. - -Use of this modules assumes that wrapped methods be coded to cache their -values in a consistent way. Here is an example of wrapping a method -that returns a computed value, with no input parameters: - - memoizer_counters = [] # Memoization - - memoizer_counters.append(SCons.Memoize.CountValue('foo')) # Memoization - - def foo(self): - - try: # Memoization - return self._memo['foo'] # Memoization - except KeyError: # Memoization - pass # Memoization - - result = self.compute_foo_value() - - self._memo['foo'] = result # Memoization - - return result - -Here is an example of wrapping a method that will return different values -based on one or more input arguments: - - def _bar_key(self, argument): # Memoization - return argument # Memoization - - memoizer_counters.append(SCons.Memoize.CountDict('bar', _bar_key)) # Memoization - - def bar(self, argument): - - memo_key = argument # Memoization - try: # Memoization - memo_dict = self._memo['bar'] # Memoization - except KeyError: # Memoization - memo_dict = {} # Memoization - self._memo['dict'] = memo_dict # Memoization - else: # Memoization - try: # Memoization - return memo_dict[memo_key] # Memoization - except KeyError: # Memoization - pass # Memoization - - result = self.compute_bar_value(argument) - - memo_dict[memo_key] = result # Memoization - - return result - -At one point we avoided replicating this sort of logic in all the methods -by putting it right into this module, but we've moved away from that at -present (see the "Historical Note," below.). - -Deciding what to cache is tricky, because different configurations -can have radically different performance tradeoffs, and because the -tradeoffs involved are often so non-obvious. Consequently, deciding -whether or not to cache a given method will likely be more of an art than -a science, but should still be based on available data from this module. -Here are some VERY GENERAL guidelines about deciding whether or not to -cache return values from a method that's being called a lot: - - -- The first question to ask is, "Can we change the calling code - so this method isn't called so often?" Sometimes this can be - done by changing the algorithm. Sometimes the *caller* should - be memoized, not the method you're looking at. - - -- The memoized function should be timed with multiple configurations - to make sure it doesn't inadvertently slow down some other - configuration. - - -- When memoizing values based on a dictionary key composed of - input arguments, you don't need to use all of the arguments - if some of them don't affect the return values. - -Historical Note: The initial Memoizer implementation actually handled -the caching of values for the wrapped methods, based on a set of generic -algorithms for computing hashable values based on the method's arguments. -This collected caching logic nicely, but had two drawbacks: - - Running arguments through a generic key-conversion mechanism is slower - (and less flexible) than just coding these things directly. Since the - methods that need memoized values are generally performance-critical, - slowing them down in order to collect the logic isn't the right - tradeoff. - - Use of the memoizer really obscured what was being called, because - all the memoized methods were wrapped with re-used generic methods. - This made it more difficult, for example, to use the Python profiler - to figure out how to optimize the underlying methods. -""" - -import types - -# A flag controlling whether or not we actually use memoization. -use_memoizer = None - -CounterList = [] - -class Counter(object): - """ - Base class for counting memoization hits and misses. - - We expect that the metaclass initialization will have filled in - the .name attribute that represents the name of the function - being counted. - """ - def __init__(self, method_name): - """ - """ - self.method_name = method_name - self.hit = 0 - self.miss = 0 - CounterList.append(self) - def display(self): - fmt = " %7d hits %7d misses %s()" - print fmt % (self.hit, self.miss, self.name) - def __cmp__(self, other): - try: - return cmp(self.name, other.name) - except AttributeError: - return 0 - -class CountValue(Counter): - """ - A counter class for simple, atomic memoized values. - - A CountValue object should be instantiated in a class for each of - the class's methods that memoizes its return value by simply storing - the return value in its _memo dictionary. - - We expect that the metaclass initialization will fill in the - .underlying_method attribute with the method that we're wrapping. - We then call the underlying_method method after counting whether - its memoized value has already been set (a hit) or not (a miss). - """ - def __call__(self, *args, **kw): - obj = args[0] - if self.method_name in obj._memo: - self.hit = self.hit + 1 - else: - self.miss = self.miss + 1 - return self.underlying_method(*args, **kw) - -class CountDict(Counter): - """ - A counter class for memoized values stored in a dictionary, with - keys based on the method's input arguments. - - A CountDict object is instantiated in a class for each of the - class's methods that memoizes its return value in a dictionary, - indexed by some key that can be computed from one or more of - its input arguments. - - We expect that the metaclass initialization will fill in the - .underlying_method attribute with the method that we're wrapping. - We then call the underlying_method method after counting whether the - computed key value is already present in the memoization dictionary - (a hit) or not (a miss). - """ - def __init__(self, method_name, keymaker): - """ - """ - Counter.__init__(self, method_name) - self.keymaker = keymaker - def __call__(self, *args, **kw): - obj = args[0] - try: - memo_dict = obj._memo[self.method_name] - except KeyError: - self.miss = self.miss + 1 - else: - key = self.keymaker(*args, **kw) - if key in memo_dict: - self.hit = self.hit + 1 - else: - self.miss = self.miss + 1 - return self.underlying_method(*args, **kw) - -class Memoizer(object): - """Object which performs caching of method calls for its 'primary' - instance.""" - - def __init__(self): - pass - -def Dump(title=None): - if title: - print title - CounterList.sort() - for counter in CounterList: - counter.display() - -class Memoized_Metaclass(type): - def __init__(cls, name, bases, cls_dict): - super(Memoized_Metaclass, cls).__init__(name, bases, cls_dict) - - for counter in cls_dict.get('memoizer_counters', []): - method_name = counter.method_name - - counter.name = cls.__name__ + '.' + method_name - counter.underlying_method = cls_dict[method_name] - - replacement_method = types.MethodType(counter, None, cls) - setattr(cls, method_name, replacement_method) - -def EnableMemoization(): - global use_memoizer - use_memoizer = 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Alias.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Alias.py deleted file mode 100644 index 291ac4d5b..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Alias.py +++ /dev/null @@ -1,152 +0,0 @@ - -"""scons.Node.Alias - -Alias nodes. - -This creates a hash of global Aliases (dummy targets). - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Node/Alias.py 5023 2010/06/14 22:05:46 scons" - -import collections - -import SCons.Errors -import SCons.Node -import SCons.Util - -class AliasNameSpace(collections.UserDict): - def Alias(self, name, **kw): - if isinstance(name, SCons.Node.Alias.Alias): - return name - try: - a = self[name] - except KeyError: - a = SCons.Node.Alias.Alias(name, **kw) - self[name] = a - return a - - def lookup(self, name, **kw): - try: - return self[name] - except KeyError: - return None - -class AliasNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - field_list = ['csig'] - def str_to_node(self, s): - return default_ans.Alias(s) - -class AliasBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -class Alias(SCons.Node.Node): - - NodeInfo = AliasNodeInfo - BuildInfo = AliasBuildInfo - - def __init__(self, name): - SCons.Node.Node.__init__(self) - self.name = name - - def str_for_display(self): - return '"' + self.__str__() + '"' - - def __str__(self): - return self.name - - def make_ready(self): - self.get_csig() - - really_build = SCons.Node.Node.build - is_up_to_date = SCons.Node.Node.children_are_up_to_date - - def is_under(self, dir): - # Make Alias nodes get built regardless of - # what directory scons was run from. Alias nodes - # are outside the filesystem: - return 1 - - def get_contents(self): - """The contents of an alias is the concatenation - of the content signatures of all its sources.""" - childsigs = [n.get_csig() for n in self.children()] - return ''.join(childsigs) - - def sconsign(self): - """An Alias is not recorded in .sconsign files""" - pass - - # - # - # - - def changed_since_last_build(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def build(self): - """A "builder" for aliases.""" - pass - - def convert(self): - try: del self.builder - except AttributeError: pass - self.reset_executor() - self.build = self.really_build - - def get_csig(self): - """ - Generate a node's content signature, the digested signature - of its content. - - node - the node - cache - alternate node to use for the signature cache - returns - the content signature - """ - try: - return self.ninfo.csig - except AttributeError: - pass - - contents = self.get_contents() - csig = SCons.Util.MD5signature(contents) - self.get_ninfo().csig = csig - return csig - -default_ans = AliasNameSpace() - -SCons.Node.arg2nodes_lookups.append(default_ans.lookup) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/FS.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/FS.py deleted file mode 100644 index 9298d9893..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/FS.py +++ /dev/null @@ -1,3142 +0,0 @@ -"""scons.Node.FS - -File system nodes. - -These Nodes represent the canonical external objects that people think -of when they think of building software: files and directories. - -This holds a "default_fs" variable that should be initialized with an FS -that can be used by scripts or modules looking for the canonical default. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Node/FS.py 5023 2010/06/14 22:05:46 scons" - -import fnmatch -import os -import re -import shutil -import stat -import sys -import time -import codecs - -import SCons.Action -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Memoize -import SCons.Node -import SCons.Node.Alias -import SCons.Subst -import SCons.Util -import SCons.Warnings - -from SCons.Debug import Trace - -do_store_info = True - - -class EntryProxyAttributeError(AttributeError): - """ - An AttributeError subclass for recording and displaying the name - of the underlying Entry involved in an AttributeError exception. - """ - def __init__(self, entry_proxy, attribute): - AttributeError.__init__(self) - self.entry_proxy = entry_proxy - self.attribute = attribute - def __str__(self): - entry = self.entry_proxy.get() - fmt = "%s instance %s has no attribute %s" - return fmt % (entry.__class__.__name__, - repr(entry.name), - repr(self.attribute)) - -# The max_drift value: by default, use a cached signature value for -# any file that's been untouched for more than two days. -default_max_drift = 2*24*60*60 - -# -# We stringify these file system Nodes a lot. Turning a file system Node -# into a string is non-trivial, because the final string representation -# can depend on a lot of factors: whether it's a derived target or not, -# whether it's linked to a repository or source directory, and whether -# there's duplication going on. The normal technique for optimizing -# calculations like this is to memoize (cache) the string value, so you -# only have to do the calculation once. -# -# A number of the above factors, however, can be set after we've already -# been asked to return a string for a Node, because a Repository() or -# VariantDir() call or the like may not occur until later in SConscript -# files. So this variable controls whether we bother trying to save -# string values for Nodes. The wrapper interface can set this whenever -# they're done mucking with Repository and VariantDir and the other stuff, -# to let this module know it can start returning saved string values -# for Nodes. -# -Save_Strings = None - -def save_strings(val): - global Save_Strings - Save_Strings = val - -# -# Avoid unnecessary function calls by recording a Boolean value that -# tells us whether or not os.path.splitdrive() actually does anything -# on this system, and therefore whether we need to bother calling it -# when looking up path names in various methods below. -# - -do_splitdrive = None - -def initialize_do_splitdrive(): - global do_splitdrive - drive, path = os.path.splitdrive('X:/foo') - do_splitdrive = not not drive - -initialize_do_splitdrive() - -# - -needs_normpath_check = None - -def initialize_normpath_check(): - """ - Initialize the normpath_check regular expression. - - This function is used by the unit tests to re-initialize the pattern - when testing for behavior with different values of os.sep. - """ - global needs_normpath_check - if os.sep == '/': - pattern = r'.*/|\.$|\.\.$' - else: - pattern = r'.*[/%s]|\.$|\.\.$' % re.escape(os.sep) - needs_normpath_check = re.compile(pattern) - -initialize_normpath_check() - -# -# SCons.Action objects for interacting with the outside world. -# -# The Node.FS methods in this module should use these actions to -# create and/or remove files and directories; they should *not* use -# os.{link,symlink,unlink,mkdir}(), etc., directly. -# -# Using these SCons.Action objects ensures that descriptions of these -# external activities are properly displayed, that the displays are -# suppressed when the -s (silent) option is used, and (most importantly) -# the actions are disabled when the the -n option is used, in which case -# there should be *no* changes to the external file system(s)... -# - -if hasattr(os, 'link'): - def _hardlink_func(fs, src, dst): - # If the source is a symlink, we can't just hard-link to it - # because a relative symlink may point somewhere completely - # different. We must disambiguate the symlink and then - # hard-link the final destination file. - while fs.islink(src): - link = fs.readlink(src) - if not os.path.isabs(link): - src = link - else: - src = os.path.join(os.path.dirname(src), link) - fs.link(src, dst) -else: - _hardlink_func = None - -if hasattr(os, 'symlink'): - def _softlink_func(fs, src, dst): - fs.symlink(src, dst) -else: - _softlink_func = None - -def _copy_func(fs, src, dest): - shutil.copy2(src, dest) - st = fs.stat(src) - fs.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - - -Valid_Duplicates = ['hard-soft-copy', 'soft-hard-copy', - 'hard-copy', 'soft-copy', 'copy'] - -Link_Funcs = [] # contains the callables of the specified duplication style - -def set_duplicate(duplicate): - # Fill in the Link_Funcs list according to the argument - # (discarding those not available on the platform). - - # Set up the dictionary that maps the argument names to the - # underlying implementations. We do this inside this function, - # not in the top-level module code, so that we can remap os.link - # and os.symlink for testing purposes. - link_dict = { - 'hard' : _hardlink_func, - 'soft' : _softlink_func, - 'copy' : _copy_func - } - - if not duplicate in Valid_Duplicates: - raise SCons.Errors.InternalError("The argument of set_duplicate " - "should be in Valid_Duplicates") - global Link_Funcs - Link_Funcs = [] - for func in duplicate.split('-'): - if link_dict[func]: - Link_Funcs.append(link_dict[func]) - -def LinkFunc(target, source, env): - # Relative paths cause problems with symbolic links, so - # we use absolute paths, which may be a problem for people - # who want to move their soft-linked src-trees around. Those - # people should use the 'hard-copy' mode, softlinks cannot be - # used for that; at least I have no idea how ... - src = source[0].abspath - dest = target[0].abspath - dir, file = os.path.split(dest) - if dir and not target[0].fs.isdir(dir): - os.makedirs(dir) - if not Link_Funcs: - # Set a default order of link functions. - set_duplicate('hard-soft-copy') - fs = source[0].fs - # Now link the files with the previously specified order. - for func in Link_Funcs: - try: - func(fs, src, dest) - break - except (IOError, OSError): - # An OSError indicates something happened like a permissions - # problem or an attempt to symlink across file-system - # boundaries. An IOError indicates something like the file - # not existing. In either case, keeping trying additional - # functions in the list and only raise an error if the last - # one failed. - if func == Link_Funcs[-1]: - # exception of the last link method (copy) are fatal - raise - return 0 - -Link = SCons.Action.Action(LinkFunc, None) -def LocalString(target, source, env): - return 'Local copy of %s from %s' % (target[0], source[0]) - -LocalCopy = SCons.Action.Action(LinkFunc, LocalString) - -def UnlinkFunc(target, source, env): - t = target[0] - t.fs.unlink(t.abspath) - return 0 - -Unlink = SCons.Action.Action(UnlinkFunc, None) - -def MkdirFunc(target, source, env): - t = target[0] - if not t.exists(): - t.fs.mkdir(t.abspath) - return 0 - -Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None) - -MkdirBuilder = None - -def get_MkdirBuilder(): - global MkdirBuilder - if MkdirBuilder is None: - import SCons.Builder - import SCons.Defaults - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - MkdirBuilder = SCons.Builder.Builder(action = Mkdir, - env = None, - explain = None, - is_explicit = None, - target_scanner = SCons.Defaults.DirEntryScanner, - name = "MkdirBuilder") - return MkdirBuilder - -class _Null(object): - pass - -_null = _Null() - -DefaultSCCSBuilder = None -DefaultRCSBuilder = None - -def get_DefaultSCCSBuilder(): - global DefaultSCCSBuilder - if DefaultSCCSBuilder is None: - import SCons.Builder - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR') - DefaultSCCSBuilder = SCons.Builder.Builder(action = act, - env = None, - name = "DefaultSCCSBuilder") - return DefaultSCCSBuilder - -def get_DefaultRCSBuilder(): - global DefaultRCSBuilder - if DefaultRCSBuilder is None: - import SCons.Builder - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR') - DefaultRCSBuilder = SCons.Builder.Builder(action = act, - env = None, - name = "DefaultRCSBuilder") - return DefaultRCSBuilder - -# Cygwin's os.path.normcase pretends it's on a case-sensitive filesystem. -_is_cygwin = sys.platform == "cygwin" -if os.path.normcase("TeSt") == os.path.normpath("TeSt") and not _is_cygwin: - def _my_normcase(x): - return x -else: - def _my_normcase(x): - return x.upper() - - - -class DiskChecker(object): - def __init__(self, type, do, ignore): - self.type = type - self.do = do - self.ignore = ignore - self.func = do - def __call__(self, *args, **kw): - return self.func(*args, **kw) - def set(self, list): - if self.type in list: - self.func = self.do - else: - self.func = self.ignore - -def do_diskcheck_match(node, predicate, errorfmt): - result = predicate() - try: - # If calling the predicate() cached a None value from stat(), - # remove it so it doesn't interfere with later attempts to - # build this Node as we walk the DAG. (This isn't a great way - # to do this, we're reaching into an interface that doesn't - # really belong to us, but it's all about performance, so - # for now we'll just document the dependency...) - if node._memo['stat'] is None: - del node._memo['stat'] - except (AttributeError, KeyError): - pass - if result: - raise TypeError(errorfmt % node.abspath) - -def ignore_diskcheck_match(node, predicate, errorfmt): - pass - -def do_diskcheck_rcs(node, name): - try: - rcs_dir = node.rcs_dir - except AttributeError: - if node.entry_exists_on_disk('RCS'): - rcs_dir = node.Dir('RCS') - else: - rcs_dir = None - node.rcs_dir = rcs_dir - if rcs_dir: - return rcs_dir.entry_exists_on_disk(name+',v') - return None - -def ignore_diskcheck_rcs(node, name): - return None - -def do_diskcheck_sccs(node, name): - try: - sccs_dir = node.sccs_dir - except AttributeError: - if node.entry_exists_on_disk('SCCS'): - sccs_dir = node.Dir('SCCS') - else: - sccs_dir = None - node.sccs_dir = sccs_dir - if sccs_dir: - return sccs_dir.entry_exists_on_disk('s.'+name) - return None - -def ignore_diskcheck_sccs(node, name): - return None - -diskcheck_match = DiskChecker('match', do_diskcheck_match, ignore_diskcheck_match) -diskcheck_rcs = DiskChecker('rcs', do_diskcheck_rcs, ignore_diskcheck_rcs) -diskcheck_sccs = DiskChecker('sccs', do_diskcheck_sccs, ignore_diskcheck_sccs) - -diskcheckers = [ - diskcheck_match, - diskcheck_rcs, - diskcheck_sccs, -] - -def set_diskcheck(list): - for dc in diskcheckers: - dc.set(list) - -def diskcheck_types(): - return [dc.type for dc in diskcheckers] - - - -class EntryProxy(SCons.Util.Proxy): - - __str__ = SCons.Util.Delegate('__str__') - - def __get_abspath(self): - entry = self.get() - return SCons.Subst.SpecialAttrWrapper(entry.get_abspath(), - entry.name + "_abspath") - - def __get_filebase(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[0], - name + "_filebase") - - def __get_suffix(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[1], - name + "_suffix") - - def __get_file(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(name, name + "_file") - - def __get_base_path(self): - """Return the file's directory and file name, with the - suffix stripped.""" - entry = self.get() - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(entry.get_path())[0], - entry.name + "_base") - - def __get_posix_path(self): - """Return the path with / as the path separator, - regardless of platform.""" - if os.sep == '/': - return self - else: - entry = self.get() - r = entry.get_path().replace(os.sep, '/') - return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_posix") - - def __get_windows_path(self): - """Return the path with \ as the path separator, - regardless of platform.""" - if os.sep == '\\': - return self - else: - entry = self.get() - r = entry.get_path().replace(os.sep, '\\') - return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_windows") - - def __get_srcnode(self): - return EntryProxy(self.get().srcnode()) - - def __get_srcdir(self): - """Returns the directory containing the source node linked to this - node via VariantDir(), or the directory of this node if not linked.""" - return EntryProxy(self.get().srcnode().dir) - - def __get_rsrcnode(self): - return EntryProxy(self.get().srcnode().rfile()) - - def __get_rsrcdir(self): - """Returns the directory containing the source node linked to this - node via VariantDir(), or the directory of this node if not linked.""" - return EntryProxy(self.get().srcnode().rfile().dir) - - def __get_dir(self): - return EntryProxy(self.get().dir) - - dictSpecialAttrs = { "base" : __get_base_path, - "posix" : __get_posix_path, - "windows" : __get_windows_path, - "win32" : __get_windows_path, - "srcpath" : __get_srcnode, - "srcdir" : __get_srcdir, - "dir" : __get_dir, - "abspath" : __get_abspath, - "filebase" : __get_filebase, - "suffix" : __get_suffix, - "file" : __get_file, - "rsrcpath" : __get_rsrcnode, - "rsrcdir" : __get_rsrcdir, - } - - def __getattr__(self, name): - # This is how we implement the "special" attributes - # such as base, posix, srcdir, etc. - try: - attr_function = self.dictSpecialAttrs[name] - except KeyError: - try: - attr = SCons.Util.Proxy.__getattr__(self, name) - except AttributeError, e: - # Raise our own AttributeError subclass with an - # overridden __str__() method that identifies the - # name of the entry that caused the exception. - raise EntryProxyAttributeError(self, name) - return attr - else: - return attr_function(self) - -class Base(SCons.Node.Node): - """A generic class for file system entries. This class is for - when we don't know yet whether the entry being looked up is a file - or a directory. Instances of this class can morph into either - Dir or File objects by a later, more precise lookup. - - Note: this class does not define __cmp__ and __hash__ for - efficiency reasons. SCons does a lot of comparing of - Node.FS.{Base,Entry,File,Dir} objects, so those operations must be - as fast as possible, which means we want to use Python's built-in - object identity comparisons. - """ - - memoizer_counters = [] - - def __init__(self, name, directory, fs): - """Initialize a generic Node.FS.Base object. - - Call the superclass initialization, take care of setting up - our relative and absolute paths, identify our parent - directory, and indicate that this node should use - signatures.""" - if __debug__: logInstanceCreation(self, 'Node.FS.Base') - SCons.Node.Node.__init__(self) - - # Filenames and paths are probably reused and are intern'ed to - # save some memory. - self.name = SCons.Util.silent_intern(name) - self.suffix = SCons.Util.silent_intern(SCons.Util.splitext(name)[1]) - self.fs = fs - - assert directory, "A directory must be provided" - - self.abspath = SCons.Util.silent_intern(directory.entry_abspath(name)) - self.labspath = SCons.Util.silent_intern(directory.entry_labspath(name)) - if directory.path == '.': - self.path = SCons.Util.silent_intern(name) - else: - self.path = SCons.Util.silent_intern(directory.entry_path(name)) - if directory.tpath == '.': - self.tpath = SCons.Util.silent_intern(name) - else: - self.tpath = SCons.Util.silent_intern(directory.entry_tpath(name)) - self.path_elements = directory.path_elements + [self] - - self.dir = directory - self.cwd = None # will hold the SConscript directory for target nodes - self.duplicate = directory.duplicate - - def str_for_display(self): - return '"' + self.__str__() + '"' - - def must_be_same(self, klass): - """ - This node, which already existed, is being looked up as the - specified klass. Raise an exception if it isn't. - """ - if isinstance(self, klass) or klass is Entry: - return - raise TypeError("Tried to lookup %s '%s' as a %s." %\ - (self.__class__.__name__, self.path, klass.__name__)) - - def get_dir(self): - return self.dir - - def get_suffix(self): - return self.suffix - - def rfile(self): - return self - - def __str__(self): - """A Node.FS.Base object's string representation is its path - name.""" - global Save_Strings - if Save_Strings: - return self._save_str() - return self._get_str() - - memoizer_counters.append(SCons.Memoize.CountValue('_save_str')) - - def _save_str(self): - try: - return self._memo['_save_str'] - except KeyError: - pass - result = sys.intern(self._get_str()) - self._memo['_save_str'] = result - return result - - def _get_str(self): - global Save_Strings - if self.duplicate or self.is_derived(): - return self.get_path() - srcnode = self.srcnode() - if srcnode.stat() is None and self.stat() is not None: - result = self.get_path() - else: - result = srcnode.get_path() - if not Save_Strings: - # We're not at the point where we're saving the string string - # representations of FS Nodes (because we haven't finished - # reading the SConscript files and need to have str() return - # things relative to them). That also means we can't yet - # cache values returned (or not returned) by stat(), since - # Python code in the SConscript files might still create - # or otherwise affect the on-disk file. So get rid of the - # values that the underlying stat() method saved. - try: del self._memo['stat'] - except KeyError: pass - if self is not srcnode: - try: del srcnode._memo['stat'] - except KeyError: pass - return result - - rstr = __str__ - - memoizer_counters.append(SCons.Memoize.CountValue('stat')) - - def stat(self): - try: return self._memo['stat'] - except KeyError: pass - try: result = self.fs.stat(self.abspath) - except os.error: result = None - self._memo['stat'] = result - return result - - def exists(self): - return self.stat() is not None - - def rexists(self): - return self.rfile().exists() - - def getmtime(self): - st = self.stat() - if st: return st[stat.ST_MTIME] - else: return None - - def getsize(self): - st = self.stat() - if st: return st[stat.ST_SIZE] - else: return None - - def isdir(self): - st = self.stat() - return st is not None and stat.S_ISDIR(st[stat.ST_MODE]) - - def isfile(self): - st = self.stat() - return st is not None and stat.S_ISREG(st[stat.ST_MODE]) - - if hasattr(os, 'symlink'): - def islink(self): - try: st = self.fs.lstat(self.abspath) - except os.error: return 0 - return stat.S_ISLNK(st[stat.ST_MODE]) - else: - def islink(self): - return 0 # no symlinks - - def is_under(self, dir): - if self is dir: - return 1 - else: - return self.dir.is_under(dir) - - def set_local(self): - self._local = 1 - - def srcnode(self): - """If this node is in a build path, return the node - corresponding to its source file. Otherwise, return - ourself. - """ - srcdir_list = self.dir.srcdir_list() - if srcdir_list: - srcnode = srcdir_list[0].Entry(self.name) - srcnode.must_be_same(self.__class__) - return srcnode - return self - - def get_path(self, dir=None): - """Return path relative to the current working directory of the - Node.FS.Base object that owns us.""" - if not dir: - dir = self.fs.getcwd() - if self == dir: - return '.' - path_elems = self.path_elements - try: i = path_elems.index(dir) - except ValueError: pass - else: path_elems = path_elems[i+1:] - path_elems = [n.name for n in path_elems] - return os.sep.join(path_elems) - - def set_src_builder(self, builder): - """Set the source code builder for this node.""" - self.sbuilder = builder - if not self.has_builder(): - self.builder_set(builder) - - def src_builder(self): - """Fetch the source code builder for this node. - - If there isn't one, we cache the source code builder specified - for the directory (which in turn will cache the value from its - parent directory, and so on up to the file system root). - """ - try: - scb = self.sbuilder - except AttributeError: - scb = self.dir.src_builder() - self.sbuilder = scb - return scb - - def get_abspath(self): - """Get the absolute path of the file.""" - return self.abspath - - def for_signature(self): - # Return just our name. Even an absolute path would not work, - # because that can change thanks to symlinks or remapped network - # paths. - return self.name - - def get_subst_proxy(self): - try: - return self._proxy - except AttributeError: - ret = EntryProxy(self) - self._proxy = ret - return ret - - def target_from_source(self, prefix, suffix, splitext=SCons.Util.splitext): - """ - - Generates a target entry that corresponds to this entry (usually - a source file) with the specified prefix and suffix. - - Note that this method can be overridden dynamically for generated - files that need different behavior. See Tool/swig.py for - an example. - """ - return self.dir.Entry(prefix + splitext(self.name)[0] + suffix) - - def _Rfindalldirs_key(self, pathlist): - return pathlist - - memoizer_counters.append(SCons.Memoize.CountDict('Rfindalldirs', _Rfindalldirs_key)) - - def Rfindalldirs(self, pathlist): - """ - Return all of the directories for a given path list, including - corresponding "backing" directories in any repositories. - - The Node lookups are relative to this Node (typically a - directory), so memoizing result saves cycles from looking - up the same path for each target in a given directory. - """ - try: - memo_dict = self._memo['Rfindalldirs'] - except KeyError: - memo_dict = {} - self._memo['Rfindalldirs'] = memo_dict - else: - try: - return memo_dict[pathlist] - except KeyError: - pass - - create_dir_relative_to_self = self.Dir - result = [] - for path in pathlist: - if isinstance(path, SCons.Node.Node): - result.append(path) - else: - dir = create_dir_relative_to_self(path) - result.extend(dir.get_all_rdirs()) - - memo_dict[pathlist] = result - - return result - - def RDirs(self, pathlist): - """Search for a list of directories in the Repository list.""" - cwd = self.cwd or self.fs._cwd - return cwd.Rfindalldirs(pathlist) - - memoizer_counters.append(SCons.Memoize.CountValue('rentry')) - - def rentry(self): - try: - return self._memo['rentry'] - except KeyError: - pass - result = self - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: - node = dir.entries[norm_name] - except KeyError: - if dir.entry_exists_on_disk(self.name): - result = dir.Entry(self.name) - break - self._memo['rentry'] = result - return result - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - return [] - -class Entry(Base): - """This is the class for generic Node.FS entries--that is, things - that could be a File or a Dir, but we're just not sure yet. - Consequently, the methods in this class really exist just to - transform their associated object into the right class when the - time comes, and then call the same-named method in the transformed - class.""" - - def diskcheck_match(self): - pass - - def disambiguate(self, must_exist=None): - """ - """ - if self.isdir(): - self.__class__ = Dir - self._morph() - elif self.isfile(): - self.__class__ = File - self._morph() - self.clear() - else: - # There was nothing on-disk at this location, so look in - # the src directory. - # - # We can't just use self.srcnode() straight away because - # that would create an actual Node for this file in the src - # directory, and there might not be one. Instead, use the - # dir_on_disk() method to see if there's something on-disk - # with that name, in which case we can go ahead and call - # self.srcnode() to create the right type of entry. - srcdir = self.dir.srcnode() - if srcdir != self.dir and \ - srcdir.entry_exists_on_disk(self.name) and \ - self.srcnode().isdir(): - self.__class__ = Dir - self._morph() - elif must_exist: - msg = "No such file or directory: '%s'" % self.abspath - raise SCons.Errors.UserError(msg) - else: - self.__class__ = File - self._morph() - self.clear() - return self - - def rfile(self): - """We're a generic Entry, but the caller is actually looking for - a File at this point, so morph into one.""" - self.__class__ = File - self._morph() - self.clear() - return File.rfile(self) - - def scanner_key(self): - return self.get_suffix() - - def get_contents(self): - """Fetch the contents of the entry. Returns the exact binary - contents of the file.""" - try: - self = self.disambiguate(must_exist=1) - except SCons.Errors.UserError: - # There was nothing on disk with which to disambiguate - # this entry. Leave it as an Entry, but return a null - # string so calls to get_contents() in emitters and the - # like (e.g. in qt.py) don't have to disambiguate by hand - # or catch the exception. - return '' - else: - return self.get_contents() - - def get_text_contents(self): - """Fetch the decoded text contents of a Unicode encoded Entry. - - Since this should return the text contents from the file - system, we check to see into what sort of subclass we should - morph this Entry.""" - try: - self = self.disambiguate(must_exist=1) - except SCons.Errors.UserError: - # There was nothing on disk with which to disambiguate - # this entry. Leave it as an Entry, but return a null - # string so calls to get_text_contents() in emitters and - # the like (e.g. in qt.py) don't have to disambiguate by - # hand or catch the exception. - return '' - else: - return self.get_text_contents() - - def must_be_same(self, klass): - """Called to make sure a Node is a Dir. Since we're an - Entry, we can morph into one.""" - if self.__class__ is not klass: - self.__class__ = klass - self._morph() - self.clear() - - # The following methods can get called before the Taskmaster has - # had a chance to call disambiguate() directly to see if this Entry - # should really be a Dir or a File. We therefore use these to call - # disambiguate() transparently (from our caller's point of view). - # - # Right now, this minimal set of methods has been derived by just - # looking at some of the methods that will obviously be called early - # in any of the various Taskmasters' calling sequences, and then - # empirically figuring out which additional methods are necessary - # to make various tests pass. - - def exists(self): - """Return if the Entry exists. Check the file system to see - what we should turn into first. Assume a file if there's no - directory.""" - return self.disambiguate().exists() - - def rel_path(self, other): - d = self.disambiguate() - if d.__class__ is Entry: - raise Exception("rel_path() could not disambiguate File/Dir") - return d.rel_path(other) - - def new_ninfo(self): - return self.disambiguate().new_ninfo() - - def changed_since_last_build(self, target, prev_ni): - return self.disambiguate().changed_since_last_build(target, prev_ni) - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - return self.disambiguate()._glob1(pattern, ondisk, source, strings) - - def get_subst_proxy(self): - return self.disambiguate().get_subst_proxy() - -# This is for later so we can differentiate between Entry the class and Entry -# the method of the FS class. -_classEntry = Entry - - -class LocalFS(object): - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - # This class implements an abstraction layer for operations involving - # a local file system. Essentially, this wraps any function in - # the os, os.path or shutil modules that we use to actually go do - # anything with or to the local file system. - # - # Note that there's a very good chance we'll refactor this part of - # the architecture in some way as we really implement the interface(s) - # for remote file system Nodes. For example, the right architecture - # might be to have this be a subclass instead of a base class. - # Nevertheless, we're using this as a first step in that direction. - # - # We're not using chdir() yet because the calling subclass method - # needs to use os.chdir() directly to avoid recursion. Will we - # really need this one? - #def chdir(self, path): - # return os.chdir(path) - def chmod(self, path, mode): - return os.chmod(path, mode) - def copy(self, src, dst): - return shutil.copy(src, dst) - def copy2(self, src, dst): - return shutil.copy2(src, dst) - def exists(self, path): - return os.path.exists(path) - def getmtime(self, path): - return os.path.getmtime(path) - def getsize(self, path): - return os.path.getsize(path) - def isdir(self, path): - return os.path.isdir(path) - def isfile(self, path): - return os.path.isfile(path) - def link(self, src, dst): - return os.link(src, dst) - def lstat(self, path): - return os.lstat(path) - def listdir(self, path): - return os.listdir(path) - def makedirs(self, path): - return os.makedirs(path) - def mkdir(self, path): - return os.mkdir(path) - def rename(self, old, new): - return os.rename(old, new) - def stat(self, path): - return os.stat(path) - def symlink(self, src, dst): - return os.symlink(src, dst) - def open(self, path): - return open(path) - def unlink(self, path): - return os.unlink(path) - - if hasattr(os, 'symlink'): - def islink(self, path): - return os.path.islink(path) - else: - def islink(self, path): - return 0 # no symlinks - - if hasattr(os, 'readlink'): - def readlink(self, file): - return os.readlink(file) - else: - def readlink(self, file): - return '' - - -#class RemoteFS: -# # Skeleton for the obvious methods we might need from the -# # abstraction layer for a remote filesystem. -# def upload(self, local_src, remote_dst): -# pass -# def download(self, remote_src, local_dst): -# pass - - -class FS(LocalFS): - - memoizer_counters = [] - - def __init__(self, path = None): - """Initialize the Node.FS subsystem. - - The supplied path is the top of the source tree, where we - expect to find the top-level build file. If no path is - supplied, the current directory is the default. - - The path argument must be a valid absolute path. - """ - if __debug__: logInstanceCreation(self, 'Node.FS') - - self._memo = {} - - self.Root = {} - self.SConstruct_dir = None - self.max_drift = default_max_drift - - self.Top = None - if path is None: - self.pathTop = os.getcwd() - else: - self.pathTop = path - self.defaultDrive = _my_normcase(os.path.splitdrive(self.pathTop)[0]) - - self.Top = self.Dir(self.pathTop) - self.Top.path = '.' - self.Top.tpath = '.' - self._cwd = self.Top - - DirNodeInfo.fs = self - FileNodeInfo.fs = self - - def set_SConstruct_dir(self, dir): - self.SConstruct_dir = dir - - def get_max_drift(self): - return self.max_drift - - def set_max_drift(self, max_drift): - self.max_drift = max_drift - - def getcwd(self): - return self._cwd - - def chdir(self, dir, change_os_dir=0): - """Change the current working directory for lookups. - If change_os_dir is true, we will also change the "real" cwd - to match. - """ - curr=self._cwd - try: - if dir is not None: - self._cwd = dir - if change_os_dir: - os.chdir(dir.abspath) - except OSError: - self._cwd = curr - raise - - def get_root(self, drive): - """ - Returns the root directory for the specified drive, creating - it if necessary. - """ - drive = _my_normcase(drive) - try: - return self.Root[drive] - except KeyError: - root = RootDir(drive, self) - self.Root[drive] = root - if not drive: - self.Root[self.defaultDrive] = root - elif drive == self.defaultDrive: - self.Root[''] = root - return root - - def _lookup(self, p, directory, fsclass, create=1): - """ - The generic entry point for Node lookup with user-supplied data. - - This translates arbitrary input into a canonical Node.FS object - of the specified fsclass. The general approach for strings is - to turn it into a fully normalized absolute path and then call - the root directory's lookup_abs() method for the heavy lifting. - - If the path name begins with '#', it is unconditionally - interpreted relative to the top-level directory of this FS. '#' - is treated as a synonym for the top-level SConstruct directory, - much like '~' is treated as a synonym for the user's home - directory in a UNIX shell. So both '#foo' and '#/foo' refer - to the 'foo' subdirectory underneath the top-level SConstruct - directory. - - If the path name is relative, then the path is looked up relative - to the specified directory, or the current directory (self._cwd, - typically the SConscript directory) if the specified directory - is None. - """ - if isinstance(p, Base): - # It's already a Node.FS object. Make sure it's the right - # class and return. - p.must_be_same(fsclass) - return p - # str(p) in case it's something like a proxy object - p = str(p) - - initial_hash = (p[0:1] == '#') - if initial_hash: - # There was an initial '#', so we strip it and override - # whatever directory they may have specified with the - # top-level SConstruct directory. - p = p[1:] - directory = self.Top - - if directory and not isinstance(directory, Dir): - directory = self.Dir(directory) - - if do_splitdrive: - drive, p = os.path.splitdrive(p) - else: - drive = '' - if drive and not p: - # This causes a naked drive letter to be treated as a synonym - # for the root directory on that drive. - p = os.sep - absolute = os.path.isabs(p) - - needs_normpath = needs_normpath_check.match(p) - - if initial_hash or not absolute: - # This is a relative lookup, either to the top-level - # SConstruct directory (because of the initial '#') or to - # the current directory (the path name is not absolute). - # Add the string to the appropriate directory lookup path, - # after which the whole thing gets normalized. - if not directory: - directory = self._cwd - if p: - p = directory.labspath + '/' + p - else: - p = directory.labspath - - if needs_normpath: - p = os.path.normpath(p) - - if drive or absolute: - root = self.get_root(drive) - else: - if not directory: - directory = self._cwd - root = directory.root - - if os.sep != '/': - p = p.replace(os.sep, '/') - return root._lookup_abs(p, fsclass, create) - - def Entry(self, name, directory = None, create = 1): - """Look up or create a generic Entry node with the specified name. - If the name is a relative path (begins with ./, ../, or a file - name), then it is looked up relative to the supplied directory - node, or to the top level directory of the FS (supplied at - construction time) if no directory is supplied. - """ - return self._lookup(name, directory, Entry, create) - - def File(self, name, directory = None, create = 1): - """Look up or create a File node with the specified name. If - the name is a relative path (begins with ./, ../, or a file name), - then it is looked up relative to the supplied directory node, - or to the top level directory of the FS (supplied at construction - time) if no directory is supplied. - - This method will raise TypeError if a directory is found at the - specified path. - """ - return self._lookup(name, directory, File, create) - - def Dir(self, name, directory = None, create = True): - """Look up or create a Dir node with the specified name. If - the name is a relative path (begins with ./, ../, or a file name), - then it is looked up relative to the supplied directory node, - or to the top level directory of the FS (supplied at construction - time) if no directory is supplied. - - This method will raise TypeError if a normal file is found at the - specified path. - """ - return self._lookup(name, directory, Dir, create) - - def VariantDir(self, variant_dir, src_dir, duplicate=1): - """Link the supplied variant directory to the source directory - for purposes of building files.""" - - if not isinstance(src_dir, SCons.Node.Node): - src_dir = self.Dir(src_dir) - if not isinstance(variant_dir, SCons.Node.Node): - variant_dir = self.Dir(variant_dir) - if src_dir.is_under(variant_dir): - raise SCons.Errors.UserError("Source directory cannot be under variant directory.") - if variant_dir.srcdir: - if variant_dir.srcdir == src_dir: - return # We already did this. - raise SCons.Errors.UserError("'%s' already has a source directory: '%s'."%(variant_dir, variant_dir.srcdir)) - variant_dir.link(src_dir, duplicate) - - def Repository(self, *dirs): - """Specify Repository directories to search.""" - for d in dirs: - if not isinstance(d, SCons.Node.Node): - d = self.Dir(d) - self.Top.addRepository(d) - - def variant_dir_target_climb(self, orig, dir, tail): - """Create targets in corresponding variant directories - - Climb the directory tree, and look up path names - relative to any linked variant directories we find. - - Even though this loops and walks up the tree, we don't memoize - the return value because this is really only used to process - the command-line targets. - """ - targets = [] - message = None - fmt = "building associated VariantDir targets: %s" - start_dir = dir - while dir: - for bd in dir.variant_dirs: - if start_dir.is_under(bd): - # If already in the build-dir location, don't reflect - return [orig], fmt % str(orig) - p = os.path.join(bd.path, *tail) - targets.append(self.Entry(p)) - tail = [dir.name] + tail - dir = dir.up() - if targets: - message = fmt % ' '.join(map(str, targets)) - return targets, message - - def Glob(self, pathname, ondisk=True, source=True, strings=False, cwd=None): - """ - Globs - - This is mainly a shim layer - """ - if cwd is None: - cwd = self.getcwd() - return cwd.glob(pathname, ondisk, source, strings) - -class DirNodeInfo(SCons.Node.NodeInfoBase): - # This should get reset by the FS initialization. - current_version_id = 1 - - fs = None - - def str_to_node(self, s): - top = self.fs.Top - root = top.root - if do_splitdrive: - drive, s = os.path.splitdrive(s) - if drive: - root = self.fs.get_root(drive) - if not os.path.isabs(s): - s = top.labspath + '/' + s - return root._lookup_abs(s, Entry) - -class DirBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -glob_magic_check = re.compile('[*?[]') - -def has_glob_magic(s): - return glob_magic_check.search(s) is not None - -class Dir(Base): - """A class for directories in a file system. - """ - - memoizer_counters = [] - - NodeInfo = DirNodeInfo - BuildInfo = DirBuildInfo - - def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.Dir') - Base.__init__(self, name, directory, fs) - self._morph() - - def _morph(self): - """Turn a file system Node (either a freshly initialized directory - object or a separate Entry object) into a proper directory object. - - Set up this directory's entries and hook it into the file - system tree. Specify that directories (this Node) don't use - signatures for calculating whether they're current. - """ - - self.repositories = [] - self.srcdir = None - - self.entries = {} - self.entries['.'] = self - self.entries['..'] = self.dir - self.cwd = self - self.searched = 0 - self._sconsign = None - self.variant_dirs = [] - self.root = self.dir.root - - # Don't just reset the executor, replace its action list, - # because it might have some pre-or post-actions that need to - # be preserved. - self.builder = get_MkdirBuilder() - self.get_executor().set_action_list(self.builder.action) - - def diskcheck_match(self): - diskcheck_match(self, self.isfile, - "File %s found where directory expected.") - - def __clearRepositoryCache(self, duplicate=None): - """Called when we change the repository(ies) for a directory. - This clears any cached information that is invalidated by changing - the repository.""" - - for node in self.entries.values(): - if node != self.dir: - if node != self and isinstance(node, Dir): - node.__clearRepositoryCache(duplicate) - else: - node.clear() - try: - del node._srcreps - except AttributeError: - pass - if duplicate is not None: - node.duplicate=duplicate - - def __resetDuplicate(self, node): - if node != self: - node.duplicate = node.get_dir().duplicate - - def Entry(self, name): - """ - Looks up or creates an entry node named 'name' relative to - this directory. - """ - return self.fs.Entry(name, self) - - def Dir(self, name, create=True): - """ - Looks up or creates a directory node named 'name' relative to - this directory. - """ - return self.fs.Dir(name, self, create) - - def File(self, name): - """ - Looks up or creates a file node named 'name' relative to - this directory. - """ - return self.fs.File(name, self) - - def _lookup_rel(self, name, klass, create=1): - """ - Looks up a *normalized* relative path name, relative to this - directory. - - This method is intended for use by internal lookups with - already-normalized path data. For general-purpose lookups, - use the Entry(), Dir() and File() methods above. - - This method does *no* input checking and will die or give - incorrect results if it's passed a non-normalized path name (e.g., - a path containing '..'), an absolute path name, a top-relative - ('#foo') path name, or any kind of object. - """ - name = self.entry_labspath(name) - return self.root._lookup_abs(name, klass, create) - - def link(self, srcdir, duplicate): - """Set this directory as the variant directory for the - supplied source directory.""" - self.srcdir = srcdir - self.duplicate = duplicate - self.__clearRepositoryCache(duplicate) - srcdir.variant_dirs.append(self) - - def getRepositories(self): - """Returns a list of repositories for this directory. - """ - if self.srcdir and not self.duplicate: - return self.srcdir.get_all_rdirs() + self.repositories - return self.repositories - - memoizer_counters.append(SCons.Memoize.CountValue('get_all_rdirs')) - - def get_all_rdirs(self): - try: - return list(self._memo['get_all_rdirs']) - except KeyError: - pass - - result = [self] - fname = '.' - dir = self - while dir: - for rep in dir.getRepositories(): - result.append(rep.Dir(fname)) - if fname == '.': - fname = dir.name - else: - fname = dir.name + os.sep + fname - dir = dir.up() - - self._memo['get_all_rdirs'] = list(result) - - return result - - def addRepository(self, dir): - if dir != self and not dir in self.repositories: - self.repositories.append(dir) - dir.tpath = '.' - self.__clearRepositoryCache() - - def up(self): - return self.entries['..'] - - def _rel_path_key(self, other): - return str(other) - - memoizer_counters.append(SCons.Memoize.CountDict('rel_path', _rel_path_key)) - - def rel_path(self, other): - """Return a path to "other" relative to this directory. - """ - - # This complicated and expensive method, which constructs relative - # paths between arbitrary Node.FS objects, is no longer used - # by SCons itself. It was introduced to store dependency paths - # in .sconsign files relative to the target, but that ended up - # being significantly inefficient. - # - # We're continuing to support the method because some SConstruct - # files out there started using it when it was available, and - # we're all about backwards compatibility.. - - try: - memo_dict = self._memo['rel_path'] - except KeyError: - memo_dict = {} - self._memo['rel_path'] = memo_dict - else: - try: - return memo_dict[other] - except KeyError: - pass - - if self is other: - result = '.' - - elif not other in self.path_elements: - try: - other_dir = other.get_dir() - except AttributeError: - result = str(other) - else: - if other_dir is None: - result = other.name - else: - dir_rel_path = self.rel_path(other_dir) - if dir_rel_path == '.': - result = other.name - else: - result = dir_rel_path + os.sep + other.name - else: - i = self.path_elements.index(other) + 1 - - path_elems = ['..'] * (len(self.path_elements) - i) \ - + [n.name for n in other.path_elements[i:]] - - result = os.sep.join(path_elems) - - memo_dict[other] = result - - return result - - def get_env_scanner(self, env, kw={}): - import SCons.Defaults - return SCons.Defaults.DirEntryScanner - - def get_target_scanner(self): - import SCons.Defaults - return SCons.Defaults.DirEntryScanner - - def get_found_includes(self, env, scanner, path): - """Return this directory's implicit dependencies. - - We don't bother caching the results because the scan typically - shouldn't be requested more than once (as opposed to scanning - .h file contents, which can be requested as many times as the - files is #included by other files). - """ - if not scanner: - return [] - # Clear cached info for this Dir. If we already visited this - # directory on our walk down the tree (because we didn't know at - # that point it was being used as the source for another Node) - # then we may have calculated build signature before realizing - # we had to scan the disk. Now that we have to, though, we need - # to invalidate the old calculated signature so that any node - # dependent on our directory structure gets one that includes - # info about everything on disk. - self.clear() - return scanner(self, env, path) - - # - # Taskmaster interface subsystem - # - - def prepare(self): - pass - - def build(self, **kw): - """A null "builder" for directories.""" - global MkdirBuilder - if self.builder is not MkdirBuilder: - SCons.Node.Node.build(self, **kw) - - # - # - # - - def _create(self): - """Create this directory, silently and without worrying about - whether the builder is the default or not.""" - listDirs = [] - parent = self - while parent: - if parent.exists(): - break - listDirs.append(parent) - p = parent.up() - if p is None: - # Don't use while: - else: for this condition because - # if so, then parent is None and has no .path attribute. - raise SCons.Errors.StopError(parent.path) - parent = p - listDirs.reverse() - for dirnode in listDirs: - try: - # Don't call dirnode.build(), call the base Node method - # directly because we definitely *must* create this - # directory. The dirnode.build() method will suppress - # the build if it's the default builder. - SCons.Node.Node.build(dirnode) - dirnode.get_executor().nullify() - # The build() action may or may not have actually - # created the directory, depending on whether the -n - # option was used or not. Delete the _exists and - # _rexists attributes so they can be reevaluated. - dirnode.clear() - except OSError: - pass - - def multiple_side_effect_has_builder(self): - global MkdirBuilder - return self.builder is not MkdirBuilder and self.has_builder() - - def alter_targets(self): - """Return any corresponding targets in a variant directory. - """ - return self.fs.variant_dir_target_climb(self, self, []) - - def scanner_key(self): - """A directory does not get scanned.""" - return None - - def get_text_contents(self): - """We already emit things in text, so just return the binary - version.""" - return self.get_contents() - - def get_contents(self): - """Return content signatures and names of all our children - separated by new-lines. Ensure that the nodes are sorted.""" - contents = [] - for node in sorted(self.children(), key=lambda t: t.name): - contents.append('%s %s\n' % (node.get_csig(), node.name)) - return ''.join(contents) - - def get_csig(self): - """Compute the content signature for Directory nodes. In - general, this is not needed and the content signature is not - stored in the DirNodeInfo. However, if get_contents on a Dir - node is called which has a child directory, the child - directory should return the hash of its contents.""" - contents = self.get_contents() - return SCons.Util.MD5signature(contents) - - def do_duplicate(self, src): - pass - - changed_since_last_build = SCons.Node.Node.state_has_changed - - def is_up_to_date(self): - """If any child is not up-to-date, then this directory isn't, - either.""" - if self.builder is not MkdirBuilder and not self.exists(): - return 0 - up_to_date = SCons.Node.up_to_date - for kid in self.children(): - if kid.get_state() > up_to_date: - return 0 - return 1 - - def rdir(self): - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: node = dir.entries[norm_name] - except KeyError: node = dir.dir_on_disk(self.name) - if node and node.exists() and \ - (isinstance(dir, Dir) or isinstance(dir, Entry)): - return node - return self - - def sconsign(self): - """Return the .sconsign file info for this directory, - creating it first if necessary.""" - if not self._sconsign: - import SCons.SConsign - self._sconsign = SCons.SConsign.ForDirectory(self) - return self._sconsign - - def srcnode(self): - """Dir has a special need for srcnode()...if we - have a srcdir attribute set, then that *is* our srcnode.""" - if self.srcdir: - return self.srcdir - return Base.srcnode(self) - - def get_timestamp(self): - """Return the latest timestamp from among our children""" - stamp = 0 - for kid in self.children(): - if kid.get_timestamp() > stamp: - stamp = kid.get_timestamp() - return stamp - - def entry_abspath(self, name): - return self.abspath + os.sep + name - - def entry_labspath(self, name): - return self.labspath + '/' + name - - def entry_path(self, name): - return self.path + os.sep + name - - def entry_tpath(self, name): - return self.tpath + os.sep + name - - def entry_exists_on_disk(self, name): - try: - d = self.on_disk_entries - except AttributeError: - d = {} - try: - entries = os.listdir(self.abspath) - except OSError: - pass - else: - for entry in map(_my_normcase, entries): - d[entry] = True - self.on_disk_entries = d - if sys.platform == 'win32': - name = _my_normcase(name) - result = d.get(name) - if result is None: - # Belt-and-suspenders for Windows: check directly for - # 8.3 file names that don't show up in os.listdir(). - result = os.path.exists(self.abspath + os.sep + name) - d[name] = result - return result - else: - return name in d - - memoizer_counters.append(SCons.Memoize.CountValue('srcdir_list')) - - def srcdir_list(self): - try: - return self._memo['srcdir_list'] - except KeyError: - pass - - result = [] - - dirname = '.' - dir = self - while dir: - if dir.srcdir: - result.append(dir.srcdir.Dir(dirname)) - dirname = dir.name + os.sep + dirname - dir = dir.up() - - self._memo['srcdir_list'] = result - - return result - - def srcdir_duplicate(self, name): - for dir in self.srcdir_list(): - if self.is_under(dir): - # We shouldn't source from something in the build path; - # variant_dir is probably under src_dir, in which case - # we are reflecting. - break - if dir.entry_exists_on_disk(name): - srcnode = dir.Entry(name).disambiguate() - if self.duplicate: - node = self.Entry(name).disambiguate() - node.do_duplicate(srcnode) - return node - else: - return srcnode - return None - - def _srcdir_find_file_key(self, filename): - return filename - - memoizer_counters.append(SCons.Memoize.CountDict('srcdir_find_file', _srcdir_find_file_key)) - - def srcdir_find_file(self, filename): - try: - memo_dict = self._memo['srcdir_find_file'] - except KeyError: - memo_dict = {} - self._memo['srcdir_find_file'] = memo_dict - else: - try: - return memo_dict[filename] - except KeyError: - pass - - def func(node): - if (isinstance(node, File) or isinstance(node, Entry)) and \ - (node.is_derived() or node.exists()): - return node - return None - - norm_name = _my_normcase(filename) - - for rdir in self.get_all_rdirs(): - try: node = rdir.entries[norm_name] - except KeyError: node = rdir.file_on_disk(filename) - else: node = func(node) - if node: - result = (node, self) - memo_dict[filename] = result - return result - - for srcdir in self.srcdir_list(): - for rdir in srcdir.get_all_rdirs(): - try: node = rdir.entries[norm_name] - except KeyError: node = rdir.file_on_disk(filename) - else: node = func(node) - if node: - result = (File(filename, self, self.fs), srcdir) - memo_dict[filename] = result - return result - - result = (None, None) - memo_dict[filename] = result - return result - - def dir_on_disk(self, name): - if self.entry_exists_on_disk(name): - try: return self.Dir(name) - except TypeError: pass - node = self.srcdir_duplicate(name) - if isinstance(node, File): - return None - return node - - def file_on_disk(self, name): - if self.entry_exists_on_disk(name) or \ - diskcheck_rcs(self, name) or \ - diskcheck_sccs(self, name): - try: return self.File(name) - except TypeError: pass - node = self.srcdir_duplicate(name) - if isinstance(node, Dir): - return None - return node - - def walk(self, func, arg): - """ - Walk this directory tree by calling the specified function - for each directory in the tree. - - This behaves like the os.path.walk() function, but for in-memory - Node.FS.Dir objects. The function takes the same arguments as - the functions passed to os.path.walk(): - - func(arg, dirname, fnames) - - Except that "dirname" will actually be the directory *Node*, - not the string. The '.' and '..' entries are excluded from - fnames. The fnames list may be modified in-place to filter the - subdirectories visited or otherwise impose a specific order. - The "arg" argument is always passed to func() and may be used - in any way (or ignored, passing None is common). - """ - entries = self.entries - names = list(entries.keys()) - names.remove('.') - names.remove('..') - func(arg, self, names) - for dirname in [n for n in names if isinstance(entries[n], Dir)]: - entries[dirname].walk(func, arg) - - def glob(self, pathname, ondisk=True, source=False, strings=False): - """ - Returns a list of Nodes (or strings) matching a specified - pathname pattern. - - Pathname patterns follow UNIX shell semantics: * matches - any-length strings of any characters, ? matches any character, - and [] can enclose lists or ranges of characters. Matches do - not span directory separators. - - The matches take into account Repositories, returning local - Nodes if a corresponding entry exists in a Repository (either - an in-memory Node or something on disk). - - By defafult, the glob() function matches entries that exist - on-disk, in addition to in-memory Nodes. Setting the "ondisk" - argument to False (or some other non-true value) causes the glob() - function to only match in-memory Nodes. The default behavior is - to return both the on-disk and in-memory Nodes. - - The "source" argument, when true, specifies that corresponding - source Nodes must be returned if you're globbing in a build - directory (initialized with VariantDir()). The default behavior - is to return Nodes local to the VariantDir(). - - The "strings" argument, when true, returns the matches as strings, - not Nodes. The strings are path names relative to this directory. - - The underlying algorithm is adapted from the glob.glob() function - in the Python library (but heavily modified), and uses fnmatch() - under the covers. - """ - dirname, basename = os.path.split(pathname) - if not dirname: - return sorted(self._glob1(basename, ondisk, source, strings), - key=lambda t: str(t)) - if has_glob_magic(dirname): - list = self.glob(dirname, ondisk, source, strings=False) - else: - list = [self.Dir(dirname, create=True)] - result = [] - for dir in list: - r = dir._glob1(basename, ondisk, source, strings) - if strings: - r = [os.path.join(str(dir), x) for x in r] - result.extend(r) - return sorted(result, key=lambda a: str(a)) - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - """ - Globs for and returns a list of entry names matching a single - pattern in this directory. - - This searches any repositories and source directories for - corresponding entries and returns a Node (or string) relative - to the current directory if an entry is found anywhere. - - TODO: handle pattern with no wildcard - """ - search_dir_list = self.get_all_rdirs() - for srcdir in self.srcdir_list(): - search_dir_list.extend(srcdir.get_all_rdirs()) - - selfEntry = self.Entry - names = [] - for dir in search_dir_list: - # We use the .name attribute from the Node because the keys of - # the dir.entries dictionary are normalized (that is, all upper - # case) on case-insensitive systems like Windows. - node_names = [ v.name for k, v in dir.entries.items() - if k not in ('.', '..') ] - names.extend(node_names) - if not strings: - # Make sure the working directory (self) actually has - # entries for all Nodes in repositories or variant dirs. - for name in node_names: selfEntry(name) - if ondisk: - try: - disk_names = os.listdir(dir.abspath) - except os.error: - continue - names.extend(disk_names) - if not strings: - # We're going to return corresponding Nodes in - # the local directory, so we need to make sure - # those Nodes exist. We only want to create - # Nodes for the entries that will match the - # specified pattern, though, which means we - # need to filter the list here, even though - # the overall list will also be filtered later, - # after we exit this loop. - if pattern[0] != '.': - #disk_names = [ d for d in disk_names if d[0] != '.' ] - disk_names = [x for x in disk_names if x[0] != '.'] - disk_names = fnmatch.filter(disk_names, pattern) - dirEntry = dir.Entry - for name in disk_names: - # Add './' before disk filename so that '#' at - # beginning of filename isn't interpreted. - name = './' + name - node = dirEntry(name).disambiguate() - n = selfEntry(name) - if n.__class__ != node.__class__: - n.__class__ = node.__class__ - n._morph() - - names = set(names) - if pattern[0] != '.': - #names = [ n for n in names if n[0] != '.' ] - names = [x for x in names if x[0] != '.'] - names = fnmatch.filter(names, pattern) - - if strings: - return names - - #return [ self.entries[_my_normcase(n)] for n in names ] - return [self.entries[_my_normcase(n)] for n in names] - -class RootDir(Dir): - """A class for the root directory of a file system. - - This is the same as a Dir class, except that the path separator - ('/' or '\\') is actually part of the name, so we don't need to - add a separator when creating the path names of entries within - this directory. - """ - def __init__(self, name, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.RootDir') - # We're going to be our own parent directory (".." entry and .dir - # attribute) so we have to set up some values so Base.__init__() - # won't gag won't it calls some of our methods. - self.abspath = '' - self.labspath = '' - self.path = '' - self.tpath = '' - self.path_elements = [] - self.duplicate = 0 - self.root = self - Base.__init__(self, name, self, fs) - - # Now set our paths to what we really want them to be: the - # initial drive letter (the name) plus the directory separator, - # except for the "lookup abspath," which does not have the - # drive letter. - self.abspath = name + os.sep - self.labspath = '' - self.path = name + os.sep - self.tpath = name + os.sep - self._morph() - - self._lookupDict = {} - - # The // and os.sep + os.sep entries are necessary because - # os.path.normpath() seems to preserve double slashes at the - # beginning of a path (presumably for UNC path names), but - # collapses triple slashes to a single slash. - self._lookupDict[''] = self - self._lookupDict['/'] = self - self._lookupDict['//'] = self - self._lookupDict[os.sep] = self - self._lookupDict[os.sep + os.sep] = self - - def must_be_same(self, klass): - if klass is Dir: - return - Base.must_be_same(self, klass) - - def _lookup_abs(self, p, klass, create=1): - """ - Fast (?) lookup of a *normalized* absolute path. - - This method is intended for use by internal lookups with - already-normalized path data. For general-purpose lookups, - use the FS.Entry(), FS.Dir() or FS.File() methods. - - The caller is responsible for making sure we're passed a - normalized absolute path; we merely let Python's dictionary look - up and return the One True Node.FS object for the path. - - If no Node for the specified "p" doesn't already exist, and - "create" is specified, the Node may be created after recursive - invocation to find or create the parent directory or directories. - """ - k = _my_normcase(p) - try: - result = self._lookupDict[k] - except KeyError: - if not create: - msg = "No such file or directory: '%s' in '%s' (and create is False)" % (p, str(self)) - raise SCons.Errors.UserError(msg) - # There is no Node for this path name, and we're allowed - # to create it. - dir_name, file_name = os.path.split(p) - dir_node = self._lookup_abs(dir_name, Dir) - result = klass(file_name, dir_node, self.fs) - - # Double-check on disk (as configured) that the Node we - # created matches whatever is out there in the real world. - result.diskcheck_match() - - self._lookupDict[k] = result - dir_node.entries[_my_normcase(file_name)] = result - dir_node.implicit = None - else: - # There is already a Node for this path name. Allow it to - # complain if we were looking for an inappropriate type. - result.must_be_same(klass) - return result - - def __str__(self): - return self.abspath - - def entry_abspath(self, name): - return self.abspath + name - - def entry_labspath(self, name): - return '/' + name - - def entry_path(self, name): - return self.path + name - - def entry_tpath(self, name): - return self.tpath + name - - def is_under(self, dir): - if self is dir: - return 1 - else: - return 0 - - def up(self): - return None - - def get_dir(self): - return None - - def src_builder(self): - return _null - -class FileNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - - field_list = ['csig', 'timestamp', 'size'] - - # This should get reset by the FS initialization. - fs = None - - def str_to_node(self, s): - top = self.fs.Top - root = top.root - if do_splitdrive: - drive, s = os.path.splitdrive(s) - if drive: - root = self.fs.get_root(drive) - if not os.path.isabs(s): - s = top.labspath + '/' + s - return root._lookup_abs(s, Entry) - -class FileBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - - def convert_to_sconsign(self): - """ - Converts this FileBuildInfo object for writing to a .sconsign file - - This replaces each Node in our various dependency lists with its - usual string representation: relative to the top-level SConstruct - directory, or an absolute path if it's outside. - """ - if os.sep == '/': - node_to_str = str - else: - def node_to_str(n): - try: - s = n.path - except AttributeError: - s = str(n) - else: - s = s.replace(os.sep, '/') - return s - for attr in ['bsources', 'bdepends', 'bimplicit']: - try: - val = getattr(self, attr) - except AttributeError: - pass - else: - setattr(self, attr, list(map(node_to_str, val))) - def convert_from_sconsign(self, dir, name): - """ - Converts a newly-read FileBuildInfo object for in-SCons use - - For normal up-to-date checking, we don't have any conversion to - perform--but we're leaving this method here to make that clear. - """ - pass - def prepare_dependencies(self): - """ - Prepares a FileBuildInfo object for explaining what changed - - The bsources, bdepends and bimplicit lists have all been - stored on disk as paths relative to the top-level SConstruct - directory. Convert the strings to actual Nodes (for use by the - --debug=explain code and --implicit-cache). - """ - attrs = [ - ('bsources', 'bsourcesigs'), - ('bdepends', 'bdependsigs'), - ('bimplicit', 'bimplicitsigs'), - ] - for (nattr, sattr) in attrs: - try: - strings = getattr(self, nattr) - nodeinfos = getattr(self, sattr) - except AttributeError: - continue - nodes = [] - for s, ni in zip(strings, nodeinfos): - if not isinstance(s, SCons.Node.Node): - s = ni.str_to_node(s) - nodes.append(s) - setattr(self, nattr, nodes) - def format(self, names=0): - result = [] - bkids = self.bsources + self.bdepends + self.bimplicit - bkidsigs = self.bsourcesigs + self.bdependsigs + self.bimplicitsigs - for bkid, bkidsig in zip(bkids, bkidsigs): - result.append(str(bkid) + ': ' + - ' '.join(bkidsig.format(names=names))) - result.append('%s [%s]' % (self.bactsig, self.bact)) - return '\n'.join(result) - -class File(Base): - """A class for files in a file system. - """ - - memoizer_counters = [] - - NodeInfo = FileNodeInfo - BuildInfo = FileBuildInfo - - md5_chunksize = 64 - - def diskcheck_match(self): - diskcheck_match(self, self.isdir, - "Directory %s found where file expected.") - - def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.File') - Base.__init__(self, name, directory, fs) - self._morph() - - def Entry(self, name): - """Create an entry node named 'name' relative to - the directory of this file.""" - return self.dir.Entry(name) - - def Dir(self, name, create=True): - """Create a directory node named 'name' relative to - the directory of this file.""" - return self.dir.Dir(name, create=create) - - def Dirs(self, pathlist): - """Create a list of directories relative to the SConscript - directory of this file.""" - return [self.Dir(p) for p in pathlist] - - def File(self, name): - """Create a file node named 'name' relative to - the directory of this file.""" - return self.dir.File(name) - - #def generate_build_dict(self): - # """Return an appropriate dictionary of values for building - # this File.""" - # return {'Dir' : self.Dir, - # 'File' : self.File, - # 'RDirs' : self.RDirs} - - def _morph(self): - """Turn a file system node into a File object.""" - self.scanner_paths = {} - if not hasattr(self, '_local'): - self._local = 0 - - # If there was already a Builder set on this entry, then - # we need to make sure we call the target-decider function, - # not the source-decider. Reaching in and doing this by hand - # is a little bogus. We'd prefer to handle this by adding - # an Entry.builder_set() method that disambiguates like the - # other methods, but that starts running into problems with the - # fragile way we initialize Dir Nodes with their Mkdir builders, - # yet still allow them to be overridden by the user. Since it's - # not clear right now how to fix that, stick with what works - # until it becomes clear... - if self.has_builder(): - self.changed_since_last_build = self.decide_target - - def scanner_key(self): - return self.get_suffix() - - def get_contents(self): - if not self.rexists(): - return '' - fname = self.rfile().abspath - try: - contents = open(fname, "rb").read() - except EnvironmentError, e: - if not e.filename: - e.filename = fname - raise - return contents - - # This attempts to figure out what the encoding of the text is - # based upon the BOM bytes, and then decodes the contents so that - # it's a valid python string. - def get_text_contents(self): - contents = self.get_contents() - # The behavior of various decode() methods and functions - # w.r.t. the initial BOM bytes is different for different - # encodings and/or Python versions. ('utf-8' does not strip - # them, but has a 'utf-8-sig' which does; 'utf-16' seems to - # strip them; etc.) Just sidestep all the complication by - # explicitly stripping the BOM before we decode(). - if contents.startswith(codecs.BOM_UTF8): - return contents[len(codecs.BOM_UTF8):].decode('utf-8') - if contents.startswith(codecs.BOM_UTF16_LE): - return contents[len(codecs.BOM_UTF16_LE):].decode('utf-16-le') - if contents.startswith(codecs.BOM_UTF16_BE): - return contents[len(codecs.BOM_UTF16_BE):].decode('utf-16-be') - return contents - - def get_content_hash(self): - """ - Compute and return the MD5 hash for this file. - """ - if not self.rexists(): - return SCons.Util.MD5signature('') - fname = self.rfile().abspath - try: - cs = SCons.Util.MD5filesignature(fname, - chunksize=SCons.Node.FS.File.md5_chunksize*1024) - except EnvironmentError, e: - if not e.filename: - e.filename = fname - raise - return cs - - - memoizer_counters.append(SCons.Memoize.CountValue('get_size')) - - def get_size(self): - try: - return self._memo['get_size'] - except KeyError: - pass - - if self.rexists(): - size = self.rfile().getsize() - else: - size = 0 - - self._memo['get_size'] = size - - return size - - memoizer_counters.append(SCons.Memoize.CountValue('get_timestamp')) - - def get_timestamp(self): - try: - return self._memo['get_timestamp'] - except KeyError: - pass - - if self.rexists(): - timestamp = self.rfile().getmtime() - else: - timestamp = 0 - - self._memo['get_timestamp'] = timestamp - - return timestamp - - def store_info(self): - # Merge our build information into the already-stored entry. - # This accomodates "chained builds" where a file that's a target - # in one build (SConstruct file) is a source in a different build. - # See test/chained-build.py for the use case. - if do_store_info: - self.dir.sconsign().store_info(self.name, self) - - convert_copy_attrs = [ - 'bsources', - 'bimplicit', - 'bdepends', - 'bact', - 'bactsig', - 'ninfo', - ] - - - convert_sig_attrs = [ - 'bsourcesigs', - 'bimplicitsigs', - 'bdependsigs', - ] - - def convert_old_entry(self, old_entry): - # Convert a .sconsign entry from before the Big Signature - # Refactoring, doing what we can to convert its information - # to the new .sconsign entry format. - # - # The old format looked essentially like this: - # - # BuildInfo - # .ninfo (NodeInfo) - # .bsig - # .csig - # .timestamp - # .size - # .bsources - # .bsourcesigs ("signature" list) - # .bdepends - # .bdependsigs ("signature" list) - # .bimplicit - # .bimplicitsigs ("signature" list) - # .bact - # .bactsig - # - # The new format looks like this: - # - # .ninfo (NodeInfo) - # .bsig - # .csig - # .timestamp - # .size - # .binfo (BuildInfo) - # .bsources - # .bsourcesigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bdepends - # .bdependsigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bimplicit - # .bimplicitsigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bact - # .bactsig - # - # The basic idea of the new structure is that a NodeInfo always - # holds all available information about the state of a given Node - # at a certain point in time. The various .b*sigs lists can just - # be a list of pointers to the .ninfo attributes of the different - # dependent nodes, without any copying of information until it's - # time to pickle it for writing out to a .sconsign file. - # - # The complicating issue is that the *old* format only stored one - # "signature" per dependency, based on however the *last* build - # was configured. We don't know from just looking at it whether - # it was a build signature, a content signature, or a timestamp - # "signature". Since we no longer use build signatures, the - # best we can do is look at the length and if it's thirty two, - # assume that it was (or might have been) a content signature. - # If it was actually a build signature, then it will cause a - # rebuild anyway when it doesn't match the new content signature, - # but that's probably the best we can do. - import SCons.SConsign - new_entry = SCons.SConsign.SConsignEntry() - new_entry.binfo = self.new_binfo() - binfo = new_entry.binfo - for attr in self.convert_copy_attrs: - try: - value = getattr(old_entry, attr) - except AttributeError: - continue - setattr(binfo, attr, value) - delattr(old_entry, attr) - for attr in self.convert_sig_attrs: - try: - sig_list = getattr(old_entry, attr) - except AttributeError: - continue - value = [] - for sig in sig_list: - ninfo = self.new_ninfo() - if len(sig) == 32: - ninfo.csig = sig - else: - ninfo.timestamp = sig - value.append(ninfo) - setattr(binfo, attr, value) - delattr(old_entry, attr) - return new_entry - - memoizer_counters.append(SCons.Memoize.CountValue('get_stored_info')) - - def get_stored_info(self): - try: - return self._memo['get_stored_info'] - except KeyError: - pass - - try: - sconsign_entry = self.dir.sconsign().get_entry(self.name) - except (KeyError, EnvironmentError): - import SCons.SConsign - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = self.new_binfo() - sconsign_entry.ninfo = self.new_ninfo() - else: - if isinstance(sconsign_entry, FileBuildInfo): - # This is a .sconsign file from before the Big Signature - # Refactoring; convert it as best we can. - sconsign_entry = self.convert_old_entry(sconsign_entry) - try: - delattr(sconsign_entry.ninfo, 'bsig') - except AttributeError: - pass - - self._memo['get_stored_info'] = sconsign_entry - - return sconsign_entry - - def get_stored_implicit(self): - binfo = self.get_stored_info().binfo - binfo.prepare_dependencies() - try: return binfo.bimplicit - except AttributeError: return None - - def rel_path(self, other): - return self.dir.rel_path(other) - - def _get_found_includes_key(self, env, scanner, path): - return (id(env), id(scanner), path) - - memoizer_counters.append(SCons.Memoize.CountDict('get_found_includes', _get_found_includes_key)) - - def get_found_includes(self, env, scanner, path): - """Return the included implicit dependencies in this file. - Cache results so we only scan the file once per path - regardless of how many times this information is requested. - """ - memo_key = (id(env), id(scanner), path) - try: - memo_dict = self._memo['get_found_includes'] - except KeyError: - memo_dict = {} - self._memo['get_found_includes'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - if scanner: - # result = [n.disambiguate() for n in scanner(self, env, path)] - result = scanner(self, env, path) - result = [N.disambiguate() for N in result] - else: - result = [] - - memo_dict[memo_key] = result - - return result - - def _createDir(self): - # ensure that the directories for this node are - # created. - self.dir._create() - - def push_to_cache(self): - """Try to push the node into a cache - """ - # This should get called before the Nodes' .built() method is - # called, which would clear the build signature if the file has - # a source scanner. - # - # We have to clear the local memoized values *before* we push - # the node to cache so that the memoization of the self.exists() - # return value doesn't interfere. - if self.nocache: - return - self.clear_memoized_values() - if self.exists(): - self.get_build_env().get_CacheDir().push(self) - - def retrieve_from_cache(self): - """Try to retrieve the node's content from a cache - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Returns true iff the node was successfully retrieved. - """ - if self.nocache: - return None - if not self.is_derived(): - return None - return self.get_build_env().get_CacheDir().retrieve(self) - - def visited(self): - if self.exists(): - self.get_build_env().get_CacheDir().push_if_forced(self) - - ninfo = self.get_ninfo() - - csig = self.get_max_drift_csig() - if csig: - ninfo.csig = csig - - ninfo.timestamp = self.get_timestamp() - ninfo.size = self.get_size() - - if not self.has_builder(): - # This is a source file, but it might have been a target file - # in another build that included more of the DAG. Copy - # any build information that's stored in the .sconsign file - # into our binfo object so it doesn't get lost. - old = self.get_stored_info() - self.get_binfo().__dict__.update(old.binfo.__dict__) - - self.store_info() - - def find_src_builder(self): - if self.rexists(): - return None - scb = self.dir.src_builder() - if scb is _null: - if diskcheck_sccs(self.dir, self.name): - scb = get_DefaultSCCSBuilder() - elif diskcheck_rcs(self.dir, self.name): - scb = get_DefaultRCSBuilder() - else: - scb = None - if scb is not None: - try: - b = self.builder - except AttributeError: - b = None - if b is None: - self.builder_set(scb) - return scb - - def has_src_builder(self): - """Return whether this Node has a source builder or not. - - If this Node doesn't have an explicit source code builder, this - is where we figure out, on the fly, if there's a transparent - source code builder for it. - - Note that if we found a source builder, we also set the - self.builder attribute, so that all of the methods that actually - *build* this file don't have to do anything different. - """ - try: - scb = self.sbuilder - except AttributeError: - scb = self.sbuilder = self.find_src_builder() - return scb is not None - - def alter_targets(self): - """Return any corresponding targets in a variant directory. - """ - if self.is_derived(): - return [], None - return self.fs.variant_dir_target_climb(self, self.dir, [self.name]) - - def _rmv_existing(self): - self.clear_memoized_values() - e = Unlink(self, [], None) - if isinstance(e, SCons.Errors.BuildError): - raise e - - # - # Taskmaster interface subsystem - # - - def make_ready(self): - self.has_src_builder() - self.get_binfo() - - def prepare(self): - """Prepare for this file to be created.""" - SCons.Node.Node.prepare(self) - - if self.get_state() != SCons.Node.up_to_date: - if self.exists(): - if self.is_derived() and not self.precious: - self._rmv_existing() - else: - try: - self._createDir() - except SCons.Errors.StopError, drive: - desc = "No drive `%s' for target `%s'." % (drive, self) - raise SCons.Errors.StopError(desc) - - # - # - # - - def remove(self): - """Remove this file.""" - if self.exists() or self.islink(): - self.fs.unlink(self.path) - return 1 - return None - - def do_duplicate(self, src): - self._createDir() - Unlink(self, None, None) - e = Link(self, src, None) - if isinstance(e, SCons.Errors.BuildError): - desc = "Cannot duplicate `%s' in `%s': %s." % (src.path, self.dir.path, e.errstr) - raise SCons.Errors.StopError(desc) - self.linked = 1 - # The Link() action may or may not have actually - # created the file, depending on whether the -n - # option was used or not. Delete the _exists and - # _rexists attributes so they can be reevaluated. - self.clear() - - memoizer_counters.append(SCons.Memoize.CountValue('exists')) - - def exists(self): - try: - return self._memo['exists'] - except KeyError: - pass - # Duplicate from source path if we are set up to do this. - if self.duplicate and not self.is_derived() and not self.linked: - src = self.srcnode() - if src is not self: - # At this point, src is meant to be copied in a variant directory. - src = src.rfile() - if src.abspath != self.abspath: - if src.exists(): - self.do_duplicate(src) - # Can't return 1 here because the duplication might - # not actually occur if the -n option is being used. - else: - # The source file does not exist. Make sure no old - # copy remains in the variant directory. - if Base.exists(self) or self.islink(): - self.fs.unlink(self.path) - # Return None explicitly because the Base.exists() call - # above will have cached its value if the file existed. - self._memo['exists'] = None - return None - result = Base.exists(self) - self._memo['exists'] = result - return result - - # - # SIGNATURE SUBSYSTEM - # - - def get_max_drift_csig(self): - """ - Returns the content signature currently stored for this node - if it's been unmodified longer than the max_drift value, or the - max_drift value is 0. Returns None otherwise. - """ - old = self.get_stored_info() - mtime = self.get_timestamp() - - max_drift = self.fs.max_drift - if max_drift > 0: - if (time.time() - mtime) > max_drift: - try: - n = old.ninfo - if n.timestamp and n.csig and n.timestamp == mtime: - return n.csig - except AttributeError: - pass - elif max_drift == 0: - try: - return old.ninfo.csig - except AttributeError: - pass - - return None - - def get_csig(self): - """ - Generate a node's content signature, the digested signature - of its content. - - node - the node - cache - alternate node to use for the signature cache - returns - the content signature - """ - ninfo = self.get_ninfo() - try: - return ninfo.csig - except AttributeError: - pass - - csig = self.get_max_drift_csig() - if csig is None: - - try: - if self.get_size() < SCons.Node.FS.File.md5_chunksize: - contents = self.get_contents() - else: - csig = self.get_content_hash() - except IOError: - # This can happen if there's actually a directory on-disk, - # which can be the case if they've disabled disk checks, - # or if an action with a File target actually happens to - # create a same-named directory by mistake. - csig = '' - else: - if not csig: - csig = SCons.Util.MD5signature(contents) - - ninfo.csig = csig - - return csig - - # - # DECISION SUBSYSTEM - # - - def builder_set(self, builder): - SCons.Node.Node.builder_set(self, builder) - self.changed_since_last_build = self.decide_target - - def changed_content(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def changed_state(self, target, prev_ni): - return self.state != SCons.Node.up_to_date - - def changed_timestamp_then_content(self, target, prev_ni): - if not self.changed_timestamp_match(target, prev_ni): - try: - self.get_ninfo().csig = prev_ni.csig - except AttributeError: - pass - return False - return self.changed_content(target, prev_ni) - - def changed_timestamp_newer(self, target, prev_ni): - try: - return self.get_timestamp() > target.get_timestamp() - except AttributeError: - return 1 - - def changed_timestamp_match(self, target, prev_ni): - try: - return self.get_timestamp() != prev_ni.timestamp - except AttributeError: - return 1 - - def decide_source(self, target, prev_ni): - return target.get_build_env().decide_source(self, target, prev_ni) - - def decide_target(self, target, prev_ni): - return target.get_build_env().decide_target(self, target, prev_ni) - - # Initialize this Node's decider function to decide_source() because - # every file is a source file until it has a Builder attached... - changed_since_last_build = decide_source - - def is_up_to_date(self): - T = 0 - if T: Trace('is_up_to_date(%s):' % self) - if not self.exists(): - if T: Trace(' not self.exists():') - # The file doesn't exist locally... - r = self.rfile() - if r != self: - # ...but there is one in a Repository... - if not self.changed(r): - if T: Trace(' changed(%s):' % r) - # ...and it's even up-to-date... - if self._local: - # ...and they'd like a local copy. - e = LocalCopy(self, r, None) - if isinstance(e, SCons.Errors.BuildError): - raise - self.store_info() - if T: Trace(' 1\n') - return 1 - self.changed() - if T: Trace(' None\n') - return None - else: - r = self.changed() - if T: Trace(' self.exists(): %s\n' % r) - return not r - - memoizer_counters.append(SCons.Memoize.CountValue('rfile')) - - def rfile(self): - try: - return self._memo['rfile'] - except KeyError: - pass - result = self - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: node = dir.entries[norm_name] - except KeyError: node = dir.file_on_disk(self.name) - if node and node.exists() and \ - (isinstance(node, File) or isinstance(node, Entry) \ - or not node.is_derived()): - result = node - # Copy over our local attributes to the repository - # Node so we identify shared object files in the - # repository and don't assume they're static. - # - # This isn't perfect; the attribute would ideally - # be attached to the object in the repository in - # case it was built statically in the repository - # and we changed it to shared locally, but that's - # rarely the case and would only occur if you - # intentionally used the same suffix for both - # shared and static objects anyway. So this - # should work well in practice. - result.attributes = self.attributes - break - self._memo['rfile'] = result - return result - - def rstr(self): - return str(self.rfile()) - - def get_cachedir_csig(self): - """ - Fetch a Node's content signature for purposes of computing - another Node's cachesig. - - This is a wrapper around the normal get_csig() method that handles - the somewhat obscure case of using CacheDir with the -n option. - Any files that don't exist would normally be "built" by fetching - them from the cache, but the normal get_csig() method will try - to open up the local file, which doesn't exist because the -n - option meant we didn't actually pull the file from cachedir. - But since the file *does* actually exist in the cachedir, we - can use its contents for the csig. - """ - try: - return self.cachedir_csig - except AttributeError: - pass - - cachedir, cachefile = self.get_build_env().get_CacheDir().cachepath(self) - if not self.exists() and cachefile and os.path.exists(cachefile): - self.cachedir_csig = SCons.Util.MD5filesignature(cachefile, \ - SCons.Node.FS.File.md5_chunksize * 1024) - else: - self.cachedir_csig = self.get_csig() - return self.cachedir_csig - - def get_cachedir_bsig(self): - try: - return self.cachesig - except AttributeError: - pass - - # Add the path to the cache signature, because multiple - # targets built by the same action will all have the same - # build signature, and we have to differentiate them somehow. - children = self.children() - executor = self.get_executor() - # sigs = [n.get_cachedir_csig() for n in children] - sigs = [n.get_cachedir_csig() for n in children] - sigs.append(SCons.Util.MD5signature(executor.get_contents())) - sigs.append(self.path) - result = self.cachesig = SCons.Util.MD5collect(sigs) - return result - - -default_fs = None - -def get_default_fs(): - global default_fs - if not default_fs: - default_fs = FS() - return default_fs - -class FileFinder(object): - """ - """ - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self): - self._memo = {} - - def filedir_lookup(self, p, fd=None): - """ - A helper method for find_file() that looks up a directory for - a file we're trying to find. This only creates the Dir Node if - it exists on-disk, since if the directory doesn't exist we know - we won't find any files in it... :-) - - It would be more compact to just use this as a nested function - with a default keyword argument (see the commented-out version - below), but that doesn't work unless you have nested scopes, - so we define it here just so this work under Python 1.5.2. - """ - if fd is None: - fd = self.default_filedir - dir, name = os.path.split(fd) - drive, d = os.path.splitdrive(dir) - if not name and d[:1] in ('/', os.sep): - #return p.fs.get_root(drive).dir_on_disk(name) - return p.fs.get_root(drive) - if dir: - p = self.filedir_lookup(p, dir) - if not p: - return None - norm_name = _my_normcase(name) - try: - node = p.entries[norm_name] - except KeyError: - return p.dir_on_disk(name) - if isinstance(node, Dir): - return node - if isinstance(node, Entry): - node.must_be_same(Dir) - return node - return None - - def _find_file_key(self, filename, paths, verbose=None): - return (filename, paths) - - memoizer_counters.append(SCons.Memoize.CountDict('find_file', _find_file_key)) - - def find_file(self, filename, paths, verbose=None): - """ - find_file(str, [Dir()]) -> [nodes] - - filename - a filename to find - paths - a list of directory path *nodes* to search in. Can be - represented as a list, a tuple, or a callable that is - called with no arguments and returns the list or tuple. - - returns - the node created from the found file. - - Find a node corresponding to either a derived file or a file - that exists already. - - Only the first file found is returned, and none is returned - if no file is found. - """ - memo_key = self._find_file_key(filename, paths) - try: - memo_dict = self._memo['find_file'] - except KeyError: - memo_dict = {} - self._memo['find_file'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - if verbose and not callable(verbose): - if not SCons.Util.is_String(verbose): - verbose = "find_file" - _verbose = u' %s: ' % verbose - verbose = lambda s: sys.stdout.write(_verbose + s) - - filedir, filename = os.path.split(filename) - if filedir: - # More compact code that we can't use until we drop - # support for Python 1.5.2: - # - #def filedir_lookup(p, fd=filedir): - # """ - # A helper function that looks up a directory for a file - # we're trying to find. This only creates the Dir Node - # if it exists on-disk, since if the directory doesn't - # exist we know we won't find any files in it... :-) - # """ - # dir, name = os.path.split(fd) - # if dir: - # p = filedir_lookup(p, dir) - # if not p: - # return None - # norm_name = _my_normcase(name) - # try: - # node = p.entries[norm_name] - # except KeyError: - # return p.dir_on_disk(name) - # if isinstance(node, Dir): - # return node - # if isinstance(node, Entry): - # node.must_be_same(Dir) - # return node - # if isinstance(node, Dir) or isinstance(node, Entry): - # return node - # return None - #paths = [_f for _f in map(filedir_lookup, paths) if _f] - - self.default_filedir = filedir - paths = [_f for _f in map(self.filedir_lookup, paths) if _f] - - result = None - for dir in paths: - if verbose: - verbose("looking for '%s' in '%s' ...\n" % (filename, dir)) - node, d = dir.srcdir_find_file(filename) - if node: - if verbose: - verbose("... FOUND '%s' in '%s'\n" % (filename, d)) - result = node - break - - memo_dict[memo_key] = result - - return result - -find_file = FileFinder().find_file - - -def invalidate_node_memos(targets): - """ - Invalidate the memoized values of all Nodes (files or directories) - that are associated with the given entries. Has been added to - clear the cache of nodes affected by a direct execution of an - action (e.g. Delete/Copy/Chmod). Existing Node caches become - inconsistent if the action is run through Execute(). The argument - `targets` can be a single Node object or filename, or a sequence - of Nodes/filenames. - """ - from traceback import extract_stack - - # First check if the cache really needs to be flushed. Only - # actions run in the SConscript with Execute() seem to be - # affected. XXX The way to check if Execute() is in the stacktrace - # is a very dirty hack and should be replaced by a more sensible - # solution. - for f in extract_stack(): - if f[2] == 'Execute' and f[0][-14:] == 'Environment.py': - break - else: - # Dont have to invalidate, so return - return - - if not SCons.Util.is_List(targets): - targets = [targets] - - for entry in targets: - # If the target is a Node object, clear the cache. If it is a - # filename, look up potentially existing Node object first. - try: - entry.clear_memoized_values() - except AttributeError: - # Not a Node object, try to look up Node by filename. XXX - # This creates Node objects even for those filenames which - # do not correspond to an existing Node object. - node = get_default_fs().Entry(entry) - if node: - node.clear_memoized_values() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Python.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Python.py deleted file mode 100644 index be99d28e9..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/Python.py +++ /dev/null @@ -1,128 +0,0 @@ -"""scons.Node.Python - -Python nodes. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Node/Python.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Node - -class ValueNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - - field_list = ['csig'] - - def str_to_node(self, s): - return Value(s) - -class ValueBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -class Value(SCons.Node.Node): - """A class for Python variables, typically passed on the command line - or generated by a script, but not from a file or some other source. - """ - - NodeInfo = ValueNodeInfo - BuildInfo = ValueBuildInfo - - def __init__(self, value, built_value=None): - SCons.Node.Node.__init__(self) - self.value = value - if built_value is not None: - self.built_value = built_value - - def str_for_display(self): - return repr(self.value) - - def __str__(self): - return str(self.value) - - def make_ready(self): - self.get_csig() - - def build(self, **kw): - if not hasattr(self, 'built_value'): - SCons.Node.Node.build(self, **kw) - - is_up_to_date = SCons.Node.Node.children_are_up_to_date - - def is_under(self, dir): - # Make Value nodes get built regardless of - # what directory scons was run from. Value nodes - # are outside the filesystem: - return 1 - - def write(self, built_value): - """Set the value of the node.""" - self.built_value = built_value - - def read(self): - """Return the value. If necessary, the value is built.""" - self.build() - if not hasattr(self, 'built_value'): - self.built_value = self.value - return self.built_value - - def get_text_contents(self): - """By the assumption that the node.built_value is a - deterministic product of the sources, the contents of a Value - are the concatenation of all the contents of its sources. As - the value need not be built when get_contents() is called, we - cannot use the actual node.built_value.""" - ###TODO: something reasonable about universal newlines - contents = str(self.value) - for kid in self.children(None): - contents = contents + kid.get_contents() - return contents - - get_contents = get_text_contents ###TODO should return 'bytes' value - - def changed_since_last_build(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def get_csig(self, calc=None): - """Because we're a Python value node and don't have a real - timestamp, we get to ignore the calculator and just use the - value contents.""" - try: - return self.ninfo.csig - except AttributeError: - pass - contents = self.get_contents() - self.get_ninfo().csig = contents - return contents - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/__init__.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/__init__.py deleted file mode 100644 index 8d15b5811..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Node/__init__.py +++ /dev/null @@ -1,1328 +0,0 @@ -"""SCons.Node - -The Node package for the SCons software construction utility. - -This is, in many ways, the heart of SCons. - -A Node is where we encapsulate all of the dependency information about -any thing that SCons can build, or about any thing which SCons can use -to build some other thing. The canonical "thing," of course, is a file, -but a Node can also represent something remote (like a web page) or -something completely abstract (like an Alias). - -Each specific type of "thing" is specifically represented by a subclass -of the Node base class: Node.FS.File for files, Node.Alias for aliases, -etc. Dependency information is kept here in the base class, and -information specific to files/aliases/etc. is in the subclass. The -goal, if we've done this correctly, is that any type of "thing" should -be able to depend on any other type of "thing." - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Node/__init__.py 5023 2010/06/14 22:05:46 scons" - -import collections -import copy -from itertools import chain - -from SCons.Debug import logInstanceCreation -import SCons.Executor -import SCons.Memoize -import SCons.Util - -from SCons.Debug import Trace - -def classname(obj): - return str(obj.__class__).split('.')[-1] - -# Node states -# -# These are in "priority" order, so that the maximum value for any -# child/dependency of a node represents the state of that node if -# it has no builder of its own. The canonical example is a file -# system directory, which is only up to date if all of its children -# were up to date. -no_state = 0 -pending = 1 -executing = 2 -up_to_date = 3 -executed = 4 -failed = 5 - -StateString = { - 0 : "no_state", - 1 : "pending", - 2 : "executing", - 3 : "up_to_date", - 4 : "executed", - 5 : "failed", -} - -# controls whether implicit dependencies are cached: -implicit_cache = 0 - -# controls whether implicit dep changes are ignored: -implicit_deps_unchanged = 0 - -# controls whether the cached implicit deps are ignored: -implicit_deps_changed = 0 - -# A variable that can be set to an interface-specific function be called -# to annotate a Node with information about its creation. -def do_nothing(node): pass - -Annotate = do_nothing - -# Classes for signature info for Nodes. - -class NodeInfoBase(object): - """ - The generic base class for signature information for a Node. - - Node subclasses should subclass NodeInfoBase to provide their own - logic for dealing with their own Node-specific signature information. - """ - current_version_id = 1 - def __init__(self, node=None): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - self._version_id = self.current_version_id - def update(self, node): - try: - field_list = self.field_list - except AttributeError: - return - for f in field_list: - try: - delattr(self, f) - except AttributeError: - pass - try: - func = getattr(node, 'get_' + f) - except AttributeError: - pass - else: - setattr(self, f, func()) - def convert(self, node, val): - pass - def merge(self, other): - self.__dict__.update(other.__dict__) - def format(self, field_list=None, names=0): - if field_list is None: - try: - field_list = self.field_list - except AttributeError: - field_list = sorted(self.__dict__.keys()) - fields = [] - for field in field_list: - try: - f = getattr(self, field) - except AttributeError: - f = None - f = str(f) - if names: - f = field + ': ' + f - fields.append(f) - return fields - -class BuildInfoBase(object): - """ - The generic base class for build information for a Node. - - This is what gets stored in a .sconsign file for each target file. - It contains a NodeInfo instance for this node (signature information - that's specific to the type of Node) and direct attributes for the - generic build stuff we have to track: sources, explicit dependencies, - implicit dependencies, and action information. - """ - current_version_id = 1 - def __init__(self, node=None): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - self._version_id = self.current_version_id - self.bsourcesigs = [] - self.bdependsigs = [] - self.bimplicitsigs = [] - self.bactsig = None - def merge(self, other): - self.__dict__.update(other.__dict__) - -class Node(object): - """The base Node class, for entities that we know how to - build, or use to build other Nodes. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - class Attrs(object): - pass - - def __init__(self): - if __debug__: logInstanceCreation(self, 'Node.Node') - # Note that we no longer explicitly initialize a self.builder - # attribute to None here. That's because the self.builder - # attribute may be created on-the-fly later by a subclass (the - # canonical example being a builder to fetch a file from a - # source code system like CVS or Subversion). - - # Each list of children that we maintain is accompanied by a - # dictionary used to look up quickly whether a node is already - # present in the list. Empirical tests showed that it was - # fastest to maintain them as side-by-side Node attributes in - # this way, instead of wrapping up each list+dictionary pair in - # a class. (Of course, we could always still do that in the - # future if we had a good reason to...). - self.sources = [] # source files used to build node - self.sources_set = set() - self._specific_sources = False - self.depends = [] # explicit dependencies (from Depends) - self.depends_set = set() - self.ignore = [] # dependencies to ignore - self.ignore_set = set() - self.prerequisites = SCons.Util.UniqueList() - self.implicit = None # implicit (scanned) dependencies (None means not scanned yet) - self.waiting_parents = set() - self.waiting_s_e = set() - self.ref_count = 0 - self.wkids = None # Kids yet to walk, when it's an array - - self.env = None - self.state = no_state - self.precious = None - self.noclean = 0 - self.nocache = 0 - self.always_build = None - self.includes = None - self.attributes = self.Attrs() # Generic place to stick information about the Node. - self.side_effect = 0 # true iff this node is a side effect - self.side_effects = [] # the side effects of building this target - self.linked = 0 # is this node linked to the variant directory? - - self.clear_memoized_values() - - # Let the interface in which the build engine is embedded - # annotate this Node with its own info (like a description of - # what line in what file created the node, for example). - Annotate(self) - - def disambiguate(self, must_exist=None): - return self - - def get_suffix(self): - return '' - - memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - - def get_build_env(self): - """Fetch the appropriate Environment to build this node. - """ - try: - return self._memo['get_build_env'] - except KeyError: - pass - result = self.get_executor().get_build_env() - self._memo['get_build_env'] = result - return result - - def get_build_scanner_path(self, scanner): - """Fetch the appropriate scanner path for this node.""" - return self.get_executor().get_build_scanner_path(scanner) - - def set_executor(self, executor): - """Set the action executor for this node.""" - self.executor = executor - - def get_executor(self, create=1): - """Fetch the action executor for this node. Create one if - there isn't already one, and requested to do so.""" - try: - executor = self.executor - except AttributeError: - if not create: - raise - try: - act = self.builder.action - except AttributeError: - executor = SCons.Executor.Null(targets=[self]) - else: - executor = SCons.Executor.Executor(act, - self.env or self.builder.env, - [self.builder.overrides], - [self], - self.sources) - self.executor = executor - return executor - - def executor_cleanup(self): - """Let the executor clean up any cached information.""" - try: - executor = self.get_executor(create=None) - except AttributeError: - pass - else: - executor.cleanup() - - def reset_executor(self): - "Remove cached executor; forces recompute when needed." - try: - delattr(self, 'executor') - except AttributeError: - pass - - def push_to_cache(self): - """Try to push a node into a cache - """ - pass - - def retrieve_from_cache(self): - """Try to retrieve the node's content from a cache - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Returns true iff the node was successfully retrieved. - """ - return 0 - - # - # Taskmaster interface subsystem - # - - def make_ready(self): - """Get a Node ready for evaluation. - - This is called before the Taskmaster decides if the Node is - up-to-date or not. Overriding this method allows for a Node - subclass to be disambiguated if necessary, or for an implicit - source builder to be attached. - """ - pass - - def prepare(self): - """Prepare for this Node to be built. - - This is called after the Taskmaster has decided that the Node - is out-of-date and must be rebuilt, but before actually calling - the method to build the Node. - - This default implementation checks that explicit or implicit - dependencies either exist or are derived, and initializes the - BuildInfo structure that will hold the information about how - this node is, uh, built. - - (The existence of source files is checked separately by the - Executor, which aggregates checks for all of the targets built - by a specific action.) - - Overriding this method allows for for a Node subclass to remove - the underlying file from the file system. Note that subclass - methods should call this base class method to get the child - check and the BuildInfo structure. - """ - for d in self.depends: - if d.missing(): - msg = "Explicit dependency `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError(msg % (d, self)) - if self.implicit is not None: - for i in self.implicit: - if i.missing(): - msg = "Implicit dependency `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError(msg % (i, self)) - self.binfo = self.get_binfo() - - def build(self, **kw): - """Actually build the node. - - This is called by the Taskmaster after it's decided that the - Node is out-of-date and must be rebuilt, and after the prepare() - method has gotten everything, uh, prepared. - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff - in built(). - - """ - try: - self.get_executor()(self, **kw) - except SCons.Errors.BuildError, e: - e.node = self - raise - - def built(self): - """Called just after this node is successfully built.""" - - # Clear the implicit dependency caches of any Nodes - # waiting for this Node to be built. - for parent in self.waiting_parents: - parent.implicit = None - - self.clear() - - self.ninfo.update(self) - - def visited(self): - """Called just after this node has been visited (with or - without a build).""" - try: - binfo = self.binfo - except AttributeError: - # Apparently this node doesn't need build info, so - # don't bother calculating or storing it. - pass - else: - self.ninfo.update(self) - self.store_info() - - # - # - # - - def add_to_waiting_s_e(self, node): - self.waiting_s_e.add(node) - - def add_to_waiting_parents(self, node): - """ - Returns the number of nodes added to our waiting parents list: - 1 if we add a unique waiting parent, 0 if not. (Note that the - returned values are intended to be used to increment a reference - count, so don't think you can "clean up" this function by using - True and False instead...) - """ - wp = self.waiting_parents - if node in wp: - return 0 - wp.add(node) - return 1 - - def postprocess(self): - """Clean up anything we don't need to hang onto after we've - been built.""" - self.executor_cleanup() - self.waiting_parents = set() - - def clear(self): - """Completely clear a Node of all its cached state (so that it - can be re-evaluated by interfaces that do continuous integration - builds). - """ - # The del_binfo() call here isn't necessary for normal execution, - # but is for interactive mode, where we might rebuild the same - # target and need to start from scratch. - self.del_binfo() - self.clear_memoized_values() - self.ninfo = self.new_ninfo() - self.executor_cleanup() - try: - delattr(self, '_calculated_sig') - except AttributeError: - pass - self.includes = None - - def clear_memoized_values(self): - self._memo = {} - - def builder_set(self, builder): - self.builder = builder - try: - del self.executor - except AttributeError: - pass - - def has_builder(self): - """Return whether this Node has a builder or not. - - In Boolean tests, this turns out to be a *lot* more efficient - than simply examining the builder attribute directly ("if - node.builder: ..."). When the builder attribute is examined - directly, it ends up calling __getattr__ for both the __len__ - and __nonzero__ attributes on instances of our Builder Proxy - class(es), generating a bazillion extra calls and slowing - things down immensely. - """ - try: - b = self.builder - except AttributeError: - # There was no explicit builder for this Node, so initialize - # the self.builder attribute to None now. - b = self.builder = None - return b is not None - - def set_explicit(self, is_explicit): - self.is_explicit = is_explicit - - def has_explicit_builder(self): - """Return whether this Node has an explicit builder - - This allows an internal Builder created by SCons to be marked - non-explicit, so that it can be overridden by an explicit - builder that the user supplies (the canonical example being - directories).""" - try: - return self.is_explicit - except AttributeError: - self.is_explicit = None - return self.is_explicit - - def get_builder(self, default_builder=None): - """Return the set builder, or a specified default value""" - try: - return self.builder - except AttributeError: - return default_builder - - multiple_side_effect_has_builder = has_builder - - def is_derived(self): - """ - Returns true iff this node is derived (i.e. built). - - This should return true only for nodes whose path should be in - the variant directory when duplicate=0 and should contribute their build - signatures when they are used as source files to other derived files. For - example: source with source builders are not derived in this sense, - and hence should not return true. - """ - return self.has_builder() or self.side_effect - - def alter_targets(self): - """Return a list of alternate targets for this Node. - """ - return [], None - - def get_found_includes(self, env, scanner, path): - """Return the scanned include lines (implicit dependencies) - found in this node. - - The default is no implicit dependencies. We expect this method - to be overridden by any subclass that can be scanned for - implicit dependencies. - """ - return [] - - def get_implicit_deps(self, env, scanner, path): - """Return a list of implicit dependencies for this node. - - This method exists to handle recursive invocation of the scanner - on the implicit dependencies returned by the scanner, if the - scanner's recursive flag says that we should. - """ - if not scanner: - return [] - - # Give the scanner a chance to select a more specific scanner - # for this Node. - #scanner = scanner.select(self) - - nodes = [self] - seen = {} - seen[self] = 1 - deps = [] - while nodes: - n = nodes.pop(0) - d = [x for x in n.get_found_includes(env, scanner, path) if x not in seen] - if d: - deps.extend(d) - for n in d: - seen[n] = 1 - nodes.extend(scanner.recurse_nodes(d)) - - return deps - - def get_env_scanner(self, env, kw={}): - return env.get_scanner(self.scanner_key()) - - def get_target_scanner(self): - return self.builder.target_scanner - - def get_source_scanner(self, node): - """Fetch the source scanner for the specified node - - NOTE: "self" is the target being built, "node" is - the source file for which we want to fetch the scanner. - - Implies self.has_builder() is true; again, expect to only be - called from locations where this is already verified. - - This function may be called very often; it attempts to cache - the scanner found to improve performance. - """ - scanner = None - try: - scanner = self.builder.source_scanner - except AttributeError: - pass - if not scanner: - # The builder didn't have an explicit scanner, so go look up - # a scanner from env['SCANNERS'] based on the node's scanner - # key (usually the file extension). - scanner = self.get_env_scanner(self.get_build_env()) - if scanner: - scanner = scanner.select(node) - return scanner - - def add_to_implicit(self, deps): - if not hasattr(self, 'implicit') or self.implicit is None: - self.implicit = [] - self.implicit_set = set() - self._children_reset() - self._add_child(self.implicit, self.implicit_set, deps) - - def scan(self): - """Scan this node's dependents for implicit dependencies.""" - # Don't bother scanning non-derived files, because we don't - # care what their dependencies are. - # Don't scan again, if we already have scanned. - if self.implicit is not None: - return - self.implicit = [] - self.implicit_set = set() - self._children_reset() - if not self.has_builder(): - return - - build_env = self.get_build_env() - executor = self.get_executor() - - # Here's where we implement --implicit-cache. - if implicit_cache and not implicit_deps_changed: - implicit = self.get_stored_implicit() - if implicit is not None: - # We now add the implicit dependencies returned from the - # stored .sconsign entry to have already been converted - # to Nodes for us. (We used to run them through a - # source_factory function here.) - - # Update all of the targets with them. This - # essentially short-circuits an N*M scan of the - # sources for each individual target, which is a hell - # of a lot more efficient. - for tgt in executor.get_all_targets(): - tgt.add_to_implicit(implicit) - - if implicit_deps_unchanged or self.is_up_to_date(): - return - # one of this node's sources has changed, - # so we must recalculate the implicit deps: - self.implicit = [] - self.implicit_set = set() - - # Have the executor scan the sources. - executor.scan_sources(self.builder.source_scanner) - - # If there's a target scanner, have the executor scan the target - # node itself and associated targets that might be built. - scanner = self.get_target_scanner() - if scanner: - executor.scan_targets(scanner) - - def scanner_key(self): - return None - - def select_scanner(self, scanner): - """Selects a scanner for this Node. - - This is a separate method so it can be overridden by Node - subclasses (specifically, Node.FS.Dir) that *must* use their - own Scanner and don't select one the Scanner.Selector that's - configured for the target. - """ - return scanner.select(self) - - def env_set(self, env, safe=0): - if safe and self.env: - return - self.env = env - - # - # SIGNATURE SUBSYSTEM - # - - NodeInfo = NodeInfoBase - BuildInfo = BuildInfoBase - - def new_ninfo(self): - ninfo = self.NodeInfo(self) - return ninfo - - def get_ninfo(self): - try: - return self.ninfo - except AttributeError: - self.ninfo = self.new_ninfo() - return self.ninfo - - def new_binfo(self): - binfo = self.BuildInfo(self) - return binfo - - def get_binfo(self): - """ - Fetch a node's build information. - - node - the node whose sources will be collected - cache - alternate node to use for the signature cache - returns - the build signature - - This no longer handles the recursive descent of the - node's children's signatures. We expect that they're - already built and updated by someone else, if that's - what's wanted. - """ - try: - return self.binfo - except AttributeError: - pass - - binfo = self.new_binfo() - self.binfo = binfo - - executor = self.get_executor() - ignore_set = self.ignore_set - - if self.has_builder(): - binfo.bact = str(executor) - binfo.bactsig = SCons.Util.MD5signature(executor.get_contents()) - - if self._specific_sources: - sources = [] - for s in self.sources: - if s not in ignore_set: - sources.append(s) - else: - sources = executor.get_unignored_sources(self, self.ignore) - seen = set() - bsources = [] - bsourcesigs = [] - for s in sources: - if not s in seen: - seen.add(s) - bsources.append(s) - bsourcesigs.append(s.get_ninfo()) - binfo.bsources = bsources - binfo.bsourcesigs = bsourcesigs - - depends = self.depends - dependsigs = [] - for d in depends: - if d not in ignore_set: - dependsigs.append(d.get_ninfo()) - binfo.bdepends = depends - binfo.bdependsigs = dependsigs - - implicit = self.implicit or [] - implicitsigs = [] - for i in implicit: - if i not in ignore_set: - implicitsigs.append(i.get_ninfo()) - binfo.bimplicit = implicit - binfo.bimplicitsigs = implicitsigs - - return binfo - - def del_binfo(self): - """Delete the build info from this node.""" - try: - delattr(self, 'binfo') - except AttributeError: - pass - - def get_csig(self): - try: - return self.ninfo.csig - except AttributeError: - ninfo = self.get_ninfo() - ninfo.csig = SCons.Util.MD5signature(self.get_contents()) - return self.ninfo.csig - - def get_cachedir_csig(self): - return self.get_csig() - - def store_info(self): - """Make the build signature permanent (that is, store it in the - .sconsign file or equivalent).""" - pass - - def do_not_store_info(self): - pass - - def get_stored_info(self): - return None - - def get_stored_implicit(self): - """Fetch the stored implicit dependencies""" - return None - - # - # - # - - def set_precious(self, precious = 1): - """Set the Node's precious value.""" - self.precious = precious - - def set_noclean(self, noclean = 1): - """Set the Node's noclean value.""" - # Make sure noclean is an integer so the --debug=stree - # output in Util.py can use it as an index. - self.noclean = noclean and 1 or 0 - - def set_nocache(self, nocache = 1): - """Set the Node's nocache value.""" - # Make sure nocache is an integer so the --debug=stree - # output in Util.py can use it as an index. - self.nocache = nocache and 1 or 0 - - def set_always_build(self, always_build = 1): - """Set the Node's always_build value.""" - self.always_build = always_build - - def exists(self): - """Does this node exists?""" - # All node exist by default: - return 1 - - def rexists(self): - """Does this node exist locally or in a repositiory?""" - # There are no repositories by default: - return self.exists() - - def missing(self): - return not self.is_derived() and \ - not self.linked and \ - not self.rexists() - - def remove(self): - """Remove this Node: no-op by default.""" - return None - - def add_dependency(self, depend): - """Adds dependencies.""" - try: - self._add_child(self.depends, self.depends_set, depend) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = list(map(str, e)) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to add a non-Node dependency to %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def add_prerequisite(self, prerequisite): - """Adds prerequisites""" - self.prerequisites.extend(prerequisite) - self._children_reset() - - def add_ignore(self, depend): - """Adds dependencies to ignore.""" - try: - self._add_child(self.ignore, self.ignore_set, depend) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = list(map(str, e)) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to ignore a non-Node dependency of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def add_source(self, source): - """Adds sources.""" - if self._specific_sources: - return - try: - self._add_child(self.sources, self.sources_set, source) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = list(map(str, e)) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to add a non-Node as source of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def _add_child(self, collection, set, child): - """Adds 'child' to 'collection', first checking 'set' to see if it's - already present.""" - #if type(child) is not type([]): - # child = [child] - #for c in child: - # if not isinstance(c, Node): - # raise TypeError, c - added = None - for c in child: - if c not in set: - set.add(c) - collection.append(c) - added = 1 - if added: - self._children_reset() - - def set_specific_source(self, source): - self.add_source(source) - self._specific_sources = True - - def add_wkid(self, wkid): - """Add a node to the list of kids waiting to be evaluated""" - if self.wkids is not None: - self.wkids.append(wkid) - - def _children_reset(self): - self.clear_memoized_values() - # We need to let the Executor clear out any calculated - # build info that it's cached so we can re-calculate it. - self.executor_cleanup() - - memoizer_counters.append(SCons.Memoize.CountValue('_children_get')) - - def _children_get(self): - try: - return self._memo['children_get'] - except KeyError: - pass - - # The return list may contain duplicate Nodes, especially in - # source trees where there are a lot of repeated #includes - # of a tangle of .h files. Profiling shows, however, that - # eliminating the duplicates with a brute-force approach that - # preserves the order (that is, something like: - # - # u = [] - # for n in list: - # if n not in u: - # u.append(n)" - # - # takes more cycles than just letting the underlying methods - # hand back cached values if a Node's information is requested - # multiple times. (Other methods of removing duplicates, like - # using dictionary keys, lose the order, and the only ordered - # dictionary patterns I found all ended up using "not in" - # internally anyway...) - if self.ignore_set: - if self.implicit is None: - iter = chain(self.sources,self.depends) - else: - iter = chain(self.sources, self.depends, self.implicit) - - children = [] - for i in iter: - if i not in self.ignore_set: - children.append(i) - else: - if self.implicit is None: - children = self.sources + self.depends - else: - children = self.sources + self.depends + self.implicit - - self._memo['children_get'] = children - return children - - def all_children(self, scan=1): - """Return a list of all the node's direct children.""" - if scan: - self.scan() - - # The return list may contain duplicate Nodes, especially in - # source trees where there are a lot of repeated #includes - # of a tangle of .h files. Profiling shows, however, that - # eliminating the duplicates with a brute-force approach that - # preserves the order (that is, something like: - # - # u = [] - # for n in list: - # if n not in u: - # u.append(n)" - # - # takes more cycles than just letting the underlying methods - # hand back cached values if a Node's information is requested - # multiple times. (Other methods of removing duplicates, like - # using dictionary keys, lose the order, and the only ordered - # dictionary patterns I found all ended up using "not in" - # internally anyway...) - if self.implicit is None: - return self.sources + self.depends - else: - return self.sources + self.depends + self.implicit - - def children(self, scan=1): - """Return a list of the node's direct children, minus those - that are ignored by this node.""" - if scan: - self.scan() - return self._children_get() - - def set_state(self, state): - self.state = state - - def get_state(self): - return self.state - - def state_has_changed(self, target, prev_ni): - return (self.state != SCons.Node.up_to_date) - - def get_env(self): - env = self.env - if not env: - import SCons.Defaults - env = SCons.Defaults.DefaultEnvironment() - return env - - def changed_since_last_build(self, target, prev_ni): - """ - - Must be overridden in a specific subclass to return True if this - Node (a dependency) has changed since the last time it was used - to build the specified target. prev_ni is this Node's state (for - example, its file timestamp, length, maybe content signature) - as of the last time the target was built. - - Note that this method is called through the dependency, not the - target, because a dependency Node must be able to use its own - logic to decide if it changed. For example, File Nodes need to - obey if we're configured to use timestamps, but Python Value Nodes - never use timestamps and always use the content. If this method - were called through the target, then each Node's implementation - of this method would have to have more complicated logic to - handle all the different Node types on which it might depend. - """ - raise NotImplementedError - - def Decider(self, function): - SCons.Util.AddMethod(self, function, 'changed_since_last_build') - - def changed(self, node=None): - """ - Returns if the node is up-to-date with respect to the BuildInfo - stored last time it was built. The default behavior is to compare - it against our own previously stored BuildInfo, but the stored - BuildInfo from another Node (typically one in a Repository) - can be used instead. - - Note that we now *always* check every dependency. We used to - short-circuit the check by returning as soon as we detected - any difference, but we now rely on checking every dependency - to make sure that any necessary Node information (for example, - the content signature of an #included .h file) is updated. - """ - t = 0 - if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node)) - if node is None: - node = self - - result = False - - bi = node.get_stored_info().binfo - then = bi.bsourcesigs + bi.bdependsigs + bi.bimplicitsigs - children = self.children() - - diff = len(children) - len(then) - if diff: - # The old and new dependency lists are different lengths. - # This always indicates that the Node must be rebuilt. - # We also extend the old dependency list with enough None - # entries to equal the new dependency list, for the benefit - # of the loop below that updates node information. - then.extend([None] * diff) - if t: Trace(': old %s new %s' % (len(then), len(children))) - result = True - - for child, prev_ni in zip(children, then): - if child.changed_since_last_build(self, prev_ni): - if t: Trace(': %s changed' % child) - result = True - - contents = self.get_executor().get_contents() - if self.has_builder(): - import SCons.Util - newsig = SCons.Util.MD5signature(contents) - if bi.bactsig != newsig: - if t: Trace(': bactsig %s != newsig %s' % (bi.bactsig, newsig)) - result = True - - if not result: - if t: Trace(': up to date') - - if t: Trace('\n') - - return result - - def is_up_to_date(self): - """Default check for whether the Node is current: unknown Node - subtypes are always out of date, so they will always get built.""" - return None - - def children_are_up_to_date(self): - """Alternate check for whether the Node is current: If all of - our children were up-to-date, then this Node was up-to-date, too. - - The SCons.Node.Alias and SCons.Node.Python.Value subclasses - rebind their current() method to this method.""" - # Allow the children to calculate their signatures. - self.binfo = self.get_binfo() - if self.always_build: - return None - state = 0 - for kid in self.children(None): - s = kid.get_state() - if s and (not state or s > state): - state = s - return (state == 0 or state == SCons.Node.up_to_date) - - def is_literal(self): - """Always pass the string representation of a Node to - the command interpreter literally.""" - return 1 - - def render_include_tree(self): - """ - Return a text representation, suitable for displaying to the - user, of the include tree for the sources of this node. - """ - if self.is_derived() and self.env: - env = self.get_build_env() - for s in self.sources: - scanner = self.get_source_scanner(s) - if scanner: - path = self.get_build_scanner_path(scanner) - else: - path = None - def f(node, env=env, scanner=scanner, path=path): - return node.get_found_includes(env, scanner, path) - return SCons.Util.render_tree(s, f, 1) - else: - return None - - def get_abspath(self): - """ - Return an absolute path to the Node. This will return simply - str(Node) by default, but for Node types that have a concept of - relative path, this might return something different. - """ - return str(self) - - def for_signature(self): - """ - Return a string representation of the Node that will always - be the same for this particular Node, no matter what. This - is by contrast to the __str__() method, which might, for - instance, return a relative path for a file Node. The purpose - of this method is to generate a value to be used in signature - calculation for the command line used to build a target, and - we use this method instead of str() to avoid unnecessary - rebuilds. This method does not need to return something that - would actually work in a command line; it can return any kind of - nonsense, so long as it does not change. - """ - return str(self) - - def get_string(self, for_signature): - """This is a convenience function designed primarily to be - used in command generators (i.e., CommandGeneratorActions or - Environment variables that are callable), which are called - with a for_signature argument that is nonzero if the command - generator is being called to generate a signature for the - command line, which determines if we should rebuild or not. - - Such command generators should use this method in preference - to str(Node) when converting a Node to a string, passing - in the for_signature parameter, such that we will call - Node.for_signature() or str(Node) properly, depending on whether - we are calculating a signature or actually constructing a - command line.""" - if for_signature: - return self.for_signature() - return str(self) - - def get_subst_proxy(self): - """ - This method is expected to return an object that will function - exactly like this Node, except that it implements any additional - special features that we would like to be in effect for - Environment variable substitution. The principle use is that - some Nodes would like to implement a __getattr__() method, - but putting that in the Node type itself has a tendency to kill - performance. We instead put it in a proxy and return it from - this method. It is legal for this method to return self - if no new functionality is needed for Environment substitution. - """ - return self - - def explain(self): - if not self.exists(): - return "building `%s' because it doesn't exist\n" % self - - if self.always_build: - return "rebuilding `%s' because AlwaysBuild() is specified\n" % self - - old = self.get_stored_info() - if old is None: - return None - - old = old.binfo - old.prepare_dependencies() - - try: - old_bkids = old.bsources + old.bdepends + old.bimplicit - old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs - except AttributeError: - return "Cannot explain why `%s' is being rebuilt: No previous build information found\n" % self - - new = self.get_binfo() - - new_bkids = new.bsources + new.bdepends + new.bimplicit - new_bkidsigs = new.bsourcesigs + new.bdependsigs + new.bimplicitsigs - - osig = dict(zip(old_bkids, old_bkidsigs)) - nsig = dict(zip(new_bkids, new_bkidsigs)) - - # The sources and dependencies we'll want to report are all stored - # as relative paths to this target's directory, but we want to - # report them relative to the top-level SConstruct directory, - # so we only print them after running them through this lambda - # to turn them into the right relative Node and then return - # its string. - def stringify( s, E=self.dir.Entry ) : - if hasattr( s, 'dir' ) : - return str(E(s)) - return str(s) - - lines = [] - - removed = [x for x in old_bkids if not x in new_bkids] - if removed: - removed = list(map(stringify, removed)) - fmt = "`%s' is no longer a dependency\n" - lines.extend([fmt % s for s in removed]) - - for k in new_bkids: - if not k in old_bkids: - lines.append("`%s' is a new dependency\n" % stringify(k)) - elif k.changed_since_last_build(self, osig[k]): - lines.append("`%s' changed\n" % stringify(k)) - - if len(lines) == 0 and old_bkids != new_bkids: - lines.append("the dependency order changed:\n" + - "%sold: %s\n" % (' '*15, list(map(stringify, old_bkids))) + - "%snew: %s\n" % (' '*15, list(map(stringify, new_bkids)))) - - if len(lines) == 0: - def fmt_with_title(title, strlines): - lines = strlines.split('\n') - sep = '\n' + ' '*(15 + len(title)) - return ' '*15 + title + sep.join(lines) + '\n' - if old.bactsig != new.bactsig: - if old.bact == new.bact: - lines.append("the contents of the build action changed\n" + - fmt_with_title('action: ', new.bact)) - else: - lines.append("the build action changed:\n" + - fmt_with_title('old: ', old.bact) + - fmt_with_title('new: ', new.bact)) - - if len(lines) == 0: - return "rebuilding `%s' for unknown reasons\n" % self - - preamble = "rebuilding `%s' because" % self - if len(lines) == 1: - return "%s %s" % (preamble, lines[0]) - else: - lines = ["%s:\n" % preamble] + lines - return ( ' '*11).join(lines) - -class NodeList(collections.UserList): - def __str__(self): - return str(list(map(str, self.data))) - -def get_children(node, parent): return node.children() -def ignore_cycle(node, stack): pass -def do_nothing(node, parent): pass - -class Walker(object): - """An iterator for walking a Node tree. - - This is depth-first, children are visited before the parent. - The Walker object can be initialized with any node, and - returns the next node on the descent with each get_next() call. - 'kids_func' is an optional function that will be called to - get the children of a node instead of calling 'children'. - 'cycle_func' is an optional function that will be called - when a cycle is detected. - - This class does not get caught in node cycles caused, for example, - by C header file include loops. - """ - def __init__(self, node, kids_func=get_children, - cycle_func=ignore_cycle, - eval_func=do_nothing): - self.kids_func = kids_func - self.cycle_func = cycle_func - self.eval_func = eval_func - node.wkids = copy.copy(kids_func(node, None)) - self.stack = [node] - self.history = {} # used to efficiently detect and avoid cycles - self.history[node] = None - - def get_next(self): - """Return the next node for this walk of the tree. - - This function is intentionally iterative, not recursive, - to sidestep any issues of stack size limitations. - """ - - while self.stack: - if self.stack[-1].wkids: - node = self.stack[-1].wkids.pop(0) - if not self.stack[-1].wkids: - self.stack[-1].wkids = None - if node in self.history: - self.cycle_func(node, self.stack) - else: - node.wkids = copy.copy(self.kids_func(node, self.stack[-1])) - self.stack.append(node) - self.history[node] = None - else: - node = self.stack.pop() - del self.history[node] - if node: - if self.stack: - parent = self.stack[-1] - else: - parent = None - self.eval_func(node, parent) - return node - return None - - def is_done(self): - return not self.stack - - -arg2nodes_lookups = [] - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py deleted file mode 100644 index f066a49c0..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/BoolOption.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def BoolOption(*args, **kw): - global warned - if not warned: - msg = "The BoolOption() function is deprecated; use the BoolVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return SCons.Variables.BoolVariable(*args, **kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py deleted file mode 100644 index b541108f3..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/EnumOption.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def EnumOption(*args, **kw): - global warned - if not warned: - msg = "The EnumOption() function is deprecated; use the EnumVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return SCons.Variables.EnumVariable(*args, **kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py deleted file mode 100644 index abc98a437..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/ListOption.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def ListOption(*args, **kw): - global warned - if not warned: - msg = "The ListOption() function is deprecated; use the ListVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return SCons.Variables.ListVariable(*args, **kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py deleted file mode 100644 index db6cac97d..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/PackageOption.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def PackageOption(*args, **kw): - global warned - if not warned: - msg = "The PackageOption() function is deprecated; use the PackageVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return SCons.Variables.PackageVariable(*args, **kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py deleted file mode 100644 index e31960d01..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/PathOption.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -class _PathOptionClass(object): - def warn(self): - global warned - if not warned: - msg = "The PathOption() function is deprecated; use the PathVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - - def __call__(self, *args, **kw): - self.warn() - return SCons.Variables.PathVariable(*args, **kw) - - def PathAccept(self, *args, **kw): - self.warn() - return SCons.Variables.PathVariable.PathAccept(*args, **kw) - - def PathIsDir(self, *args, **kw): - self.warn() - return SCons.Variables.PathVariable.PathIsDir(*args, **kw) - - def PathIsDirCreate(self, *args, **kw): - self.warn() - return SCons.Variables.PathVariable.PathIsDirCreate(*args, **kw) - - def PathIsFile(self, *args, **kw): - self.warn() - return SCons.Variables.PathVariable.PathIsFile(*args, **kw) - - def PathExists(self, *args, **kw): - self.warn() - return SCons.Variables.PathVariable.PathExists(*args, **kw) - -PathOption = _PathOptionClass() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/__init__.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/__init__.py deleted file mode 100644 index 63de8ed5a..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Options/__init__.py +++ /dev/null @@ -1,67 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/__init__.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -from BoolOption import BoolOption # okay -from EnumOption import EnumOption # okay -from ListOption import ListOption # naja -from PackageOption import PackageOption # naja -from PathOption import PathOption # okay - -warned = False - -class Options(SCons.Variables.Variables): - def __init__(self, *args, **kw): - global warned - if not warned: - msg = "The Options class is deprecated; use the Variables class instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - SCons.Variables.Variables.__init__(self, *args, **kw) - - def AddOptions(self, *args, **kw): - return SCons.Variables.Variables.AddVariables(self, *args, **kw) - - def UnknownOptions(self, *args, **kw): - return SCons.Variables.Variables.UnknownVariables(self, *args, **kw) - - def FormatOptionHelpText(self, *args, **kw): - return SCons.Variables.Variables.FormatVariableHelpText(self, *args, - **kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/PathList.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/PathList.py deleted file mode 100644 index 764b0b867..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/PathList.py +++ /dev/null @@ -1,231 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/PathList.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """SCons.PathList - -A module for handling lists of directory paths (the sort of things -that get set as CPPPATH, LIBPATH, etc.) with as much caching of data and -efficiency as we can while still keeping the evaluation delayed so that we -Do the Right Thing (almost) regardless of how the variable is specified. - -""" - -import os - -import SCons.Memoize -import SCons.Node -import SCons.Util - -# -# Variables to specify the different types of entries in a PathList object: -# - -TYPE_STRING_NO_SUBST = 0 # string with no '$' -TYPE_STRING_SUBST = 1 # string containing '$' -TYPE_OBJECT = 2 # other object - -def node_conv(obj): - """ - This is the "string conversion" routine that we have our substitutions - use to return Nodes, not strings. This relies on the fact that an - EntryProxy object has a get() method that returns the underlying - Node that it wraps, which is a bit of architectural dependence - that we might need to break or modify in the future in response to - additional requirements. - """ - try: - get = obj.get - except AttributeError: - if isinstance(obj, SCons.Node.Node) or SCons.Util.is_Sequence( obj ): - result = obj - else: - result = str(obj) - else: - result = get() - return result - -class _PathList(object): - """ - An actual PathList object. - """ - def __init__(self, pathlist): - """ - Initializes a PathList object, canonicalizing the input and - pre-processing it for quicker substitution later. - - The stored representation of the PathList is a list of tuples - containing (type, value), where the "type" is one of the TYPE_* - variables defined above. We distinguish between: - - strings that contain no '$' and therefore need no - delayed-evaluation string substitution (we expect that there - will be many of these and that we therefore get a pretty - big win from avoiding string substitution) - - strings that contain '$' and therefore need substitution - (the hard case is things like '${TARGET.dir}/include', - which require re-evaluation for every target + source) - - other objects (which may be something like an EntryProxy - that needs a method called to return a Node) - - Pre-identifying the type of each element in the PathList up-front - and storing the type in the list of tuples is intended to reduce - the amount of calculation when we actually do the substitution - over and over for each target. - """ - if SCons.Util.is_String(pathlist): - pathlist = pathlist.split(os.pathsep) - elif not SCons.Util.is_Sequence(pathlist): - pathlist = [pathlist] - - pl = [] - for p in pathlist: - try: - index = p.find('$') - except (AttributeError, TypeError): - type = TYPE_OBJECT - else: - if index == -1: - type = TYPE_STRING_NO_SUBST - else: - type = TYPE_STRING_SUBST - pl.append((type, p)) - - self.pathlist = tuple(pl) - - def __len__(self): return len(self.pathlist) - - def __getitem__(self, i): return self.pathlist[i] - - def subst_path(self, env, target, source): - """ - Performs construction variable substitution on a pre-digested - PathList for a specific target and source. - """ - result = [] - for type, value in self.pathlist: - if type == TYPE_STRING_SUBST: - value = env.subst(value, target=target, source=source, - conv=node_conv) - if SCons.Util.is_Sequence(value): - result.extend(value) - continue - - elif type == TYPE_OBJECT: - value = node_conv(value) - if value: - result.append(value) - return tuple(result) - - -class PathListCache(object): - """ - A class to handle caching of PathList lookups. - - This class gets instantiated once and then deleted from the namespace, - so it's used as a Singleton (although we don't enforce that in the - usual Pythonic ways). We could have just made the cache a dictionary - in the module namespace, but putting it in this class allows us to - use the same Memoizer pattern that we use elsewhere to count cache - hits and misses, which is very valuable. - - Lookup keys in the cache are computed by the _PathList_key() method. - Cache lookup should be quick, so we don't spend cycles canonicalizing - all forms of the same lookup key. For example, 'x:y' and ['x', - 'y'] logically represent the same list, but we don't bother to - split string representations and treat those two equivalently. - (Note, however, that we do, treat lists and tuples the same.) - - The main type of duplication we're trying to catch will come from - looking up the same path list from two different clones of the - same construction environment. That is, given - - env2 = env1.Clone() - - both env1 and env2 will have the same CPPPATH value, and we can - cheaply avoid re-parsing both values of CPPPATH by using the - common value from this cache. - """ - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self): - self._memo = {} - - def _PathList_key(self, pathlist): - """ - Returns the key for memoization of PathLists. - - Note that we want this to be pretty quick, so we don't completely - canonicalize all forms of the same list. For example, - 'dir1:$ROOT/dir2' and ['$ROOT/dir1', 'dir'] may logically - represent the same list if you're executing from $ROOT, but - we're not going to bother splitting strings into path elements, - or massaging strings into Nodes, to identify that equivalence. - We just want to eliminate obvious redundancy from the normal - case of re-using exactly the same cloned value for a path. - """ - if SCons.Util.is_Sequence(pathlist): - pathlist = tuple(SCons.Util.flatten(pathlist)) - return pathlist - - memoizer_counters.append(SCons.Memoize.CountDict('PathList', _PathList_key)) - - def PathList(self, pathlist): - """ - Returns the cached _PathList object for the specified pathlist, - creating and caching a new object as necessary. - """ - pathlist = self._PathList_key(pathlist) - try: - memo_dict = self._memo['PathList'] - except KeyError: - memo_dict = {} - self._memo['PathList'] = memo_dict - else: - try: - return memo_dict[pathlist] - except KeyError: - pass - - result = _PathList(pathlist) - - memo_dict[pathlist] = result - - return result - -PathList = PathListCache().PathList - - -del PathListCache - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py deleted file mode 100644 index 7e6288d34..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py +++ /dev/null @@ -1,241 +0,0 @@ -"""SCons.Platform - -SCons platform selection. - -This looks for modules that define a callable object that can modify a -construction environment as appropriate for a given platform. - -Note that we take a more simplistic view of "platform" than Python does. -We're looking for a single string that determines a set of -tool-independent variables with which to initialize a construction -environment. Consequently, we'll examine both sys.platform and os.name -(and anything else that might come in to play) in order to return some -specification which is unique enough for our purposes. - -Note that because this subsysem just *selects* a callable that can -modify a construction environment, it's possible for people to define -their own "platform specification" in an arbitrary callable function. -No one needs to use or tie in to this subsystem in order to roll -their own platform definition. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/__init__.py 5023 2010/06/14 22:05:46 scons" - -import SCons.compat - -import imp -import os -import sys -import tempfile - -import SCons.Errors -import SCons.Subst -import SCons.Tool - -def platform_default(): - """Return the platform string for our execution environment. - - The returned value should map to one of the SCons/Platform/*.py - files. Since we're architecture independent, though, we don't - care about the machine architecture. - """ - osname = os.name - if osname == 'java': - osname = os._osType - if osname == 'posix': - if sys.platform == 'cygwin': - return 'cygwin' - elif sys.platform.find('irix') != -1: - return 'irix' - elif sys.platform.find('sunos') != -1: - return 'sunos' - elif sys.platform.find('hp-ux') != -1: - return 'hpux' - elif sys.platform.find('aix') != -1: - return 'aix' - elif sys.platform.find('darwin') != -1: - return 'darwin' - else: - return 'posix' - elif os.name == 'os2': - return 'os2' - else: - return sys.platform - -def platform_module(name = platform_default()): - """Return the imported module for the platform. - - This looks for a module name that matches the specified argument. - If the name is unspecified, we fetch the appropriate default for - our execution environment. - """ - full_name = 'SCons.Platform.' + name - if full_name not in sys.modules: - if os.name == 'java': - eval(full_name) - else: - try: - file, path, desc = imp.find_module(name, - sys.modules['SCons.Platform'].__path__) - try: - mod = imp.load_module(full_name, file, path, desc) - finally: - if file: - file.close() - except ImportError: - try: - import zipimport - importer = zipimport.zipimporter( sys.modules['SCons.Platform'].__path__[0] ) - mod = importer.load_module(full_name) - except ImportError: - raise SCons.Errors.UserError("No platform named '%s'" % name) - setattr(SCons.Platform, name, mod) - return sys.modules[full_name] - -def DefaultToolList(platform, env): - """Select a default tool list for the specified platform. - """ - return SCons.Tool.tool_list(platform, env) - -class PlatformSpec(object): - def __init__(self, name, generate): - self.name = name - self.generate = generate - - def __call__(self, *args, **kw): - return self.generate(*args, **kw) - - def __str__(self): - return self.name - -class TempFileMunge(object): - """A callable class. You can set an Environment variable to this, - then call it with a string argument, then it will perform temporary - file substitution on it. This is used to circumvent the long command - line limitation. - - Example usage: - env["TEMPFILE"] = TempFileMunge - env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}" - - By default, the name of the temporary file used begins with a - prefix of '@'. This may be configred for other tool chains by - setting '$TEMPFILEPREFIX'. - - env["TEMPFILEPREFIX"] = '-@' # diab compiler - env["TEMPFILEPREFIX"] = '-via' # arm tool chain - """ - def __init__(self, cmd): - self.cmd = cmd - - def __call__(self, target, source, env, for_signature): - if for_signature: - # If we're being called for signature calculation, it's - # because we're being called by the string expansion in - # Subst.py, which has the logic to strip any $( $) that - # may be in the command line we squirreled away. So we - # just return the raw command line and let the upper - # string substitution layers do their thing. - return self.cmd - - # Now we're actually being called because someone is actually - # going to try to execute the command, so we have to do our - # own expansion. - cmd = env.subst_list(self.cmd, SCons.Subst.SUBST_CMD, target, source)[0] - try: - maxline = int(env.subst('$MAXLINELENGTH')) - except ValueError: - maxline = 2048 - - length = 0 - for c in cmd: - length += len(c) - if length <= maxline: - return self.cmd - - # We do a normpath because mktemp() has what appears to be - # a bug in Windows that will use a forward slash as a path - # delimiter. Windows's link mistakes that for a command line - # switch and barfs. - # - # We use the .lnk suffix for the benefit of the Phar Lap - # linkloc linker, which likes to append an .lnk suffix if - # none is given. - (fd, tmp) = tempfile.mkstemp('.lnk', text=True) - native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp)) - - if env['SHELL'] and env['SHELL'] == 'sh': - # The sh shell will try to escape the backslashes in the - # path, so unescape them. - native_tmp = native_tmp.replace('\\', r'\\\\') - # In Cygwin, we want to use rm to delete the temporary - # file, because del does not exist in the sh shell. - rm = env.Detect('rm') or 'del' - else: - # Don't use 'rm' if the shell is not sh, because rm won't - # work with the Windows shells (cmd.exe or command.com) or - # Windows path names. - rm = 'del' - - prefix = env.subst('$TEMPFILEPREFIX') - if not prefix: - prefix = '@' - - args = list(map(SCons.Subst.quote_spaces, cmd[1:])) - os.write(fd, " ".join(args) + "\n") - os.close(fd) - # XXX Using the SCons.Action.print_actions value directly - # like this is bogus, but expedient. This class should - # really be rewritten as an Action that defines the - # __call__() and strfunction() methods and lets the - # normal action-execution logic handle whether or not to - # print/execute the action. The problem, though, is all - # of that is decided before we execute this method as - # part of expanding the $TEMPFILE construction variable. - # Consequently, refactoring this will have to wait until - # we get more flexible with allowing Actions to exist - # independently and get strung together arbitrarily like - # Ant tasks. In the meantime, it's going to be more - # user-friendly to not let obsession with architectural - # purity get in the way of just being helpful, so we'll - # reach into SCons.Action directly. - if SCons.Action.print_actions: - print("Using tempfile "+native_tmp+" for command line:\n"+ - str(cmd[0]) + " " + " ".join(args)) - return [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ] - -def Platform(name = platform_default()): - """Select a canned Platform specification. - """ - module = platform_module(name) - spec = PlatformSpec(name, module.generate) - return spec - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/aix.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/aix.py deleted file mode 100644 index e729bcbf6..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/aix.py +++ /dev/null @@ -1,69 +0,0 @@ -"""engine.SCons.Platform.aix - -Platform-specific initialization for IBM AIX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/aix.py 5023 2010/06/14 22:05:46 scons" - -import os - -import posix - -def get_xlc(env, xlc=None, xlc_r=None, packages=[]): - # Use the AIX package installer tool lslpp to figure out where a - # given xl* compiler is installed and what version it is. - xlcPath = None - xlcVersion = None - - if xlc is None: - xlc = env.get('CC', 'xlc') - if xlc_r is None: - xlc_r = xlc + '_r' - for package in packages: - cmd = "lslpp -fc " + package + " 2>/dev/null | egrep '" + xlc + "([^-_a-zA-Z0-9].*)?$'" - line = os.popen(cmd).readline() - if line: - v, p = line.split(':')[1:3] - xlcVersion = v.split()[1] - xlcPath = p.split()[0] - xlcPath = xlcPath[:xlcPath.rindex('/')] - break - return (xlcPath, xlc, xlc_r, xlcVersion) - -def generate(env): - posix.generate(env) - #Based on AIX 5.2: ARG_MAX=24576 - 3000 for environment expansion - env['MAXLINELENGTH'] = 21576 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py deleted file mode 100644 index 854a2c555..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py +++ /dev/null @@ -1,55 +0,0 @@ -"""SCons.Platform.cygwin - -Platform-specific initialization for Cygwin systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/cygwin.py 5023 2010/06/14 22:05:46 scons" - -import posix -from SCons.Platform import TempFileMunge - -def generate(env): - posix.generate(env) - - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - env['MAXLINELENGTH'] = 2048 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py deleted file mode 100644 index 4d6251795..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py +++ /dev/null @@ -1,46 +0,0 @@ -"""engine.SCons.Platform.darwin - -Platform-specific initialization for Mac OS X systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/darwin.py 5023 2010/06/14 22:05:46 scons" - -import posix - -def generate(env): - posix.generate(env) - env['SHLIBSUFFIX'] = '.dylib' - env['ENV']['PATH'] = env['ENV']['PATH'] + ':/sw/bin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py deleted file mode 100644 index 4544dfb90..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py +++ /dev/null @@ -1,46 +0,0 @@ -"""engine.SCons.Platform.hpux - -Platform-specific initialization for HP-UX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/hpux.py 5023 2010/06/14 22:05:46 scons" - -import posix - -def generate(env): - posix.generate(env) - #Based on HP-UX11i: ARG_MAX=2048000 - 3000 for environment expansion - env['MAXLINELENGTH'] = 2045000 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/irix.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/irix.py deleted file mode 100644 index 3daebf5dc..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/irix.py +++ /dev/null @@ -1,44 +0,0 @@ -"""SCons.Platform.irix - -Platform-specific initialization for SGI IRIX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/irix.py 5023 2010/06/14 22:05:46 scons" - -import posix - -def generate(env): - posix.generate(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/os2.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/os2.py deleted file mode 100644 index e74a22ca6..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/os2.py +++ /dev/null @@ -1,58 +0,0 @@ -"""SCons.Platform.os2 - -Platform-specific initialization for OS/2 systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/os2.py 5023 2010/06/14 22:05:46 scons" -import win32 - -def generate(env): - if 'ENV' not in env: - env['ENV'] = {} - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = '$LIBPREFIX' - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['HOST_OS'] = 'os2' - env['HOST_ARCH'] = win32.get_architecture().arch - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/posix.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/posix.py deleted file mode 100644 index 1f19277d9..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/posix.py +++ /dev/null @@ -1,263 +0,0 @@ -"""SCons.Platform.posix - -Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/posix.py 5023 2010/06/14 22:05:46 scons" - -import errno -import os -import os.path -import subprocess -import sys -import select - -import SCons.Util -from SCons.Platform import TempFileMunge - -exitvalmap = { - 2 : 127, - 13 : 126, -} - -def escape(arg): - "escape shell special characters" - slash = '\\' - special = '"$()' - - arg = arg.replace(slash, slash+slash) - for c in special: - arg = arg.replace(c, slash+c) - - return '"' + arg + '"' - -def exec_system(l, env): - stat = os.system(' '.join(l)) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_spawnvpe(l, env): - stat = os.spawnvpe(os.P_WAIT, l[0], l, env) - # os.spawnvpe() returns the actual exit code, not the encoding - # returned by os.waitpid() or os.system(). - return stat - -def exec_fork(l, env): - pid = os.fork() - if not pid: - # Child process. - exitval = 127 - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process. - pid, stat = os.waitpid(pid, 0) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def _get_env_command(sh, escape, cmd, args, env): - s = ' '.join(args) - if env: - l = ['env', '-'] + \ - [escape(t[0])+'='+escape(t[1]) for t in env.items()] + \ - [sh, '-c', escape(s)] - s = ' '.join(l) - return s - -def env_spawn(sh, escape, cmd, args, env): - return exec_system([_get_env_command( sh, escape, cmd, args, env)], env) - -def spawnvpe_spawn(sh, escape, cmd, args, env): - return exec_spawnvpe([sh, '-c', ' '.join(args)], env) - -def fork_spawn(sh, escape, cmd, args, env): - return exec_fork([sh, '-c', ' '.join(args)], env) - -def process_cmd_output(cmd_stdout, cmd_stderr, stdout, stderr): - stdout_eof = stderr_eof = 0 - while not (stdout_eof and stderr_eof): - try: - (i,o,e) = select.select([cmd_stdout, cmd_stderr], [], []) - if cmd_stdout in i: - str = cmd_stdout.read() - if len(str) == 0: - stdout_eof = 1 - elif stdout is not None: - stdout.write(str) - if cmd_stderr in i: - str = cmd_stderr.read() - if len(str) == 0: - #sys.__stderr__.write( "stderr_eof=1\n" ) - stderr_eof = 1 - else: - #sys.__stderr__.write( "str(stderr) = %s\n" % str ) - stderr.write(str) - except select.error, (_errno, _strerror): - if _errno != errno.EINTR: - raise - -def exec_popen3(l, env, stdout, stderr): - proc = subprocess.Popen(' '.join(l), - stdout=stdout, - stderr=stderr, - shell=True) - stat = proc.wait() - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_piped_fork(l, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - if stdout != stderr: - (rFdOut, wFdOut) = os.pipe() - (rFdErr, wFdErr) = os.pipe() - else: - (rFdOut, wFdOut) = os.pipe() - rFdErr = rFdOut - wFdErr = wFdOut - # do the fork - pid = os.fork() - if not pid: - # Child process - os.close( rFdOut ) - if rFdOut != rFdErr: - os.close( rFdErr ) - os.dup2( wFdOut, 1 ) # is there some symbolic way to do that ? - os.dup2( wFdErr, 2 ) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - exitval = 127 - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process - pid, stat = os.waitpid(pid, 0) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - childOut = os.fdopen( rFdOut ) - if stdout != stderr: - childErr = os.fdopen( rFdErr ) - else: - childErr = childOut - process_cmd_output(childOut, childErr, stdout, stderr) - os.close( rFdOut ) - if stdout != stderr: - os.close( rFdErr ) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr): - # spawn using Popen3 combined with the env command - # the command name and the command's stdout is written to stdout - # the command's stderr is written to stderr - return exec_popen3([_get_env_command(sh, escape, cmd, args, env)], - env, stdout, stderr) - -def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - return exec_piped_fork([sh, '-c', ' '.join(args)], - env, stdout, stderr) - - - -def generate(env): - # If os.spawnvpe() exists, we use it to spawn commands. Otherwise - # if the env utility exists, we use os.system() to spawn commands, - # finally we fall back on os.fork()/os.exec(). - # - # os.spawnvpe() is prefered because it is the most efficient. But - # for Python versions without it, os.system() is prefered because it - # is claimed that it works better with threads (i.e. -j) and is more - # efficient than forking Python. - # - # NB: Other people on the scons-users mailing list have claimed that - # os.fork()/os.exec() works better than os.system(). There may just - # not be a default that works best for all users. - - if 'spawnvpe' in os.__dict__: - spawn = spawnvpe_spawn - elif env.Detect('env'): - spawn = env_spawn - else: - spawn = fork_spawn - - if env.Detect('env'): - pspawn = piped_env_spawn - else: - pspawn = piped_fork_spawn - - if 'ENV' not in env: - env['ENV'] = {} - env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin' - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.o' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - env['SHLIBPREFIX'] = '$LIBPREFIX' - env['SHLIBSUFFIX'] = '.so' - env['LIBPREFIXES'] = [ '$LIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['PSPAWN'] = pspawn - env['SPAWN'] = spawn - env['SHELL'] = 'sh' - env['ESCAPE'] = escape - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion - #Note: specific platforms might rise or lower this value - env['MAXLINELENGTH'] = 128072 - - # This platform supports RPATH specifications. - env['__RPATH'] = '$_RPATH' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py deleted file mode 100644 index f855aa829..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py +++ /dev/null @@ -1,50 +0,0 @@ -"""engine.SCons.Platform.sunos - -Platform-specific initialization for Sun systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/sunos.py 5023 2010/06/14 22:05:46 scons" - -import posix - -def generate(env): - posix.generate(env) - # Based on sunSparc 8:32bit - # ARG_MAX=1048320 - 3000 for environment expansion - env['MAXLINELENGTH'] = 1045320 - env['PKGINFO'] = 'pkginfo' - env['PKGCHK'] = '/usr/sbin/pkgchk' - env['ENV']['PATH'] = env['ENV']['PATH'] + ':/opt/SUNWspro/bin:/usr/ccs/bin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/win32.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/win32.py deleted file mode 100644 index 57d9bdca5..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Platform/win32.py +++ /dev/null @@ -1,385 +0,0 @@ -"""SCons.Platform.win32 - -Platform-specific initialization for Win32 systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/win32.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path -import sys -import tempfile - -from SCons.Platform.posix import exitvalmap -from SCons.Platform import TempFileMunge -import SCons.Util - -try: - import msvcrt - import win32api - import win32con - - msvcrt.get_osfhandle - win32api.SetHandleInformation - win32con.HANDLE_FLAG_INHERIT -except ImportError: - parallel_msg = \ - "you do not seem to have the pywin32 extensions installed;\n" + \ - "\tparallel (-j) builds may not work reliably with open Python files." -except AttributeError: - parallel_msg = \ - "your pywin32 extensions do not support file handle operations;\n" + \ - "\tparallel (-j) builds may not work reliably with open Python files." -else: - parallel_msg = None - - import builtins - - _builtin_file = builtins.file - _builtin_open = builtins.open - - def _scons_file(*args, **kw): - fp = _builtin_file(*args, **kw) - win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), - win32con.HANDLE_FLAG_INHERIT, - 0) - return fp - - def _scons_open(*args, **kw): - fp = _builtin_open(*args, **kw) - win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), - win32con.HANDLE_FLAG_INHERIT, - 0) - return fp - - builtins.file = _scons_file - builtins.open = _scons_open - - - -# The upshot of all this is that, if you are using Python 1.5.2, -# you had better have cmd or command.com in your PATH when you run -# scons. - -def piped_spawn(sh, escape, cmd, args, env, stdout, stderr): - # There is no direct way to do that in python. What we do - # here should work for most cases: - # In case stdout (stderr) is not redirected to a file, - # we redirect it into a temporary file tmpFileStdout - # (tmpFileStderr) and copy the contents of this file - # to stdout (stderr) given in the argument - if not sh: - sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") - return 127 - else: - # one temporary file for stdout and stderr - tmpFileStdout = os.path.normpath(tempfile.mktemp()) - tmpFileStderr = os.path.normpath(tempfile.mktemp()) - - # check if output is redirected - stdoutRedirected = 0 - stderrRedirected = 0 - for arg in args: - # are there more possibilities to redirect stdout ? - if (arg.find( ">", 0, 1 ) != -1 or - arg.find( "1>", 0, 2 ) != -1): - stdoutRedirected = 1 - # are there more possibilities to redirect stderr ? - if arg.find( "2>", 0, 2 ) != -1: - stderrRedirected = 1 - - # redirect output of non-redirected streams to our tempfiles - if stdoutRedirected == 0: - args.append(">" + str(tmpFileStdout)) - if stderrRedirected == 0: - args.append("2>" + str(tmpFileStderr)) - - # actually do the spawn - try: - args = [sh, '/C', escape(' '.join(args)) ] - ret = os.spawnve(os.P_WAIT, sh, args, env) - except OSError, e: - # catch any error - try: - ret = exitvalmap[e[0]] - except KeyError: - sys.stderr.write("scons: unknown OSError exception code %d - %s: %s\n" % (e[0], cmd, e[1])) - if stderr is not None: - stderr.write("scons: %s: %s\n" % (cmd, e[1])) - # copy child output from tempfiles to our streams - # and do clean up stuff - if stdout is not None and stdoutRedirected == 0: - try: - stdout.write(open( tmpFileStdout, "r" ).read()) - os.remove( tmpFileStdout ) - except (IOError, OSError): - pass - - if stderr is not None and stderrRedirected == 0: - try: - stderr.write(open( tmpFileStderr, "r" ).read()) - os.remove( tmpFileStderr ) - except (IOError, OSError): - pass - return ret - -def exec_spawn(l, env): - try: - result = os.spawnve(os.P_WAIT, l[0], l, env) - except OSError, e: - try: - result = exitvalmap[e[0]] - sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) - except KeyError: - result = 127 - if len(l) > 2: - if len(l[2]) < 1000: - command = ' '.join(l[0:3]) - else: - command = l[0] - else: - command = l[0] - sys.stderr.write("scons: unknown OSError exception code %d - '%s': %s\n" % (e[0], command, e[1])) - return result - -def spawn(sh, escape, cmd, args, env): - if not sh: - sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") - return 127 - return exec_spawn([sh, '/C', escape(' '.join(args))], env) - -# Windows does not allow special characters in file names anyway, so no -# need for a complex escape function, we will just quote the arg, except -# that "cmd /c" requires that if an argument ends with a backslash it -# needs to be escaped so as not to interfere with closing double quote -# that we add. -def escape(x): - if x[-1] == '\\': - x = x + '\\' - return '"' + x + '"' - -# Get the windows system directory name -_system_root = None - -def get_system_root(): - global _system_root - if _system_root is not None: - return _system_root - - # A resonable default if we can't read the registry - val = os.environ.get('SystemRoot', "C:\\WINDOWS") - - if SCons.Util.can_read_reg: - try: - # Look for Windows NT system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows NT\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - except SCons.Util.RegError: - try: - # Okay, try the Windows 9x system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - except KeyboardInterrupt: - raise - except: - pass - _system_root = val - return val - -# Get the location of the program files directory -def get_program_files_dir(): - # Now see if we can look in the registry... - val = '' - if SCons.Util.can_read_reg: - try: - # Look for Windows Program Files directory - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'ProgramFilesDir') - except SCons.Util.RegError: - val = '' - pass - - if val == '': - # A reasonable default if we can't read the registry - # (Actually, it's pretty reasonable even if we can :-) - val = os.path.join(os.path.dirname(get_system_root()),"Program Files") - - return val - - - -# Determine which windows CPU were running on. -class ArchDefinition(object): - """ - A class for defining architecture-specific settings and logic. - """ - def __init__(self, arch, synonyms=[]): - self.arch = arch - self.synonyms = synonyms - -SupportedArchitectureList = [ - ArchDefinition( - 'x86', - ['i386', 'i486', 'i586', 'i686'], - ), - - ArchDefinition( - 'x86_64', - ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'], - ), - - ArchDefinition( - 'ia64', - ['IA64'], - ), -] - -SupportedArchitectureMap = {} -for a in SupportedArchitectureList: - SupportedArchitectureMap[a.arch] = a - for s in a.synonyms: - SupportedArchitectureMap[s] = a - -def get_architecture(arch=None): - """Returns the definition for the specified architecture string. - - If no string is specified, the system default is returned (as defined - by the PROCESSOR_ARCHITEW6432 or PROCESSOR_ARCHITECTURE environment - variables). - """ - if arch is None: - arch = os.environ.get('PROCESSOR_ARCHITEW6432') - if not arch: - arch = os.environ.get('PROCESSOR_ARCHITECTURE') - return SupportedArchitectureMap.get(arch, ArchDefinition('', [''])) - -def generate(env): - # Attempt to find cmd.exe (for WinNT/2k/XP) or - # command.com for Win9x - cmd_interp = '' - # First see if we can look in the registry... - if SCons.Util.can_read_reg: - try: - # Look for Windows NT system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows NT\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - cmd_interp = os.path.join(val, 'System32\\cmd.exe') - except SCons.Util.RegError: - try: - # Okay, try the Windows 9x system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - cmd_interp = os.path.join(val, 'command.com') - except KeyboardInterrupt: - raise - except: - pass - - # For the special case of not having access to the registry, we - # use a temporary path and pathext to attempt to find the command - # interpreter. If we fail, we try to find the interpreter through - # the env's PATH. The problem with that is that it might not - # contain an ENV and a PATH. - if not cmd_interp: - systemroot = get_system_root() - tmp_path = systemroot + os.pathsep + \ - os.path.join(systemroot,'System32') - tmp_pathext = '.com;.exe;.bat;.cmd' - if 'PATHEXT' in os.environ: - tmp_pathext = os.environ['PATHEXT'] - cmd_interp = SCons.Util.WhereIs('cmd', tmp_path, tmp_pathext) - if not cmd_interp: - cmd_interp = SCons.Util.WhereIs('command', tmp_path, tmp_pathext) - - if not cmd_interp: - cmd_interp = env.Detect('cmd') - if not cmd_interp: - cmd_interp = env.Detect('command') - - - if 'ENV' not in env: - env['ENV'] = {} - - # Import things from the external environment to the construction - # environment's ENV. This is a potential slippery slope, because we - # *don't* want to make builds dependent on the user's environment by - # default. We're doing this for SystemRoot, though, because it's - # needed for anything that uses sockets, and seldom changes, and - # for SystemDrive because it's related. - # - # Weigh the impact carefully before adding other variables to this list. - import_env = [ 'SystemDrive', 'SystemRoot', 'TEMP', 'TMP' ] - for var in import_env: - v = os.environ.get(var) - if v: - env['ENV'][var] = v - - if 'COMSPEC' not in env['ENV']: - v = os.environ.get("COMSPEC") - if v: - env['ENV']['COMSPEC'] = v - - env.AppendENVPath('PATH', get_system_root() + '\System32') - - env['ENV']['PATHEXT'] = '.COM;.EXE;.BAT;.CMD' - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = [ '$LIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ] - env['PSPAWN'] = piped_spawn - env['SPAWN'] = spawn - env['SHELL'] = cmd_interp - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - env['MAXLINELENGTH'] = 2048 - env['ESCAPE'] = escape - - env['HOST_OS'] = 'win32' - env['HOST_ARCH'] = get_architecture().arch - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/SConf.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/SConf.py deleted file mode 100644 index bce935e82..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/SConf.py +++ /dev/null @@ -1,1030 +0,0 @@ -"""SCons.SConf - -Autoconf-like configuration support. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/SConf.py 5023 2010/06/14 22:05:46 scons" - -import SCons.compat - -import io -import os -import re -import sys -import traceback - -import SCons.Action -import SCons.Builder -import SCons.Errors -import SCons.Job -import SCons.Node.FS -import SCons.Taskmaster -import SCons.Util -import SCons.Warnings -import SCons.Conftest - -from SCons.Debug import Trace - -# Turn off the Conftest error logging -SCons.Conftest.LogInputFiles = 0 -SCons.Conftest.LogErrorMessages = 0 - -# Set -build_type = None -build_types = ['clean', 'help'] - -def SetBuildType(type): - global build_type - build_type = type - -# to be set, if we are in dry-run mode -dryrun = 0 - -AUTO=0 # use SCons dependency scanning for up-to-date checks -FORCE=1 # force all tests to be rebuilt -CACHE=2 # force all tests to be taken from cache (raise an error, if necessary) -cache_mode = AUTO - -def SetCacheMode(mode): - """Set the Configure cache mode. mode must be one of "auto", "force", - or "cache".""" - global cache_mode - if mode == "auto": - cache_mode = AUTO - elif mode == "force": - cache_mode = FORCE - elif mode == "cache": - cache_mode = CACHE - else: - raise ValueError("SCons.SConf.SetCacheMode: Unknown mode " + mode) - -progress_display = SCons.Util.display # will be overwritten by SCons.Script -def SetProgressDisplay(display): - """Set the progress display to use (called from SCons.Script)""" - global progress_display - progress_display = display - -SConfFS = None - -_ac_build_counter = 0 # incremented, whenever TryBuild is called -_ac_config_logs = {} # all config.log files created in this build -_ac_config_hs = {} # all config.h files created in this build -sconf_global = None # current sconf object - -def _createConfigH(target, source, env): - t = open(str(target[0]), "w") - defname = re.sub('[^A-Za-z0-9_]', '_', str(target[0]).upper()) - t.write("""#ifndef %(DEFNAME)s_SEEN -#define %(DEFNAME)s_SEEN - -""" % {'DEFNAME' : defname}) - t.write(source[0].get_contents()) - t.write(""" -#endif /* %(DEFNAME)s_SEEN */ -""" % {'DEFNAME' : defname}) - t.close() - -def _stringConfigH(target, source, env): - return "scons: Configure: creating " + str(target[0]) - -def CreateConfigHBuilder(env): - """Called just before the building targets phase begins.""" - if len(_ac_config_hs) == 0: - return - action = SCons.Action.Action(_createConfigH, - _stringConfigH) - sconfigHBld = SCons.Builder.Builder(action=action) - env.Append( BUILDERS={'SConfigHBuilder':sconfigHBld} ) - for k in _ac_config_hs.keys(): - env.SConfigHBuilder(k, env.Value(_ac_config_hs[k])) - -class SConfWarning(SCons.Warnings.Warning): - pass -SCons.Warnings.enableWarningClass(SConfWarning) - -# some error definitions -class SConfError(SCons.Errors.UserError): - def __init__(self,msg): - SCons.Errors.UserError.__init__(self,msg) - -class ConfigureDryRunError(SConfError): - """Raised when a file or directory needs to be updated during a Configure - process, but the user requested a dry-run""" - def __init__(self,target): - if not isinstance(target, SCons.Node.FS.File): - msg = 'Cannot create configure directory "%s" within a dry-run.' % str(target) - else: - msg = 'Cannot update configure test "%s" within a dry-run.' % str(target) - SConfError.__init__(self,msg) - -class ConfigureCacheError(SConfError): - """Raised when a use explicitely requested the cache feature, but the test - is run the first time.""" - def __init__(self,target): - SConfError.__init__(self, '"%s" is not yet built and cache is forced.' % str(target)) - -# define actions for building text files -def _createSource( target, source, env ): - fd = open(str(target[0]), "w") - fd.write(source[0].get_contents()) - fd.close() -def _stringSource( target, source, env ): - return (str(target[0]) + ' <-\n |' + - source[0].get_contents().replace( '\n', "\n |" ) ) - -class SConfBuildInfo(SCons.Node.FS.FileBuildInfo): - """ - Special build info for targets of configure tests. Additional members - are result (did the builder succeed last time?) and string, which - contains messages of the original build phase. - """ - result = None # -> 0/None -> no error, != 0 error - string = None # the stdout / stderr output when building the target - - def set_build_result(self, result, string): - self.result = result - self.string = string - - -class Streamer(object): - """ - 'Sniffer' for a file-like writable object. Similar to the unix tool tee. - """ - def __init__(self, orig): - self.orig = orig - self.s = io.StringIO() - - def write(self, str): - if self.orig: - self.orig.write(str) - self.s.write(str) - - def writelines(self, lines): - for l in lines: - self.write(l + '\n') - - def getvalue(self): - """ - Return everything written to orig since the Streamer was created. - """ - return self.s.getvalue() - - def flush(self): - if self.orig: - self.orig.flush() - self.s.flush() - - -class SConfBuildTask(SCons.Taskmaster.AlwaysTask): - """ - This is almost the same as SCons.Script.BuildTask. Handles SConfErrors - correctly and knows about the current cache_mode. - """ - def display(self, message): - if sconf_global.logstream: - sconf_global.logstream.write("scons: Configure: " + message + "\n") - - def display_cached_string(self, bi): - """ - Logs the original builder messages, given the SConfBuildInfo instance - bi. - """ - if not isinstance(bi, SConfBuildInfo): - SCons.Warnings.warn(SConfWarning, - "The stored build information has an unexpected class: %s" % bi.__class__) - else: - self.display("The original builder output was:\n" + - (" |" + str(bi.string)).replace("\n", "\n |")) - - def failed(self): - # check, if the reason was a ConfigureDryRunError or a - # ConfigureCacheError and if yes, reraise the exception - exc_type = self.exc_info()[0] - if issubclass(exc_type, SConfError): - raise - elif issubclass(exc_type, SCons.Errors.BuildError): - # we ignore Build Errors (occurs, when a test doesn't pass) - # Clear the exception to prevent the contained traceback - # to build a reference cycle. - self.exc_clear() - else: - self.display('Caught exception while building "%s":\n' % - self.targets[0]) - try: - excepthook = sys.excepthook - except AttributeError: - # Earlier versions of Python don't have sys.excepthook... - def excepthook(type, value, tb): - traceback.print_tb(tb) - print type, value - excepthook(*self.exc_info()) - return SCons.Taskmaster.Task.failed(self) - - def collect_node_states(self): - # returns (is_up_to_date, cached_error, cachable) - # where is_up_to_date is 1, if the node(s) are up_to_date - # cached_error is 1, if the node(s) are up_to_date, but the - # build will fail - # cachable is 0, if some nodes are not in our cache - T = 0 - changed = False - cached_error = False - cachable = True - for t in self.targets: - if T: Trace('%s' % (t)) - bi = t.get_stored_info().binfo - if isinstance(bi, SConfBuildInfo): - if T: Trace(': SConfBuildInfo') - if cache_mode == CACHE: - t.set_state(SCons.Node.up_to_date) - if T: Trace(': set_state(up_to-date)') - else: - if T: Trace(': get_state() %s' % t.get_state()) - if T: Trace(': changed() %s' % t.changed()) - if (t.get_state() != SCons.Node.up_to_date and t.changed()): - changed = True - if T: Trace(': changed %s' % changed) - cached_error = cached_error or bi.result - else: - if T: Trace(': else') - # the node hasn't been built in a SConf context or doesn't - # exist - cachable = False - changed = ( t.get_state() != SCons.Node.up_to_date ) - if T: Trace(': changed %s' % changed) - if T: Trace('\n') - return (not changed, cached_error, cachable) - - def execute(self): - if not self.targets[0].has_builder(): - return - - sconf = sconf_global - - is_up_to_date, cached_error, cachable = self.collect_node_states() - - if cache_mode == CACHE and not cachable: - raise ConfigureCacheError(self.targets[0]) - elif cache_mode == FORCE: - is_up_to_date = 0 - - if cached_error and is_up_to_date: - self.display("Building \"%s\" failed in a previous run and all " - "its sources are up to date." % str(self.targets[0])) - binfo = self.targets[0].get_stored_info().binfo - self.display_cached_string(binfo) - raise SCons.Errors.BuildError # will be 'caught' in self.failed - elif is_up_to_date: - self.display("\"%s\" is up to date." % str(self.targets[0])) - binfo = self.targets[0].get_stored_info().binfo - self.display_cached_string(binfo) - elif dryrun: - raise ConfigureDryRunError(self.targets[0]) - else: - # note stdout and stderr are the same here - s = sys.stdout = sys.stderr = Streamer(sys.stdout) - try: - env = self.targets[0].get_build_env() - if cache_mode == FORCE: - # Set up the Decider() to force rebuilds by saying - # that every source has changed. Note that we still - # call the environment's underlying source decider so - # that the correct .sconsign info will get calculated - # and keep the build state consistent. - def force_build(dependency, target, prev_ni, - env_decider=env.decide_source): - env_decider(dependency, target, prev_ni) - return True - if env.decide_source.func_code is not force_build.func_code: - env.Decider(force_build) - env['PSTDOUT'] = env['PSTDERR'] = s - try: - sconf.cached = 0 - self.targets[0].build() - finally: - sys.stdout = sys.stderr = env['PSTDOUT'] = \ - env['PSTDERR'] = sconf.logstream - except KeyboardInterrupt: - raise - except SystemExit: - exc_value = sys.exc_info()[1] - raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code) - except Exception, e: - for t in self.targets: - binfo = t.get_binfo() - binfo.__class__ = SConfBuildInfo - binfo.set_build_result(1, s.getvalue()) - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = binfo - #sconsign_entry.ninfo = self.get_ninfo() - # We'd like to do this as follows: - # t.store_info(binfo) - # However, we need to store it as an SConfBuildInfo - # object, and store_info() will turn it into a - # regular FileNodeInfo if the target is itself a - # regular File. - sconsign = t.dir.sconsign() - sconsign.set_entry(t.name, sconsign_entry) - sconsign.merge() - raise e - else: - for t in self.targets: - binfo = t.get_binfo() - binfo.__class__ = SConfBuildInfo - binfo.set_build_result(0, s.getvalue()) - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = binfo - #sconsign_entry.ninfo = self.get_ninfo() - # We'd like to do this as follows: - # t.store_info(binfo) - # However, we need to store it as an SConfBuildInfo - # object, and store_info() will turn it into a - # regular FileNodeInfo if the target is itself a - # regular File. - sconsign = t.dir.sconsign() - sconsign.set_entry(t.name, sconsign_entry) - sconsign.merge() - -class SConfBase(object): - """This is simply a class to represent a configure context. After - creating a SConf object, you can call any tests. After finished with your - tests, be sure to call the Finish() method, which returns the modified - environment. - Some words about caching: In most cases, it is not necessary to cache - Test results explicitely. Instead, we use the scons dependency checking - mechanism. For example, if one wants to compile a test program - (SConf.TryLink), the compiler is only called, if the program dependencies - have changed. However, if the program could not be compiled in a former - SConf run, we need to explicitely cache this error. - """ - - def __init__(self, env, custom_tests = {}, conf_dir='$CONFIGUREDIR', - log_file='$CONFIGURELOG', config_h = None, _depth = 0): - """Constructor. Pass additional tests in the custom_tests-dictinary, - e.g. custom_tests={'CheckPrivate':MyPrivateTest}, where MyPrivateTest - defines a custom test. - Note also the conf_dir and log_file arguments (you may want to - build tests in the VariantDir, not in the SourceDir) - """ - global SConfFS - if not SConfFS: - SConfFS = SCons.Node.FS.default_fs or \ - SCons.Node.FS.FS(env.fs.pathTop) - if sconf_global is not None: - raise SCons.Errors.UserError - self.env = env - if log_file is not None: - log_file = SConfFS.File(env.subst(log_file)) - self.logfile = log_file - self.logstream = None - self.lastTarget = None - self.depth = _depth - self.cached = 0 # will be set, if all test results are cached - - # add default tests - default_tests = { - 'CheckCC' : CheckCC, - 'CheckCXX' : CheckCXX, - 'CheckSHCC' : CheckSHCC, - 'CheckSHCXX' : CheckSHCXX, - 'CheckFunc' : CheckFunc, - 'CheckType' : CheckType, - 'CheckTypeSize' : CheckTypeSize, - 'CheckDeclaration' : CheckDeclaration, - 'CheckHeader' : CheckHeader, - 'CheckCHeader' : CheckCHeader, - 'CheckCXXHeader' : CheckCXXHeader, - 'CheckLib' : CheckLib, - 'CheckLibWithHeader' : CheckLibWithHeader, - } - self.AddTests(default_tests) - self.AddTests(custom_tests) - self.confdir = SConfFS.Dir(env.subst(conf_dir)) - if config_h is not None: - config_h = SConfFS.File(config_h) - self.config_h = config_h - self._startup() - - def Finish(self): - """Call this method after finished with your tests: - env = sconf.Finish() - """ - self._shutdown() - return self.env - - def Define(self, name, value = None, comment = None): - """ - Define a pre processor symbol name, with the optional given value in the - current config header. - - If value is None (default), then #define name is written. If value is not - none, then #define name value is written. - - comment is a string which will be put as a C comment in the - header, to explain the meaning of the value (appropriate C comments /* and - */ will be put automatically.""" - lines = [] - if comment: - comment_str = "/* %s */" % comment - lines.append(comment_str) - - if value is not None: - define_str = "#define %s %s" % (name, value) - else: - define_str = "#define %s" % name - lines.append(define_str) - lines.append('') - - self.config_h_text = self.config_h_text + '\n'.join(lines) - - def BuildNodes(self, nodes): - """ - Tries to build the given nodes immediately. Returns 1 on success, - 0 on error. - """ - if self.logstream is not None: - # override stdout / stderr to write in log file - oldStdout = sys.stdout - sys.stdout = self.logstream - oldStderr = sys.stderr - sys.stderr = self.logstream - - # the engine assumes the current path is the SConstruct directory ... - old_fs_dir = SConfFS.getcwd() - old_os_dir = os.getcwd() - SConfFS.chdir(SConfFS.Top, change_os_dir=1) - - # Because we take responsibility here for writing out our - # own .sconsign info (see SConfBuildTask.execute(), above), - # we override the store_info() method with a null place-holder - # so we really control how it gets written. - for n in nodes: - n.store_info = n.do_not_store_info - - ret = 1 - - try: - # ToDo: use user options for calc - save_max_drift = SConfFS.get_max_drift() - SConfFS.set_max_drift(0) - tm = SCons.Taskmaster.Taskmaster(nodes, SConfBuildTask) - # we don't want to build tests in parallel - jobs = SCons.Job.Jobs(1, tm ) - jobs.run() - for n in nodes: - state = n.get_state() - if (state != SCons.Node.executed and - state != SCons.Node.up_to_date): - # the node could not be built. we return 0 in this case - ret = 0 - finally: - SConfFS.set_max_drift(save_max_drift) - os.chdir(old_os_dir) - SConfFS.chdir(old_fs_dir, change_os_dir=0) - if self.logstream is not None: - # restore stdout / stderr - sys.stdout = oldStdout - sys.stderr = oldStderr - return ret - - def pspawn_wrapper(self, sh, escape, cmd, args, env): - """Wrapper function for handling piped spawns. - - This looks to the calling interface (in Action.py) like a "normal" - spawn, but associates the call with the PSPAWN variable from - the construction environment and with the streams to which we - want the output logged. This gets slid into the construction - environment as the SPAWN variable so Action.py doesn't have to - know or care whether it's spawning a piped command or not. - """ - return self.pspawn(sh, escape, cmd, args, env, self.logstream, self.logstream) - - - def TryBuild(self, builder, text = None, extension = ""): - """Low level TryBuild implementation. Normally you don't need to - call that - you can use TryCompile / TryLink / TryRun instead - """ - global _ac_build_counter - - # Make sure we have a PSPAWN value, and save the current - # SPAWN value. - try: - self.pspawn = self.env['PSPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing PSPAWN construction variable.') - try: - save_spawn = self.env['SPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing SPAWN construction variable.') - - nodesToBeBuilt = [] - - f = "conftest_" + str(_ac_build_counter) - pref = self.env.subst( builder.builder.prefix ) - suff = self.env.subst( builder.builder.suffix ) - target = self.confdir.File(pref + f + suff) - - try: - # Slide our wrapper into the construction environment as - # the SPAWN function. - self.env['SPAWN'] = self.pspawn_wrapper - sourcetext = self.env.Value(text) - - if text is not None: - textFile = self.confdir.File(f + extension) - textFileNode = self.env.SConfSourceBuilder(target=textFile, - source=sourcetext) - nodesToBeBuilt.extend(textFileNode) - source = textFileNode - else: - source = None - - nodes = builder(target = target, source = source) - if not SCons.Util.is_List(nodes): - nodes = [nodes] - nodesToBeBuilt.extend(nodes) - result = self.BuildNodes(nodesToBeBuilt) - - finally: - self.env['SPAWN'] = save_spawn - - _ac_build_counter = _ac_build_counter + 1 - if result: - self.lastTarget = nodes[0] - else: - self.lastTarget = None - - return result - - def TryAction(self, action, text = None, extension = ""): - """Tries to execute the given action with optional source file - contents and optional source file extension , - Returns the status (0 : failed, 1 : ok) and the contents of the - output file. - """ - builder = SCons.Builder.Builder(action=action) - self.env.Append( BUILDERS = {'SConfActionBuilder' : builder} ) - ok = self.TryBuild(self.env.SConfActionBuilder, text, extension) - del self.env['BUILDERS']['SConfActionBuilder'] - if ok: - outputStr = self.lastTarget.get_contents() - return (1, outputStr) - return (0, "") - - def TryCompile( self, text, extension): - """Compiles the program given in text to an env.Object, using extension - as file extension (e.g. '.c'). Returns 1, if compilation was - successful, 0 otherwise. The target is saved in self.lastTarget (for - further processing). - """ - return self.TryBuild(self.env.Object, text, extension) - - def TryLink( self, text, extension ): - """Compiles the program given in text to an executable env.Program, - using extension as file extension (e.g. '.c'). Returns 1, if - compilation was successful, 0 otherwise. The target is saved in - self.lastTarget (for further processing). - """ - return self.TryBuild(self.env.Program, text, extension ) - - def TryRun(self, text, extension ): - """Compiles and runs the program given in text, using extension - as file extension (e.g. '.c'). Returns (1, outputStr) on success, - (0, '') otherwise. The target (a file containing the program's stdout) - is saved in self.lastTarget (for further processing). - """ - ok = self.TryLink(text, extension) - if( ok ): - prog = self.lastTarget - pname = prog.path - output = self.confdir.File(os.path.basename(pname)+'.out') - node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ]) - ok = self.BuildNodes(node) - if ok: - outputStr = output.get_contents() - return( 1, outputStr) - return (0, "") - - class TestWrapper(object): - """A wrapper around Tests (to ensure sanity)""" - def __init__(self, test, sconf): - self.test = test - self.sconf = sconf - def __call__(self, *args, **kw): - if not self.sconf.active: - raise SCons.Errors.UserError - context = CheckContext(self.sconf) - ret = self.test(context, *args, **kw) - if self.sconf.config_h is not None: - self.sconf.config_h_text = self.sconf.config_h_text + context.config_h - context.Result("error: no result") - return ret - - def AddTest(self, test_name, test_instance): - """Adds test_class to this SConf instance. It can be called with - self.test_name(...)""" - setattr(self, test_name, SConfBase.TestWrapper(test_instance, self)) - - def AddTests(self, tests): - """Adds all the tests given in the tests dictionary to this SConf - instance - """ - for name in tests.keys(): - self.AddTest(name, tests[name]) - - def _createDir( self, node ): - dirName = str(node) - if dryrun: - if not os.path.isdir( dirName ): - raise ConfigureDryRunError(dirName) - else: - if not os.path.isdir( dirName ): - os.makedirs( dirName ) - node._exists = 1 - - def _startup(self): - """Private method. Set up logstream, and set the environment - variables necessary for a piped build - """ - global _ac_config_logs - global sconf_global - global SConfFS - - self.lastEnvFs = self.env.fs - self.env.fs = SConfFS - self._createDir(self.confdir) - self.confdir.up().add_ignore( [self.confdir] ) - - if self.logfile is not None and not dryrun: - # truncate logfile, if SConf.Configure is called for the first time - # in a build - if self.logfile in _ac_config_logs: - log_mode = "a" - else: - _ac_config_logs[self.logfile] = None - log_mode = "w" - fp = open(str(self.logfile), log_mode) - self.logstream = SCons.Util.Unbuffered(fp) - # logfile may stay in a build directory, so we tell - # the build system not to override it with a eventually - # existing file with the same name in the source directory - self.logfile.dir.add_ignore( [self.logfile] ) - - tb = traceback.extract_stack()[-3-self.depth] - old_fs_dir = SConfFS.getcwd() - SConfFS.chdir(SConfFS.Top, change_os_dir=0) - self.logstream.write('file %s,line %d:\n\tConfigure(confdir = %s)\n' % - (tb[0], tb[1], str(self.confdir)) ) - SConfFS.chdir(old_fs_dir) - else: - self.logstream = None - # we use a special builder to create source files from TEXT - action = SCons.Action.Action(_createSource, - _stringSource) - sconfSrcBld = SCons.Builder.Builder(action=action) - self.env.Append( BUILDERS={'SConfSourceBuilder':sconfSrcBld} ) - self.config_h_text = _ac_config_hs.get(self.config_h, "") - self.active = 1 - # only one SConf instance should be active at a time ... - sconf_global = self - - def _shutdown(self): - """Private method. Reset to non-piped spawn""" - global sconf_global, _ac_config_hs - - if not self.active: - raise SCons.Errors.UserError("Finish may be called only once!") - if self.logstream is not None and not dryrun: - self.logstream.write("\n") - self.logstream.close() - self.logstream = None - # remove the SConfSourceBuilder from the environment - blds = self.env['BUILDERS'] - del blds['SConfSourceBuilder'] - self.env.Replace( BUILDERS=blds ) - self.active = 0 - sconf_global = None - if not self.config_h is None: - _ac_config_hs[self.config_h] = self.config_h_text - self.env.fs = self.lastEnvFs - -class CheckContext(object): - """Provides a context for configure tests. Defines how a test writes to the - screen and log file. - - A typical test is just a callable with an instance of CheckContext as - first argument: - - def CheckCustom(context, ...) - context.Message('Checking my weird test ... ') - ret = myWeirdTestFunction(...) - context.Result(ret) - - Often, myWeirdTestFunction will be one of - context.TryCompile/context.TryLink/context.TryRun. The results of - those are cached, for they are only rebuild, if the dependencies have - changed. - """ - - def __init__(self, sconf): - """Constructor. Pass the corresponding SConf instance.""" - self.sconf = sconf - self.did_show_result = 0 - - # for Conftest.py: - self.vardict = {} - self.havedict = {} - self.headerfilename = None - self.config_h = "" # config_h text will be stored here - # we don't regenerate the config.h file after each test. That means, - # that tests won't be able to include the config.h file, and so - # they can't do an #ifdef HAVE_XXX_H. This shouldn't be a major - # issue, though. If it turns out, that we need to include config.h - # in tests, we must ensure, that the dependencies are worked out - # correctly. Note that we can't use Conftest.py's support for config.h, - # cause we will need to specify a builder for the config.h file ... - - def Message(self, text): - """Inform about what we are doing right now, e.g. - 'Checking for SOMETHING ... ' - """ - self.Display(text) - self.sconf.cached = 1 - self.did_show_result = 0 - - def Result(self, res): - """Inform about the result of the test. res may be an integer or a - string. In case of an integer, the written text will be 'yes' or 'no'. - The result is only displayed when self.did_show_result is not set. - """ - if isinstance(res, (int, bool)): - if res: - text = "yes" - else: - text = "no" - elif isinstance(res, str): - text = res - else: - raise TypeError("Expected string, int or bool, got " + str(type(res))) - - if self.did_show_result == 0: - # Didn't show result yet, do it now. - self.Display(text + "\n") - self.did_show_result = 1 - - def TryBuild(self, *args, **kw): - return self.sconf.TryBuild(*args, **kw) - - def TryAction(self, *args, **kw): - return self.sconf.TryAction(*args, **kw) - - def TryCompile(self, *args, **kw): - return self.sconf.TryCompile(*args, **kw) - - def TryLink(self, *args, **kw): - return self.sconf.TryLink(*args, **kw) - - def TryRun(self, *args, **kw): - return self.sconf.TryRun(*args, **kw) - - def __getattr__( self, attr ): - if( attr == 'env' ): - return self.sconf.env - elif( attr == 'lastTarget' ): - return self.sconf.lastTarget - else: - raise AttributeError("CheckContext instance has no attribute '%s'" % attr) - - #### Stuff used by Conftest.py (look there for explanations). - - def BuildProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.Program, text, ext) - - def CompileProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.Object, text, ext) - - def CompileSharedObject(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $SHCC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.SharedObject, text, ext) - - def RunProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - st, out = self.TryRun(text, ext) - return not st, out - - def AppendLIBS(self, lib_name_list): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Append(LIBS = lib_name_list) - return oldLIBS - - def PrependLIBS(self, lib_name_list): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Prepend(LIBS = lib_name_list) - return oldLIBS - - def SetLIBS(self, val): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Replace(LIBS = val) - return oldLIBS - - def Display(self, msg): - if self.sconf.cached: - # We assume that Display is called twice for each test here - # once for the Checking for ... message and once for the result. - # The self.sconf.cached flag can only be set between those calls - msg = "(cached) " + msg - self.sconf.cached = 0 - progress_display(msg, append_newline=0) - self.Log("scons: Configure: " + msg + "\n") - - def Log(self, msg): - if self.sconf.logstream is not None: - self.sconf.logstream.write(msg) - - #### End of stuff used by Conftest.py. - - -def SConf(*args, **kw): - if kw.get(build_type, True): - kw['_depth'] = kw.get('_depth', 0) + 1 - for bt in build_types: - try: - del kw[bt] - except KeyError: - pass - return SConfBase(*args, **kw) - else: - return SCons.Util.Null() - - -def CheckFunc(context, function_name, header = None, language = None): - res = SCons.Conftest.CheckFunc(context, function_name, header = header, language = language) - context.did_show_result = 1 - return not res - -def CheckType(context, type_name, includes = "", language = None): - res = SCons.Conftest.CheckType(context, type_name, - header = includes, language = language) - context.did_show_result = 1 - return not res - -def CheckTypeSize(context, type_name, includes = "", language = None, expect = None): - res = SCons.Conftest.CheckTypeSize(context, type_name, - header = includes, language = language, - expect = expect) - context.did_show_result = 1 - return res - -def CheckDeclaration(context, declaration, includes = "", language = None): - res = SCons.Conftest.CheckDeclaration(context, declaration, - includes = includes, - language = language) - context.did_show_result = 1 - return not res - -def createIncludesFromHeaders(headers, leaveLast, include_quotes = '""'): - # used by CheckHeader and CheckLibWithHeader to produce C - #include - # statements from the specified header (list) - if not SCons.Util.is_List(headers): - headers = [headers] - l = [] - if leaveLast: - lastHeader = headers[-1] - headers = headers[:-1] - else: - lastHeader = None - for s in headers: - l.append("#include %s%s%s\n" - % (include_quotes[0], s, include_quotes[1])) - return ''.join(l), lastHeader - -def CheckHeader(context, header, include_quotes = '<>', language = None): - """ - A test for a C or C++ header file. - """ - prog_prefix, hdr_to_check = \ - createIncludesFromHeaders(header, 1, include_quotes) - res = SCons.Conftest.CheckHeader(context, hdr_to_check, prog_prefix, - language = language, - include_quotes = include_quotes) - context.did_show_result = 1 - return not res - -def CheckCC(context): - res = SCons.Conftest.CheckCC(context) - context.did_show_result = 1 - return not res - -def CheckCXX(context): - res = SCons.Conftest.CheckCXX(context) - context.did_show_result = 1 - return not res - -def CheckSHCC(context): - res = SCons.Conftest.CheckSHCC(context) - context.did_show_result = 1 - return not res - -def CheckSHCXX(context): - res = SCons.Conftest.CheckSHCXX(context) - context.did_show_result = 1 - return not res - -# Bram: Make this function obsolete? CheckHeader() is more generic. - -def CheckCHeader(context, header, include_quotes = '""'): - """ - A test for a C header file. - """ - return CheckHeader(context, header, include_quotes, language = "C") - - -# Bram: Make this function obsolete? CheckHeader() is more generic. - -def CheckCXXHeader(context, header, include_quotes = '""'): - """ - A test for a C++ header file. - """ - return CheckHeader(context, header, include_quotes, language = "C++") - - -def CheckLib(context, library = None, symbol = "main", - header = None, language = None, autoadd = 1): - """ - A test for a library. See also CheckLibWithHeader. - Note that library may also be None to test whether the given symbol - compiles without flags. - """ - - if library == []: - library = [None] - - if not SCons.Util.is_List(library): - library = [library] - - # ToDo: accept path for the library - res = SCons.Conftest.CheckLib(context, library, symbol, header = header, - language = language, autoadd = autoadd) - context.did_show_result = 1 - return not res - -# XXX -# Bram: Can only include one header and can't use #ifdef HAVE_HEADER_H. - -def CheckLibWithHeader(context, libs, header, language, - call = None, autoadd = 1): - # ToDo: accept path for library. Support system header files. - """ - Another (more sophisticated) test for a library. - Checks, if library and header is available for language (may be 'C' - or 'CXX'). Call maybe be a valid expression _with_ a trailing ';'. - As in CheckLib, we support library=None, to test if the call compiles - without extra link flags. - """ - prog_prefix, dummy = \ - createIncludesFromHeaders(header, 0) - if libs == []: - libs = [None] - - if not SCons.Util.is_List(libs): - libs = [libs] - - res = SCons.Conftest.CheckLib(context, libs, None, prog_prefix, - call = call, language = language, autoadd = autoadd) - context.did_show_result = 1 - return not res - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/SConsign.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/SConsign.py deleted file mode 100644 index 25f848652..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/SConsign.py +++ /dev/null @@ -1,383 +0,0 @@ -"""SCons.SConsign - -Writing and reading information to the .sconsign file or files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/SConsign.py 5023 2010/06/14 22:05:46 scons" - -import SCons.compat - -import os -# compat layer imports "cPickle" for us if it's available. -import pickle - -import SCons.dblite -import SCons.Warnings - -def corrupt_dblite_warning(filename): - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt .sconsign file: %s"%filename) - -SCons.dblite.ignore_corrupt_dbfiles = 1 -SCons.dblite.corruption_warning = corrupt_dblite_warning - -#XXX Get rid of the global array so this becomes re-entrant. -sig_files = [] - -# Info for the database SConsign implementation (now the default): -# "DataBase" is a dictionary that maps top-level SConstruct directories -# to open database handles. -# "DB_Module" is the Python database module to create the handles. -# "DB_Name" is the base name of the database file (minus any -# extension the underlying DB module will add). -DataBase = {} -DB_Module = SCons.dblite -DB_Name = ".sconsign" -DB_sync_list = [] - -def Get_DataBase(dir): - global DataBase, DB_Module, DB_Name - top = dir.fs.Top - if not os.path.isabs(DB_Name) and top.repositories: - mode = "c" - for d in [top] + top.repositories: - if dir.is_under(d): - try: - return DataBase[d], mode - except KeyError: - path = d.entry_abspath(DB_Name) - try: db = DataBase[d] = DB_Module.open(path, mode) - except (IOError, OSError): pass - else: - if mode != "r": - DB_sync_list.append(db) - return db, mode - mode = "r" - try: - return DataBase[top], "c" - except KeyError: - db = DataBase[top] = DB_Module.open(DB_Name, "c") - DB_sync_list.append(db) - return db, "c" - except TypeError: - print "DataBase =", DataBase - raise - -def Reset(): - """Reset global state. Used by unit tests that end up using - SConsign multiple times to get a clean slate for each test.""" - global sig_files, DB_sync_list - sig_files = [] - DB_sync_list = [] - -normcase = os.path.normcase - -def write(): - global sig_files - for sig_file in sig_files: - sig_file.write(sync=0) - for db in DB_sync_list: - try: - syncmethod = db.sync - except AttributeError: - pass # Not all anydbm modules have sync() methods. - else: - syncmethod() - -class SConsignEntry(object): - """ - Wrapper class for the generic entry in a .sconsign file. - The Node subclass populates it with attributes as it pleases. - - XXX As coded below, we do expect a '.binfo' attribute to be added, - but we'll probably generalize this in the next refactorings. - """ - current_version_id = 1 - def __init__(self): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - _version_id = self.current_version_id - def convert_to_sconsign(self): - self.binfo.convert_to_sconsign() - def convert_from_sconsign(self, dir, name): - self.binfo.convert_from_sconsign(dir, name) - -class Base(object): - """ - This is the controlling class for the signatures for the collection of - entries associated with a specific directory. The actual directory - association will be maintained by a subclass that is specific to - the underlying storage method. This class provides a common set of - methods for fetching and storing the individual bits of information - that make up signature entry. - """ - def __init__(self): - self.entries = {} - self.dirty = False - self.to_be_merged = {} - - def get_entry(self, filename): - """ - Fetch the specified entry attribute. - """ - return self.entries[filename] - - def set_entry(self, filename, obj): - """ - Set the entry. - """ - self.entries[filename] = obj - self.dirty = True - - def do_not_set_entry(self, filename, obj): - pass - - def store_info(self, filename, node): - entry = node.get_stored_info() - entry.binfo.merge(node.get_binfo()) - self.to_be_merged[filename] = node - self.dirty = True - - def do_not_store_info(self, filename, node): - pass - - def merge(self): - for key, node in self.to_be_merged.items(): - entry = node.get_stored_info() - try: - ninfo = entry.ninfo - except AttributeError: - # This happens with SConf Nodes, because the configuration - # subsystem takes direct control over how the build decision - # is made and its information stored. - pass - else: - ninfo.merge(node.get_ninfo()) - self.entries[key] = entry - self.to_be_merged = {} - -class DB(Base): - """ - A Base subclass that reads and writes signature information - from a global .sconsign.db* file--the actual file suffix is - determined by the database module. - """ - def __init__(self, dir): - Base.__init__(self) - - self.dir = dir - - db, mode = Get_DataBase(dir) - - # Read using the path relative to the top of the Repository - # (self.dir.tpath) from which we're fetching the signature - # information. - path = normcase(dir.tpath) - try: - rawentries = db[path] - except KeyError: - pass - else: - try: - self.entries = pickle.loads(rawentries) - if not isinstance(self.entries, dict): - self.entries = {} - raise TypeError - except KeyboardInterrupt: - raise - except Exception, e: - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.tpath, e)) - for key, entry in self.entries.items(): - entry.convert_from_sconsign(dir, key) - - if mode == "r": - # This directory is actually under a repository, which means - # likely they're reaching in directly for a dependency on - # a file there. Don't actually set any entry info, so we - # won't try to write to that .sconsign.dblite file. - self.set_entry = self.do_not_set_entry - self.store_info = self.do_not_store_info - - global sig_files - sig_files.append(self) - - def write(self, sync=1): - if not self.dirty: - return - - self.merge() - - db, mode = Get_DataBase(self.dir) - - # Write using the path relative to the top of the SConstruct - # directory (self.dir.path), not relative to the top of - # the Repository; we only write to our own .sconsign file, - # not to .sconsign files in Repositories. - path = normcase(self.dir.path) - for key, entry in self.entries.items(): - entry.convert_to_sconsign() - db[path] = pickle.dumps(self.entries, 1) - - if sync: - try: - syncmethod = db.sync - except AttributeError: - # Not all anydbm modules have sync() methods. - pass - else: - syncmethod() - -class Dir(Base): - def __init__(self, fp=None, dir=None): - """ - fp - file pointer to read entries from - """ - Base.__init__(self) - - if not fp: - return - - self.entries = pickle.load(fp) - if not isinstance(self.entries, dict): - self.entries = {} - raise TypeError - - if dir: - for key, entry in self.entries.items(): - entry.convert_from_sconsign(dir, key) - -class DirFile(Dir): - """ - Encapsulates reading and writing a per-directory .sconsign file. - """ - def __init__(self, dir): - """ - dir - the directory for the file - """ - - self.dir = dir - self.sconsign = os.path.join(dir.path, '.sconsign') - - try: - fp = open(self.sconsign, 'rb') - except IOError: - fp = None - - try: - Dir.__init__(self, fp, dir) - except KeyboardInterrupt: - raise - except: - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt .sconsign file: %s"%self.sconsign) - - global sig_files - sig_files.append(self) - - def write(self, sync=1): - """ - Write the .sconsign file to disk. - - Try to write to a temporary file first, and rename it if we - succeed. If we can't write to the temporary file, it's - probably because the directory isn't writable (and if so, - how did we build anything in this directory, anyway?), so - try to write directly to the .sconsign file as a backup. - If we can't rename, try to copy the temporary contents back - to the .sconsign file. Either way, always try to remove - the temporary file at the end. - """ - if not self.dirty: - return - - self.merge() - - temp = os.path.join(self.dir.path, '.scons%d' % os.getpid()) - try: - file = open(temp, 'wb') - fname = temp - except IOError: - try: - file = open(self.sconsign, 'wb') - fname = self.sconsign - except IOError: - return - for key, entry in self.entries.items(): - entry.convert_to_sconsign() - pickle.dump(self.entries, file, 1) - file.close() - if fname != self.sconsign: - try: - mode = os.stat(self.sconsign)[0] - os.chmod(self.sconsign, 0666) - os.unlink(self.sconsign) - except (IOError, OSError): - # Try to carry on in the face of either OSError - # (things like permission issues) or IOError (disk - # or network issues). If there's a really dangerous - # issue, it should get re-raised by the calls below. - pass - try: - os.rename(fname, self.sconsign) - except OSError: - # An OSError failure to rename may indicate something - # like the directory has no write permission, but - # the .sconsign file itself might still be writable, - # so try writing on top of it directly. An IOError - # here, or in any of the following calls, would get - # raised, indicating something like a potentially - # serious disk or network issue. - open(self.sconsign, 'wb').write(open(fname, 'rb').read()) - os.chmod(self.sconsign, mode) - try: - os.unlink(temp) - except (IOError, OSError): - pass - -ForDirectory = DB - -def File(name, dbm_module=None): - """ - Arrange for all signatures to be stored in a global .sconsign.db* - file. - """ - global ForDirectory, DB_Name, DB_Module - if name is None: - ForDirectory = DirFile - DB_Module = None - else: - ForDirectory = DB - DB_Name = name - if not dbm_module is None: - DB_Module = dbm_module - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/C.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/C.py deleted file mode 100644 index 598d3b1c1..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/C.py +++ /dev/null @@ -1,132 +0,0 @@ -"""SCons.Scanner.C - -This module implements the depenency scanner for C/C++ code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/C.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Node.FS -import SCons.Scanner -import SCons.Util - -import SCons.cpp - -class SConsCPPScanner(SCons.cpp.PreProcessor): - """ - SCons-specific subclass of the cpp.py module's processing. - - We subclass this so that: 1) we can deal with files represented - by Nodes, not strings; 2) we can keep track of the files that are - missing. - """ - def __init__(self, *args, **kw): - SCons.cpp.PreProcessor.__init__(self, *args, **kw) - self.missing = [] - def initialize_result(self, fname): - self.result = SCons.Util.UniqueList([fname]) - def finalize_result(self, fname): - return self.result[1:] - def find_include_file(self, t): - keyword, quote, fname = t - result = SCons.Node.FS.find_file(fname, self.searchpath[quote]) - if not result: - self.missing.append((fname, self.current_file)) - return result - def read_file(self, file): - try: - fp = open(str(file.rfile())) - except EnvironmentError, e: - self.missing.append((file, self.current_file)) - return '' - else: - return fp.read() - -def dictify_CPPDEFINES(env): - cppdefines = env.get('CPPDEFINES', {}) - if cppdefines is None: - return {} - if SCons.Util.is_Sequence(cppdefines): - result = {} - for c in cppdefines: - if SCons.Util.is_Sequence(c): - result[c[0]] = c[1] - else: - result[c] = None - return result - if not SCons.Util.is_Dict(cppdefines): - return {cppdefines : None} - return cppdefines - -class SConsCPPScannerWrapper(object): - """ - The SCons wrapper around a cpp.py scanner. - - This is the actual glue between the calling conventions of generic - SCons scanners, and the (subclass of) cpp.py class that knows how - to look for #include lines with reasonably real C-preprocessor-like - evaluation of #if/#ifdef/#else/#elif lines. - """ - def __init__(self, name, variable): - self.name = name - self.path = SCons.Scanner.FindPathDirs(variable) - def __call__(self, node, env, path = ()): - cpp = SConsCPPScanner(current = node.get_dir(), - cpppath = path, - dict = dictify_CPPDEFINES(env)) - result = cpp(node) - for included, includer in cpp.missing: - fmt = "No dependency generated for file: %s (included from: %s) -- file not found" - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - fmt % (included, includer)) - return result - - def recurse_nodes(self, nodes): - return nodes - def select(self, node): - return self - -def CScanner(): - """Return a prototype Scanner instance for scanning source files - that use the C pre-processor""" - - # Here's how we would (or might) use the CPP scanner code above that - # knows how to evaluate #if/#ifdef/#else/#elif lines when searching - # for #includes. This is commented out for now until we add the - # right configurability to let users pick between the scanners. - #return SConsCPPScannerWrapper("CScanner", "CPPPATH") - - cs = SCons.Scanner.ClassicCPP("CScanner", - "$CPPSUFFIXES", - "CPPPATH", - '^[ \t]*#[ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")') - return cs - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/D.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/D.py deleted file mode 100644 index 04bb5a7b7..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/D.py +++ /dev/null @@ -1,73 +0,0 @@ -"""SCons.Scanner.D - -Scanner for the Digital Mars "D" programming language. - -Coded by Andy Friesen -17 Nov 2003 - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/D.py 5023 2010/06/14 22:05:46 scons" - -import re - -import SCons.Scanner - -def DScanner(): - """Return a prototype Scanner instance for scanning D source files""" - ds = D() - return ds - -class D(SCons.Scanner.Classic): - def __init__ (self): - SCons.Scanner.Classic.__init__ (self, - name = "DScanner", - suffixes = '$DSUFFIXES', - path_variable = 'DPATH', - regex = 'import\s+(?:[a-zA-Z0-9_.]+)\s*(?:,\s*(?:[a-zA-Z0-9_.]+)\s*)*;') - - self.cre2 = re.compile ('(?:import\s)?\s*([a-zA-Z0-9_.]+)\s*(?:,|;)', re.M) - - def find_include(self, include, source_dir, path): - # translate dots (package separators) to slashes - inc = include.replace('.', '/') - - i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path) - if i is None: - i = SCons.Node.FS.find_file (inc + '.di', (source_dir,) + path) - return i, include - - def find_include_names(self, node): - includes = [] - for i in self.cre.findall(node.get_text_contents()): - includes = includes + self.cre2.findall(i) - return includes - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py deleted file mode 100644 index 172aa620e..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py +++ /dev/null @@ -1,109 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Scanner/Dir.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Node.FS -import SCons.Scanner - -def only_dirs(nodes): - is_Dir = lambda n: isinstance(n.disambiguate(), SCons.Node.FS.Dir) - return list(filter(is_Dir, nodes)) - -def DirScanner(**kw): - """Return a prototype Scanner instance for scanning - directories for on-disk files""" - kw['node_factory'] = SCons.Node.FS.Entry - kw['recursive'] = only_dirs - return SCons.Scanner.Base(scan_on_disk, "DirScanner", **kw) - -def DirEntryScanner(**kw): - """Return a prototype Scanner instance for "scanning" - directory Nodes for their in-memory entries""" - kw['node_factory'] = SCons.Node.FS.Entry - kw['recursive'] = None - return SCons.Scanner.Base(scan_in_memory, "DirEntryScanner", **kw) - -skip_entry = {} - -skip_entry_list = [ - '.', - '..', - '.sconsign', - # Used by the native dblite.py module. - '.sconsign.dblite', - # Used by dbm and dumbdbm. - '.sconsign.dir', - # Used by dbm. - '.sconsign.pag', - # Used by dumbdbm. - '.sconsign.dat', - '.sconsign.bak', - # Used by some dbm emulations using Berkeley DB. - '.sconsign.db', -] - -for skip in skip_entry_list: - skip_entry[skip] = 1 - skip_entry[SCons.Node.FS._my_normcase(skip)] = 1 - -do_not_scan = lambda k: k not in skip_entry - -def scan_on_disk(node, env, path=()): - """ - Scans a directory for on-disk files and directories therein. - - Looking up the entries will add these to the in-memory Node tree - representation of the file system, so all we have to do is just - that and then call the in-memory scanning function. - """ - try: - flist = node.fs.listdir(node.abspath) - except (IOError, OSError): - return [] - e = node.Entry - for f in filter(do_not_scan, flist): - # Add ./ to the beginning of the file name so if it begins with a - # '#' we don't look it up relative to the top-level directory. - e('./' + f) - return scan_in_memory(node, env, path) - -def scan_in_memory(node, env, path=()): - """ - "Scans" a Node.FS.Dir for its in-memory entries. - """ - try: - entries = node.entries - except AttributeError: - # It's not a Node.FS.Dir (or doesn't look enough like one for - # our purposes), which can happen if a target list containing - # mixed Node types (Dirs and Files, for example) has a Dir as - # the first entry. - return [] - entry_list = sorted(filter(do_not_scan, list(entries.keys()))) - return [entries[n] for n in entry_list] - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py deleted file mode 100644 index 8d023e7f9..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py +++ /dev/null @@ -1,316 +0,0 @@ -"""SCons.Scanner.Fortran - -This module implements the dependency scanner for Fortran code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Scanner/Fortran.py 5023 2010/06/14 22:05:46 scons" - -import re - -import SCons.Node -import SCons.Node.FS -import SCons.Scanner -import SCons.Util -import SCons.Warnings - -class F90Scanner(SCons.Scanner.Classic): - """ - A Classic Scanner subclass for Fortran source files which takes - into account both USE and INCLUDE statements. This scanner will - work for both F77 and F90 (and beyond) compilers. - - Currently, this scanner assumes that the include files do not contain - USE statements. To enable the ability to deal with USE statements - in include files, add logic right after the module names are found - to loop over each include file, search for and locate each USE - statement, and append each module name to the list of dependencies. - Caching the search results in a common dictionary somewhere so that - the same include file is not searched multiple times would be a - smart thing to do. - """ - - def __init__(self, name, suffixes, path_variable, - use_regex, incl_regex, def_regex, *args, **kw): - - self.cre_use = re.compile(use_regex, re.M) - self.cre_incl = re.compile(incl_regex, re.M) - self.cre_def = re.compile(def_regex, re.M) - - def _scan(node, env, path, self=self): - node = node.rfile() - - if not node.exists(): - return [] - - return self.scan(node, env, path) - - kw['function'] = _scan - kw['path_function'] = SCons.Scanner.FindPathDirs(path_variable) - kw['recursive'] = 1 - kw['skeys'] = suffixes - kw['name'] = name - - SCons.Scanner.Current.__init__(self, *args, **kw) - - def scan(self, node, env, path=()): - - # cache the includes list in node so we only scan it once: - if node.includes != None: - mods_and_includes = node.includes - else: - # retrieve all included filenames - includes = self.cre_incl.findall(node.get_text_contents()) - # retrieve all USE'd module names - modules = self.cre_use.findall(node.get_text_contents()) - # retrieve all defined module names - defmodules = self.cre_def.findall(node.get_text_contents()) - - # Remove all USE'd module names that are defined in the same file - d = {} - for m in defmodules: - d[m] = 1 - modules = [m for m in modules if m not in d] - #modules = self.undefinedModules(modules, defmodules) - - # Convert module name to a .mod filename - suffix = env.subst('$FORTRANMODSUFFIX') - modules = [x.lower() + suffix for x in modules] - # Remove unique items from the list - mods_and_includes = SCons.Util.unique(includes+modules) - node.includes = mods_and_includes - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the USE or INCLUDE line, which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally. - nodes = [] - source_dir = node.get_dir() - if callable(path): - path = path() - for dep in mods_and_includes: - n, i = self.find_include(dep, source_dir, path) - - if n is None: - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (referenced by: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(dep) - nodes.append((sortkey, n)) - - return [pair[1] for pair in sorted(nodes)] - -def FortranScan(path_variable="FORTRANPATH"): - """Return a prototype Scanner instance for scanning source files - for Fortran USE & INCLUDE statements""" - -# The USE statement regex matches the following: -# -# USE module_name -# USE :: module_name -# USE, INTRINSIC :: module_name -# USE, NON_INTRINSIC :: module_name -# -# Limitations -# -# -- While the regex can handle multiple USE statements on one line, -# it cannot properly handle them if they are commented out. -# In either of the following cases: -# -# ! USE mod_a ; USE mod_b [entire line is commented out] -# USE mod_a ! ; USE mod_b [in-line comment of second USE statement] -# -# the second module name (mod_b) will be picked up as a dependency -# even though it should be ignored. The only way I can see -# to rectify this would be to modify the scanner to eliminate -# the call to re.findall, read in the contents of the file, -# treating the comment character as an end-of-line character -# in addition to the normal linefeed, loop over each line, -# weeding out the comments, and looking for the USE statements. -# One advantage to this is that the regex passed to the scanner -# would no longer need to match a semicolon. -# -# -- I question whether or not we need to detect dependencies to -# INTRINSIC modules because these are built-in to the compiler. -# If we consider them a dependency, will SCons look for them, not -# find them, and kill the build? Or will we there be standard -# compiler-specific directories we will need to point to so the -# compiler and SCons can locate the proper object and mod files? - -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# ^ : start of line -# (?: : group a collection of regex symbols without saving the match as a "group" -# ^|; : matches either the start of the line or a semicolon - semicolon -# ) : end the unsaved grouping -# \s* : any amount of white space -# USE : match the string USE, case insensitive -# (?: : group a collection of regex symbols without saving the match as a "group" -# \s+| : match one or more whitespace OR .... (the next entire grouped set of regex symbols) -# (?: : group a collection of regex symbols without saving the match as a "group" -# (?: : establish another unsaved grouping of regex symbols -# \s* : any amount of white space -# , : match a comma -# \s* : any amount of white space -# (?:NON_)? : optionally match the prefix NON_, case insensitive -# INTRINSIC : match the string INTRINSIC, case insensitive -# )? : optionally match the ", INTRINSIC/NON_INTRINSIC" grouped expression -# \s* : any amount of white space -# :: : match a double colon that must appear after the INTRINSIC/NON_INTRINSIC attribute -# ) : end the unsaved grouping -# ) : end the unsaved grouping -# \s* : match any amount of white space -# (\w+) : match the module name that is being USE'd -# -# - use_regex = "(?i)(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)" - - -# The INCLUDE statement regex matches the following: -# -# INCLUDE 'some_Text' -# INCLUDE "some_Text" -# INCLUDE "some_Text" ; INCLUDE "some_Text" -# INCLUDE kind_"some_Text" -# INCLUDE kind_'some_Text" -# -# where some_Text can include any alphanumeric and/or special character -# as defined by the Fortran 2003 standard. -# -# Limitations: -# -# -- The Fortran standard dictates that a " or ' in the INCLUDE'd -# string must be represented as a "" or '', if the quotes that wrap -# the entire string are either a ' or ", respectively. While the -# regular expression below can detect the ' or " characters just fine, -# the scanning logic, presently is unable to detect them and reduce -# them to a single instance. This probably isn't an issue since, -# in practice, ' or " are not generally used in filenames. -# -# -- This regex will not properly deal with multiple INCLUDE statements -# when the entire line has been commented out, ala -# -# ! INCLUDE 'some_file' ; INCLUDE 'some_file' -# -# In such cases, it will properly ignore the first INCLUDE file, -# but will actually still pick up the second. Interestingly enough, -# the regex will properly deal with these cases: -# -# INCLUDE 'some_file' -# INCLUDE 'some_file' !; INCLUDE 'some_file' -# -# To get around the above limitation, the FORTRAN programmer could -# simply comment each INCLUDE statement separately, like this -# -# ! INCLUDE 'some_file' !; INCLUDE 'some_file' -# -# The way I see it, the only way to get around this limitation would -# be to modify the scanning logic to replace the calls to re.findall -# with a custom loop that processes each line separately, throwing -# away fully commented out lines before attempting to match against -# the INCLUDE syntax. -# -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# (?: : begin a non-saving group that matches the following: -# ^ : either the start of the line -# | : or -# ['">]\s*; : a semicolon that follows a single quote, -# double quote or greater than symbol (with any -# amount of whitespace in between). This will -# allow the regex to match multiple INCLUDE -# statements per line (although it also requires -# the positive lookahead assertion that is -# used below). It will even properly deal with -# (i.e. ignore) cases in which the additional -# INCLUDES are part of an in-line comment, ala -# " INCLUDE 'someFile' ! ; INCLUDE 'someFile2' " -# ) : end of non-saving group -# \s* : any amount of white space -# INCLUDE : match the string INCLUDE, case insensitive -# \s+ : match one or more white space characters -# (?\w+_)? : match the optional "kind-param _" prefix allowed by the standard -# [<"'] : match the include delimiter - an apostrophe, double quote, or less than symbol -# (.+?) : match one or more characters that make up -# the included path and file name and save it -# in a group. The Fortran standard allows for -# any non-control character to be used. The dot -# operator will pick up any character, including -# control codes, but I can't conceive of anyone -# putting control codes in their file names. -# The question mark indicates it is non-greedy so -# that regex will match only up to the next quote, -# double quote, or greater than symbol -# (?=["'>]) : positive lookahead assertion to match the include -# delimiter - an apostrophe, double quote, or -# greater than symbol. This level of complexity -# is required so that the include delimiter is -# not consumed by the match, thus allowing the -# sub-regex discussed above to uniquely match a -# set of semicolon-separated INCLUDE statements -# (as allowed by the F2003 standard) - - include_regex = """(?i)(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])""" - -# The MODULE statement regex finds module definitions by matching -# the following: -# -# MODULE module_name -# -# but *not* the following: -# -# MODULE PROCEDURE procedure_name -# -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# ^\s* : any amount of white space -# MODULE : match the string MODULE, case insensitive -# \s+ : match one or more white space characters -# (?!PROCEDURE) : but *don't* match if the next word matches -# PROCEDURE (negative lookahead assertion), -# case insensitive -# (\w+) : match one or more alphanumeric characters -# that make up the defined module name and -# save it in a group - - def_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)""" - - scanner = F90Scanner("FortranScan", - "$FORTRANSUFFIXES", - path_variable, - use_regex, - include_regex, - def_regex) - return scanner - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py deleted file mode 100644 index 507b9e19f..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py +++ /dev/null @@ -1,48 +0,0 @@ -"""SCons.Scanner.IDL - -This module implements the depenency scanner for IDL (Interface -Definition Language) files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/IDL.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Node.FS -import SCons.Scanner - -def IDLScan(): - """Return a prototype Scanner instance for scanning IDL source files""" - cs = SCons.Scanner.ClassicCPP("IDLScan", - "$IDLSUFFIXES", - "CPPPATH", - '^[ \t]*(?:#[ \t]*include|[ \t]*import)[ \t]+(<|")([^>"]+)(>|")') - return cs - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py deleted file mode 100644 index 77be34c97..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py +++ /dev/null @@ -1,362 +0,0 @@ -"""SCons.Scanner.LaTeX - -This module implements the dependency scanner for LaTeX code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/LaTeX.py 5023 2010/06/14 22:05:46 scons" - -import os.path -import re - -import SCons.Scanner -import SCons.Util - -# list of graphics file extensions for TeX and LaTeX -TexGraphics = ['.eps', '.ps'] -LatexGraphics = ['.pdf', '.png', '.jpg', '.gif', '.tif'] - -# Used as a return value of modify_env_var if the variable is not set. -class _Null(object): - pass -_null = _Null - -# The user specifies the paths in env[variable], similar to other builders. -# They may be relative and must be converted to absolute, as expected -# by LaTeX and Co. The environment may already have some paths in -# env['ENV'][var]. These paths are honored, but the env[var] paths have -# higher precedence. All changes are un-done on exit. -def modify_env_var(env, var, abspath): - try: - save = env['ENV'][var] - except KeyError: - save = _null - env.PrependENVPath(var, abspath) - try: - if SCons.Util.is_List(env[var]): - env.PrependENVPath(var, [os.path.abspath(str(p)) for p in env[var]]) - else: - # Split at os.pathsep to convert into absolute path - env.PrependENVPath(var, [os.path.abspath(p) for p in str(env[var]).split(os.pathsep)]) - except KeyError: - pass - - # Convert into a string explicitly to append ":" (without which it won't search system - # paths as well). The problem is that env.AppendENVPath(var, ":") - # does not work, refuses to append ":" (os.pathsep). - - if SCons.Util.is_List(env['ENV'][var]): - env['ENV'][var] = os.pathsep.join(env['ENV'][var]) - # Append the trailing os.pathsep character here to catch the case with no env[var] - env['ENV'][var] = env['ENV'][var] + os.pathsep - - return save - -class FindENVPathDirs(object): - """A class to bind a specific *PATH variable name to a function that - will return all of the *path directories.""" - def __init__(self, variable): - self.variable = variable - def __call__(self, env, dir=None, target=None, source=None, argument=None): - import SCons.PathList - try: - path = env['ENV'][self.variable] - except KeyError: - return () - - dir = dir or env.fs._cwd - path = SCons.PathList.PathList(path).subst_path(env, target, source) - return tuple(dir.Rfindalldirs(path)) - - - -def LaTeXScanner(): - """Return a prototype Scanner instance for scanning LaTeX source files - when built with latex. - """ - ds = LaTeX(name = "LaTeXScanner", - suffixes = '$LATEXSUFFIXES', - # in the search order, see below in LaTeX class docstring - graphics_extensions = TexGraphics, - recursive = 0) - return ds - -def PDFLaTeXScanner(): - """Return a prototype Scanner instance for scanning LaTeX source files - when built with pdflatex. - """ - ds = LaTeX(name = "PDFLaTeXScanner", - suffixes = '$LATEXSUFFIXES', - # in the search order, see below in LaTeX class docstring - graphics_extensions = LatexGraphics, - recursive = 0) - return ds - -class LaTeX(SCons.Scanner.Base): - """Class for scanning LaTeX files for included files. - - Unlike most scanners, which use regular expressions that just - return the included file name, this returns a tuple consisting - of the keyword for the inclusion ("include", "includegraphics", - "input", or "bibliography"), and then the file name itself. - Based on a quick look at LaTeX documentation, it seems that we - should append .tex suffix for the "include" keywords, append .tex if - there is no extension for the "input" keyword, and need to add .bib - for the "bibliography" keyword that does not accept extensions by itself. - - Finally, if there is no extension for an "includegraphics" keyword - latex will append .ps or .eps to find the file, while pdftex may use .pdf, - .jpg, .tif, .mps, or .png. - - The actual subset and search order may be altered by - DeclareGraphicsExtensions command. This complication is ignored. - The default order corresponds to experimentation with teTeX - $ latex --version - pdfeTeX 3.141592-1.21a-2.2 (Web2C 7.5.4) - kpathsea version 3.5.4 - The order is: - ['.eps', '.ps'] for latex - ['.png', '.pdf', '.jpg', '.tif']. - - Another difference is that the search path is determined by the type - of the file being searched: - env['TEXINPUTS'] for "input" and "include" keywords - env['TEXINPUTS'] for "includegraphics" keyword - env['TEXINPUTS'] for "lstinputlisting" keyword - env['BIBINPUTS'] for "bibliography" keyword - env['BSTINPUTS'] for "bibliographystyle" keyword - - FIXME: also look for the class or style in document[class|style]{} - FIXME: also look for the argument of bibliographystyle{} - """ - keyword_paths = {'include': 'TEXINPUTS', - 'input': 'TEXINPUTS', - 'includegraphics': 'TEXINPUTS', - 'bibliography': 'BIBINPUTS', - 'bibliographystyle': 'BSTINPUTS', - 'usepackage': 'TEXINPUTS', - 'lstinputlisting': 'TEXINPUTS'} - env_variables = SCons.Util.unique(list(keyword_paths.values())) - - def __init__(self, name, suffixes, graphics_extensions, *args, **kw): - - # We have to include \n with the % we exclude from the first part - # part of the regex because the expression is compiled with re.M. - # Without the \n, the ^ could match the beginning of a *previous* - # line followed by one or more newline characters (i.e. blank - # lines), interfering with a match on the next line. - regex = r'^[^%\n]*\\(include|includegraphics(?:\[[^\]]+\])?|lstinputlisting(?:\[[^\]]+\])?|input|bibliography|usepackage){([^}]*)}' - self.cre = re.compile(regex, re.M) - self.graphics_extensions = graphics_extensions - - def _scan(node, env, path=(), self=self): - node = node.rfile() - if not node.exists(): - return [] - return self.scan_recurse(node, path) - - class FindMultiPathDirs(object): - """The stock FindPathDirs function has the wrong granularity: - it is called once per target, while we need the path that depends - on what kind of included files is being searched. This wrapper - hides multiple instances of FindPathDirs, one per the LaTeX path - variable in the environment. When invoked, the function calculates - and returns all the required paths as a dictionary (converted into - a tuple to become hashable). Then the scan function converts it - back and uses a dictionary of tuples rather than a single tuple - of paths. - """ - def __init__(self, dictionary): - self.dictionary = {} - for k,n in dictionary.items(): - self.dictionary[k] = ( SCons.Scanner.FindPathDirs(n), - FindENVPathDirs(n) ) - - def __call__(self, env, dir=None, target=None, source=None, - argument=None): - di = {} - for k,(c,cENV) in self.dictionary.items(): - di[k] = ( c(env, dir=None, target=None, source=None, - argument=None) , - cENV(env, dir=None, target=None, source=None, - argument=None) ) - # To prevent "dict is not hashable error" - return tuple(di.items()) - - class LaTeXScanCheck(object): - """Skip all but LaTeX source files, i.e., do not scan *.eps, - *.pdf, *.jpg, etc. - """ - def __init__(self, suffixes): - self.suffixes = suffixes - def __call__(self, node, env): - current = not node.has_builder() or node.is_up_to_date() - scannable = node.get_suffix() in env.subst_list(self.suffixes)[0] - # Returning false means that the file is not scanned. - return scannable and current - - kw['function'] = _scan - kw['path_function'] = FindMultiPathDirs(LaTeX.keyword_paths) - kw['recursive'] = 0 - kw['skeys'] = suffixes - kw['scan_check'] = LaTeXScanCheck(suffixes) - kw['name'] = name - - SCons.Scanner.Base.__init__(self, *args, **kw) - - def _latex_names(self, include): - filename = include[1] - if include[0] == 'input': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.tex'] - if (include[0] == 'include'): - return [filename + '.tex'] - if include[0] == 'bibliography': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.bib'] - if include[0] == 'usepackage': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.sty'] - if include[0] == 'includegraphics': - base, ext = os.path.splitext( filename ) - if ext == "": - #return [filename+e for e in self.graphics_extensions + TexGraphics] - # use the line above to find dependencies for the PDF builder - # when only an .eps figure is present. Since it will be found - # if the user tells scons how to make the pdf figure, leave - # it out for now. - return [filename+e for e in self.graphics_extensions] - return [filename] - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(str(include)) - - def find_include(self, include, source_dir, path): - try: - sub_path = path[include[0]] - except (IndexError, KeyError): - sub_path = () - try_names = self._latex_names(include) - for n in try_names: - # see if we find it using the path in env[var] - i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[0]) - if i: - return i, include - # see if we find it using the path in env['ENV'][var] - i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[1]) - if i: - return i, include - return i, include - - def scan(self, node): - # Modify the default scan function to allow for the regular - # expression to return a comma separated list of file names - # as can be the case with the bibliography keyword. - - # Cache the includes list in node so we only scan it once: - # path_dict = dict(list(path)) - noopt_cre = re.compile('\[.*$') - if node.includes != None: - includes = node.includes - else: - includes = self.cre.findall(node.get_text_contents()) - # 1. Split comma-separated lines, e.g. - # ('bibliography', 'phys,comp') - # should become two entries - # ('bibliography', 'phys') - # ('bibliography', 'comp') - # 2. Remove the options, e.g., such as - # ('includegraphics[clip,width=0.7\\linewidth]', 'picture.eps') - # should become - # ('includegraphics', 'picture.eps') - split_includes = [] - for include in includes: - inc_type = noopt_cre.sub('', include[0]) - inc_list = include[1].split(',') - for j in range(len(inc_list)): - split_includes.append( (inc_type, inc_list[j]) ) - # - includes = split_includes - node.includes = includes - - return includes - - def scan_recurse(self, node, path=()): - """ do a recursive scan of the top level target file - This lets us search for included files based on the - directory of the main file just as latex does""" - - path_dict = dict(list(path)) - - queue = [] - queue.extend( self.scan(node) ) - seen = {} - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the \include, \input, etc. line. - # TODO: what about the comment in the original Classic scanner: - # """which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally.""" - nodes = [] - source_dir = node.get_dir() - #for include in includes: - while queue: - - include = queue.pop() - try: - if seen[include[1]] == 1: - continue - except KeyError: - seen[include[1]] = 1 - - # - # Handle multiple filenames in include[1] - # - n, i = self.find_include(include, source_dir, path_dict) - if n is None: - # Do not bother with 'usepackage' warnings, as they most - # likely refer to system-level files - if include[0] != 'usepackage': - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(n) - nodes.append((sortkey, n)) - # recurse down - queue.extend( self.scan(n) ) - - return [pair[1] for pair in sorted(nodes)] - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py deleted file mode 100644 index 97f25b337..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py +++ /dev/null @@ -1,101 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/Prog.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Node -import SCons.Node.FS -import SCons.Scanner -import SCons.Util - -# global, set by --debug=findlibs -print_find_libs = None - -def ProgramScanner(**kw): - """Return a prototype Scanner instance for scanning executable - files for static-lib dependencies""" - kw['path_function'] = SCons.Scanner.FindPathDirs('LIBPATH') - ps = SCons.Scanner.Base(scan, "ProgramScanner", **kw) - return ps - -def scan(node, env, libpath = ()): - """ - This scanner scans program files for static-library - dependencies. It will search the LIBPATH environment variable - for libraries specified in the LIBS variable, returning any - files it finds as dependencies. - """ - try: - libs = env['LIBS'] - except KeyError: - # There are no LIBS in this environment, so just return a null list: - return [] - if SCons.Util.is_String(libs): - libs = libs.split() - else: - libs = SCons.Util.flatten(libs) - - try: - prefix = env['LIBPREFIXES'] - if not SCons.Util.is_List(prefix): - prefix = [ prefix ] - except KeyError: - prefix = [ '' ] - - try: - suffix = env['LIBSUFFIXES'] - if not SCons.Util.is_List(suffix): - suffix = [ suffix ] - except KeyError: - suffix = [ '' ] - - pairs = [] - for suf in map(env.subst, suffix): - for pref in map(env.subst, prefix): - pairs.append((pref, suf)) - - result = [] - - if callable(libpath): - libpath = libpath() - - find_file = SCons.Node.FS.find_file - adjustixes = SCons.Util.adjustixes - for lib in libs: - if SCons.Util.is_String(lib): - lib = env.subst(lib) - for pref, suf in pairs: - l = adjustixes(lib, pref, suf) - l = find_file(l, libpath, verbose=print_find_libs) - if l: - result.append(l) - else: - result.append(lib) - - return result - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py deleted file mode 100644 index de7744b9e..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py +++ /dev/null @@ -1,55 +0,0 @@ -"""SCons.Scanner.RC - -This module implements the depenency scanner for RC (Interface -Definition Language) files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/RC.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Node.FS -import SCons.Scanner -import re - -def RCScan(): - """Return a prototype Scanner instance for scanning RC source files""" - - res_re= r'^(?:\s*#\s*(?:include)|' \ - '.*?\s+(?:ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)' \ - '\s*.*?)' \ - '\s*(<|"| )([^>"\s]+)(?:[>" ])*$' - resScanner = SCons.Scanner.ClassicCPP( "ResourceScanner", - "$RCSUFFIXES", - "CPPPATH", - res_re ) - - return resScanner - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py deleted file mode 100644 index 2a6f2996e..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py +++ /dev/null @@ -1,413 +0,0 @@ -"""SCons.Scanner - -The Scanner package for the SCons software construction utility. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/__init__.py 5023 2010/06/14 22:05:46 scons" - -import re - -import SCons.Node.FS -import SCons.Util - - -class _Null(object): - pass - -# This is used instead of None as a default argument value so None can be -# used as an actual argument value. -_null = _Null - -def Scanner(function, *args, **kw): - """ - Public interface factory function for creating different types - of Scanners based on the different types of "functions" that may - be supplied. - - TODO: Deprecate this some day. We've moved the functionality - inside the Base class and really don't need this factory function - any more. It was, however, used by some of our Tool modules, so - the call probably ended up in various people's custom modules - patterned on SCons code. - """ - if SCons.Util.is_Dict(function): - return Selector(function, *args, **kw) - else: - return Base(function, *args, **kw) - - - -class FindPathDirs(object): - """A class to bind a specific *PATH variable name to a function that - will return all of the *path directories.""" - def __init__(self, variable): - self.variable = variable - def __call__(self, env, dir=None, target=None, source=None, argument=None): - import SCons.PathList - try: - path = env[self.variable] - except KeyError: - return () - - dir = dir or env.fs._cwd - path = SCons.PathList.PathList(path).subst_path(env, target, source) - return tuple(dir.Rfindalldirs(path)) - - - -class Base(object): - """ - The base class for dependency scanners. This implements - straightforward, single-pass scanning of a single file. - """ - - def __init__(self, - function, - name = "NONE", - argument = _null, - skeys = _null, - path_function = None, - # Node.FS.Base so that, by default, it's okay for a - # scanner to return a Dir, File or Entry. - node_class = SCons.Node.FS.Base, - node_factory = None, - scan_check = None, - recursive = None): - """ - Construct a new scanner object given a scanner function. - - 'function' - a scanner function taking two or three - arguments and returning a list of strings. - - 'name' - a name for identifying this scanner object. - - 'argument' - an optional argument that, if specified, will be - passed to both the scanner function and the path_function. - - 'skeys' - an optional list argument that can be used to determine - which scanner should be used for a given Node. In the case of File - nodes, for example, the 'skeys' would be file suffixes. - - 'path_function' - a function that takes four or five arguments - (a construction environment, Node for the directory containing - the SConscript file that defined the primary target, list of - target nodes, list of source nodes, and optional argument for - this instance) and returns a tuple of the directories that can - be searched for implicit dependency files. May also return a - callable() which is called with no args and returns the tuple - (supporting Bindable class). - - 'node_class' - the class of Nodes which this scan will return. - If node_class is None, then this scanner will not enforce any - Node conversion and will return the raw results from the - underlying scanner function. - - 'node_factory' - the factory function to be called to translate - the raw results returned by the scanner function into the - expected node_class objects. - - 'scan_check' - a function to be called to first check whether - this node really needs to be scanned. - - 'recursive' - specifies that this scanner should be invoked - recursively on all of the implicit dependencies it returns - (the canonical example being #include lines in C source files). - May be a callable, which will be called to filter the list - of nodes found to select a subset for recursive scanning - (the canonical example being only recursively scanning - subdirectories within a directory). - - The scanner function's first argument will be a Node that should - be scanned for dependencies, the second argument will be an - Environment object, the third argument will be the tuple of paths - returned by the path_function, and the fourth argument will be - the value passed into 'argument', and the returned list should - contain the Nodes for all the direct dependencies of the file. - - Examples: - - s = Scanner(my_scanner_function) - - s = Scanner(function = my_scanner_function) - - s = Scanner(function = my_scanner_function, argument = 'foo') - - """ - - # Note: this class could easily work with scanner functions that take - # something other than a filename as an argument (e.g. a database - # node) and a dependencies list that aren't file names. All that - # would need to be changed is the documentation. - - self.function = function - self.path_function = path_function - self.name = name - self.argument = argument - - if skeys is _null: - if SCons.Util.is_Dict(function): - skeys = list(function.keys()) - else: - skeys = [] - self.skeys = skeys - - self.node_class = node_class - self.node_factory = node_factory - self.scan_check = scan_check - if callable(recursive): - self.recurse_nodes = recursive - elif recursive: - self.recurse_nodes = self._recurse_all_nodes - else: - self.recurse_nodes = self._recurse_no_nodes - - def path(self, env, dir=None, target=None, source=None): - if not self.path_function: - return () - if not self.argument is _null: - return self.path_function(env, dir, target, source, self.argument) - else: - return self.path_function(env, dir, target, source) - - def __call__(self, node, env, path = ()): - """ - This method scans a single object. 'node' is the node - that will be passed to the scanner function, and 'env' is the - environment that will be passed to the scanner function. A list of - direct dependency nodes for the specified node will be returned. - """ - if self.scan_check and not self.scan_check(node, env): - return [] - - self = self.select(node) - - if not self.argument is _null: - list = self.function(node, env, path, self.argument) - else: - list = self.function(node, env, path) - - kw = {} - if hasattr(node, 'dir'): - kw['directory'] = node.dir - node_factory = env.get_factory(self.node_factory) - nodes = [] - for l in list: - if self.node_class and not isinstance(l, self.node_class): - l = node_factory(l, **kw) - nodes.append(l) - return nodes - - def __cmp__(self, other): - try: - return cmp(self.__dict__, other.__dict__) - except AttributeError: - # other probably doesn't have a __dict__ - return cmp(self.__dict__, other) - - def __hash__(self): - return id(self) - - def __str__(self): - return self.name - - def add_skey(self, skey): - """Add a skey to the list of skeys""" - self.skeys.append(skey) - - def get_skeys(self, env=None): - if env and SCons.Util.is_String(self.skeys): - return env.subst_list(self.skeys)[0] - return self.skeys - - def select(self, node): - if SCons.Util.is_Dict(self.function): - key = node.scanner_key() - try: - return self.function[key] - except KeyError: - return None - else: - return self - - def _recurse_all_nodes(self, nodes): - return nodes - - def _recurse_no_nodes(self, nodes): - return [] - - recurse_nodes = _recurse_no_nodes - - def add_scanner(self, skey, scanner): - self.function[skey] = scanner - self.add_skey(skey) - - -class Selector(Base): - """ - A class for selecting a more specific scanner based on the - scanner_key() (suffix) for a specific Node. - - TODO: This functionality has been moved into the inner workings of - the Base class, and this class will be deprecated at some point. - (It was never exposed directly as part of the public interface, - although it is used by the Scanner() factory function that was - used by various Tool modules and therefore was likely a template - for custom modules that may be out there.) - """ - def __init__(self, dict, *args, **kw): - Base.__init__(self, None, *args, **kw) - self.dict = dict - self.skeys = list(dict.keys()) - - def __call__(self, node, env, path = ()): - return self.select(node)(node, env, path) - - def select(self, node): - try: - return self.dict[node.scanner_key()] - except KeyError: - return None - - def add_scanner(self, skey, scanner): - self.dict[skey] = scanner - self.add_skey(skey) - - -class Current(Base): - """ - A class for scanning files that are source files (have no builder) - or are derived files and are current (which implies that they exist, - either locally or in a repository). - """ - - def __init__(self, *args, **kw): - def current_check(node, env): - return not node.has_builder() or node.is_up_to_date() - kw['scan_check'] = current_check - Base.__init__(self, *args, **kw) - -class Classic(Current): - """ - A Scanner subclass to contain the common logic for classic CPP-style - include scanning, but which can be customized to use different - regular expressions to find the includes. - - Note that in order for this to work "out of the box" (without - overriding the find_include() and sort_key() methods), the regular - expression passed to the constructor must return the name of the - include file in group 0. - """ - - def __init__(self, name, suffixes, path_variable, regex, *args, **kw): - - self.cre = re.compile(regex, re.M) - - def _scan(node, env, path=(), self=self): - node = node.rfile() - if not node.exists(): - return [] - return self.scan(node, path) - - kw['function'] = _scan - kw['path_function'] = FindPathDirs(path_variable) - kw['recursive'] = 1 - kw['skeys'] = suffixes - kw['name'] = name - - Current.__init__(self, *args, **kw) - - def find_include(self, include, source_dir, path): - n = SCons.Node.FS.find_file(include, (source_dir,) + tuple(path)) - return n, include - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(include) - - def find_include_names(self, node): - return self.cre.findall(node.get_text_contents()) - - def scan(self, node, path=()): - - # cache the includes list in node so we only scan it once: - if node.includes is not None: - includes = node.includes - else: - includes = self.find_include_names (node) - # Intern the names of the include files. Saves some memory - # if the same header is included many times. - node.includes = list(map(SCons.Util.silent_intern, includes)) - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the #include line (including the - # " or <, since that may affect what file is found), which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally. - nodes = [] - source_dir = node.get_dir() - if callable(path): - path = path() - for include in includes: - n, i = self.find_include(include, source_dir, path) - - if n is None: - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node)) - else: - nodes.append((self.sort_key(include), n)) - - return [pair[1] for pair in sorted(nodes)] - -class ClassicCPP(Classic): - """ - A Classic Scanner subclass which takes into account the type of - bracketing used to include the file, and uses classic CPP rules - for searching for the files based on the bracketing. - - Note that in order for this to work, the regular expression passed - to the constructor must return the leading bracket in group 0, and - the contained filename in group 1. - """ - def find_include(self, include, source_dir, path): - if include[0] == '"': - paths = (source_dir,) + tuple(path) - else: - paths = tuple(path) + (source_dir,) - - n = SCons.Node.FS.find_file(include[1], paths) - - i = SCons.Util.silent_intern(include[1]) - return n, i - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(' '.join(include)) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py deleted file mode 100644 index 52fc75389..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py +++ /dev/null @@ -1,384 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Script/Interactive.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """ -SCons interactive mode -""" - -# TODO: -# -# This has the potential to grow into something with a really big life -# of its own, which might or might not be a good thing. Nevertheless, -# here are some enhancements that will probably be requested some day -# and are worth keeping in mind (assuming this takes off): -# -# - A command to re-read / re-load the SConscript files. This may -# involve allowing people to specify command-line options (e.g. -f, -# -I, --no-site-dir) that affect how the SConscript files are read. -# -# - Additional command-line options on the "build" command. -# -# Of the supported options that seemed to make sense (after a quick -# pass through the list), the ones that seemed likely enough to be -# used are listed in the man page and have explicit test scripts. -# -# These had code changed in Script/Main.py to support them, but didn't -# seem likely to be used regularly, so had no test scripts added: -# -# build --diskcheck=* -# build --implicit-cache=* -# build --implicit-deps-changed=* -# build --implicit-deps-unchanged=* -# -# These look like they should "just work" with no changes to the -# existing code, but like those above, look unlikely to be used and -# therefore had no test scripts added: -# -# build --random -# -# These I'm not sure about. They might be useful for individual -# "build" commands, and may even work, but they seem unlikely enough -# that we'll wait until they're requested before spending any time on -# writing test scripts for them, or investigating whether they work. -# -# build -q [??? is there a useful analog to the exit status?] -# build --duplicate= -# build --profile= -# build --max-drift= -# build --warn=* -# build --Y -# -# - Most of the SCons command-line options that the "build" command -# supports should be settable as default options that apply to all -# subsequent "build" commands. Maybe a "set {option}" command that -# maps to "SetOption('{option}')". -# -# - Need something in the 'help' command that prints the -h output. -# -# - A command to run the configure subsystem separately (must see how -# this interacts with the new automake model). -# -# - Command-line completion of target names; maybe even of SCons options? -# Completion is something that's supported by the Python cmd module, -# so this should be doable without too much trouble. -# - -import cmd -import copy -import os -import re -import shlex -import sys - -try: - import readline -except ImportError: - pass - -class SConsInteractiveCmd(cmd.Cmd): - """\ - build [TARGETS] Build the specified TARGETS and their dependencies. - 'b' is a synonym. - clean [TARGETS] Clean (remove) the specified TARGETS and their - dependencies. 'c' is a synonym. - exit Exit SCons interactive mode. - help [COMMAND] Prints help for the specified COMMAND. 'h' and - '?' are synonyms. - shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and '!' - are synonyms. - version Prints SCons version information. - """ - - synonyms = { - 'b' : 'build', - 'c' : 'clean', - 'h' : 'help', - 'scons' : 'build', - 'sh' : 'shell', - } - - def __init__(self, **kw): - cmd.Cmd.__init__(self) - for key, val in kw.items(): - setattr(self, key, val) - - if sys.platform == 'win32': - self.shell_variable = 'COMSPEC' - else: - self.shell_variable = 'SHELL' - - def default(self, argv): - print "*** Unknown command: %s" % argv[0] - - def onecmd(self, line): - line = line.strip() - if not line: - print self.lastcmd - return self.emptyline() - self.lastcmd = line - if line[0] == '!': - line = 'shell ' + line[1:] - elif line[0] == '?': - line = 'help ' + line[1:] - if os.sep == '\\': - line = line.replace('\\', '\\\\') - argv = shlex.split(line) - argv[0] = self.synonyms.get(argv[0], argv[0]) - if not argv[0]: - return self.default(line) - else: - try: - func = getattr(self, 'do_' + argv[0]) - except AttributeError: - return self.default(argv) - return func(argv) - - def do_build(self, argv): - """\ - build [TARGETS] Build the specified TARGETS and their - dependencies. 'b' is a synonym. - """ - import SCons.Node - import SCons.SConsign - import SCons.Script.Main - - options = copy.deepcopy(self.options) - - options, targets = self.parser.parse_args(argv[1:], values=options) - - SCons.Script.COMMAND_LINE_TARGETS = targets - - if targets: - SCons.Script.BUILD_TARGETS = targets - else: - # If the user didn't specify any targets on the command line, - # use the list of default targets. - SCons.Script.BUILD_TARGETS = SCons.Script._build_plus_default - - nodes = SCons.Script.Main._build_targets(self.fs, - options, - targets, - self.target_top) - - if not nodes: - return - - # Call each of the Node's alter_targets() methods, which may - # provide additional targets that ended up as part of the build - # (the canonical example being a VariantDir() when we're building - # from a source directory) and which we therefore need their - # state cleared, too. - x = [] - for n in nodes: - x.extend(n.alter_targets()[0]) - nodes.extend(x) - - # Clean up so that we can perform the next build correctly. - # - # We do this by walking over all the children of the targets, - # and clearing their state. - # - # We currently have to re-scan each node to find their - # children, because built nodes have already been partially - # cleared and don't remember their children. (In scons - # 0.96.1 and earlier, this wasn't the case, and we didn't - # have to re-scan the nodes.) - # - # Because we have to re-scan each node, we can't clear the - # nodes as we walk over them, because we may end up rescanning - # a cleared node as we scan a later node. Therefore, only - # store the list of nodes that need to be cleared as we walk - # the tree, and clear them in a separate pass. - # - # XXX: Someone more familiar with the inner workings of scons - # may be able to point out a more efficient way to do this. - - SCons.Script.Main.progress_display("scons: Clearing cached node information ...") - - seen_nodes = {} - - def get_unseen_children(node, parent, seen_nodes=seen_nodes): - def is_unseen(node, seen_nodes=seen_nodes): - return node not in seen_nodes - return list(filter(is_unseen, node.children(scan=1))) - - def add_to_seen_nodes(node, parent, seen_nodes=seen_nodes): - seen_nodes[node] = 1 - - # If this file is in a VariantDir and has a - # corresponding source file in the source tree, remember the - # node in the source tree, too. This is needed in - # particular to clear cached implicit dependencies on the - # source file, since the scanner will scan it if the - # VariantDir was created with duplicate=0. - try: - rfile_method = node.rfile - except AttributeError: - return - else: - rfile = rfile_method() - if rfile != node: - seen_nodes[rfile] = 1 - - for node in nodes: - walker = SCons.Node.Walker(node, - kids_func=get_unseen_children, - eval_func=add_to_seen_nodes) - n = walker.get_next() - while n: - n = walker.get_next() - - for node in seen_nodes.keys(): - # Call node.clear() to clear most of the state - node.clear() - # node.clear() doesn't reset node.state, so call - # node.set_state() to reset it manually - node.set_state(SCons.Node.no_state) - node.implicit = None - - # Debug: Uncomment to verify that all Taskmaster reference - # counts have been reset to zero. - #if node.ref_count != 0: - # from SCons.Debug import Trace - # Trace('node %s, ref_count %s !!!\n' % (node, node.ref_count)) - - SCons.SConsign.Reset() - SCons.Script.Main.progress_display("scons: done clearing node information.") - - def do_clean(self, argv): - """\ - clean [TARGETS] Clean (remove) the specified TARGETS - and their dependencies. 'c' is a synonym. - """ - return self.do_build(['build', '--clean'] + argv[1:]) - - def do_EOF(self, argv): - print - self.do_exit(argv) - - def _do_one_help(self, arg): - try: - # If help_() exists, then call it. - func = getattr(self, 'help_' + arg) - except AttributeError: - try: - func = getattr(self, 'do_' + arg) - except AttributeError: - doc = None - else: - doc = self._doc_to_help(func) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - else: - doc = self.strip_initial_spaces(func()) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - - def _doc_to_help(self, obj): - doc = obj.__doc__ - if doc is None: - return '' - return self._strip_initial_spaces(doc) - - def _strip_initial_spaces(self, s): - #lines = s.split('\n') - lines = s.split('\n') - spaces = re.match(' *', lines[0]).group(0) - #def strip_spaces(l): - # if l.startswith(spaces): - # l = l[len(spaces):] - # return l - #return '\n'.join([ strip_spaces(l) for l in lines ]) - def strip_spaces(l, spaces=spaces): - if l[:len(spaces)] == spaces: - l = l[len(spaces):] - return l - lines = list(map(strip_spaces, lines)) - return '\n'.join(lines) - - def do_exit(self, argv): - """\ - exit Exit SCons interactive mode. - """ - sys.exit(0) - - def do_help(self, argv): - """\ - help [COMMAND] Prints help for the specified COMMAND. 'h' - and '?' are synonyms. - """ - if argv[1:]: - for arg in argv[1:]: - if self._do_one_help(arg): - break - else: - # If bare 'help' is called, print this class's doc - # string (if it has one). - doc = self._doc_to_help(self.__class__) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - - def do_shell(self, argv): - """\ - shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and - '!' are synonyms. - """ - import subprocess - argv = argv[1:] - if not argv: - argv = os.environ[self.shell_variable] - try: - # Per "[Python-Dev] subprocess insufficiently platform-independent?" - # http://mail.python.org/pipermail/python-dev/2008-August/081979.html "+ - # Doing the right thing with an argument list currently - # requires different shell= values on Windows and Linux. - p = subprocess.Popen(argv, shell=(sys.platform=='win32')) - except EnvironmentError, e: - sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror)) - else: - p.wait() - - def do_version(self, argv): - """\ - version Prints SCons version information. - """ - sys.stdout.write(self.parser.version + '\n') - -def interact(fs, parser, options, targets, target_top): - c = SConsInteractiveCmd(prompt = 'scons>>> ', - fs = fs, - parser = parser, - options = options, - targets = targets, - target_top = target_top) - c.cmdloop() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Main.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Main.py deleted file mode 100644 index 2bd15602c..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/Main.py +++ /dev/null @@ -1,1334 +0,0 @@ -"""SCons.Script - -This file implements the main() function used by the scons script. - -Architecturally, this *is* the scons script, and will likely only be -called from the external "scons" wrapper. Consequently, anything here -should not be, or be considered, part of the build engine. If it's -something that we expect other software to want to use, it should go in -some other module. If it's specific to the "scons" script invocation, -it goes here. -""" - -unsupported_python_version = (2, 3, 0) -deprecated_python_version = (2, 4, 0) - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Script/Main.py 5023 2010/06/14 22:05:46 scons" - -import SCons.compat - -import os -import sys -import time -import traceback - -# Strip the script directory from sys.path() so on case-insensitive -# (Windows) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own version directory so, if -# if they're there, we pick up the right version of the build engine -# modules. -#sys.path = [os.path.join(sys.prefix, -# 'lib', -# 'scons-%d' % SCons.__version__)] + sys.path[1:] - -import SCons.CacheDir -import SCons.Debug -import SCons.Defaults -import SCons.Environment -import SCons.Errors -import SCons.Job -import SCons.Node -import SCons.Node.FS -import SCons.SConf -import SCons.Script -import SCons.Taskmaster -import SCons.Util -import SCons.Warnings - -import SCons.Script.Interactive - -def fetch_win32_parallel_msg(): - # A subsidiary function that exists solely to isolate this import - # so we don't have to pull it in on all platforms, and so that an - # in-line "import" statement in the _main() function below doesn't - # cause warnings about local names shadowing use of the 'SCons' - # globl in nest scopes and UnboundLocalErrors and the like in some - # versions (2.1) of Python. - import SCons.Platform.win32 - return SCons.Platform.win32.parallel_msg - -# - -class SConsPrintHelpException(Exception): - pass - -display = SCons.Util.display -progress_display = SCons.Util.DisplayEngine() - -first_command_start = None -last_command_end = None - -class Progressor(object): - prev = '' - count = 0 - target_string = '$TARGET' - - def __init__(self, obj, interval=1, file=None, overwrite=False): - if file is None: - file = sys.stdout - - self.obj = obj - self.file = file - self.interval = interval - self.overwrite = overwrite - - if callable(obj): - self.func = obj - elif SCons.Util.is_List(obj): - self.func = self.spinner - elif obj.find(self.target_string) != -1: - self.func = self.replace_string - else: - self.func = self.string - - def write(self, s): - self.file.write(s) - self.file.flush() - self.prev = s - - def erase_previous(self): - if self.prev: - length = len(self.prev) - if self.prev[-1] in ('\n', '\r'): - length = length - 1 - self.write(' ' * length + '\r') - self.prev = '' - - def spinner(self, node): - self.write(self.obj[self.count % len(self.obj)]) - - def string(self, node): - self.write(self.obj) - - def replace_string(self, node): - self.write(self.obj.replace(self.target_string, str(node))) - - def __call__(self, node): - self.count = self.count + 1 - if (self.count % self.interval) == 0: - if self.overwrite: - self.erase_previous() - self.func(node) - -ProgressObject = SCons.Util.Null() - -def Progress(*args, **kw): - global ProgressObject - ProgressObject = Progressor(*args, **kw) - -# Task control. -# - -_BuildFailures = [] - -def GetBuildFailures(): - return _BuildFailures - -class BuildTask(SCons.Taskmaster.OutOfDateTask): - """An SCons build task.""" - progress = ProgressObject - - def display(self, message): - display('scons: ' + message) - - def prepare(self): - self.progress(self.targets[0]) - return SCons.Taskmaster.OutOfDateTask.prepare(self) - - def needs_execute(self): - if SCons.Taskmaster.OutOfDateTask.needs_execute(self): - return True - if self.top and self.targets[0].has_builder(): - display("scons: `%s' is up to date." % str(self.node)) - return False - - def execute(self): - if print_time: - start_time = time.time() - global first_command_start - if first_command_start is None: - first_command_start = start_time - SCons.Taskmaster.OutOfDateTask.execute(self) - if print_time: - global cumulative_command_time - global last_command_end - finish_time = time.time() - last_command_end = finish_time - cumulative_command_time = cumulative_command_time+finish_time-start_time - sys.stdout.write("Command execution time: %f seconds\n"%(finish_time-start_time)) - - def do_failed(self, status=2): - _BuildFailures.append(self.exception[1]) - global exit_status - global this_build_status - if self.options.ignore_errors: - SCons.Taskmaster.OutOfDateTask.executed(self) - elif self.options.keep_going: - SCons.Taskmaster.OutOfDateTask.fail_continue(self) - exit_status = status - this_build_status = status - else: - SCons.Taskmaster.OutOfDateTask.fail_stop(self) - exit_status = status - this_build_status = status - - def executed(self): - t = self.targets[0] - if self.top and not t.has_builder() and not t.side_effect: - if not t.exists(): - if t.__class__.__name__ in ('File', 'Dir', 'Entry'): - errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.abspath) - else: # Alias or Python or ... - errstr="Do not know how to make %s target `%s'." % (t.__class__.__name__, t) - sys.stderr.write("scons: *** " + errstr) - if not self.options.keep_going: - sys.stderr.write(" Stop.") - sys.stderr.write("\n") - try: - raise SCons.Errors.BuildError(t, errstr) - except KeyboardInterrupt: - raise - except: - self.exception_set() - self.do_failed() - else: - print "scons: Nothing to be done for `%s'." % t - SCons.Taskmaster.OutOfDateTask.executed(self) - else: - SCons.Taskmaster.OutOfDateTask.executed(self) - - def failed(self): - # Handle the failure of a build task. The primary purpose here - # is to display the various types of Errors and Exceptions - # appropriately. - exc_info = self.exc_info() - try: - t, e, tb = exc_info - except ValueError: - t, e = exc_info - tb = None - - if t is None: - # The Taskmaster didn't record an exception for this Task; - # see if the sys module has one. - try: - t, e, tb = sys.exc_info()[:] - except ValueError: - t, e = exc_info - tb = None - - # Deprecated string exceptions will have their string stored - # in the first entry of the tuple. - if e is None: - e = t - - buildError = SCons.Errors.convert_to_BuildError(e) - if not buildError.node: - buildError.node = self.node - - node = buildError.node - if not SCons.Util.is_List(node): - node = [ node ] - nodename = ', '.join(map(str, node)) - - errfmt = "scons: *** [%s] %s\n" - sys.stderr.write(errfmt % (nodename, buildError)) - - if (buildError.exc_info[2] and buildError.exc_info[1] and - not isinstance( - buildError.exc_info[1], - (EnvironmentError, SCons.Errors.StopError, - SCons.Errors.UserError))): - type, value, trace = buildError.exc_info - traceback.print_exception(type, value, trace) - elif tb and print_stacktrace: - sys.stderr.write("scons: internal stack trace:\n") - traceback.print_tb(tb, file=sys.stderr) - - self.exception = (e, buildError, tb) # type, value, traceback - self.do_failed(buildError.exitstatus) - - self.exc_clear() - - def postprocess(self): - if self.top: - t = self.targets[0] - for tp in self.options.tree_printers: - tp.display(t) - if self.options.debug_includes: - tree = t.render_include_tree() - if tree: - print - print tree - SCons.Taskmaster.OutOfDateTask.postprocess(self) - - def make_ready(self): - """Make a task ready for execution""" - SCons.Taskmaster.OutOfDateTask.make_ready(self) - if self.out_of_date and self.options.debug_explain: - explanation = self.out_of_date[0].explain() - if explanation: - sys.stdout.write("scons: " + explanation) - -class CleanTask(SCons.Taskmaster.AlwaysTask): - """An SCons clean task.""" - def fs_delete(self, path, pathstr, remove=1): - try: - if os.path.lexists(path): - if os.path.isfile(path) or os.path.islink(path): - if remove: os.unlink(path) - display("Removed " + pathstr) - elif os.path.isdir(path) and not os.path.islink(path): - # delete everything in the dir - for e in sorted(os.listdir(path)): - p = os.path.join(path, e) - s = os.path.join(pathstr, e) - if os.path.isfile(p): - if remove: os.unlink(p) - display("Removed " + s) - else: - self.fs_delete(p, s, remove) - # then delete dir itself - if remove: os.rmdir(path) - display("Removed directory " + pathstr) - else: - errstr = "Path '%s' exists but isn't a file or directory." - raise SCons.Errors.UserError(errstr % (pathstr)) - except SCons.Errors.UserError, e: - print e - except (IOError, OSError), e: - print "scons: Could not remove '%s':" % pathstr, e.strerror - - def show(self): - target = self.targets[0] - if (target.has_builder() or target.side_effect) and not target.noclean: - for t in self.targets: - if not t.isdir(): - display("Removed " + str(t)) - if target in SCons.Environment.CleanTargets: - files = SCons.Environment.CleanTargets[target] - for f in files: - self.fs_delete(f.abspath, str(f), 0) - - def remove(self): - target = self.targets[0] - if (target.has_builder() or target.side_effect) and not target.noclean: - for t in self.targets: - try: - removed = t.remove() - except OSError, e: - # An OSError may indicate something like a permissions - # issue, an IOError would indicate something like - # the file not existing. In either case, print a - # message and keep going to try to remove as many - # targets aa possible. - print "scons: Could not remove '%s':" % str(t), e.strerror - else: - if removed: - display("Removed " + str(t)) - if target in SCons.Environment.CleanTargets: - files = SCons.Environment.CleanTargets[target] - for f in files: - self.fs_delete(f.abspath, str(f)) - - execute = remove - - # We want the Taskmaster to update the Node states (and therefore - # handle reference counts, etc.), but we don't want to call - # back to the Node's post-build methods, which would do things - # we don't want, like store .sconsign information. - executed = SCons.Taskmaster.Task.executed_without_callbacks - - # Have the taskmaster arrange to "execute" all of the targets, because - # we'll figure out ourselves (in remove() or show() above) whether - # anything really needs to be done. - make_ready = SCons.Taskmaster.Task.make_ready_all - - def prepare(self): - pass - -class QuestionTask(SCons.Taskmaster.AlwaysTask): - """An SCons task for the -q (question) option.""" - def prepare(self): - pass - - def execute(self): - if self.targets[0].get_state() != SCons.Node.up_to_date or \ - (self.top and not self.targets[0].exists()): - global exit_status - global this_build_status - exit_status = 1 - this_build_status = 1 - self.tm.stop() - - def executed(self): - pass - - -class TreePrinter(object): - def __init__(self, derived=False, prune=False, status=False): - self.derived = derived - self.prune = prune - self.status = status - def get_all_children(self, node): - return node.all_children() - def get_derived_children(self, node): - children = node.all_children(None) - return [x for x in children if x.has_builder()] - def display(self, t): - if self.derived: - func = self.get_derived_children - else: - func = self.get_all_children - s = self.status and 2 or 0 - SCons.Util.print_tree(t, func, prune=self.prune, showtags=s) - - -def python_version_string(): - return sys.version.split()[0] - -def python_version_unsupported(version=sys.version_info): - return version < unsupported_python_version - -def python_version_deprecated(version=sys.version_info): - return version < deprecated_python_version - - -# Global variables - -print_objects = 0 -print_memoizer = 0 -print_stacktrace = 0 -print_time = 0 -sconscript_time = 0 -cumulative_command_time = 0 -exit_status = 0 # final exit status, assume success by default -this_build_status = 0 # "exit status" of an individual build -num_jobs = None -delayed_warnings = [] - -class FakeOptionParser(object): - """ - A do-nothing option parser, used for the initial OptionsParser variable. - - During normal SCons operation, the OptionsParser is created right - away by the main() function. Certain tests scripts however, can - introspect on different Tool modules, the initialization of which - can try to add a new, local option to an otherwise uninitialized - OptionsParser object. This allows that introspection to happen - without blowing up. - - """ - class FakeOptionValues(object): - def __getattr__(self, attr): - return None - values = FakeOptionValues() - def add_local_option(self, *args, **kw): - pass - -OptionsParser = FakeOptionParser() - -def AddOption(*args, **kw): - if 'default' not in kw: - kw['default'] = None - result = OptionsParser.add_local_option(*args, **kw) - return result - -def GetOption(name): - return getattr(OptionsParser.values, name) - -def SetOption(name, value): - return OptionsParser.values.set_option(name, value) - -# -class Stats(object): - def __init__(self): - self.stats = [] - self.labels = [] - self.append = self.do_nothing - self.print_stats = self.do_nothing - def enable(self, outfp): - self.outfp = outfp - self.append = self.do_append - self.print_stats = self.do_print - def do_nothing(self, *args, **kw): - pass - -class CountStats(Stats): - def do_append(self, label): - self.labels.append(label) - self.stats.append(SCons.Debug.fetchLoggedInstances()) - def do_print(self): - stats_table = {} - for s in self.stats: - for n in [t[0] for t in s]: - stats_table[n] = [0, 0, 0, 0] - i = 0 - for s in self.stats: - for n, c in s: - stats_table[n][i] = c - i = i + 1 - self.outfp.write("Object counts:\n") - pre = [" "] - post = [" %s\n"] - l = len(self.stats) - fmt1 = ''.join(pre + [' %7s']*l + post) - fmt2 = ''.join(pre + [' %7d']*l + post) - labels = self.labels[:l] - labels.append(("", "Class")) - self.outfp.write(fmt1 % tuple([x[0] for x in labels])) - self.outfp.write(fmt1 % tuple([x[1] for x in labels])) - for k in sorted(stats_table.keys()): - r = stats_table[k][:l] + [k] - self.outfp.write(fmt2 % tuple(r)) - -count_stats = CountStats() - -class MemStats(Stats): - def do_append(self, label): - self.labels.append(label) - self.stats.append(SCons.Debug.memory()) - def do_print(self): - fmt = 'Memory %-32s %12d\n' - for label, stats in zip(self.labels, self.stats): - self.outfp.write(fmt % (label, stats)) - -memory_stats = MemStats() - -# utility functions - -def _scons_syntax_error(e): - """Handle syntax errors. Print out a message and show where the error - occurred. - """ - etype, value, tb = sys.exc_info() - lines = traceback.format_exception_only(etype, value) - for line in lines: - sys.stderr.write(line+'\n') - sys.exit(2) - -def find_deepest_user_frame(tb): - """ - Find the deepest stack frame that is not part of SCons. - - Input is a "pre-processed" stack trace in the form - returned by traceback.extract_tb() or traceback.extract_stack() - """ - - tb.reverse() - - # find the deepest traceback frame that is not part - # of SCons: - for frame in tb: - filename = frame[0] - if filename.find(os.sep+'SCons'+os.sep) == -1: - return frame - return tb[0] - -def _scons_user_error(e): - """Handle user errors. Print out a message and a description of the - error, along with the line number and routine where it occured. - The file and line number will be the deepest stack frame that is - not part of SCons itself. - """ - global print_stacktrace - etype, value, tb = sys.exc_info() - if print_stacktrace: - traceback.print_exception(etype, value, tb) - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb)) - sys.stderr.write("\nscons: *** %s\n" % value) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - sys.exit(2) - -def _scons_user_warning(e): - """Handle user warnings. Print out a message and a description of - the warning, along with the line number and routine where it occured. - The file and line number will be the deepest stack frame that is - not part of SCons itself. - """ - etype, value, tb = sys.exc_info() - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb)) - sys.stderr.write("\nscons: warning: %s\n" % e) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - -def _scons_internal_warning(e): - """Slightly different from _scons_user_warning in that we use the - *current call stack* rather than sys.exc_info() to get our stack trace. - This is used by the warnings framework to print warnings.""" - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_stack()) - sys.stderr.write("\nscons: warning: %s\n" % e.args[0]) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - -def _scons_internal_error(): - """Handle all errors but user errors. Print out a message telling - the user what to do in this case and print a normal trace. - """ - print 'internal error' - traceback.print_exc() - sys.exit(2) - -def _SConstruct_exists(dirname='', repositories=[], filelist=None): - """This function checks that an SConstruct file exists in a directory. - If so, it returns the path of the file. By default, it checks the - current directory. - """ - if not filelist: - filelist = ['SConstruct', 'Sconstruct', 'sconstruct'] - for file in filelist: - sfile = os.path.join(dirname, file) - if os.path.isfile(sfile): - return sfile - if not os.path.isabs(sfile): - for rep in repositories: - if os.path.isfile(os.path.join(rep, sfile)): - return sfile - return None - -def _set_debug_values(options): - global print_memoizer, print_objects, print_stacktrace, print_time - - debug_values = options.debug - - if "count" in debug_values: - # All of the object counts are within "if __debug__:" blocks, - # which get stripped when running optimized (with python -O or - # from compiled *.pyo files). Provide a warning if __debug__ is - # stripped, so it doesn't just look like --debug=count is broken. - enable_count = False - if __debug__: enable_count = True - if enable_count: - count_stats.enable(sys.stdout) - else: - msg = "--debug=count is not supported when running SCons\n" + \ - "\twith the python -O option or optimized (.pyo) modules." - SCons.Warnings.warn(SCons.Warnings.NoObjectCountWarning, msg) - if "dtree" in debug_values: - options.tree_printers.append(TreePrinter(derived=True)) - options.debug_explain = ("explain" in debug_values) - if "findlibs" in debug_values: - SCons.Scanner.Prog.print_find_libs = "findlibs" - options.debug_includes = ("includes" in debug_values) - print_memoizer = ("memoizer" in debug_values) - if "memory" in debug_values: - memory_stats.enable(sys.stdout) - print_objects = ("objects" in debug_values) - if "presub" in debug_values: - SCons.Action.print_actions_presub = 1 - if "stacktrace" in debug_values: - print_stacktrace = 1 - if "stree" in debug_values: - options.tree_printers.append(TreePrinter(status=True)) - if "time" in debug_values: - print_time = 1 - if "tree" in debug_values: - options.tree_printers.append(TreePrinter()) - -def _create_path(plist): - path = '.' - for d in plist: - if os.path.isabs(d): - path = d - else: - path = path + '/' + d - return path - -def _load_site_scons_dir(topdir, site_dir_name=None): - """Load the site_scons dir under topdir. - Adds site_scons to sys.path, imports site_scons/site_init.py, - and adds site_scons/site_tools to default toolpath.""" - if site_dir_name: - err_if_not_found = True # user specified: err if missing - else: - site_dir_name = "site_scons" - err_if_not_found = False - - site_dir = os.path.join(topdir.path, site_dir_name) - if not os.path.exists(site_dir): - if err_if_not_found: - raise SCons.Errors.UserError("site dir %s not found."%site_dir) - return - - site_init_filename = "site_init.py" - site_init_modname = "site_init" - site_tools_dirname = "site_tools" - sys.path = [os.path.abspath(site_dir)] + sys.path - site_init_file = os.path.join(site_dir, site_init_filename) - site_tools_dir = os.path.join(site_dir, site_tools_dirname) - if os.path.exists(site_init_file): - import imp - # TODO(2.4): turn this into try:-except:-finally: - try: - try: - fp, pathname, description = imp.find_module(site_init_modname, - [site_dir]) - # Load the file into SCons.Script namespace. This is - # opaque and clever; m is the module object for the - # SCons.Script module, and the exec ... in call executes a - # file (or string containing code) in the context of the - # module's dictionary, so anything that code defines ends - # up adding to that module. This is really short, but all - # the error checking makes it longer. - try: - m = sys.modules['SCons.Script'] - except Exception, e: - fmt = 'cannot import site_init.py: missing SCons.Script module %s' - raise SCons.Errors.InternalError(fmt % repr(e)) - try: - # This is the magic. - exec fp in m.__dict__ - except KeyboardInterrupt: - raise - except Exception, e: - fmt = '*** Error loading site_init file %s:\n' - sys.stderr.write(fmt % repr(site_init_file)) - raise - except KeyboardInterrupt: - raise - except ImportError, e: - fmt = '*** cannot import site init file %s:\n' - sys.stderr.write(fmt % repr(site_init_file)) - raise - finally: - if fp: - fp.close() - if os.path.exists(site_tools_dir): - SCons.Tool.DefaultToolpath.append(os.path.abspath(site_tools_dir)) - -def version_string(label, module): - version = module.__version__ - build = module.__build__ - if build: - if build[0] != '.': - build = '.' + build - version = version + build - fmt = "\t%s: v%s, %s, by %s on %s\n" - return fmt % (label, - version, - module.__date__, - module.__developer__, - module.__buildsys__) - -def _main(parser): - global exit_status - global this_build_status - - options = parser.values - - # Here's where everything really happens. - - # First order of business: set up default warnings and then - # handle the user's warning options, so that we can issue (or - # suppress) appropriate warnings about anything that might happen, - # as configured by the user. - - default_warnings = [ SCons.Warnings.WarningOnByDefault, - SCons.Warnings.DeprecatedWarning, - ] - - for warning in default_warnings: - SCons.Warnings.enableWarningClass(warning) - SCons.Warnings._warningOut = _scons_internal_warning - SCons.Warnings.process_warn_strings(options.warn) - - # Now that we have the warnings configuration set up, we can actually - # issue (or suppress) any warnings about warning-worthy things that - # occurred while the command-line options were getting parsed. - try: - dw = options.delayed_warnings - except AttributeError: - pass - else: - delayed_warnings.extend(dw) - for warning_type, message in delayed_warnings: - SCons.Warnings.warn(warning_type, message) - - if options.diskcheck: - SCons.Node.FS.set_diskcheck(options.diskcheck) - - # Next, we want to create the FS object that represents the outside - # world's file system, as that's central to a lot of initialization. - # To do this, however, we need to be in the directory from which we - # want to start everything, which means first handling any relevant - # options that might cause us to chdir somewhere (-C, -D, -U, -u). - if options.directory: - script_dir = os.path.abspath(_create_path(options.directory)) - else: - script_dir = os.getcwd() - - target_top = None - if options.climb_up: - target_top = '.' # directory to prepend to targets - while script_dir and not _SConstruct_exists(script_dir, - options.repository, - options.file): - script_dir, last_part = os.path.split(script_dir) - if last_part: - target_top = os.path.join(last_part, target_top) - else: - script_dir = '' - - if script_dir and script_dir != os.getcwd(): - display("scons: Entering directory `%s'" % script_dir) - try: - os.chdir(script_dir) - except OSError: - sys.stderr.write("Could not change directory to %s\n" % script_dir) - - # Now that we're in the top-level SConstruct directory, go ahead - # and initialize the FS object that represents the file system, - # and make it the build engine default. - fs = SCons.Node.FS.get_default_fs() - - for rep in options.repository: - fs.Repository(rep) - - # Now that we have the FS object, the next order of business is to - # check for an SConstruct file (or other specified config file). - # If there isn't one, we can bail before doing any more work. - scripts = [] - if options.file: - scripts.extend(options.file) - if not scripts: - sfile = _SConstruct_exists(repositories=options.repository, - filelist=options.file) - if sfile: - scripts.append(sfile) - - if not scripts: - if options.help: - # There's no SConstruct, but they specified -h. - # Give them the options usage now, before we fail - # trying to read a non-existent SConstruct file. - raise SConsPrintHelpException - raise SCons.Errors.UserError("No SConstruct file found.") - - if scripts[0] == "-": - d = fs.getcwd() - else: - d = fs.File(scripts[0]).dir - fs.set_SConstruct_dir(d) - - _set_debug_values(options) - SCons.Node.implicit_cache = options.implicit_cache - SCons.Node.implicit_deps_changed = options.implicit_deps_changed - SCons.Node.implicit_deps_unchanged = options.implicit_deps_unchanged - - if options.no_exec: - SCons.SConf.dryrun = 1 - SCons.Action.execute_actions = None - if options.question: - SCons.SConf.dryrun = 1 - if options.clean: - SCons.SConf.SetBuildType('clean') - if options.help: - SCons.SConf.SetBuildType('help') - SCons.SConf.SetCacheMode(options.config) - SCons.SConf.SetProgressDisplay(progress_display) - - if options.no_progress or options.silent: - progress_display.set_mode(0) - - if options.site_dir: - _load_site_scons_dir(d, options.site_dir) - elif not options.no_site_dir: - _load_site_scons_dir(d) - - if options.include_dir: - sys.path = options.include_dir + sys.path - - # That should cover (most of) the options. Next, set up the variables - # that hold command-line arguments, so the SConscript files that we - # read and execute have access to them. - targets = [] - xmit_args = [] - for a in parser.largs: - if a[:1] == '-': - continue - if '=' in a: - xmit_args.append(a) - else: - targets.append(a) - SCons.Script._Add_Targets(targets + parser.rargs) - SCons.Script._Add_Arguments(xmit_args) - - # If stdout is not a tty, replace it with a wrapper object to call flush - # after every write. - # - # Tty devices automatically flush after every newline, so the replacement - # isn't necessary. Furthermore, if we replace sys.stdout, the readline - # module will no longer work. This affects the behavior during - # --interactive mode. --interactive should only be used when stdin and - # stdout refer to a tty. - if not hasattr(sys.stdout, 'isatty') or not sys.stdout.isatty(): - sys.stdout = SCons.Util.Unbuffered(sys.stdout) - if not hasattr(sys.stderr, 'isatty') or not sys.stderr.isatty(): - sys.stderr = SCons.Util.Unbuffered(sys.stderr) - - memory_stats.append('before reading SConscript files:') - count_stats.append(('pre-', 'read')) - - # And here's where we (finally) read the SConscript files. - - progress_display("scons: Reading SConscript files ...") - - start_time = time.time() - try: - for script in scripts: - SCons.Script._SConscript._SConscript(fs, script) - except SCons.Errors.StopError, e: - # We had problems reading an SConscript file, such as it - # couldn't be copied in to the VariantDir. Since we're just - # reading SConscript files and haven't started building - # things yet, stop regardless of whether they used -i or -k - # or anything else. - sys.stderr.write("scons: *** %s Stop.\n" % e) - exit_status = 2 - sys.exit(exit_status) - global sconscript_time - sconscript_time = time.time() - start_time - - progress_display("scons: done reading SConscript files.") - - memory_stats.append('after reading SConscript files:') - count_stats.append(('post-', 'read')) - - # Re-{enable,disable} warnings in case they disabled some in - # the SConscript file. - # - # We delay enabling the PythonVersionWarning class until here so that, - # if they explicity disabled it in either in the command line or in - # $SCONSFLAGS, or in the SConscript file, then the search through - # the list of deprecated warning classes will find that disabling - # first and not issue the warning. - #SCons.Warnings.enableWarningClass(SCons.Warnings.PythonVersionWarning) - SCons.Warnings.process_warn_strings(options.warn) - - # Now that we've read the SConscript files, we can check for the - # warning about deprecated Python versions--delayed until here - # in case they disabled the warning in the SConscript files. - if python_version_deprecated(): - msg = "Support for pre-2.4 Python (%s) is deprecated.\n" + \ - " If this will cause hardship, contact dev@scons.tigris.org." - SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning, - msg % python_version_string()) - - if not options.help: - SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment()) - - # Now re-parse the command-line options (any to the left of a '--' - # argument, that is) with any user-defined command-line options that - # the SConscript files may have added to the parser object. This will - # emit the appropriate error message and exit if any unknown option - # was specified on the command line. - - parser.preserve_unknown_options = False - parser.parse_args(parser.largs, options) - - if options.help: - help_text = SCons.Script.help_text - if help_text is None: - # They specified -h, but there was no Help() inside the - # SConscript files. Give them the options usage. - raise SConsPrintHelpException - else: - print help_text - print "Use scons -H for help about command-line options." - exit_status = 0 - return - - # Change directory to the top-level SConstruct directory, then tell - # the Node.FS subsystem that we're all done reading the SConscript - # files and calling Repository() and VariantDir() and changing - # directories and the like, so it can go ahead and start memoizing - # the string values of file system nodes. - - fs.chdir(fs.Top) - - SCons.Node.FS.save_strings(1) - - # Now that we've read the SConscripts we can set the options - # that are SConscript settable: - SCons.Node.implicit_cache = options.implicit_cache - SCons.Node.FS.set_duplicate(options.duplicate) - fs.set_max_drift(options.max_drift) - - SCons.Job.explicit_stack_size = options.stack_size - - if options.md5_chunksize: - SCons.Node.FS.File.md5_chunksize = options.md5_chunksize - - platform = SCons.Platform.platform_module() - - if options.interactive: - SCons.Script.Interactive.interact(fs, OptionsParser, options, - targets, target_top) - - else: - - # Build the targets - nodes = _build_targets(fs, options, targets, target_top) - if not nodes: - exit_status = 2 - -def _build_targets(fs, options, targets, target_top): - - global this_build_status - this_build_status = 0 - - progress_display.set_mode(not (options.no_progress or options.silent)) - display.set_mode(not options.silent) - SCons.Action.print_actions = not options.silent - SCons.Action.execute_actions = not options.no_exec - SCons.Node.FS.do_store_info = not options.no_exec - SCons.SConf.dryrun = options.no_exec - - if options.diskcheck: - SCons.Node.FS.set_diskcheck(options.diskcheck) - - SCons.CacheDir.cache_enabled = not options.cache_disable - SCons.CacheDir.cache_debug = options.cache_debug - SCons.CacheDir.cache_force = options.cache_force - SCons.CacheDir.cache_show = options.cache_show - - if options.no_exec: - CleanTask.execute = CleanTask.show - else: - CleanTask.execute = CleanTask.remove - - lookup_top = None - if targets or SCons.Script.BUILD_TARGETS != SCons.Script._build_plus_default: - # They specified targets on the command line or modified - # BUILD_TARGETS in the SConscript file(s), so if they used -u, - # -U or -D, we have to look up targets relative to the top, - # but we build whatever they specified. - if target_top: - lookup_top = fs.Dir(target_top) - target_top = None - - targets = SCons.Script.BUILD_TARGETS - else: - # There are no targets specified on the command line, - # so if they used -u, -U or -D, we may have to restrict - # what actually gets built. - d = None - if target_top: - if options.climb_up == 1: - # -u, local directory and below - target_top = fs.Dir(target_top) - lookup_top = target_top - elif options.climb_up == 2: - # -D, all Default() targets - target_top = None - lookup_top = None - elif options.climb_up == 3: - # -U, local SConscript Default() targets - target_top = fs.Dir(target_top) - def check_dir(x, target_top=target_top): - if hasattr(x, 'cwd') and not x.cwd is None: - cwd = x.cwd.srcnode() - return cwd == target_top - else: - # x doesn't have a cwd, so it's either not a target, - # or not a file, so go ahead and keep it as a default - # target and let the engine sort it out: - return 1 - d = list(filter(check_dir, SCons.Script.DEFAULT_TARGETS)) - SCons.Script.DEFAULT_TARGETS[:] = d - target_top = None - lookup_top = None - - targets = SCons.Script._Get_Default_Targets(d, fs) - - if not targets: - sys.stderr.write("scons: *** No targets specified and no Default() targets found. Stop.\n") - return None - - def Entry(x, ltop=lookup_top, ttop=target_top, fs=fs): - if isinstance(x, SCons.Node.Node): - node = x - else: - node = None - # Why would ltop be None? Unfortunately this happens. - if ltop is None: ltop = '' - # Curdir becomes important when SCons is called with -u, -C, - # or similar option that changes directory, and so the paths - # of targets given on the command line need to be adjusted. - curdir = os.path.join(os.getcwd(), str(ltop)) - for lookup in SCons.Node.arg2nodes_lookups: - node = lookup(x, curdir=curdir) - if node is not None: - break - if node is None: - node = fs.Entry(x, directory=ltop, create=1) - if ttop and not node.is_under(ttop): - if isinstance(node, SCons.Node.FS.Dir) and ttop.is_under(node): - node = ttop - else: - node = None - return node - - nodes = [_f for _f in map(Entry, targets) if _f] - - task_class = BuildTask # default action is to build targets - opening_message = "Building targets ..." - closing_message = "done building targets." - if options.keep_going: - failure_message = "done building targets (errors occurred during build)." - else: - failure_message = "building terminated because of errors." - if options.question: - task_class = QuestionTask - try: - if options.clean: - task_class = CleanTask - opening_message = "Cleaning targets ..." - closing_message = "done cleaning targets." - if options.keep_going: - failure_message = "done cleaning targets (errors occurred during clean)." - else: - failure_message = "cleaning terminated because of errors." - except AttributeError: - pass - - task_class.progress = ProgressObject - - if options.random: - def order(dependencies): - """Randomize the dependencies.""" - import random - # This is cribbed from the implementation of - # random.shuffle() in Python 2.X. - d = dependencies - for i in range(len(d)-1, 0, -1): - j = int(random.random() * (i+1)) - d[i], d[j] = d[j], d[i] - return d - else: - def order(dependencies): - """Leave the order of dependencies alone.""" - return dependencies - - if options.taskmastertrace_file == '-': - tmtrace = sys.stdout - elif options.taskmastertrace_file: - tmtrace = open(options.taskmastertrace_file, 'wb') - else: - tmtrace = None - taskmaster = SCons.Taskmaster.Taskmaster(nodes, task_class, order, tmtrace) - - # Let the BuildTask objects get at the options to respond to the - # various print_* settings, tree_printer list, etc. - BuildTask.options = options - - global num_jobs - num_jobs = options.num_jobs - jobs = SCons.Job.Jobs(num_jobs, taskmaster) - if num_jobs > 1: - msg = None - if jobs.num_jobs == 1: - msg = "parallel builds are unsupported by this version of Python;\n" + \ - "\tignoring -j or num_jobs option.\n" - elif sys.platform == 'win32': - msg = fetch_win32_parallel_msg() - if msg: - SCons.Warnings.warn(SCons.Warnings.NoParallelSupportWarning, msg) - - memory_stats.append('before building targets:') - count_stats.append(('pre-', 'build')) - - def jobs_postfunc( - jobs=jobs, - options=options, - closing_message=closing_message, - failure_message=failure_message - ): - if jobs.were_interrupted(): - if not options.no_progress and not options.silent: - sys.stderr.write("scons: Build interrupted.\n") - global exit_status - global this_build_status - exit_status = 2 - this_build_status = 2 - - if this_build_status: - progress_display("scons: " + failure_message) - else: - progress_display("scons: " + closing_message) - if not options.no_exec: - if jobs.were_interrupted(): - progress_display("scons: writing .sconsign file.") - SCons.SConsign.write() - - progress_display("scons: " + opening_message) - jobs.run(postfunc = jobs_postfunc) - - memory_stats.append('after building targets:') - count_stats.append(('post-', 'build')) - - return nodes - -def _exec_main(parser, values): - sconsflags = os.environ.get('SCONSFLAGS', '') - all_args = sconsflags.split() + sys.argv[1:] - - options, args = parser.parse_args(all_args, values) - - if isinstance(options.debug, list) and "pdb" in options.debug: - import pdb - pdb.Pdb().runcall(_main, parser) - elif options.profile_file: - # compat layer imports "cProfile" for us if it's available. - from profile import Profile - - # Some versions of Python 2.4 shipped a profiler that had the - # wrong 'c_exception' entry in its dispatch table. Make sure - # we have the right one. (This may put an unnecessary entry - # in the table in earlier versions of Python, but its presence - # shouldn't hurt anything). - try: - dispatch = Profile.dispatch - except AttributeError: - pass - else: - dispatch['c_exception'] = Profile.trace_dispatch_return - - prof = Profile() - try: - prof.runcall(_main, parser) - except SConsPrintHelpException, e: - prof.dump_stats(options.profile_file) - raise e - except SystemExit: - pass - prof.dump_stats(options.profile_file) - else: - _main(parser) - -def main(): - global OptionsParser - global exit_status - global first_command_start - - # Check up front for a Python version we do not support. We - # delay the check for deprecated Python versions until later, - # after the SConscript files have been read, in case they - # disable that warning. - if python_version_unsupported(): - msg = "scons: *** SCons version %s does not run under Python version %s.\n" - sys.stderr.write(msg % (SCons.__version__, python_version_string())) - sys.exit(1) - - parts = ["SCons by Steven Knight et al.:\n"] - try: - import __main__ - parts.append(version_string("script", __main__)) - except (ImportError, AttributeError): - # On Windows there is no scons.py, so there is no - # __main__.__version__, hence there is no script version. - pass - parts.append(version_string("engine", SCons)) - parts.append("Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation") - version = ''.join(parts) - - import SConsOptions - parser = SConsOptions.Parser(version) - values = SConsOptions.SConsValues(parser.get_default_values()) - - OptionsParser = parser - - try: - _exec_main(parser, values) - except SystemExit, s: - if s: - exit_status = s - except KeyboardInterrupt: - print("scons: Build interrupted.") - sys.exit(2) - except SyntaxError, e: - _scons_syntax_error(e) - except SCons.Errors.InternalError: - _scons_internal_error() - except SCons.Errors.UserError, e: - _scons_user_error(e) - except SConsPrintHelpException: - parser.print_help() - exit_status = 0 - except SCons.Errors.BuildError, e: - exit_status = e.exitstatus - except: - # An exception here is likely a builtin Python exception Python - # code in an SConscript file. Show them precisely what the - # problem was and where it happened. - SCons.Script._SConscript.SConscript_exception() - sys.exit(2) - - memory_stats.print_stats() - count_stats.print_stats() - - if print_objects: - SCons.Debug.listLoggedInstances('*') - #SCons.Debug.dumpLoggedInstances('*') - - if print_memoizer: - SCons.Memoize.Dump("Memoizer (memory cache) hits and misses:") - - # Dump any development debug info that may have been enabled. - # These are purely for internal debugging during development, so - # there's no need to control them with --debug= options; they're - # controlled by changing the source code. - SCons.Debug.dump_caller_counts() - SCons.Taskmaster.dump_stats() - - if print_time: - total_time = time.time() - SCons.Script.start_time - if num_jobs == 1: - ct = cumulative_command_time - else: - if last_command_end is None or first_command_start is None: - ct = 0.0 - else: - ct = last_command_end - first_command_start - scons_time = total_time - sconscript_time - ct - print "Total build time: %f seconds"%total_time - print "Total SConscript file execution time: %f seconds"%sconscript_time - print "Total SCons execution time: %f seconds"%scons_time - print "Total command execution time: %f seconds"%ct - - sys.exit(exit_status) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py deleted file mode 100644 index 913a6ee59..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py +++ /dev/null @@ -1,939 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Script/SConsOptions.py 5023 2010/06/14 22:05:46 scons" - -import optparse -import re -import sys -import textwrap - -no_hyphen_re = re.compile(r'(\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') - -try: - from gettext import gettext -except ImportError: - def gettext(message): - return message -_ = gettext - -import SCons.Node.FS -import SCons.Warnings - -OptionValueError = optparse.OptionValueError -SUPPRESS_HELP = optparse.SUPPRESS_HELP - -diskcheck_all = SCons.Node.FS.diskcheck_types() - -def diskcheck_convert(value): - if value is None: - return [] - if not SCons.Util.is_List(value): - value = value.split(',') - result = [] - for v in value: - v = v.lower() - if v == 'all': - result = diskcheck_all - elif v == 'none': - result = [] - elif v in diskcheck_all: - result.append(v) - else: - raise ValueError(v) - return result - -class SConsValues(optparse.Values): - """ - Holder class for uniform access to SCons options, regardless - of whether or not they can be set on the command line or in the - SConscript files (using the SetOption() function). - - A SCons option value can originate three different ways: - - 1) set on the command line; - 2) set in an SConscript file; - 3) the default setting (from the the op.add_option() - calls in the Parser() function, below). - - The command line always overrides a value set in a SConscript file, - which in turn always overrides default settings. Because we want - to support user-specified options in the SConscript file itself, - though, we may not know about all of the options when the command - line is first parsed, so we can't make all the necessary precedence - decisions at the time the option is configured. - - The solution implemented in this class is to keep these different sets - of settings separate (command line, SConscript file, and default) - and to override the __getattr__() method to check them in turn. - This should allow the rest of the code to just fetch values as - attributes of an instance of this class, without having to worry - about where they came from. - - Note that not all command line options are settable from SConscript - files, and the ones that are must be explicitly added to the - "settable" list in this class, and optionally validated and coerced - in the set_option() method. - """ - - def __init__(self, defaults): - self.__dict__['__defaults__'] = defaults - self.__dict__['__SConscript_settings__'] = {} - - def __getattr__(self, attr): - """ - Fetches an options value, checking first for explicit settings - from the command line (which are direct attributes), then the - SConscript file settings, then the default values. - """ - try: - return self.__dict__[attr] - except KeyError: - try: - return self.__dict__['__SConscript_settings__'][attr] - except KeyError: - return getattr(self.__dict__['__defaults__'], attr) - - settable = [ - 'clean', - 'diskcheck', - 'duplicate', - 'help', - 'implicit_cache', - 'max_drift', - 'md5_chunksize', - 'no_exec', - 'num_jobs', - 'random', - 'stack_size', - 'warn', - ] - - def set_option(self, name, value): - """ - Sets an option from an SConscript file. - """ - if not name in self.settable: - raise SCons.Errors.UserError("This option is not settable from a SConscript file: %s"%name) - - if name == 'num_jobs': - try: - value = int(value) - if value < 1: - raise ValueError - except ValueError: - raise SCons.Errors.UserError("A positive integer is required: %s"%repr(value)) - elif name == 'max_drift': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError("An integer is required: %s"%repr(value)) - elif name == 'duplicate': - try: - value = str(value) - except ValueError: - raise SCons.Errors.UserError("A string is required: %s"%repr(value)) - if not value in SCons.Node.FS.Valid_Duplicates: - raise SCons.Errors.UserError("Not a valid duplication style: %s" % value) - # Set the duplicate style right away so it can affect linking - # of SConscript files. - SCons.Node.FS.set_duplicate(value) - elif name == 'diskcheck': - try: - value = diskcheck_convert(value) - except ValueError, v: - raise SCons.Errors.UserError("Not a valid diskcheck value: %s"%v) - if 'diskcheck' not in self.__dict__: - # No --diskcheck= option was specified on the command line. - # Set this right away so it can affect the rest of the - # file/Node lookups while processing the SConscript files. - SCons.Node.FS.set_diskcheck(value) - elif name == 'stack_size': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError("An integer is required: %s"%repr(value)) - elif name == 'md5_chunksize': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError("An integer is required: %s"%repr(value)) - elif name == 'warn': - if SCons.Util.is_String(value): - value = [value] - value = self.__SConscript_settings__.get(name, []) + value - SCons.Warnings.process_warn_strings(value) - - self.__SConscript_settings__[name] = value - -class SConsOption(optparse.Option): - def convert_value(self, opt, value): - if value is not None: - if self.nargs in (1, '?'): - return self.check_value(opt, value) - else: - return tuple([self.check_value(opt, v) for v in value]) - - def process(self, opt, value, values, parser): - - # First, convert the value(s) to the right type. Howl if any - # value(s) are bogus. - value = self.convert_value(opt, value) - - # And then take whatever action is expected of us. - # This is a separate method to make life easier for - # subclasses to add new actions. - return self.take_action( - self.action, self.dest, opt, value, values, parser) - - def _check_nargs_optional(self): - if self.nargs == '?' and self._short_opts: - fmt = "option %s: nargs='?' is incompatible with short options" - raise SCons.Errors.UserError(fmt % self._short_opts[0]) - - try: - _orig_CONST_ACTIONS = optparse.Option.CONST_ACTIONS - - _orig_CHECK_METHODS = optparse.Option.CHECK_METHODS - - except AttributeError: - # optparse.Option had no CONST_ACTIONS before Python 2.5. - - _orig_CONST_ACTIONS = ("store_const",) - - def _check_const(self): - if self.action not in self.CONST_ACTIONS and self.const is not None: - raise OptionError( - "'const' must not be supplied for action %r" % self.action, - self) - - # optparse.Option collects its list of unbound check functions - # up front. This sucks because it means we can't just override - # the _check_const() function like a normal method, we have to - # actually replace it in the list. This seems to be the most - # straightforward way to do that. - - _orig_CHECK_METHODS = [optparse.Option._check_action, - optparse.Option._check_type, - optparse.Option._check_choice, - optparse.Option._check_dest, - _check_const, - optparse.Option._check_nargs, - optparse.Option._check_callback] - - CHECK_METHODS = _orig_CHECK_METHODS + [_check_nargs_optional] - - CONST_ACTIONS = _orig_CONST_ACTIONS + optparse.Option.TYPED_ACTIONS - -class SConsOptionGroup(optparse.OptionGroup): - """ - A subclass for SCons-specific option groups. - - The only difference between this and the base class is that we print - the group's help text flush left, underneath their own title but - lined up with the normal "SCons Options". - """ - def format_help(self, formatter): - """ - Format an option group's help text, outdenting the title so it's - flush with the "SCons Options" title we print at the top. - """ - formatter.dedent() - result = formatter.format_heading(self.title) - formatter.indent() - result = result + optparse.OptionContainer.format_help(self, formatter) - return result - -class SConsOptionParser(optparse.OptionParser): - preserve_unknown_options = False - - def error(self, msg): - self.print_usage(sys.stderr) - sys.stderr.write("SCons error: %s\n" % msg) - sys.exit(2) - - def _process_long_opt(self, rargs, values): - """ - SCons-specific processing of long options. - - This is copied directly from the normal - optparse._process_long_opt() method, except that, if configured - to do so, we catch the exception thrown when an unknown option - is encountered and just stick it back on the "leftover" arguments - for later (re-)processing. - """ - arg = rargs.pop(0) - - # Value explicitly attached to arg? Pretend it's the next - # argument. - if "=" in arg: - (opt, next_arg) = arg.split("=", 1) - rargs.insert(0, next_arg) - had_explicit_value = True - else: - opt = arg - had_explicit_value = False - - try: - opt = self._match_long_opt(opt) - except optparse.BadOptionError: - if self.preserve_unknown_options: - # SCons-specific: if requested, add unknown options to - # the "leftover arguments" list for later processing. - self.largs.append(arg) - if had_explicit_value: - # The unknown option will be re-processed later, - # so undo the insertion of the explicit value. - rargs.pop(0) - return - raise - - option = self._long_opt[opt] - if option.takes_value(): - nargs = option.nargs - if nargs == '?': - if had_explicit_value: - value = rargs.pop(0) - else: - value = option.const - elif len(rargs) < nargs: - if nargs == 1: - self.error(_("%s option requires an argument") % opt) - else: - self.error(_("%s option requires %d arguments") - % (opt, nargs)) - elif nargs == 1: - value = rargs.pop(0) - else: - value = tuple(rargs[0:nargs]) - del rargs[0:nargs] - - elif had_explicit_value: - self.error(_("%s option does not take a value") % opt) - - else: - value = None - - option.process(opt, value, values, self) - - def add_local_option(self, *args, **kw): - """ - Adds a local option to the parser. - - This is initiated by a SetOption() call to add a user-defined - command-line option. We add the option to a separate option - group for the local options, creating the group if necessary. - """ - try: - group = self.local_option_group - except AttributeError: - group = SConsOptionGroup(self, 'Local Options') - group = self.add_option_group(group) - self.local_option_group = group - - result = group.add_option(*args, **kw) - - if result: - # The option was added succesfully. We now have to add the - # default value to our object that holds the default values - # (so that an attempt to fetch the option's attribute will - # yield the default value when not overridden) and then - # we re-parse the leftover command-line options, so that - # any value overridden on the command line is immediately - # available if the user turns around and does a GetOption() - # right away. - setattr(self.values.__defaults__, result.dest, result.default) - self.parse_args(self.largs, self.values) - - return result - -class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter): - def format_usage(self, usage): - return "usage: %s\n" % usage - - def format_heading(self, heading): - """ - This translates any heading of "options" or "Options" into - "SCons Options." Unfortunately, we have to do this here, - because those titles are hard-coded in the optparse calls. - """ - if heading == 'options': - # The versions of optparse.py shipped with Pythons 2.3 and - # 2.4 pass this in uncapitalized; override that so we get - # consistent output on all versions. - heading = "Options" - if heading == 'Options': - heading = "SCons Options" - return optparse.IndentedHelpFormatter.format_heading(self, heading) - - def format_option(self, option): - """ - A copy of the normal optparse.IndentedHelpFormatter.format_option() - method. This has been snarfed so we can modify text wrapping to - out liking: - - -- add our own regular expression that doesn't break on hyphens - (so things like --no-print-directory don't get broken); - - -- wrap the list of options themselves when it's too long - (the wrapper.fill(opts) call below); - - -- set the subsequent_indent when wrapping the help_text. - """ - # The help for each option consists of two parts: - # * the opt strings and metavars - # eg. ("-x", or "-fFILENAME, --file=FILENAME") - # * the user-supplied help string - # eg. ("turn on expert mode", "read data from FILENAME") - # - # If possible, we write both of these on the same line: - # -x turn on expert mode - # - # But if the opt string list is too long, we put the help - # string on a second line, indented to the same column it would - # start in if it fit on the first line. - # -fFILENAME, --file=FILENAME - # read data from FILENAME - result = [] - - try: - opts = self.option_strings[option] - except AttributeError: - # The Python 2.3 version of optparse attaches this to - # to the option argument, not to this object. - opts = option.option_strings - - opt_width = self.help_position - self.current_indent - 2 - if len(opts) > opt_width: - wrapper = textwrap.TextWrapper(width=self.width, - initial_indent = ' ', - subsequent_indent = ' ') - wrapper.wordsep_re = no_hyphen_re - opts = wrapper.fill(opts) + '\n' - indent_first = self.help_position - else: # start help on same line as opts - opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts) - indent_first = 0 - result.append(opts) - if option.help: - - try: - expand_default = self.expand_default - except AttributeError: - # The HelpFormatter base class in the Python 2.3 version - # of optparse has no expand_default() method. - help_text = option.help - else: - help_text = expand_default(option) - - # SCons: indent every line of the help text but the first. - wrapper = textwrap.TextWrapper(width=self.help_width, - subsequent_indent = ' ') - wrapper.wordsep_re = no_hyphen_re - help_lines = wrapper.wrap(help_text) - result.append("%*s%s\n" % (indent_first, "", help_lines[0])) - for line in help_lines[1:]: - result.append("%*s%s\n" % (self.help_position, "", line)) - elif opts[-1] != "\n": - result.append("\n") - return "".join(result) - - # For consistent help output across Python versions, we provide a - # subclass copy of format_option_strings() and these two variables. - # This is necessary (?) for Python2.3, which otherwise concatenates - # a short option with its metavar. - _short_opt_fmt = "%s %s" - _long_opt_fmt = "%s=%s" - - def format_option_strings(self, option): - """Return a comma-separated list of option strings & metavariables.""" - if option.takes_value(): - metavar = option.metavar or option.dest.upper() - short_opts = [] - for sopt in option._short_opts: - short_opts.append(self._short_opt_fmt % (sopt, metavar)) - long_opts = [] - for lopt in option._long_opts: - long_opts.append(self._long_opt_fmt % (lopt, metavar)) - else: - short_opts = option._short_opts - long_opts = option._long_opts - - if self.short_first: - opts = short_opts + long_opts - else: - opts = long_opts + short_opts - - return ", ".join(opts) - -def Parser(version): - """ - Returns an options parser object initialized with the standard - SCons options. - """ - - formatter = SConsIndentedHelpFormatter(max_help_position=30) - - op = SConsOptionParser(option_class=SConsOption, - add_help_option=False, - formatter=formatter, - usage="usage: scons [OPTION] [TARGET] ...",) - - op.preserve_unknown_options = True - op.version = version - - # Add the options to the parser we just created. - # - # These are in the order we want them to show up in the -H help - # text, basically alphabetical. Each op.add_option() call below - # should have a consistent format: - # - # op.add_option("-L", "--long-option-name", - # nargs=1, type="string", - # dest="long_option_name", default='foo', - # action="callback", callback=opt_long_option, - # help="help text goes here", - # metavar="VAR") - # - # Even though the optparse module constructs reasonable default - # destination names from the long option names, we're going to be - # explicit about each one for easier readability and so this code - # will at least show up when grepping the source for option attribute - # names, or otherwise browsing the source code. - - # options ignored for compatibility - def opt_ignore(option, opt, value, parser): - sys.stderr.write("Warning: ignoring %s option\n" % opt) - op.add_option("-b", "-d", "-e", "-m", "-S", "-t", "-w", - "--environment-overrides", - "--no-keep-going", - "--no-print-directory", - "--print-directory", - "--stop", - "--touch", - action="callback", callback=opt_ignore, - help="Ignored for compatibility.") - - op.add_option('-c', '--clean', '--remove', - dest="clean", default=False, - action="store_true", - help="Remove specified targets and dependencies.") - - op.add_option('-C', '--directory', - nargs=1, type="string", - dest="directory", default=[], - action="append", - help="Change to DIR before doing anything.", - metavar="DIR") - - op.add_option('--cache-debug', - nargs=1, - dest="cache_debug", default=None, - action="store", - help="Print CacheDir debug info to FILE.", - metavar="FILE") - - op.add_option('--cache-disable', '--no-cache', - dest='cache_disable', default=False, - action="store_true", - help="Do not retrieve built targets from CacheDir.") - - op.add_option('--cache-force', '--cache-populate', - dest='cache_force', default=False, - action="store_true", - help="Copy already-built targets into the CacheDir.") - - op.add_option('--cache-show', - dest='cache_show', default=False, - action="store_true", - help="Print build actions for files from CacheDir.") - - config_options = ["auto", "force" ,"cache"] - - def opt_config(option, opt, value, parser, c_options=config_options): - if not value in c_options: - raise OptionValueError("Warning: %s is not a valid config type" % value) - setattr(parser.values, option.dest, value) - opt_config_help = "Controls Configure subsystem: %s." \ - % ", ".join(config_options) - op.add_option('--config', - nargs=1, type="string", - dest="config", default="auto", - action="callback", callback=opt_config, - help = opt_config_help, - metavar="MODE") - - op.add_option('-D', - dest="climb_up", default=None, - action="store_const", const=2, - help="Search up directory tree for SConstruct, " - "build all Default() targets.") - - deprecated_debug_options = { - "dtree" : '; please use --tree=derived instead', - "nomemoizer" : ' and has no effect', - "stree" : '; please use --tree=all,status instead', - "tree" : '; please use --tree=all instead', - } - - debug_options = ["count", "explain", "findlibs", - "includes", "memoizer", "memory", "objects", - "pdb", "presub", "stacktrace", - "time"] + list(deprecated_debug_options.keys()) - - def opt_debug(option, opt, value, parser, - debug_options=debug_options, - deprecated_debug_options=deprecated_debug_options): - if value in debug_options: - parser.values.debug.append(value) - if value in deprecated_debug_options.keys(): - try: - parser.values.delayed_warnings - except AttributeError: - parser.values.delayed_warnings = [] - msg = deprecated_debug_options[value] - w = "The --debug=%s option is deprecated%s." % (value, msg) - t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w) - parser.values.delayed_warnings.append(t) - else: - raise OptionValueError("Warning: %s is not a valid debug type" % value) - opt_debug_help = "Print various types of debugging information: %s." \ - % ", ".join(debug_options) - op.add_option('--debug', - nargs=1, type="string", - dest="debug", default=[], - action="callback", callback=opt_debug, - help=opt_debug_help, - metavar="TYPE") - - def opt_diskcheck(option, opt, value, parser): - try: - diskcheck_value = diskcheck_convert(value) - except ValueError, e: - raise OptionValueError("Warning: `%s' is not a valid diskcheck type" % e) - setattr(parser.values, option.dest, diskcheck_value) - - op.add_option('--diskcheck', - nargs=1, type="string", - dest='diskcheck', default=None, - action="callback", callback=opt_diskcheck, - help="Enable specific on-disk checks.", - metavar="TYPE") - - def opt_duplicate(option, opt, value, parser): - if not value in SCons.Node.FS.Valid_Duplicates: - raise OptionValueError("`%s' is not a valid duplication style." % value) - setattr(parser.values, option.dest, value) - # Set the duplicate style right away so it can affect linking - # of SConscript files. - SCons.Node.FS.set_duplicate(value) - - opt_duplicate_help = "Set the preferred duplication methods. Must be one of " \ - + ", ".join(SCons.Node.FS.Valid_Duplicates) - - op.add_option('--duplicate', - nargs=1, type="string", - dest="duplicate", default='hard-soft-copy', - action="callback", callback=opt_duplicate, - help=opt_duplicate_help) - - op.add_option('-f', '--file', '--makefile', '--sconstruct', - nargs=1, type="string", - dest="file", default=[], - action="append", - help="Read FILE as the top-level SConstruct file.") - - op.add_option('-h', '--help', - dest="help", default=False, - action="store_true", - help="Print defined help message, or this one.") - - op.add_option("-H", "--help-options", - action="help", - help="Print this message and exit.") - - op.add_option('-i', '--ignore-errors', - dest='ignore_errors', default=False, - action="store_true", - help="Ignore errors from build actions.") - - op.add_option('-I', '--include-dir', - nargs=1, - dest='include_dir', default=[], - action="append", - help="Search DIR for imported Python modules.", - metavar="DIR") - - op.add_option('--implicit-cache', - dest='implicit_cache', default=False, - action="store_true", - help="Cache implicit dependencies") - - def opt_implicit_deps(option, opt, value, parser): - setattr(parser.values, 'implicit_cache', True) - setattr(parser.values, option.dest, True) - - op.add_option('--implicit-deps-changed', - dest="implicit_deps_changed", default=False, - action="callback", callback=opt_implicit_deps, - help="Ignore cached implicit dependencies.") - - op.add_option('--implicit-deps-unchanged', - dest="implicit_deps_unchanged", default=False, - action="callback", callback=opt_implicit_deps, - help="Ignore changes in implicit dependencies.") - - op.add_option('--interact', '--interactive', - dest='interactive', default=False, - action="store_true", - help="Run in interactive mode.") - - op.add_option('-j', '--jobs', - nargs=1, type="int", - dest="num_jobs", default=1, - action="store", - help="Allow N jobs at once.", - metavar="N") - - op.add_option('-k', '--keep-going', - dest='keep_going', default=False, - action="store_true", - help="Keep going when a target can't be made.") - - op.add_option('--max-drift', - nargs=1, type="int", - dest='max_drift', default=SCons.Node.FS.default_max_drift, - action="store", - help="Set maximum system clock drift to N seconds.", - metavar="N") - - op.add_option('--md5-chunksize', - nargs=1, type="int", - dest='md5_chunksize', default=SCons.Node.FS.File.md5_chunksize, - action="store", - help="Set chunk-size for MD5 signature computation to N kilobytes.", - metavar="N") - - op.add_option('-n', '--no-exec', '--just-print', '--dry-run', '--recon', - dest='no_exec', default=False, - action="store_true", - help="Don't build; just print commands.") - - op.add_option('--no-site-dir', - dest='no_site_dir', default=False, - action="store_true", - help="Don't search or use the usual site_scons dir.") - - op.add_option('--profile', - nargs=1, - dest="profile_file", default=None, - action="store", - help="Profile SCons and put results in FILE.", - metavar="FILE") - - op.add_option('-q', '--question', - dest="question", default=False, - action="store_true", - help="Don't build; exit status says if up to date.") - - op.add_option('-Q', - dest='no_progress', default=False, - action="store_true", - help="Suppress \"Reading/Building\" progress messages.") - - op.add_option('--random', - dest="random", default=False, - action="store_true", - help="Build dependencies in random order.") - - op.add_option('-s', '--silent', '--quiet', - dest="silent", default=False, - action="store_true", - help="Don't print commands.") - - op.add_option('--site-dir', - nargs=1, - dest='site_dir', default=None, - action="store", - help="Use DIR instead of the usual site_scons dir.", - metavar="DIR") - - op.add_option('--stack-size', - nargs=1, type="int", - dest='stack_size', - action="store", - help="Set the stack size of the threads used to run jobs to N kilobytes.", - metavar="N") - - op.add_option('--taskmastertrace', - nargs=1, - dest="taskmastertrace_file", default=None, - action="store", - help="Trace Node evaluation to FILE.", - metavar="FILE") - - tree_options = ["all", "derived", "prune", "status"] - - def opt_tree(option, opt, value, parser, tree_options=tree_options): - import Main - tp = Main.TreePrinter() - for o in value.split(','): - if o == 'all': - tp.derived = False - elif o == 'derived': - tp.derived = True - elif o == 'prune': - tp.prune = True - elif o == 'status': - tp.status = True - else: - raise OptionValueError("Warning: %s is not a valid --tree option" % o) - parser.values.tree_printers.append(tp) - - opt_tree_help = "Print a dependency tree in various formats: %s." \ - % ", ".join(tree_options) - - op.add_option('--tree', - nargs=1, type="string", - dest="tree_printers", default=[], - action="callback", callback=opt_tree, - help=opt_tree_help, - metavar="OPTIONS") - - op.add_option('-u', '--up', '--search-up', - dest="climb_up", default=0, - action="store_const", const=1, - help="Search up directory tree for SConstruct, " - "build targets at or below current directory.") - - op.add_option('-U', - dest="climb_up", default=0, - action="store_const", const=3, - help="Search up directory tree for SConstruct, " - "build Default() targets from local SConscript.") - - def opt_version(option, opt, value, parser): - sys.stdout.write(parser.version + '\n') - sys.exit(0) - op.add_option("-v", "--version", - action="callback", callback=opt_version, - help="Print the SCons version number and exit.") - - def opt_warn(option, opt, value, parser, tree_options=tree_options): - if SCons.Util.is_String(value): - value = value.split(',') - parser.values.warn.extend(value) - - op.add_option('--warn', '--warning', - nargs=1, type="string", - dest="warn", default=[], - action="callback", callback=opt_warn, - help="Enable or disable warnings.", - metavar="WARNING-SPEC") - - op.add_option('-Y', '--repository', '--srcdir', - nargs=1, - dest="repository", default=[], - action="append", - help="Search REPOSITORY for source and target files.") - - # Options from Make and Cons classic that we do not yet support, - # but which we may support someday and whose (potential) meanings - # we don't want to change. These all get a "the -X option is not - # yet implemented" message and don't show up in the help output. - - def opt_not_yet(option, opt, value, parser): - msg = "Warning: the %s option is not yet implemented\n" % opt - sys.stderr.write(msg) - - op.add_option('-l', '--load-average', '--max-load', - nargs=1, type="int", - dest="load_average", default=0, - action="callback", callback=opt_not_yet, - # action="store", - # help="Don't start multiple jobs unless load is below " - # "LOAD-AVERAGE." - help=SUPPRESS_HELP) - op.add_option('--list-actions', - dest="list_actions", - action="callback", callback=opt_not_yet, - # help="Don't build; list files and build actions." - help=SUPPRESS_HELP) - op.add_option('--list-derived', - dest="list_derived", - action="callback", callback=opt_not_yet, - # help="Don't build; list files that would be built." - help=SUPPRESS_HELP) - op.add_option('--list-where', - dest="list_where", - action="callback", callback=opt_not_yet, - # help="Don't build; list files and where defined." - help=SUPPRESS_HELP) - op.add_option('-o', '--old-file', '--assume-old', - nargs=1, type="string", - dest="old_file", default=[], - action="callback", callback=opt_not_yet, - # action="append", - # help = "Consider FILE to be old; don't rebuild it." - help=SUPPRESS_HELP) - op.add_option('--override', - nargs=1, type="string", - action="callback", callback=opt_not_yet, - dest="override", - # help="Override variables as specified in FILE." - help=SUPPRESS_HELP) - op.add_option('-p', - action="callback", callback=opt_not_yet, - dest="p", - # help="Print internal environments/objects." - help=SUPPRESS_HELP) - op.add_option('-r', '-R', '--no-builtin-rules', '--no-builtin-variables', - action="callback", callback=opt_not_yet, - dest="no_builtin_rules", - # help="Clear default environments and variables." - help=SUPPRESS_HELP) - op.add_option('--write-filenames', - nargs=1, type="string", - dest="write_filenames", - action="callback", callback=opt_not_yet, - # help="Write all filenames examined into FILE." - help=SUPPRESS_HELP) - op.add_option('-W', '--new-file', '--assume-new', '--what-if', - nargs=1, type="string", - dest="new_file", - action="callback", callback=opt_not_yet, - # help="Consider FILE to be changed." - help=SUPPRESS_HELP) - op.add_option('--warn-undefined-variables', - dest="warn_undefined_variables", - action="callback", callback=opt_not_yet, - # help="Warn when an undefined variable is referenced." - help=SUPPRESS_HELP) - - return op - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py deleted file mode 100644 index 5a22db735..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py +++ /dev/null @@ -1,640 +0,0 @@ -"""SCons.Script.SConscript - -This module defines the Python API provided to SConscript and SConstruct -files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -from __future__ import division - -__revision__ = "src/engine/SCons/Script/SConscript.py 5023 2010/06/14 22:05:46 scons" - -import SCons -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Environment -import SCons.Errors -import SCons.Node -import SCons.Node.Alias -import SCons.Node.FS -import SCons.Platform -import SCons.SConf -import SCons.Script.Main -import SCons.Tool -import SCons.Util - -import collections -import os -import os.path -import re -import sys -import traceback - -# The following variables used to live in this module. Some -# SConscript files out there may have referred to them directly as -# SCons.Script.SConscript.*. This is now supported by some special -# handling towards the bottom of the SConscript.__init__.py module. -#Arguments = {} -#ArgList = [] -#BuildTargets = TargetList() -#CommandLineTargets = [] -#DefaultTargets = [] - -class SConscriptReturn(Exception): - pass - -launch_dir = os.path.abspath(os.curdir) - -GlobalDict = None - -# global exports set by Export(): -global_exports = {} - -# chdir flag -sconscript_chdir = 1 - -def get_calling_namespaces(): - """Return the locals and globals for the function that called - into this module in the current call stack.""" - try: 1//0 - except ZeroDivisionError: - # Don't start iterating with the current stack-frame to - # prevent creating reference cycles (f_back is safe). - frame = sys.exc_info()[2].tb_frame.f_back - - # Find the first frame that *isn't* from this file. This means - # that we expect all of the SCons frames that implement an Export() - # or SConscript() call to be in this file, so that we can identify - # the first non-Script.SConscript frame as the user's local calling - # environment, and the locals and globals dictionaries from that - # frame as the calling namespaces. See the comment below preceding - # the DefaultEnvironmentCall block for even more explanation. - while frame.f_globals.get("__name__") == __name__: - frame = frame.f_back - - return frame.f_locals, frame.f_globals - - -def compute_exports(exports): - """Compute a dictionary of exports given one of the parameters - to the Export() function or the exports argument to SConscript().""" - - loc, glob = get_calling_namespaces() - - retval = {} - try: - for export in exports: - if SCons.Util.is_Dict(export): - retval.update(export) - else: - try: - retval[export] = loc[export] - except KeyError: - retval[export] = glob[export] - except KeyError, x: - raise SCons.Errors.UserError("Export of non-existent variable '%s'"%x) - - return retval - -class Frame(object): - """A frame on the SConstruct/SConscript call stack""" - def __init__(self, fs, exports, sconscript): - self.globals = BuildDefaultGlobals() - self.retval = None - self.prev_dir = fs.getcwd() - self.exports = compute_exports(exports) # exports from the calling SConscript - # make sure the sconscript attr is a Node. - if isinstance(sconscript, SCons.Node.Node): - self.sconscript = sconscript - elif sconscript == '-': - self.sconscript = None - else: - self.sconscript = fs.File(str(sconscript)) - -# the SConstruct/SConscript call stack: -call_stack = [] - -# For documentation on the methods in this file, see the scons man-page - -def Return(*vars, **kw): - retval = [] - try: - fvars = SCons.Util.flatten(vars) - for var in fvars: - for v in var.split(): - retval.append(call_stack[-1].globals[v]) - except KeyError, x: - raise SCons.Errors.UserError("Return of non-existent variable '%s'"%x) - - if len(retval) == 1: - call_stack[-1].retval = retval[0] - else: - call_stack[-1].retval = tuple(retval) - - stop = kw.get('stop', True) - - if stop: - raise SConscriptReturn - - -stack_bottom = '% Stack boTTom %' # hard to define a variable w/this name :) - -def _SConscript(fs, *files, **kw): - top = fs.Top - sd = fs.SConstruct_dir.rdir() - exports = kw.get('exports', []) - - # evaluate each SConscript file - results = [] - for fn in files: - call_stack.append(Frame(fs, exports, fn)) - old_sys_path = sys.path - try: - SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1 - if fn == "-": - exec sys.stdin in call_stack[-1].globals - else: - if isinstance(fn, SCons.Node.Node): - f = fn - else: - f = fs.File(str(fn)) - _file_ = None - - # Change directory to the top of the source - # tree to make sure the os's cwd and the cwd of - # fs match so we can open the SConscript. - fs.chdir(top, change_os_dir=1) - if f.rexists(): - actual = f.rfile() - _file_ = open(actual.get_abspath(), "r") - elif f.srcnode().rexists(): - actual = f.srcnode().rfile() - _file_ = open(actual.get_abspath(), "r") - elif f.has_src_builder(): - # The SConscript file apparently exists in a source - # code management system. Build it, but then clear - # the builder so that it doesn't get built *again* - # during the actual build phase. - f.build() - f.built() - f.builder_set(None) - if f.exists(): - _file_ = open(f.get_abspath(), "r") - if _file_: - # Chdir to the SConscript directory. Use a path - # name relative to the SConstruct file so that if - # we're using the -f option, we're essentially - # creating a parallel SConscript directory structure - # in our local directory tree. - # - # XXX This is broken for multiple-repository cases - # where the SConstruct and SConscript files might be - # in different Repositories. For now, cross that - # bridge when someone comes to it. - try: - src_dir = kw['src_dir'] - except KeyError: - ldir = fs.Dir(f.dir.get_path(sd)) - else: - ldir = fs.Dir(src_dir) - if not ldir.is_under(f.dir): - # They specified a source directory, but - # it's above the SConscript directory. - # Do the sensible thing and just use the - # SConcript directory. - ldir = fs.Dir(f.dir.get_path(sd)) - try: - fs.chdir(ldir, change_os_dir=sconscript_chdir) - except OSError: - # There was no local directory, so we should be - # able to chdir to the Repository directory. - # Note that we do this directly, not through - # fs.chdir(), because we still need to - # interpret the stuff within the SConscript file - # relative to where we are logically. - fs.chdir(ldir, change_os_dir=0) - os.chdir(actual.dir.get_abspath()) - - # Append the SConscript directory to the beginning - # of sys.path so Python modules in the SConscript - # directory can be easily imported. - sys.path = [ f.dir.get_abspath() ] + sys.path - - # This is the magic line that actually reads up - # and executes the stuff in the SConscript file. - # The locals for this frame contain the special - # bottom-of-the-stack marker so that any - # exceptions that occur when processing this - # SConscript can base the printed frames at this - # level and not show SCons internals as well. - call_stack[-1].globals.update({stack_bottom:1}) - old_file = call_stack[-1].globals.get('__file__') - try: - del call_stack[-1].globals['__file__'] - except KeyError: - pass - try: - try: - exec _file_ in call_stack[-1].globals - except SConscriptReturn: - pass - finally: - if old_file is not None: - call_stack[-1].globals.update({__file__:old_file}) - else: - SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning, - "Ignoring missing SConscript '%s'" % f.path) - - finally: - SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1 - sys.path = old_sys_path - frame = call_stack.pop() - try: - fs.chdir(frame.prev_dir, change_os_dir=sconscript_chdir) - except OSError: - # There was no local directory, so chdir to the - # Repository directory. Like above, we do this - # directly. - fs.chdir(frame.prev_dir, change_os_dir=0) - rdir = frame.prev_dir.rdir() - rdir._create() # Make sure there's a directory there. - try: - os.chdir(rdir.get_abspath()) - except OSError, e: - # We still couldn't chdir there, so raise the error, - # but only if actions are being executed. - # - # If the -n option was used, the directory would *not* - # have been created and we should just carry on and - # let things muddle through. This isn't guaranteed - # to work if the SConscript files are reading things - # from disk (for example), but it should work well - # enough for most configurations. - if SCons.Action.execute_actions: - raise e - - results.append(frame.retval) - - # if we only have one script, don't return a tuple - if len(results) == 1: - return results[0] - else: - return tuple(results) - -def SConscript_exception(file=sys.stderr): - """Print an exception stack trace just for the SConscript file(s). - This will show users who have Python errors where the problem is, - without cluttering the output with all of the internal calls leading - up to where we exec the SConscript.""" - exc_type, exc_value, exc_tb = sys.exc_info() - tb = exc_tb - while tb and stack_bottom not in tb.tb_frame.f_locals: - tb = tb.tb_next - if not tb: - # We did not find our exec statement, so this was actually a bug - # in SCons itself. Show the whole stack. - tb = exc_tb - stack = traceback.extract_tb(tb) - try: - type = exc_type.__name__ - except AttributeError: - type = str(exc_type) - if type[:11] == "exceptions.": - type = type[11:] - file.write('%s: %s:\n' % (type, exc_value)) - for fname, line, func, text in stack: - file.write(' File "%s", line %d:\n' % (fname, line)) - file.write(' %s\n' % text) - -def annotate(node): - """Annotate a node with the stack frame describing the - SConscript file and line number that created it.""" - tb = sys.exc_info()[2] - while tb and stack_bottom not in tb.tb_frame.f_locals: - tb = tb.tb_next - if not tb: - # We did not find any exec of an SConscript file: what?! - raise SCons.Errors.InternalError("could not find SConscript stack frame") - node.creator = traceback.extract_stack(tb)[0] - -# The following line would cause each Node to be annotated using the -# above function. Unfortunately, this is a *huge* performance hit, so -# leave this disabled until we find a more efficient mechanism. -#SCons.Node.Annotate = annotate - -class SConsEnvironment(SCons.Environment.Base): - """An Environment subclass that contains all of the methods that - are particular to the wrapper SCons interface and which aren't - (or shouldn't be) part of the build engine itself. - - Note that not all of the methods of this class have corresponding - global functions, there are some private methods. - """ - - # - # Private methods of an SConsEnvironment. - # - def _exceeds_version(self, major, minor, v_major, v_minor): - """Return 1 if 'major' and 'minor' are greater than the version - in 'v_major' and 'v_minor', and 0 otherwise.""" - return (major > v_major or (major == v_major and minor > v_minor)) - - def _get_major_minor_revision(self, version_string): - """Split a version string into major, minor and (optionally) - revision parts. - - This is complicated by the fact that a version string can be - something like 3.2b1.""" - version = version_string.split(' ')[0].split('.') - v_major = int(version[0]) - v_minor = int(re.match('\d+', version[1]).group()) - if len(version) >= 3: - v_revision = int(re.match('\d+', version[2]).group()) - else: - v_revision = 0 - return v_major, v_minor, v_revision - - def _get_SConscript_filenames(self, ls, kw): - """ - Convert the parameters passed to SConscript() calls into a list - of files and export variables. If the parameters are invalid, - throws SCons.Errors.UserError. Returns a tuple (l, e) where l - is a list of SConscript filenames and e is a list of exports. - """ - exports = [] - - if len(ls) == 0: - try: - dirs = kw["dirs"] - except KeyError: - raise SCons.Errors.UserError("Invalid SConscript usage - no parameters") - - if not SCons.Util.is_List(dirs): - dirs = [ dirs ] - dirs = list(map(str, dirs)) - - name = kw.get('name', 'SConscript') - - files = [os.path.join(n, name) for n in dirs] - - elif len(ls) == 1: - - files = ls[0] - - elif len(ls) == 2: - - files = ls[0] - exports = self.Split(ls[1]) - - else: - - raise SCons.Errors.UserError("Invalid SConscript() usage - too many arguments") - - if not SCons.Util.is_List(files): - files = [ files ] - - if kw.get('exports'): - exports.extend(self.Split(kw['exports'])) - - variant_dir = kw.get('variant_dir') or kw.get('build_dir') - if variant_dir: - if len(files) != 1: - raise SCons.Errors.UserError("Invalid SConscript() usage - can only specify one SConscript with a variant_dir") - duplicate = kw.get('duplicate', 1) - src_dir = kw.get('src_dir') - if not src_dir: - src_dir, fname = os.path.split(str(files[0])) - files = [os.path.join(str(variant_dir), fname)] - else: - if not isinstance(src_dir, SCons.Node.Node): - src_dir = self.fs.Dir(src_dir) - fn = files[0] - if not isinstance(fn, SCons.Node.Node): - fn = self.fs.File(fn) - if fn.is_under(src_dir): - # Get path relative to the source directory. - fname = fn.get_path(src_dir) - files = [os.path.join(str(variant_dir), fname)] - else: - files = [fn.abspath] - kw['src_dir'] = variant_dir - self.fs.VariantDir(variant_dir, src_dir, duplicate) - - return (files, exports) - - # - # Public methods of an SConsEnvironment. These get - # entry points in the global name space so they can be called - # as global functions. - # - - def Configure(self, *args, **kw): - if not SCons.Script.sconscript_reading: - raise SCons.Errors.UserError("Calling Configure from Builders is not supported.") - kw['_depth'] = kw.get('_depth', 0) + 1 - return SCons.Environment.Base.Configure(self, *args, **kw) - - def Default(self, *targets): - SCons.Script._Set_Default_Targets(self, targets) - - def EnsureSConsVersion(self, major, minor, revision=0): - """Exit abnormally if the SCons version is not late enough.""" - scons_ver = self._get_major_minor_revision(SCons.__version__) - if scons_ver < (major, minor, revision): - if revision: - scons_ver_string = '%d.%d.%d' % (major, minor, revision) - else: - scons_ver_string = '%d.%d' % (major, minor) - print "SCons %s or greater required, but you have SCons %s" % \ - (scons_ver_string, SCons.__version__) - sys.exit(2) - - def EnsurePythonVersion(self, major, minor): - """Exit abnormally if the Python version is not late enough.""" - try: - v_major, v_minor, v_micro, release, serial = sys.version_info - python_ver = (v_major, v_minor) - except AttributeError: - python_ver = self._get_major_minor_revision(sys.version)[:2] - if python_ver < (major, minor): - v = sys.version.split(" ", 1)[0] - print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v) - sys.exit(2) - - def Exit(self, value=0): - sys.exit(value) - - def Export(self, *vars, **kw): - for var in vars: - global_exports.update(compute_exports(self.Split(var))) - global_exports.update(kw) - - def GetLaunchDir(self): - global launch_dir - return launch_dir - - def GetOption(self, name): - name = self.subst(name) - return SCons.Script.Main.GetOption(name) - - def Help(self, text): - text = self.subst(text, raw=1) - SCons.Script.HelpFunction(text) - - def Import(self, *vars): - try: - frame = call_stack[-1] - globals = frame.globals - exports = frame.exports - for var in vars: - var = self.Split(var) - for v in var: - if v == '*': - globals.update(global_exports) - globals.update(exports) - else: - if v in exports: - globals[v] = exports[v] - else: - globals[v] = global_exports[v] - except KeyError,x: - raise SCons.Errors.UserError("Import of non-existent variable '%s'"%x) - - def SConscript(self, *ls, **kw): - if 'build_dir' in kw: - msg = """The build_dir keyword has been deprecated; use the variant_dir keyword instead.""" - SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg) - def subst_element(x, subst=self.subst): - if SCons.Util.is_List(x): - x = list(map(subst, x)) - else: - x = subst(x) - return x - ls = list(map(subst_element, ls)) - subst_kw = {} - for key, val in kw.items(): - if SCons.Util.is_String(val): - val = self.subst(val) - elif SCons.Util.is_List(val): - result = [] - for v in val: - if SCons.Util.is_String(v): - v = self.subst(v) - result.append(v) - val = result - subst_kw[key] = val - - files, exports = self._get_SConscript_filenames(ls, subst_kw) - subst_kw['exports'] = exports - return _SConscript(self.fs, *files, **subst_kw) - - def SConscriptChdir(self, flag): - global sconscript_chdir - sconscript_chdir = flag - - def SetOption(self, name, value): - name = self.subst(name) - SCons.Script.Main.SetOption(name, value) - -# -# -# -SCons.Environment.Environment = SConsEnvironment - -def Configure(*args, **kw): - if not SCons.Script.sconscript_reading: - raise SCons.Errors.UserError("Calling Configure from Builders is not supported.") - kw['_depth'] = 1 - return SCons.SConf.SConf(*args, **kw) - -# It's very important that the DefaultEnvironmentCall() class stay in this -# file, with the get_calling_namespaces() function, the compute_exports() -# function, the Frame class and the SConsEnvironment.Export() method. -# These things make up the calling stack leading up to the actual global -# Export() or SConscript() call that the user issued. We want to allow -# users to export local variables that they define, like so: -# -# def func(): -# x = 1 -# Export('x') -# -# To support this, the get_calling_namespaces() function assumes that -# the *first* stack frame that's not from this file is the local frame -# for the Export() or SConscript() call. - -_DefaultEnvironmentProxy = None - -def get_DefaultEnvironmentProxy(): - global _DefaultEnvironmentProxy - if not _DefaultEnvironmentProxy: - default_env = SCons.Defaults.DefaultEnvironment() - _DefaultEnvironmentProxy = SCons.Environment.NoSubstitutionProxy(default_env) - return _DefaultEnvironmentProxy - -class DefaultEnvironmentCall(object): - """A class that implements "global function" calls of - Environment methods by fetching the specified method from the - DefaultEnvironment's class. Note that this uses an intermediate - proxy class instead of calling the DefaultEnvironment method - directly so that the proxy can override the subst() method and - thereby prevent expansion of construction variables (since from - the user's point of view this was called as a global function, - with no associated construction environment).""" - def __init__(self, method_name, subst=0): - self.method_name = method_name - if subst: - self.factory = SCons.Defaults.DefaultEnvironment - else: - self.factory = get_DefaultEnvironmentProxy - def __call__(self, *args, **kw): - env = self.factory() - method = getattr(env, self.method_name) - return method(*args, **kw) - - -def BuildDefaultGlobals(): - """ - Create a dictionary containing all the default globals for - SConstruct and SConscript files. - """ - - global GlobalDict - if GlobalDict is None: - GlobalDict = {} - - import SCons.Script - d = SCons.Script.__dict__ - def not_a_module(m, d=d, mtype=type(SCons.Script)): - return not isinstance(d[m], mtype) - for m in filter(not_a_module, dir(SCons.Script)): - GlobalDict[m] = d[m] - - return GlobalDict.copy() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/__init__.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/__init__.py deleted file mode 100644 index b5b522235..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Script/__init__.py +++ /dev/null @@ -1,412 +0,0 @@ -"""SCons.Script - -This file implements the main() function used by the scons script. - -Architecturally, this *is* the scons script, and will likely only be -called from the external "scons" wrapper. Consequently, anything here -should not be, or be considered, part of the build engine. If it's -something that we expect other software to want to use, it should go in -some other module. If it's specific to the "scons" script invocation, -it goes here. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Script/__init__.py 5023 2010/06/14 22:05:46 scons" - -import time -start_time = time.time() - -import collections -import os -import sys - -# Special chicken-and-egg handling of the "--debug=memoizer" flag: -# -# SCons.Memoize contains a metaclass implementation that affects how -# the other classes are instantiated. The Memoizer may add shim methods -# to classes that have methods that cache computed values in order to -# count and report the hits and misses. -# -# If we wait to enable the Memoization until after we've parsed the -# command line options normally, it will be too late, because the Memoizer -# will have already analyzed the classes that it's Memoizing and decided -# to not add the shims. So we use a special-case, up-front check for -# the "--debug=memoizer" flag and enable Memoizer before we import any -# of the other modules that use it. - -_args = sys.argv + os.environ.get('SCONSFLAGS', '').split() -if "--debug=memoizer" in _args: - import SCons.Memoize - import SCons.Warnings - try: - SCons.Memoize.EnableMemoization() - except SCons.Warnings.Warning: - # Some warning was thrown. Arrange for it to be displayed - # or not after warnings are configured. - import Main - exc_type, exc_value, tb = sys.exc_info() - Main.delayed_warnings.append((exc_type, exc_value)) -del _args - -import SCons.Action -import SCons.Builder -import SCons.Environment -import SCons.Node.FS -import SCons.Options -import SCons.Platform -import SCons.Scanner -import SCons.SConf -import SCons.Subst -import SCons.Tool -import SCons.Util -import SCons.Variables -import SCons.Defaults - -import Main - -main = Main.main - -# The following are global class definitions and variables that used to -# live directly in this module back before 0.96.90, when it contained -# a lot of code. Some SConscript files in widely-distributed packages -# (Blender is the specific example) actually reached into SCons.Script -# directly to use some of these. Rather than break those SConscript -# files, we're going to propagate these names into the SCons.Script -# namespace here. -# -# Some of these are commented out because it's *really* unlikely anyone -# used them, but we're going to leave the comment here to try to make -# it obvious what to do if the situation arises. -BuildTask = Main.BuildTask -CleanTask = Main.CleanTask -QuestionTask = Main.QuestionTask -#PrintHelp = Main.PrintHelp -#SConscriptSettableOptions = Main.SConscriptSettableOptions - -AddOption = Main.AddOption -GetOption = Main.GetOption -SetOption = Main.SetOption -Progress = Main.Progress -GetBuildFailures = Main.GetBuildFailures - -#keep_going_on_error = Main.keep_going_on_error -#print_dtree = Main.print_dtree -#print_explanations = Main.print_explanations -#print_includes = Main.print_includes -#print_objects = Main.print_objects -#print_time = Main.print_time -#print_tree = Main.print_tree -#memory_stats = Main.memory_stats -#ignore_errors = Main.ignore_errors -#sconscript_time = Main.sconscript_time -#command_time = Main.command_time -#exit_status = Main.exit_status -#profiling = Main.profiling -#repositories = Main.repositories - -# -import SConscript -_SConscript = SConscript - -call_stack = _SConscript.call_stack - -# -Action = SCons.Action.Action -AddMethod = SCons.Util.AddMethod -AllowSubstExceptions = SCons.Subst.SetAllowableExceptions -Builder = SCons.Builder.Builder -Configure = _SConscript.Configure -Environment = SCons.Environment.Environment -#OptParser = SCons.SConsOptions.OptParser -FindPathDirs = SCons.Scanner.FindPathDirs -Platform = SCons.Platform.Platform -Return = _SConscript.Return -Scanner = SCons.Scanner.Base -Tool = SCons.Tool.Tool -WhereIs = SCons.Util.WhereIs - -# -BoolVariable = SCons.Variables.BoolVariable -EnumVariable = SCons.Variables.EnumVariable -ListVariable = SCons.Variables.ListVariable -PackageVariable = SCons.Variables.PackageVariable -PathVariable = SCons.Variables.PathVariable - -# Deprecated names that will go away some day. -BoolOption = SCons.Options.BoolOption -EnumOption = SCons.Options.EnumOption -ListOption = SCons.Options.ListOption -PackageOption = SCons.Options.PackageOption -PathOption = SCons.Options.PathOption - -# Action factories. -Chmod = SCons.Defaults.Chmod -Copy = SCons.Defaults.Copy -Delete = SCons.Defaults.Delete -Mkdir = SCons.Defaults.Mkdir -Move = SCons.Defaults.Move -Touch = SCons.Defaults.Touch - -# Pre-made, public scanners. -CScanner = SCons.Tool.CScanner -DScanner = SCons.Tool.DScanner -DirScanner = SCons.Defaults.DirScanner -ProgramScanner = SCons.Tool.ProgramScanner -SourceFileScanner = SCons.Tool.SourceFileScanner - -# Functions we might still convert to Environment methods. -CScan = SCons.Defaults.CScan -DefaultEnvironment = SCons.Defaults.DefaultEnvironment - -# Other variables we provide. -class TargetList(collections.UserList): - def _do_nothing(self, *args, **kw): - pass - def _add_Default(self, list): - self.extend(list) - def _clear(self): - del self[:] - -ARGUMENTS = {} -ARGLIST = [] -BUILD_TARGETS = TargetList() -COMMAND_LINE_TARGETS = [] -DEFAULT_TARGETS = [] - -# BUILD_TARGETS can be modified in the SConscript files. If so, we -# want to treat the modified BUILD_TARGETS list as if they specified -# targets on the command line. To do that, though, we need to know if -# BUILD_TARGETS was modified through "official" APIs or by hand. We do -# this by updating two lists in parallel, the documented BUILD_TARGETS -# list, above, and this internal _build_plus_default targets list which -# should only have "official" API changes. Then Script/Main.py can -# compare these two afterwards to figure out if the user added their -# own targets to BUILD_TARGETS. -_build_plus_default = TargetList() - -def _Add_Arguments(alist): - for arg in alist: - a, b = arg.split('=', 1) - ARGUMENTS[a] = b - ARGLIST.append((a, b)) - -def _Add_Targets(tlist): - if tlist: - COMMAND_LINE_TARGETS.extend(tlist) - BUILD_TARGETS.extend(tlist) - BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing - BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing - _build_plus_default.extend(tlist) - _build_plus_default._add_Default = _build_plus_default._do_nothing - _build_plus_default._clear = _build_plus_default._do_nothing - -def _Set_Default_Targets_Has_Been_Called(d, fs): - return DEFAULT_TARGETS - -def _Set_Default_Targets_Has_Not_Been_Called(d, fs): - if d is None: - d = [fs.Dir('.')] - return d - -_Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called - -def _Set_Default_Targets(env, tlist): - global DEFAULT_TARGETS - global _Get_Default_Targets - _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called - for t in tlist: - if t is None: - # Delete the elements from the list in-place, don't - # reassign an empty list to DEFAULT_TARGETS, so that the - # variables will still point to the same object we point to. - del DEFAULT_TARGETS[:] - BUILD_TARGETS._clear() - _build_plus_default._clear() - elif isinstance(t, SCons.Node.Node): - DEFAULT_TARGETS.append(t) - BUILD_TARGETS._add_Default([t]) - _build_plus_default._add_Default([t]) - else: - nodes = env.arg2nodes(t, env.fs.Entry) - DEFAULT_TARGETS.extend(nodes) - BUILD_TARGETS._add_Default(nodes) - _build_plus_default._add_Default(nodes) - -# -help_text = None - -def HelpFunction(text): - global help_text - if SCons.Script.help_text is None: - SCons.Script.help_text = text - else: - help_text = help_text + text - -# -# Will be non-zero if we are reading an SConscript file. -sconscript_reading = 0 - -# -def Variables(files=[], args=ARGUMENTS): - return SCons.Variables.Variables(files, args) - -def Options(files=[], args=ARGUMENTS): - return SCons.Options.Options(files, args) - -# The list of global functions to add to the SConscript name space -# that end up calling corresponding methods or Builders in the -# DefaultEnvironment(). -GlobalDefaultEnvironmentFunctions = [ - # Methods from the SConsEnvironment class, above. - 'Default', - 'EnsurePythonVersion', - 'EnsureSConsVersion', - 'Exit', - 'Export', - 'GetLaunchDir', - 'Help', - 'Import', - #'SConscript', is handled separately, below. - 'SConscriptChdir', - - # Methods from the Environment.Base class. - 'AddPostAction', - 'AddPreAction', - 'Alias', - 'AlwaysBuild', - 'BuildDir', - 'CacheDir', - 'Clean', - #The Command() method is handled separately, below. - 'Decider', - 'Depends', - 'Dir', - 'NoClean', - 'NoCache', - 'Entry', - 'Execute', - 'File', - 'FindFile', - 'FindInstalledFiles', - 'FindSourceFiles', - 'Flatten', - 'GetBuildPath', - 'Glob', - 'Ignore', - 'Install', - 'InstallAs', - 'Literal', - 'Local', - 'ParseDepends', - 'Precious', - 'Repository', - 'Requires', - 'SConsignFile', - 'SideEffect', - 'SourceCode', - 'SourceSignatures', - 'Split', - 'Tag', - 'TargetSignatures', - 'Value', - 'VariantDir', -] - -GlobalDefaultBuilders = [ - # Supported builders. - 'CFile', - 'CXXFile', - 'DVI', - 'Jar', - 'Java', - 'JavaH', - 'Library', - 'M4', - 'MSVSProject', - 'Object', - 'PCH', - 'PDF', - 'PostScript', - 'Program', - 'RES', - 'RMIC', - 'SharedLibrary', - 'SharedObject', - 'StaticLibrary', - 'StaticObject', - 'Tar', - 'TypeLibrary', - 'Zip', - 'Package', -] - -for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders: - exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)) -del name - -# There are a handful of variables that used to live in the -# Script/SConscript.py module that some SConscript files out there were -# accessing directly as SCons.Script.SConscript.*. The problem is that -# "SConscript" in this namespace is no longer a module, it's a global -# function call--or more precisely, an object that implements a global -# function call through the default Environment. Nevertheless, we can -# maintain backwards compatibility for SConscripts that were reaching in -# this way by hanging some attributes off the "SConscript" object here. -SConscript = _SConscript.DefaultEnvironmentCall('SConscript') - -# Make SConscript look enough like the module it used to be so -# that pychecker doesn't barf. -SConscript.__name__ = 'SConscript' - -SConscript.Arguments = ARGUMENTS -SConscript.ArgList = ARGLIST -SConscript.BuildTargets = BUILD_TARGETS -SConscript.CommandLineTargets = COMMAND_LINE_TARGETS -SConscript.DefaultTargets = DEFAULT_TARGETS - -# The global Command() function must be handled differently than the -# global functions for other construction environment methods because -# we want people to be able to use Actions that must expand $TARGET -# and $SOURCE later, when (and if) the Action is invoked to build -# the target(s). We do this with the subst=1 argument, which creates -# a DefaultEnvironmentCall instance that wraps up a normal default -# construction environment that performs variable substitution, not a -# proxy that doesn't. -# -# There's a flaw here, though, because any other $-variables on a command -# line will *also* be expanded, each to a null string, but that should -# only be a problem in the unusual case where someone was passing a '$' -# on a command line and *expected* the $ to get through to the shell -# because they were calling Command() and not env.Command()... This is -# unlikely enough that we're going to leave this as is and cross that -# bridge if someone actually comes to it. -Command = _SConscript.DefaultEnvironmentCall('Command', subst=1) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Sig.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Sig.py deleted file mode 100644 index 49c00bf32..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Sig.py +++ /dev/null @@ -1,63 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Sig.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Place-holder for the old SCons.Sig module hierarchy - -This is no longer used, but code out there (such as the NSIS module on -the SCons wiki) may try to import SCons.Sig. If so, we generate a warning -that points them to the line that caused the import, and don't die. - -If someone actually tried to use the sub-modules or functions within -the package (for example, SCons.Sig.MD5.signature()), then they'll still -get an AttributeError, but at least they'll know where to start looking. -""" - -import SCons.Util -import SCons.Warnings - -msg = 'The SCons.Sig module no longer exists.\n' \ - ' Remove the following "import SCons.Sig" line to eliminate this warning:' - -SCons.Warnings.warn(SCons.Warnings.DeprecatedSigModuleWarning, msg) - -default_calc = None -default_module = None - -class MD5Null(SCons.Util.Null): - def __repr__(self): - return "MD5Null()" - -class TimeStampNull(SCons.Util.Null): - def __repr__(self): - return "TimeStampNull()" - -MD5 = MD5Null() -TimeStamp = TimeStampNull() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Subst.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Subst.py deleted file mode 100644 index d9b029a99..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Subst.py +++ /dev/null @@ -1,904 +0,0 @@ -"""SCons.Subst - -SCons string substitution. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Subst.py 5023 2010/06/14 22:05:46 scons" - -import collections -import re - -import SCons.Errors - -from SCons.Util import is_String, is_Sequence - -# Indexed by the SUBST_* constants below. -_strconv = [SCons.Util.to_String_for_subst, - SCons.Util.to_String_for_subst, - SCons.Util.to_String_for_signature] - - - -AllowableExceptions = (IndexError, NameError) - -def SetAllowableExceptions(*excepts): - global AllowableExceptions - AllowableExceptions = [_f for _f in excepts if _f] - -def raise_exception(exception, target, s): - name = exception.__class__.__name__ - msg = "%s `%s' trying to evaluate `%s'" % (name, exception, s) - if target: - raise SCons.Errors.BuildError(target[0], msg) - else: - raise SCons.Errors.UserError(msg) - - - -class Literal(object): - """A wrapper for a string. If you use this object wrapped - around a string, then it will be interpreted as literal. - When passed to the command interpreter, all special - characters will be escaped.""" - def __init__(self, lstr): - self.lstr = lstr - - def __str__(self): - return self.lstr - - def escape(self, escape_func): - return escape_func(self.lstr) - - def for_signature(self): - return self.lstr - - def is_literal(self): - return 1 - -class SpecialAttrWrapper(object): - """This is a wrapper for what we call a 'Node special attribute.' - This is any of the attributes of a Node that we can reference from - Environment variable substitution, such as $TARGET.abspath or - $SOURCES[1].filebase. We implement the same methods as Literal - so we can handle special characters, plus a for_signature method, - such that we can return some canonical string during signature - calculation to avoid unnecessary rebuilds.""" - - def __init__(self, lstr, for_signature=None): - """The for_signature parameter, if supplied, will be the - canonical string we return from for_signature(). Else - we will simply return lstr.""" - self.lstr = lstr - if for_signature: - self.forsig = for_signature - else: - self.forsig = lstr - - def __str__(self): - return self.lstr - - def escape(self, escape_func): - return escape_func(self.lstr) - - def for_signature(self): - return self.forsig - - def is_literal(self): - return 1 - -def quote_spaces(arg): - """Generic function for putting double quotes around any string that - has white space in it.""" - if ' ' in arg or '\t' in arg: - return '"%s"' % arg - else: - return str(arg) - -class CmdStringHolder(collections.UserString): - """This is a special class used to hold strings generated by - scons_subst() and scons_subst_list(). It defines a special method - escape(). When passed a function with an escape algorithm for a - particular platform, it will return the contained string with the - proper escape sequences inserted. - """ - def __init__(self, cmd, literal=None): - collections.UserString.__init__(self, cmd) - self.literal = literal - - def is_literal(self): - return self.literal - - def escape(self, escape_func, quote_func=quote_spaces): - """Escape the string with the supplied function. The - function is expected to take an arbitrary string, then - return it with all special characters escaped and ready - for passing to the command interpreter. - - After calling this function, the next call to str() will - return the escaped string. - """ - - if self.is_literal(): - return escape_func(self.data) - elif ' ' in self.data or '\t' in self.data: - return quote_func(self.data) - else: - return self.data - -def escape_list(mylist, escape_func): - """Escape a list of arguments by running the specified escape_func - on every object in the list that has an escape() method.""" - def escape(obj, escape_func=escape_func): - try: - e = obj.escape - except AttributeError: - return obj - else: - return e(escape_func) - return list(map(escape, mylist)) - -class NLWrapper(object): - """A wrapper class that delays turning a list of sources or targets - into a NodeList until it's needed. The specified function supplied - when the object is initialized is responsible for turning raw nodes - into proxies that implement the special attributes like .abspath, - .source, etc. This way, we avoid creating those proxies just - "in case" someone is going to use $TARGET or the like, and only - go through the trouble if we really have to. - - In practice, this might be a wash performance-wise, but it's a little - cleaner conceptually... - """ - - def __init__(self, list, func): - self.list = list - self.func = func - def _return_nodelist(self): - return self.nodelist - def _gen_nodelist(self): - mylist = self.list - if mylist is None: - mylist = [] - elif not is_Sequence(mylist): - mylist = [mylist] - # The map(self.func) call is what actually turns - # a list into appropriate proxies. - self.nodelist = SCons.Util.NodeList(list(map(self.func, mylist))) - self._create_nodelist = self._return_nodelist - return self.nodelist - _create_nodelist = _gen_nodelist - - -class Targets_or_Sources(collections.UserList): - """A class that implements $TARGETS or $SOURCES expansions by in turn - wrapping a NLWrapper. This class handles the different methods used - to access the list, calling the NLWrapper to create proxies on demand. - - Note that we subclass collections.UserList purely so that the - is_Sequence() function will identify an object of this class as - a list during variable expansion. We're not really using any - collections.UserList methods in practice. - """ - def __init__(self, nl): - self.nl = nl - def __getattr__(self, attr): - nl = self.nl._create_nodelist() - return getattr(nl, attr) - def __getitem__(self, i): - nl = self.nl._create_nodelist() - return nl[i] - def __getslice__(self, i, j): - nl = self.nl._create_nodelist() - i = max(i, 0); j = max(j, 0) - return nl[i:j] - def __str__(self): - nl = self.nl._create_nodelist() - return str(nl) - def __repr__(self): - nl = self.nl._create_nodelist() - return repr(nl) - -class Target_or_Source(object): - """A class that implements $TARGET or $SOURCE expansions by in turn - wrapping a NLWrapper. This class handles the different methods used - to access an individual proxy Node, calling the NLWrapper to create - a proxy on demand. - """ - def __init__(self, nl): - self.nl = nl - def __getattr__(self, attr): - nl = self.nl._create_nodelist() - try: - nl0 = nl[0] - except IndexError: - # If there is nothing in the list, then we have no attributes to - # pass through, so raise AttributeError for everything. - raise AttributeError("NodeList has no attribute: %s" % attr) - return getattr(nl0, attr) - def __str__(self): - nl = self.nl._create_nodelist() - if nl: - return str(nl[0]) - return '' - def __repr__(self): - nl = self.nl._create_nodelist() - if nl: - return repr(nl[0]) - return '' - -class NullNodeList(SCons.Util.NullSeq): - def __call__(self, *args, **kwargs): return '' - def __str__(self): return '' - -NullNodesList = NullNodeList() - -def subst_dict(target, source): - """Create a dictionary for substitution of special - construction variables. - - This translates the following special arguments: - - target - the target (object or array of objects), - used to generate the TARGET and TARGETS - construction variables - - source - the source (object or array of objects), - used to generate the SOURCES and SOURCE - construction variables - """ - dict = {} - - if target: - def get_tgt_subst_proxy(thing): - try: - subst_proxy = thing.get_subst_proxy() - except AttributeError: - subst_proxy = thing # probably a string, just return it - return subst_proxy - tnl = NLWrapper(target, get_tgt_subst_proxy) - dict['TARGETS'] = Targets_or_Sources(tnl) - dict['TARGET'] = Target_or_Source(tnl) - - # This is a total cheat, but hopefully this dictionary goes - # away soon anyway. We just let these expand to $TARGETS - # because that's "good enough" for the use of ToolSurrogates - # (see test/ToolSurrogate.py) to generate documentation. - dict['CHANGED_TARGETS'] = '$TARGETS' - dict['UNCHANGED_TARGETS'] = '$TARGETS' - else: - dict['TARGETS'] = NullNodesList - dict['TARGET'] = NullNodesList - - if source: - def get_src_subst_proxy(node): - try: - rfile = node.rfile - except AttributeError: - pass - else: - node = rfile() - try: - return node.get_subst_proxy() - except AttributeError: - return node # probably a String, just return it - snl = NLWrapper(source, get_src_subst_proxy) - dict['SOURCES'] = Targets_or_Sources(snl) - dict['SOURCE'] = Target_or_Source(snl) - - # This is a total cheat, but hopefully this dictionary goes - # away soon anyway. We just let these expand to $TARGETS - # because that's "good enough" for the use of ToolSurrogates - # (see test/ToolSurrogate.py) to generate documentation. - dict['CHANGED_SOURCES'] = '$SOURCES' - dict['UNCHANGED_SOURCES'] = '$SOURCES' - else: - dict['SOURCES'] = NullNodesList - dict['SOURCE'] = NullNodesList - - return dict - -# Constants for the "mode" parameter to scons_subst_list() and -# scons_subst(). SUBST_RAW gives the raw command line. SUBST_CMD -# gives a command line suitable for passing to a shell. SUBST_SIG -# gives a command line appropriate for calculating the signature -# of a command line...if this changes, we should rebuild. -SUBST_CMD = 0 -SUBST_RAW = 1 -SUBST_SIG = 2 - -_rm = re.compile(r'\$[()]') -_remove = re.compile(r'\$\([^\$]*(\$[^\)][^\$]*)*\$\)') - -# Indexed by the SUBST_* constants above. -_regex_remove = [ _rm, None, _remove ] - -def _rm_list(list): - #return [ l for l in list if not l in ('$(', '$)') ] - return [l for l in list if not l in ('$(', '$)')] - -def _remove_list(list): - result = [] - do_append = result.append - for l in list: - if l == '$(': - do_append = lambda x: None - elif l == '$)': - do_append = result.append - else: - do_append(l) - return result - -# Indexed by the SUBST_* constants above. -_list_remove = [ _rm_list, None, _remove_list ] - -# Regular expressions for splitting strings and handling substitutions, -# for use by the scons_subst() and scons_subst_list() functions: -# -# The first expression compiled matches all of the $-introduced tokens -# that we need to process in some way, and is used for substitutions. -# The expressions it matches are: -# -# "$$" -# "$(" -# "$)" -# "$variable" [must begin with alphabetic or underscore] -# "${any stuff}" -# -# The second expression compiled is used for splitting strings into tokens -# to be processed, and it matches all of the tokens listed above, plus -# the following that affect how arguments do or don't get joined together: -# -# " " [white space] -# "non-white-space" [without any dollar signs] -# "$" [single dollar sign] -# -_dollar_exps_str = r'\$[\$\(\)]|\$[_a-zA-Z][\.\w]*|\${[^}]*}' -_dollar_exps = re.compile(r'(%s)' % _dollar_exps_str) -_separate_args = re.compile(r'(%s|\s+|[^\s\$]+|\$)' % _dollar_exps_str) - -# This regular expression is used to replace strings of multiple white -# space characters in the string result from the scons_subst() function. -_space_sep = re.compile(r'[\t ]+(?![^{]*})') - -def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None): - """Expand a string or list containing construction variable - substitutions. - - This is the work-horse function for substitutions in file names - and the like. The companion scons_subst_list() function (below) - handles separating command lines into lists of arguments, so see - that function if that's what you're looking for. - """ - if isinstance(strSubst, str) and strSubst.find('$') < 0: - return strSubst - - class StringSubber(object): - """A class to construct the results of a scons_subst() call. - - This binds a specific construction environment, mode, target and - source with two methods (substitute() and expand()) that handle - the expansion. - """ - def __init__(self, env, mode, conv, gvars): - self.env = env - self.mode = mode - self.conv = conv - self.gvars = gvars - - def expand(self, s, lvars): - """Expand a single "token" as necessary, returning an - appropriate string containing the expansion. - - This handles expanding different types of things (strings, - lists, callables) appropriately. It calls the wrapper - substitute() method to re-expand things as necessary, so that - the results of expansions of side-by-side strings still get - re-evaluated separately, not smushed together. - """ - if is_String(s): - try: - s0, s1 = s[:2] - except (IndexError, ValueError): - return s - if s0 != '$': - return s - if s1 == '$': - return '$' - elif s1 in '()': - return s - else: - key = s[1:] - if key[0] == '{' or key.find('.') >= 0: - if key[0] == '{': - key = key[1:-1] - try: - s = eval(key, self.gvars, lvars) - except KeyboardInterrupt: - raise - except Exception, e: - if e.__class__ in AllowableExceptions: - return '' - raise_exception(e, lvars['TARGETS'], s) - else: - if key in lvars: - s = lvars[key] - elif key in self.gvars: - s = self.gvars[key] - elif not NameError in AllowableExceptions: - raise_exception(NameError(key), lvars['TARGETS'], s) - else: - return '' - - # Before re-expanding the result, handle - # recursive expansion by copying the local - # variable dictionary and overwriting a null - # string for the value of the variable name - # we just expanded. - # - # This could potentially be optimized by only - # copying lvars when s contains more expansions, - # but lvars is usually supposed to be pretty - # small, and deeply nested variable expansions - # are probably more the exception than the norm, - # so it should be tolerable for now. - lv = lvars.copy() - var = key.split('.')[0] - lv[var] = '' - return self.substitute(s, lv) - elif is_Sequence(s): - def func(l, conv=self.conv, substitute=self.substitute, lvars=lvars): - return conv(substitute(l, lvars)) - return list(map(func, s)) - elif callable(s): - try: - s = s(target=lvars['TARGETS'], - source=lvars['SOURCES'], - env=self.env, - for_signature=(self.mode != SUBST_CMD)) - except TypeError: - # This probably indicates that it's a callable - # object that doesn't match our calling arguments - # (like an Action). - if self.mode == SUBST_RAW: - return s - s = self.conv(s) - return self.substitute(s, lvars) - elif s is None: - return '' - else: - return s - - def substitute(self, args, lvars): - """Substitute expansions in an argument or list of arguments. - - This serves as a wrapper for splitting up a string into - separate tokens. - """ - if is_String(args) and not isinstance(args, CmdStringHolder): - args = str(args) # In case it's a UserString. - try: - def sub_match(match): - return self.conv(self.expand(match.group(1), lvars)) - result = _dollar_exps.sub(sub_match, args) - except TypeError: - # If the internal conversion routine doesn't return - # strings (it could be overridden to return Nodes, for - # example), then the 1.5.2 re module will throw this - # exception. Back off to a slower, general-purpose - # algorithm that works for all data types. - args = _separate_args.findall(args) - result = [] - for a in args: - result.append(self.conv(self.expand(a, lvars))) - if len(result) == 1: - result = result[0] - else: - result = ''.join(map(str, result)) - return result - else: - return self.expand(args, lvars) - - if conv is None: - conv = _strconv[mode] - - # Doing this every time is a bit of a waste, since the Executor - # has typically already populated the OverrideEnvironment with - # $TARGET/$SOURCE variables. We're keeping this (for now), though, - # because it supports existing behavior that allows us to call - # an Action directly with an arbitrary target+source pair, which - # we use in Tool/tex.py to handle calling $BIBTEX when necessary. - # If we dropped that behavior (or found another way to cover it), - # we could get rid of this call completely and just rely on the - # Executor setting the variables. - if 'TARGET' not in lvars: - d = subst_dict(target, source) - if d: - lvars = lvars.copy() - lvars.update(d) - - # We're (most likely) going to eval() things. If Python doesn't - # find a __builtins__ value in the global dictionary used for eval(), - # it copies the current global values for you. Avoid this by - # setting it explicitly and then deleting, so we don't pollute the - # construction environment Dictionary(ies) that are typically used - # for expansion. - gvars['__builtins__'] = __builtins__ - - ss = StringSubber(env, mode, conv, gvars) - result = ss.substitute(strSubst, lvars) - - try: - del gvars['__builtins__'] - except KeyError: - pass - - if is_String(result): - # Remove $(-$) pairs and any stuff in between, - # if that's appropriate. - remove = _regex_remove[mode] - if remove: - result = remove.sub('', result) - if mode != SUBST_RAW: - # Compress strings of white space characters into - # a single space. - result = _space_sep.sub(' ', result).strip() - elif is_Sequence(result): - remove = _list_remove[mode] - if remove: - result = remove(result) - - return result - -#Subst_List_Strings = {} - -def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None): - """Substitute construction variables in a string (or list or other - object) and separate the arguments into a command list. - - The companion scons_subst() function (above) handles basic - substitutions within strings, so see that function instead - if that's what you're looking for. - """ -# try: -# Subst_List_Strings[strSubst] = Subst_List_Strings[strSubst] + 1 -# except KeyError: -# Subst_List_Strings[strSubst] = 1 -# import SCons.Debug -# SCons.Debug.caller_trace(1) - class ListSubber(collections.UserList): - """A class to construct the results of a scons_subst_list() call. - - Like StringSubber, this class binds a specific construction - environment, mode, target and source with two methods - (substitute() and expand()) that handle the expansion. - - In addition, however, this class is used to track the state of - the result(s) we're gathering so we can do the appropriate thing - whenever we have to append another word to the result--start a new - line, start a new word, append to the current word, etc. We do - this by setting the "append" attribute to the right method so - that our wrapper methods only need ever call ListSubber.append(), - and the rest of the object takes care of doing the right thing - internally. - """ - def __init__(self, env, mode, conv, gvars): - collections.UserList.__init__(self, []) - self.env = env - self.mode = mode - self.conv = conv - self.gvars = gvars - - if self.mode == SUBST_RAW: - self.add_strip = lambda x: self.append(x) - else: - self.add_strip = lambda x: None - self.in_strip = None - self.next_line() - - def expand(self, s, lvars, within_list): - """Expand a single "token" as necessary, appending the - expansion to the current result. - - This handles expanding different types of things (strings, - lists, callables) appropriately. It calls the wrapper - substitute() method to re-expand things as necessary, so that - the results of expansions of side-by-side strings still get - re-evaluated separately, not smushed together. - """ - - if is_String(s): - try: - s0, s1 = s[:2] - except (IndexError, ValueError): - self.append(s) - return - if s0 != '$': - self.append(s) - return - if s1 == '$': - self.append('$') - elif s1 == '(': - self.open_strip('$(') - elif s1 == ')': - self.close_strip('$)') - else: - key = s[1:] - if key[0] == '{' or key.find('.') >= 0: - if key[0] == '{': - key = key[1:-1] - try: - s = eval(key, self.gvars, lvars) - except KeyboardInterrupt: - raise - except Exception, e: - if e.__class__ in AllowableExceptions: - return - raise_exception(e, lvars['TARGETS'], s) - else: - if key in lvars: - s = lvars[key] - elif key in self.gvars: - s = self.gvars[key] - elif not NameError in AllowableExceptions: - raise_exception(NameError(), lvars['TARGETS'], s) - else: - return - - # Before re-expanding the result, handle - # recursive expansion by copying the local - # variable dictionary and overwriting a null - # string for the value of the variable name - # we just expanded. - lv = lvars.copy() - var = key.split('.')[0] - lv[var] = '' - self.substitute(s, lv, 0) - self.this_word() - elif is_Sequence(s): - for a in s: - self.substitute(a, lvars, 1) - self.next_word() - elif callable(s): - try: - s = s(target=lvars['TARGETS'], - source=lvars['SOURCES'], - env=self.env, - for_signature=(self.mode != SUBST_CMD)) - except TypeError: - # This probably indicates that it's a callable - # object that doesn't match our calling arguments - # (like an Action). - if self.mode == SUBST_RAW: - self.append(s) - return - s = self.conv(s) - self.substitute(s, lvars, within_list) - elif s is None: - self.this_word() - else: - self.append(s) - - def substitute(self, args, lvars, within_list): - """Substitute expansions in an argument or list of arguments. - - This serves as a wrapper for splitting up a string into - separate tokens. - """ - - if is_String(args) and not isinstance(args, CmdStringHolder): - args = str(args) # In case it's a UserString. - args = _separate_args.findall(args) - for a in args: - if a[0] in ' \t\n\r\f\v': - if '\n' in a: - self.next_line() - elif within_list: - self.append(a) - else: - self.next_word() - else: - self.expand(a, lvars, within_list) - else: - self.expand(args, lvars, within_list) - - def next_line(self): - """Arrange for the next word to start a new line. This - is like starting a new word, except that we have to append - another line to the result.""" - collections.UserList.append(self, []) - self.next_word() - - def this_word(self): - """Arrange for the next word to append to the end of the - current last word in the result.""" - self.append = self.add_to_current_word - - def next_word(self): - """Arrange for the next word to start a new word.""" - self.append = self.add_new_word - - def add_to_current_word(self, x): - """Append the string x to the end of the current last word - in the result. If that is not possible, then just add - it as a new word. Make sure the entire concatenated string - inherits the object attributes of x (in particular, the - escape function) by wrapping it as CmdStringHolder.""" - - if not self.in_strip or self.mode != SUBST_SIG: - try: - current_word = self[-1][-1] - except IndexError: - self.add_new_word(x) - else: - # All right, this is a hack and it should probably - # be refactored out of existence in the future. - # The issue is that we want to smoosh words together - # and make one file name that gets escaped if - # we're expanding something like foo$EXTENSION, - # but we don't want to smoosh them together if - # it's something like >$TARGET, because then we'll - # treat the '>' like it's part of the file name. - # So for now, just hard-code looking for the special - # command-line redirection characters... - try: - last_char = str(current_word)[-1] - except IndexError: - last_char = '\0' - if last_char in '<>|': - self.add_new_word(x) - else: - y = current_word + x - - # We used to treat a word appended to a literal - # as a literal itself, but this caused problems - # with interpreting quotes around space-separated - # targets on command lines. Removing this makes - # none of the "substantive" end-to-end tests fail, - # so we'll take this out but leave it commented - # for now in case there's a problem not covered - # by the test cases and we need to resurrect this. - #literal1 = self.literal(self[-1][-1]) - #literal2 = self.literal(x) - y = self.conv(y) - if is_String(y): - #y = CmdStringHolder(y, literal1 or literal2) - y = CmdStringHolder(y, None) - self[-1][-1] = y - - def add_new_word(self, x): - if not self.in_strip or self.mode != SUBST_SIG: - literal = self.literal(x) - x = self.conv(x) - if is_String(x): - x = CmdStringHolder(x, literal) - self[-1].append(x) - self.append = self.add_to_current_word - - def literal(self, x): - try: - l = x.is_literal - except AttributeError: - return None - else: - return l() - - def open_strip(self, x): - """Handle the "open strip" $( token.""" - self.add_strip(x) - self.in_strip = 1 - - def close_strip(self, x): - """Handle the "close strip" $) token.""" - self.add_strip(x) - self.in_strip = None - - if conv is None: - conv = _strconv[mode] - - # Doing this every time is a bit of a waste, since the Executor - # has typically already populated the OverrideEnvironment with - # $TARGET/$SOURCE variables. We're keeping this (for now), though, - # because it supports existing behavior that allows us to call - # an Action directly with an arbitrary target+source pair, which - # we use in Tool/tex.py to handle calling $BIBTEX when necessary. - # If we dropped that behavior (or found another way to cover it), - # we could get rid of this call completely and just rely on the - # Executor setting the variables. - if 'TARGET' not in lvars: - d = subst_dict(target, source) - if d: - lvars = lvars.copy() - lvars.update(d) - - # We're (most likely) going to eval() things. If Python doesn't - # find a __builtins__ value in the global dictionary used for eval(), - # it copies the current global values for you. Avoid this by - # setting it explicitly and then deleting, so we don't pollute the - # construction environment Dictionary(ies) that are typically used - # for expansion. - gvars['__builtins__'] = __builtins__ - - ls = ListSubber(env, mode, conv, gvars) - ls.substitute(strSubst, lvars, 0) - - try: - del gvars['__builtins__'] - except KeyError: - pass - - return ls.data - -def scons_subst_once(strSubst, env, key): - """Perform single (non-recursive) substitution of a single - construction variable keyword. - - This is used when setting a variable when copying or overriding values - in an Environment. We want to capture (expand) the old value before - we override it, so people can do things like: - - env2 = env.Clone(CCFLAGS = '$CCFLAGS -g') - - We do this with some straightforward, brute-force code here... - """ - if isinstance(strSubst, str) and strSubst.find('$') < 0: - return strSubst - - matchlist = ['$' + key, '${' + key + '}'] - val = env.get(key, '') - def sub_match(match, val=val, matchlist=matchlist): - a = match.group(1) - if a in matchlist: - a = val - if is_Sequence(a): - return ' '.join(map(str, a)) - else: - return str(a) - - if is_Sequence(strSubst): - result = [] - for arg in strSubst: - if is_String(arg): - if arg in matchlist: - arg = val - if is_Sequence(arg): - result.extend(arg) - else: - result.append(arg) - else: - result.append(_dollar_exps.sub(sub_match, arg)) - else: - result.append(arg) - return result - elif is_String(strSubst): - return _dollar_exps.sub(sub_match, strSubst) - else: - return strSubst - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Taskmaster.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Taskmaster.py deleted file mode 100644 index 68ac1f549..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Taskmaster.py +++ /dev/null @@ -1,1017 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__doc__ = """ -Generic Taskmaster module for the SCons build engine. - -This module contains the primary interface(s) between a wrapping user -interface and the SCons build engine. There are two key classes here: - - Taskmaster - This is the main engine for walking the dependency graph and - calling things to decide what does or doesn't need to be built. - - Task - This is the base class for allowing a wrapping interface to - decide what does or doesn't actually need to be done. The - intention is for a wrapping interface to subclass this as - appropriate for different types of behavior it may need. - - The canonical example is the SCons native Python interface, - which has Task subclasses that handle its specific behavior, - like printing "`foo' is up to date" when a top-level target - doesn't need to be built, and handling the -c option by removing - targets as its "build" action. There is also a separate subclass - for suppressing this output when the -q option is used. - - The Taskmaster instantiates a Task object for each (set of) - target(s) that it decides need to be evaluated and/or built. -""" - -__revision__ = "src/engine/SCons/Taskmaster.py 5023 2010/06/14 22:05:46 scons" - -from itertools import chain -import operator -import sys -import traceback - -import SCons.Errors -import SCons.Node -import SCons.Warnings - -StateString = SCons.Node.StateString -NODE_NO_STATE = SCons.Node.no_state -NODE_PENDING = SCons.Node.pending -NODE_EXECUTING = SCons.Node.executing -NODE_UP_TO_DATE = SCons.Node.up_to_date -NODE_EXECUTED = SCons.Node.executed -NODE_FAILED = SCons.Node.failed - - -# A subsystem for recording stats about how different Nodes are handled by -# the main Taskmaster loop. There's no external control here (no need for -# a --debug= option); enable it by changing the value of CollectStats. - -CollectStats = None - -class Stats(object): - """ - A simple class for holding statistics about the disposition of a - Node by the Taskmaster. If we're collecting statistics, each Node - processed by the Taskmaster gets one of these attached, in which case - the Taskmaster records its decision each time it processes the Node. - (Ideally, that's just once per Node.) - """ - def __init__(self): - """ - Instantiates a Taskmaster.Stats object, initializing all - appropriate counters to zero. - """ - self.considered = 0 - self.already_handled = 0 - self.problem = 0 - self.child_failed = 0 - self.not_built = 0 - self.side_effects = 0 - self.build = 0 - -StatsNodes = [] - -fmt = "%(considered)3d "\ - "%(already_handled)3d " \ - "%(problem)3d " \ - "%(child_failed)3d " \ - "%(not_built)3d " \ - "%(side_effects)3d " \ - "%(build)3d " - -def dump_stats(): - for n in sorted(StatsNodes, key=lambda a: str(a)): - print (fmt % n.stats.__dict__) + str(n) - - - -class Task(object): - """ - Default SCons build engine task. - - This controls the interaction of the actual building of node - and the rest of the engine. - - This is expected to handle all of the normally-customizable - aspects of controlling a build, so any given application - *should* be able to do what it wants by sub-classing this - class and overriding methods as appropriate. If an application - needs to customze something by sub-classing Taskmaster (or - some other build engine class), we should first try to migrate - that functionality into this class. - - Note that it's generally a good idea for sub-classes to call - these methods explicitly to update state, etc., rather than - roll their own interaction with Taskmaster from scratch. - """ - def __init__(self, tm, targets, top, node): - self.tm = tm - self.targets = targets - self.top = top - self.node = node - self.exc_clear() - - def trace_message(self, method, node, description='node'): - fmt = '%-20s %s %s\n' - return fmt % (method + ':', description, self.tm.trace_node(node)) - - def display(self, message): - """ - Hook to allow the calling interface to display a message. - - This hook gets called as part of preparing a task for execution - (that is, a Node to be built). As part of figuring out what Node - should be built next, the actually target list may be altered, - along with a message describing the alteration. The calling - interface can subclass Task and provide a concrete implementation - of this method to see those messages. - """ - pass - - def prepare(self): - """ - Called just before the task is executed. - - This is mainly intended to give the target Nodes a chance to - unlink underlying files and make all necessary directories before - the Action is actually called to build the targets. - """ - T = self.tm.trace - if T: T.write(self.trace_message(u'Task.prepare()', self.node)) - - # Now that it's the appropriate time, give the TaskMaster a - # chance to raise any exceptions it encountered while preparing - # this task. - self.exception_raise() - - if self.tm.message: - self.display(self.tm.message) - self.tm.message = None - - # Let the targets take care of any necessary preparations. - # This includes verifying that all of the necessary sources - # and dependencies exist, removing the target file(s), etc. - # - # As of April 2008, the get_executor().prepare() method makes - # sure that all of the aggregate sources necessary to build this - # Task's target(s) exist in one up-front check. The individual - # target t.prepare() methods check that each target's explicit - # or implicit dependencies exists, and also initialize the - # .sconsign info. - executor = self.targets[0].get_executor() - executor.prepare() - for t in executor.get_action_targets(): - t.prepare() - for s in t.side_effects: - s.prepare() - - def get_target(self): - """Fetch the target being built or updated by this task. - """ - return self.node - - def needs_execute(self): - # TODO(deprecate): "return True" is the old default behavior; - # change it to NotImplementedError (after running through the - # Deprecation Cycle) so the desired behavior is explicitly - # determined by which concrete subclass is used. - #raise NotImplementedError - msg = ('Taskmaster.Task is an abstract base class; instead of\n' - '\tusing it directly, ' - 'derive from it and override the abstract methods.') - SCons.Warnings.warn(SCons.Warnings.TaskmasterNeedsExecuteWarning, msg) - return True - - def execute(self): - """ - Called to execute the task. - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - prepare(), executed() or failed(). - """ - T = self.tm.trace - if T: T.write(self.trace_message(u'Task.execute()', self.node)) - - try: - everything_was_cached = 1 - for t in self.targets: - if t.retrieve_from_cache(): - # Call the .built() method without calling the - # .push_to_cache() method, since we just got the - # target from the cache and don't need to push - # it back there. - t.set_state(NODE_EXECUTED) - t.built() - else: - everything_was_cached = 0 - break - if not everything_was_cached: - self.targets[0].build() - except SystemExit: - exc_value = sys.exc_info()[1] - raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code) - except SCons.Errors.UserError: - raise - except SCons.Errors.BuildError: - raise - except Exception, e: - buildError = SCons.Errors.convert_to_BuildError(e) - buildError.node = self.targets[0] - buildError.exc_info = sys.exc_info() - raise buildError - - def executed_without_callbacks(self): - """ - Called when the task has been successfully executed - and the Taskmaster instance doesn't want to call - the Node's callback methods. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.executed_without_callbacks()', - self.node)) - - for t in self.targets: - if t.get_state() == NODE_EXECUTING: - for side_effect in t.side_effects: - side_effect.set_state(NODE_NO_STATE) - t.set_state(NODE_EXECUTED) - - def executed_with_callbacks(self): - """ - Called when the task has been successfully executed and - the Taskmaster instance wants to call the Node's callback - methods. - - This may have been a do-nothing operation (to preserve build - order), so we must check the node's state before deciding whether - it was "built", in which case we call the appropriate Node method. - In any event, we always call "visited()", which will handle any - post-visit actions that must take place regardless of whether - or not the target was an actual built target or a source Node. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.executed_with_callbacks()', - self.node)) - - for t in self.targets: - if t.get_state() == NODE_EXECUTING: - for side_effect in t.side_effects: - side_effect.set_state(NODE_NO_STATE) - t.set_state(NODE_EXECUTED) - t.push_to_cache() - t.built() - t.visited() - - executed = executed_with_callbacks - - def failed(self): - """ - Default action when a task fails: stop the build. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - self.fail_stop() - - def fail_stop(self): - """ - Explicit stop-the-build failure. - - This sets failure status on the target nodes and all of - their dependent parent nodes. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.failed_stop()', self.node)) - - # Invoke will_not_build() to clean-up the pending children - # list. - self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED)) - - # Tell the taskmaster to not start any new tasks - self.tm.stop() - - # We're stopping because of a build failure, but give the - # calling Task class a chance to postprocess() the top-level - # target under which the build failure occurred. - self.targets = [self.tm.current_top] - self.top = 1 - - def fail_continue(self): - """ - Explicit continue-the-build failure. - - This sets failure status on the target nodes and all of - their dependent parent nodes. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.failed_continue()', self.node)) - - self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED)) - - def make_ready_all(self): - """ - Marks all targets in a task ready for execution. - - This is used when the interface needs every target Node to be - visited--the canonical example being the "scons -c" option. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.make_ready_all()', self.node)) - - self.out_of_date = self.targets[:] - for t in self.targets: - t.disambiguate().set_state(NODE_EXECUTING) - for s in t.side_effects: - # add disambiguate here to mirror the call on targets above - s.disambiguate().set_state(NODE_EXECUTING) - - def make_ready_current(self): - """ - Marks all targets in a task ready for execution if any target - is not current. - - This is the default behavior for building only what's necessary. - """ - T = self.tm.trace - if T: T.write(self.trace_message(u'Task.make_ready_current()', - self.node)) - - self.out_of_date = [] - needs_executing = False - for t in self.targets: - try: - t.disambiguate().make_ready() - is_up_to_date = not t.has_builder() or \ - (not t.always_build and t.is_up_to_date()) - except EnvironmentError, e: - raise SCons.Errors.BuildError(node=t, errstr=e.strerror, filename=e.filename) - - if not is_up_to_date: - self.out_of_date.append(t) - needs_executing = True - - if needs_executing: - for t in self.targets: - t.set_state(NODE_EXECUTING) - for s in t.side_effects: - # add disambiguate here to mirror the call on targets in first loop above - s.disambiguate().set_state(NODE_EXECUTING) - else: - for t in self.targets: - # We must invoke visited() to ensure that the node - # information has been computed before allowing the - # parent nodes to execute. (That could occur in a - # parallel build...) - t.visited() - t.set_state(NODE_UP_TO_DATE) - - make_ready = make_ready_current - - def postprocess(self): - """ - Post-processes a task after it's been executed. - - This examines all the targets just built (or not, we don't care - if the build was successful, or even if there was no build - because everything was up-to-date) to see if they have any - waiting parent Nodes, or Nodes waiting on a common side effect, - that can be put back on the candidates list. - """ - T = self.tm.trace - if T: T.write(self.trace_message(u'Task.postprocess()', self.node)) - - # We may have built multiple targets, some of which may have - # common parents waiting for this build. Count up how many - # targets each parent was waiting for so we can subtract the - # values later, and so we *don't* put waiting side-effect Nodes - # back on the candidates list if the Node is also a waiting - # parent. - - targets = set(self.targets) - - pending_children = self.tm.pending_children - parents = {} - for t in targets: - # A node can only be in the pending_children set if it has - # some waiting_parents. - if t.waiting_parents: - if T: T.write(self.trace_message(u'Task.postprocess()', - t, - 'removing')) - pending_children.discard(t) - for p in t.waiting_parents: - parents[p] = parents.get(p, 0) + 1 - - for t in targets: - for s in t.side_effects: - if s.get_state() == NODE_EXECUTING: - s.set_state(NODE_NO_STATE) - for p in s.waiting_parents: - parents[p] = parents.get(p, 0) + 1 - for p in s.waiting_s_e: - if p.ref_count == 0: - self.tm.candidates.append(p) - - for p, subtract in parents.items(): - p.ref_count = p.ref_count - subtract - if T: T.write(self.trace_message(u'Task.postprocess()', - p, - 'adjusted parent ref count')) - if p.ref_count == 0: - self.tm.candidates.append(p) - - for t in targets: - t.postprocess() - - # Exception handling subsystem. - # - # Exceptions that occur while walking the DAG or examining Nodes - # must be raised, but must be raised at an appropriate time and in - # a controlled manner so we can, if necessary, recover gracefully, - # possibly write out signature information for Nodes we've updated, - # etc. This is done by having the Taskmaster tell us about the - # exception, and letting - - def exc_info(self): - """ - Returns info about a recorded exception. - """ - return self.exception - - def exc_clear(self): - """ - Clears any recorded exception. - - This also changes the "exception_raise" attribute to point - to the appropriate do-nothing method. - """ - self.exception = (None, None, None) - self.exception_raise = self._no_exception_to_raise - - def exception_set(self, exception=None): - """ - Records an exception to be raised at the appropriate time. - - This also changes the "exception_raise" attribute to point - to the method that will, in fact - """ - if not exception: - exception = sys.exc_info() - self.exception = exception - self.exception_raise = self._exception_raise - - def _no_exception_to_raise(self): - pass - - def _exception_raise(self): - """ - Raises a pending exception that was recorded while getting a - Task ready for execution. - """ - exc = self.exc_info()[:] - try: - exc_type, exc_value, exc_traceback = exc - except ValueError: - exc_type, exc_value = exc - exc_traceback = None - raise exc_type, exc_value, exc_traceback - -class AlwaysTask(Task): - def needs_execute(self): - """ - Always returns True (indicating this Task should always - be executed). - - Subclasses that need this behavior (as opposed to the default - of only executing Nodes that are out of date w.r.t. their - dependencies) can use this as follows: - - class MyTaskSubclass(SCons.Taskmaster.Task): - needs_execute = SCons.Taskmaster.Task.execute_always - """ - return True - -class OutOfDateTask(Task): - def needs_execute(self): - """ - Returns True (indicating this Task should be executed) if this - Task's target state indicates it needs executing, which has - already been determined by an earlier up-to-date check. - """ - return self.targets[0].get_state() == SCons.Node.executing - - -def find_cycle(stack, visited): - if stack[-1] in visited: - return None - visited.add(stack[-1]) - for n in stack[-1].waiting_parents: - stack.append(n) - if stack[0] == stack[-1]: - return stack - if find_cycle(stack, visited): - return stack - stack.pop() - return None - - -class Taskmaster(object): - """ - The Taskmaster for walking the dependency DAG. - """ - - def __init__(self, targets=[], tasker=None, order=None, trace=None): - self.original_top = targets - self.top_targets_left = targets[:] - self.top_targets_left.reverse() - self.candidates = [] - if tasker is None: - tasker = OutOfDateTask - self.tasker = tasker - if not order: - order = lambda l: l - self.order = order - self.message = None - self.trace = trace - self.next_candidate = self.find_next_candidate - self.pending_children = set() - - def find_next_candidate(self): - """ - Returns the next candidate Node for (potential) evaluation. - - The candidate list (really a stack) initially consists of all of - the top-level (command line) targets provided when the Taskmaster - was initialized. While we walk the DAG, visiting Nodes, all the - children that haven't finished processing get pushed on to the - candidate list. Each child can then be popped and examined in - turn for whether *their* children are all up-to-date, in which - case a Task will be created for their actual evaluation and - potential building. - - Here is where we also allow candidate Nodes to alter the list of - Nodes that should be examined. This is used, for example, when - invoking SCons in a source directory. A source directory Node can - return its corresponding build directory Node, essentially saying, - "Hey, you really need to build this thing over here instead." - """ - try: - return self.candidates.pop() - except IndexError: - pass - try: - node = self.top_targets_left.pop() - except IndexError: - return None - self.current_top = node - alt, message = node.alter_targets() - if alt: - self.message = message - self.candidates.append(node) - self.candidates.extend(self.order(alt)) - node = self.candidates.pop() - return node - - def no_next_candidate(self): - """ - Stops Taskmaster processing by not returning a next candidate. - - Note that we have to clean-up the Taskmaster candidate list - because the cycle detection depends on the fact all nodes have - been processed somehow. - """ - while self.candidates: - candidates = self.candidates - self.candidates = [] - self.will_not_build(candidates) - return None - - def _validate_pending_children(self): - """ - Validate the content of the pending_children set. Assert if an - internal error is found. - - This function is used strictly for debugging the taskmaster by - checking that no invariants are violated. It is not used in - normal operation. - - The pending_children set is used to detect cycles in the - dependency graph. We call a "pending child" a child that is - found in the "pending" state when checking the dependencies of - its parent node. - - A pending child can occur when the Taskmaster completes a loop - through a cycle. For example, lets imagine a graph made of - three node (A, B and C) making a cycle. The evaluation starts - at node A. The taskmaster first consider whether node A's - child B is up-to-date. Then, recursively, node B needs to - check whether node C is up-to-date. This leaves us with a - dependency graph looking like: - - Next candidate \ - \ - Node A (Pending) --> Node B(Pending) --> Node C (NoState) - ^ | - | | - +-------------------------------------+ - - Now, when the Taskmaster examines the Node C's child Node A, - it finds that Node A is in the "pending" state. Therefore, - Node A is a pending child of node C. - - Pending children indicate that the Taskmaster has potentially - loop back through a cycle. We say potentially because it could - also occur when a DAG is evaluated in parallel. For example, - consider the following graph: - - - Node A (Pending) --> Node B(Pending) --> Node C (Pending) --> ... - | ^ - | | - +----------> Node D (NoState) --------+ - / - Next candidate / - - The Taskmaster first evaluates the nodes A, B, and C and - starts building some children of node C. Assuming, that the - maximum parallel level has not been reached, the Taskmaster - will examine Node D. It will find that Node C is a pending - child of Node D. - - In summary, evaluating a graph with a cycle will always - involve a pending child at one point. A pending child might - indicate either a cycle or a diamond-shaped DAG. Only a - fraction of the nodes ends-up being a "pending child" of - another node. This keeps the pending_children set small in - practice. - - We can differentiate between the two cases if we wait until - the end of the build. At this point, all the pending children - nodes due to a diamond-shaped DAG will have been properly - built (or will have failed to build). But, the pending - children involved in a cycle will still be in the pending - state. - - The taskmaster removes nodes from the pending_children set as - soon as a pending_children node moves out of the pending - state. This also helps to keep the pending_children set small. - """ - - for n in self.pending_children: - assert n.state in (NODE_PENDING, NODE_EXECUTING), \ - (str(n), StateString[n.state]) - assert len(n.waiting_parents) != 0, (str(n), len(n.waiting_parents)) - for p in n.waiting_parents: - assert p.ref_count > 0, (str(n), str(p), p.ref_count) - - - def trace_message(self, message): - return 'Taskmaster: %s\n' % message - - def trace_node(self, node): - return '<%-10s %-3s %s>' % (StateString[node.get_state()], - node.ref_count, - repr(str(node))) - - def _find_next_ready_node(self): - """ - Finds the next node that is ready to be built. - - This is *the* main guts of the DAG walk. We loop through the - list of candidates, looking for something that has no un-built - children (i.e., that is a leaf Node or has dependencies that are - all leaf Nodes or up-to-date). Candidate Nodes are re-scanned - (both the target Node itself and its sources, which are always - scanned in the context of a given target) to discover implicit - dependencies. A Node that must wait for some children to be - built will be put back on the candidates list after the children - have finished building. A Node that has been put back on the - candidates list in this way may have itself (or its sources) - re-scanned, in order to handle generated header files (e.g.) and - the implicit dependencies therein. - - Note that this method does not do any signature calculation or - up-to-date check itself. All of that is handled by the Task - class. This is purely concerned with the dependency graph walk. - """ - - self.ready_exc = None - - T = self.trace - if T: T.write(u'\n' + self.trace_message('Looking for a node to evaluate')) - - while True: - node = self.next_candidate() - if node is None: - if T: T.write(self.trace_message('No candidate anymore.') + u'\n') - return None - - node = node.disambiguate() - state = node.get_state() - - # For debugging only: - # - # try: - # self._validate_pending_children() - # except: - # self.ready_exc = sys.exc_info() - # return node - - if CollectStats: - if not hasattr(node, 'stats'): - node.stats = Stats() - StatsNodes.append(node) - S = node.stats - S.considered = S.considered + 1 - else: - S = None - - if T: T.write(self.trace_message(u' Considering node %s and its children:' % self.trace_node(node))) - - if state == NODE_NO_STATE: - # Mark this node as being on the execution stack: - node.set_state(NODE_PENDING) - elif state > NODE_PENDING: - # Skip this node if it has already been evaluated: - if S: S.already_handled = S.already_handled + 1 - if T: T.write(self.trace_message(u' already handled (executed)')) - continue - - executor = node.get_executor() - - try: - children = executor.get_all_children() - except SystemExit: - exc_value = sys.exc_info()[1] - e = SCons.Errors.ExplicitExit(node, exc_value.code) - self.ready_exc = (SCons.Errors.ExplicitExit, e) - if T: T.write(self.trace_message(' SystemExit')) - return node - except Exception, e: - # We had a problem just trying to figure out the - # children (like a child couldn't be linked in to a - # VariantDir, or a Scanner threw something). Arrange to - # raise the exception when the Task is "executed." - self.ready_exc = sys.exc_info() - if S: S.problem = S.problem + 1 - if T: T.write(self.trace_message(' exception %s while scanning children.\n' % e)) - return node - - children_not_visited = [] - children_pending = set() - children_not_ready = [] - children_failed = False - - for child in chain(executor.get_all_prerequisites(), children): - childstate = child.get_state() - - if T: T.write(self.trace_message(u' ' + self.trace_node(child))) - - if childstate == NODE_NO_STATE: - children_not_visited.append(child) - elif childstate == NODE_PENDING: - children_pending.add(child) - elif childstate == NODE_FAILED: - children_failed = True - - if childstate <= NODE_EXECUTING: - children_not_ready.append(child) - - - # These nodes have not even been visited yet. Add - # them to the list so that on some next pass we can - # take a stab at evaluating them (or their children). - children_not_visited.reverse() - self.candidates.extend(self.order(children_not_visited)) - #if T and children_not_visited: - # T.write(self.trace_message(' adding to candidates: %s' % map(str, children_not_visited))) - # T.write(self.trace_message(' candidates now: %s\n' % map(str, self.candidates))) - - # Skip this node if any of its children have failed. - # - # This catches the case where we're descending a top-level - # target and one of our children failed while trying to be - # built by a *previous* descent of an earlier top-level - # target. - # - # It can also occur if a node is reused in multiple - # targets. One first descends though the one of the - # target, the next time occurs through the other target. - # - # Note that we can only have failed_children if the - # --keep-going flag was used, because without it the build - # will stop before diving in the other branch. - # - # Note that even if one of the children fails, we still - # added the other children to the list of candidate nodes - # to keep on building (--keep-going). - if children_failed: - for n in executor.get_action_targets(): - n.set_state(NODE_FAILED) - - if S: S.child_failed = S.child_failed + 1 - if T: T.write(self.trace_message('****** %s\n' % self.trace_node(node))) - continue - - if children_not_ready: - for child in children_not_ready: - # We're waiting on one or more derived targets - # that have not yet finished building. - if S: S.not_built = S.not_built + 1 - - # Add this node to the waiting parents lists of - # anything we're waiting on, with a reference - # count so we can be put back on the list for - # re-evaluation when they've all finished. - node.ref_count = node.ref_count + child.add_to_waiting_parents(node) - if T: T.write(self.trace_message(u' adjusted ref count: %s, child %s' % - (self.trace_node(node), repr(str(child))))) - - if T: - for pc in children_pending: - T.write(self.trace_message(' adding %s to the pending children set\n' % - self.trace_node(pc))) - self.pending_children = self.pending_children | children_pending - - continue - - # Skip this node if it has side-effects that are - # currently being built: - wait_side_effects = False - for se in executor.get_action_side_effects(): - if se.get_state() == NODE_EXECUTING: - se.add_to_waiting_s_e(node) - wait_side_effects = True - - if wait_side_effects: - if S: S.side_effects = S.side_effects + 1 - continue - - # The default when we've gotten through all of the checks above: - # this node is ready to be built. - if S: S.build = S.build + 1 - if T: T.write(self.trace_message(u'Evaluating %s\n' % - self.trace_node(node))) - - # For debugging only: - # - # try: - # self._validate_pending_children() - # except: - # self.ready_exc = sys.exc_info() - # return node - - return node - - return None - - def next_task(self): - """ - Returns the next task to be executed. - - This simply asks for the next Node to be evaluated, and then wraps - it in the specific Task subclass with which we were initialized. - """ - node = self._find_next_ready_node() - - if node is None: - return None - - tlist = node.get_executor().get_all_targets() - - task = self.tasker(self, tlist, node in self.original_top, node) - try: - task.make_ready() - except: - # We had a problem just trying to get this task ready (like - # a child couldn't be linked in to a VariantDir when deciding - # whether this node is current). Arrange to raise the - # exception when the Task is "executed." - self.ready_exc = sys.exc_info() - - if self.ready_exc: - task.exception_set(self.ready_exc) - - self.ready_exc = None - - return task - - def will_not_build(self, nodes, node_func=lambda n: None): - """ - Perform clean-up about nodes that will never be built. Invokes - a user defined function on all of these nodes (including all - of their parents). - """ - - T = self.trace - - pending_children = self.pending_children - - to_visit = set(nodes) - pending_children = pending_children - to_visit - - if T: - for n in nodes: - T.write(self.trace_message(' removing node %s from the pending children set\n' % - self.trace_node(n))) - try: - while len(to_visit): - node = to_visit.pop() - node_func(node) - - # Prune recursion by flushing the waiting children - # list immediately. - parents = node.waiting_parents - node.waiting_parents = set() - - to_visit = to_visit | parents - pending_children = pending_children - parents - - for p in parents: - p.ref_count = p.ref_count - 1 - if T: T.write(self.trace_message(' removing parent %s from the pending children set\n' % - self.trace_node(p))) - except KeyError: - # The container to_visit has been emptied. - pass - - # We have the stick back the pending_children list into the - # taskmaster because the python 1.5.2 compatibility does not - # allow us to use in-place updates - self.pending_children = pending_children - - def stop(self): - """ - Stops the current build completely. - """ - self.next_candidate = self.no_next_candidate - - def cleanup(self): - """ - Check for dependency cycles. - """ - if not self.pending_children: - return - - nclist = [(n, find_cycle([n], set())) for n in self.pending_children] - - genuine_cycles = [ - node for node,cycle in nclist - if cycle or node.get_state() != NODE_EXECUTED - ] - if not genuine_cycles: - # All of the "cycles" found were single nodes in EXECUTED state, - # which is to say, they really weren't cycles. Just return. - return - - desc = 'Found dependency cycle(s):\n' - for node, cycle in nclist: - if cycle: - desc = desc + " " + " -> ".join(map(str, cycle)) + "\n" - else: - desc = desc + \ - " Internal Error: no cycle found for node %s (%s) in state %s\n" % \ - (node, repr(node), StateString[node.get_state()]) - - raise SCons.Errors.UserError(desc) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py deleted file mode 100644 index 5b8c8cb67..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py +++ /dev/null @@ -1,61 +0,0 @@ -"""SCons.Tool.386asm - -Tool specification for the 386ASM assembler for the Phar Lap ETS embedded -operating system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/386asm.py 5023 2010/06/14 22:05:46 scons" - -from SCons.Tool.PharLapCommon import addPharLapPaths -import SCons.Util - -as_module = __import__('as', globals(), locals(), []) - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - as_module.generate(env) - - env['AS'] = '386asm' - env['ASFLAGS'] = SCons.Util.CLVar('') - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASCOM'] = '$AS $ASFLAGS $SOURCES -o $TARGET' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES -o $TARGET' - - addPharLapPaths(env) - -def exists(env): - return env.Detect('386asm') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py deleted file mode 100644 index a155a4256..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py +++ /dev/null @@ -1,67 +0,0 @@ -"""SCons.Tool.BitKeeper.py - -Tool-specific initialization for the BitKeeper source code control -system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/BitKeeper.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - BitKeeper to an Environment.""" - - def BitKeeperFactory(env=env): - """ """ - import SCons.Warnings as W - W.warn(W.DeprecatedSourceCodeWarning, """The BitKeeper() factory is deprecated and there is no replacement.""") - act = SCons.Action.Action("$BITKEEPERCOM", "$BITKEEPERCOMSTR") - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'BitKeeper', BitKeeperFactory) - env.BitKeeper = BitKeeperFactory - - env['BITKEEPER'] = 'bk' - env['BITKEEPERGET'] = '$BITKEEPER get' - env['BITKEEPERGETFLAGS'] = SCons.Util.CLVar('') - env['BITKEEPERCOM'] = '$BITKEEPERGET $BITKEEPERGETFLAGS $TARGET' - -def exists(env): - return env.Detect('bk') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py deleted file mode 100644 index bb9f95643..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py +++ /dev/null @@ -1,73 +0,0 @@ -"""SCons.Tool.CVS.py - -Tool-specific initialization for CVS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/CVS.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - CVS to an Environment.""" - - def CVSFactory(repos, module='', env=env): - """ """ - import SCons.Warnings as W - W.warn(W.DeprecatedSourceCodeWarning, """The CVS() factory is deprecated and there is no replacement.""") - # fail if repos is not an absolute path name? - if module != '': - # Don't use os.path.join() because the name we fetch might - # be across a network and must use POSIX slashes as separators. - module = module + '/' - env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS -d ${TARGET.dir} $CVSMODULE${TARGET.posix}' - act = SCons.Action.Action('$CVSCOM', '$CVSCOMSTR') - return SCons.Builder.Builder(action = act, - env = env, - CVSREPOSITORY = repos, - CVSMODULE = module) - - #setattr(env, 'CVS', CVSFactory) - env.CVS = CVSFactory - - env['CVS'] = 'cvs' - env['CVSFLAGS'] = SCons.Util.CLVar('-d $CVSREPOSITORY') - env['CVSCOFLAGS'] = SCons.Util.CLVar('') - env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS ${TARGET.posix}' - -def exists(env): - return env.Detect('cvs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py deleted file mode 100644 index db89f967f..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py +++ /dev/null @@ -1,246 +0,0 @@ -"""SCons.Tool.FortranCommon - -Stuff for processing Fortran, common to all fortran dialects. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/FortranCommon.py 5023 2010/06/14 22:05:46 scons" - -import re -import os.path - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util - -def isfortran(env, source): - """Return 1 if any of code in source has fortran files in it, 0 - otherwise.""" - try: - fsuffixes = env['FORTRANSUFFIXES'] - except KeyError: - # If no FORTRANSUFFIXES, no fortran tool, so there is no need to look - # for fortran sources. - return 0 - - if not source: - # Source might be None for unusual cases like SConf. - return 0 - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext in fsuffixes: - return 1 - return 0 - -def _fortranEmitter(target, source, env): - node = source[0].rfile() - if not node.exists() and not node.is_derived(): - print "Could not locate " + str(node.name) - return ([], []) - mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)""" - cre = re.compile(mod_regex,re.M) - # Retrieve all USE'd module names - modules = cre.findall(node.get_text_contents()) - # Remove unique items from the list - modules = SCons.Util.unique(modules) - # Convert module name to a .mod filename - suffix = env.subst('$FORTRANMODSUFFIX', target=target, source=source) - moddir = env.subst('$FORTRANMODDIR', target=target, source=source) - modules = [x.lower() + suffix for x in modules] - for m in modules: - target.append(env.fs.File(m, moddir)) - return (target, source) - -def FortranEmitter(target, source, env): - target, source = _fortranEmitter(target, source, env) - return SCons.Defaults.StaticObjectEmitter(target, source, env) - -def ShFortranEmitter(target, source, env): - target, source = _fortranEmitter(target, source, env) - return SCons.Defaults.SharedObjectEmitter(target, source, env) - -def ComputeFortranSuffixes(suffixes, ppsuffixes): - """suffixes are fortran source files, and ppsuffixes the ones to be - pre-processed. Both should be sequences, not strings.""" - assert len(suffixes) > 0 - s = suffixes[0] - sup = s.upper() - upper_suffixes = [_.upper() for _ in suffixes] - if SCons.Util.case_sensitive_suffixes(s, sup): - ppsuffixes.extend(upper_suffixes) - else: - suffixes.extend(upper_suffixes) - -def CreateDialectActions(dialect): - """Create dialect specific actions.""" - CompAction = SCons.Action.Action('$%sCOM ' % dialect, '$%sCOMSTR' % dialect) - CompPPAction = SCons.Action.Action('$%sPPCOM ' % dialect, '$%sPPCOMSTR' % dialect) - ShCompAction = SCons.Action.Action('$SH%sCOM ' % dialect, '$SH%sCOMSTR' % dialect) - ShCompPPAction = SCons.Action.Action('$SH%sPPCOM ' % dialect, '$SH%sPPCOMSTR' % dialect) - - return CompAction, CompPPAction, ShCompAction, ShCompPPAction - -def DialectAddToEnv(env, dialect, suffixes, ppsuffixes, support_module = 0): - """Add dialect specific construction variables.""" - ComputeFortranSuffixes(suffixes, ppsuffixes) - - fscan = SCons.Scanner.Fortran.FortranScan("%sPATH" % dialect) - - for suffix in suffixes + ppsuffixes: - SCons.Tool.SourceFileScanner.add_scanner(suffix, fscan) - - env.AppendUnique(FORTRANSUFFIXES = suffixes + ppsuffixes) - - compaction, compppaction, shcompaction, shcompppaction = \ - CreateDialectActions(dialect) - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in suffixes: - static_obj.add_action(suffix, compaction) - shared_obj.add_action(suffix, shcompaction) - static_obj.add_emitter(suffix, FortranEmitter) - shared_obj.add_emitter(suffix, ShFortranEmitter) - - for suffix in ppsuffixes: - static_obj.add_action(suffix, compppaction) - shared_obj.add_action(suffix, shcompppaction) - static_obj.add_emitter(suffix, FortranEmitter) - shared_obj.add_emitter(suffix, ShFortranEmitter) - - if '%sFLAGS' % dialect not in env: - env['%sFLAGS' % dialect] = SCons.Util.CLVar('') - - if 'SH%sFLAGS' % dialect not in env: - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect) - - # If a tool does not define fortran prefix/suffix for include path, use C ones - if 'INC%sPREFIX' % dialect not in env: - env['INC%sPREFIX' % dialect] = '$INCPREFIX' - - if 'INC%sSUFFIX' % dialect not in env: - env['INC%sSUFFIX' % dialect] = '$INCSUFFIX' - - env['_%sINCFLAGS' % dialect] = '$( ${_concat(INC%sPREFIX, %sPATH, INC%sSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' % (dialect, dialect, dialect) - - if support_module == 1: - env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - else: - env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - -def add_fortran_to_env(env): - """Add Builders and construction variables for Fortran to an Environment.""" - try: - FortranSuffixes = env['FORTRANFILESUFFIXES'] - except KeyError: - FortranSuffixes = ['.f', '.for', '.ftn'] - - #print "Adding %s to fortran suffixes" % FortranSuffixes - try: - FortranPPSuffixes = env['FORTRANPPFILESUFFIXES'] - except KeyError: - FortranPPSuffixes = ['.fpp', '.FPP'] - - DialectAddToEnv(env, "FORTRAN", FortranSuffixes, - FortranPPSuffixes, support_module = 1) - - env['FORTRANMODPREFIX'] = '' # like $LIBPREFIX - env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX - - env['FORTRANMODDIR'] = '' # where the compiler should place .mod files - env['FORTRANMODDIRPREFIX'] = '' # some prefix to $FORTRANMODDIR - similar to $INCPREFIX - env['FORTRANMODDIRSUFFIX'] = '' # some suffix to $FORTRANMODDIR - similar to $INCSUFFIX - env['_FORTRANMODFLAG'] = '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - -def add_f77_to_env(env): - """Add Builders and construction variables for f77 to an Environment.""" - try: - F77Suffixes = env['F77FILESUFFIXES'] - except KeyError: - F77Suffixes = ['.f77'] - - #print "Adding %s to f77 suffixes" % F77Suffixes - try: - F77PPSuffixes = env['F77PPFILESUFFIXES'] - except KeyError: - F77PPSuffixes = [] - - DialectAddToEnv(env, "F77", F77Suffixes, F77PPSuffixes) - -def add_f90_to_env(env): - """Add Builders and construction variables for f90 to an Environment.""" - try: - F90Suffixes = env['F90FILESUFFIXES'] - except KeyError: - F90Suffixes = ['.f90'] - - #print "Adding %s to f90 suffixes" % F90Suffixes - try: - F90PPSuffixes = env['F90PPFILESUFFIXES'] - except KeyError: - F90PPSuffixes = [] - - DialectAddToEnv(env, "F90", F90Suffixes, F90PPSuffixes, - support_module = 1) - -def add_f95_to_env(env): - """Add Builders and construction variables for f95 to an Environment.""" - try: - F95Suffixes = env['F95FILESUFFIXES'] - except KeyError: - F95Suffixes = ['.f95'] - - #print "Adding %s to f95 suffixes" % F95Suffixes - try: - F95PPSuffixes = env['F95PPFILESUFFIXES'] - except KeyError: - F95PPSuffixes = [] - - DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes, - support_module = 1) - -def add_all_to_env(env): - """Add builders and construction variables for all supported fortran - dialects.""" - add_fortran_to_env(env) - add_f77_to_env(env) - add_f90_to_env(env) - add_f95_to_env(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py deleted file mode 100644 index bd6a30bc2..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py +++ /dev/null @@ -1,323 +0,0 @@ -"""SCons.Tool.JavaCommon - -Stuff for processing Java. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/JavaCommon.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path -import re - -java_parsing = 1 - -default_java_version = '1.4' - -if java_parsing: - # Parse Java files for class names. - # - # This is a really cool parser from Charles Crain - # that finds appropriate class names in Java source. - - # A regular expression that will find, in a java file: - # newlines; - # double-backslashes; - # a single-line comment "//"; - # single or double quotes preceeded by a backslash; - # single quotes, double quotes, open or close braces, semi-colons, - # periods, open or close parentheses; - # floating-point numbers; - # any alphanumeric token (keyword, class name, specifier); - # any alphanumeric token surrounded by angle brackets (generics); - # the multi-line comment begin and end tokens /* and */; - # array declarations "[]". - _reToken = re.compile(r'(\n|\\\\|//|\\[\'"]|[\'"\{\}\;\.\(\)]|' + - r'\d*\.\d*|[A-Za-z_][\w\$\.]*|<[A-Za-z_]\w+>|' + - r'/\*|\*/|\[\])') - - class OuterState(object): - """The initial state for parsing a Java file for classes, - interfaces, and anonymous inner classes.""" - def __init__(self, version=default_java_version): - - if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', - '5', '6'): - msg = "Java version %s not supported" % version - raise NotImplementedError(msg) - - self.version = version - self.listClasses = [] - self.listOutputs = [] - self.stackBrackets = [] - self.brackets = 0 - self.nextAnon = 1 - self.localClasses = [] - self.stackAnonClassBrackets = [] - self.anonStacksStack = [[0]] - self.package = None - - def trace(self): - pass - - def __getClassState(self): - try: - return self.classState - except AttributeError: - ret = ClassState(self) - self.classState = ret - return ret - - def __getPackageState(self): - try: - return self.packageState - except AttributeError: - ret = PackageState(self) - self.packageState = ret - return ret - - def __getAnonClassState(self): - try: - return self.anonState - except AttributeError: - self.outer_state = self - ret = SkipState(1, AnonClassState(self)) - self.anonState = ret - return ret - - def __getSkipState(self): - try: - return self.skipState - except AttributeError: - ret = SkipState(1, self) - self.skipState = ret - return ret - - def __getAnonStack(self): - return self.anonStacksStack[-1] - - def openBracket(self): - self.brackets = self.brackets + 1 - - def closeBracket(self): - self.brackets = self.brackets - 1 - if len(self.stackBrackets) and \ - self.brackets == self.stackBrackets[-1]: - self.listOutputs.append('$'.join(self.listClasses)) - self.localClasses.pop() - self.listClasses.pop() - self.anonStacksStack.pop() - self.stackBrackets.pop() - if len(self.stackAnonClassBrackets) and \ - self.brackets == self.stackAnonClassBrackets[-1]: - self.__getAnonStack().pop() - self.stackAnonClassBrackets.pop() - - def parseToken(self, token): - if token[:2] == '//': - return IgnoreState('\n', self) - elif token == '/*': - return IgnoreState('*/', self) - elif token == '{': - self.openBracket() - elif token == '}': - self.closeBracket() - elif token in [ '"', "'" ]: - return IgnoreState(token, self) - elif token == "new": - # anonymous inner class - if len(self.listClasses) > 0: - return self.__getAnonClassState() - return self.__getSkipState() # Skip the class name - elif token in ['class', 'interface', 'enum']: - if len(self.listClasses) == 0: - self.nextAnon = 1 - self.stackBrackets.append(self.brackets) - return self.__getClassState() - elif token == 'package': - return self.__getPackageState() - elif token == '.': - # Skip the attribute, it might be named "class", in which - # case we don't want to treat the following token as - # an inner class name... - return self.__getSkipState() - return self - - def addAnonClass(self): - """Add an anonymous inner class""" - if self.version in ('1.1', '1.2', '1.3', '1.4'): - clazz = self.listClasses[0] - self.listOutputs.append('%s$%d' % (clazz, self.nextAnon)) - elif self.version in ('1.5', '1.6', '5', '6'): - self.stackAnonClassBrackets.append(self.brackets) - className = [] - className.extend(self.listClasses) - self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1 - for anon in self.__getAnonStack(): - className.append(str(anon)) - self.listOutputs.append('$'.join(className)) - - self.nextAnon = self.nextAnon + 1 - self.__getAnonStack().append(0) - - def setPackage(self, package): - self.package = package - - class AnonClassState(object): - """A state that looks for anonymous inner classes.""" - def __init__(self, old_state): - # outer_state is always an instance of OuterState - self.outer_state = old_state.outer_state - self.old_state = old_state - self.brace_level = 0 - def parseToken(self, token): - # This is an anonymous class if and only if the next - # non-whitespace token is a bracket. Everything between - # braces should be parsed as normal java code. - if token[:2] == '//': - return IgnoreState('\n', self) - elif token == '/*': - return IgnoreState('*/', self) - elif token == '\n': - return self - elif token[0] == '<' and token[-1] == '>': - return self - elif token == '(': - self.brace_level = self.brace_level + 1 - return self - if self.brace_level > 0: - if token == 'new': - # look further for anonymous inner class - return SkipState(1, AnonClassState(self)) - elif token in [ '"', "'" ]: - return IgnoreState(token, self) - elif token == ')': - self.brace_level = self.brace_level - 1 - return self - if token == '{': - self.outer_state.addAnonClass() - return self.old_state.parseToken(token) - - class SkipState(object): - """A state that will skip a specified number of tokens before - reverting to the previous state.""" - def __init__(self, tokens_to_skip, old_state): - self.tokens_to_skip = tokens_to_skip - self.old_state = old_state - def parseToken(self, token): - self.tokens_to_skip = self.tokens_to_skip - 1 - if self.tokens_to_skip < 1: - return self.old_state - return self - - class ClassState(object): - """A state we go into when we hit a class or interface keyword.""" - def __init__(self, outer_state): - # outer_state is always an instance of OuterState - self.outer_state = outer_state - def parseToken(self, token): - # the next non-whitespace token should be the name of the class - if token == '\n': - return self - # If that's an inner class which is declared in a method, it - # requires an index prepended to the class-name, e.g. - # 'Foo$1Inner' (Tigris Issue 2087) - if self.outer_state.localClasses and \ - self.outer_state.stackBrackets[-1] > \ - self.outer_state.stackBrackets[-2]+1: - locals = self.outer_state.localClasses[-1] - try: - idx = locals[token] - locals[token] = locals[token]+1 - except KeyError: - locals[token] = 1 - token = str(locals[token]) + token - self.outer_state.localClasses.append({}) - self.outer_state.listClasses.append(token) - self.outer_state.anonStacksStack.append([0]) - return self.outer_state - - class IgnoreState(object): - """A state that will ignore all tokens until it gets to a - specified token.""" - def __init__(self, ignore_until, old_state): - self.ignore_until = ignore_until - self.old_state = old_state - def parseToken(self, token): - if self.ignore_until == token: - return self.old_state - return self - - class PackageState(object): - """The state we enter when we encounter the package keyword. - We assume the next token will be the package name.""" - def __init__(self, outer_state): - # outer_state is always an instance of OuterState - self.outer_state = outer_state - def parseToken(self, token): - self.outer_state.setPackage(token) - return self.outer_state - - def parse_java_file(fn, version=default_java_version): - return parse_java(open(fn, 'r').read(), version) - - def parse_java(contents, version=default_java_version, trace=None): - """Parse a .java file and return a double of package directory, - plus a list of .class files that compiling that .java file will - produce""" - package = None - initial = OuterState(version) - currstate = initial - for token in _reToken.findall(contents): - # The regex produces a bunch of groups, but only one will - # have anything in it. - currstate = currstate.parseToken(token) - if trace: trace(token, currstate) - if initial.package: - package = initial.package.replace('.', os.sep) - return (package, initial.listOutputs) - -else: - # Don't actually parse Java files for class names. - # - # We might make this a configurable option in the future if - # Java-file parsing takes too long (although it shouldn't relative - # to how long the Java compiler itself seems to take...). - - def parse_java_file(fn): - """ "Parse" a .java file. - - This actually just splits the file name, so the assumption here - is that the file name matches the public class name, and that - the path to the file is the same as the package name. - """ - return os.path.split(file) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py deleted file mode 100644 index 63890783c..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """ -Common functions for Microsoft Visual Studio and Visual C/C++. -""" - -import copy -import os -import re -import subprocess - -import SCons.Errors -import SCons.Platform.win32 -import SCons.Util - -from SCons.Tool.MSCommon.sdk import mssdk_exists, \ - mssdk_setup_env - -from SCons.Tool.MSCommon.vc import msvc_exists, \ - msvc_setup_env, \ - msvc_setup_env_once - -from SCons.Tool.MSCommon.vs import get_default_version, \ - get_vs_by_version, \ - merge_default_version, \ - msvs_exists, \ - query_versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py deleted file mode 100644 index ba6d2d605..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py +++ /dev/null @@ -1,61 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Module to define supported Windows chip architectures. -""" - -import os - -class ArchDefinition(object): - """ - A class for defining architecture-specific settings and logic. - """ - def __init__(self, arch, synonyms=[]): - self.arch = arch - self.synonyms = synonyms - -SupportedArchitectureList = [ - ArchitectureDefinition( - 'x86', - ['i386', 'i486', 'i586', 'i686'], - ), - - ArchitectureDefinition( - 'x86_64', - ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'], - ), - - ArchitectureDefinition( - 'ia64', - ['IA64'], - ), -] - -SupportedArchitectureMap = {} -for a in SupportedArchitectureList: - SupportedArchitectureMap[a.arch] = a - for s in a.synonyms: - SupportedArchitectureMap[s] = a - diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py deleted file mode 100644 index ef1aae926..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py +++ /dev/null @@ -1,240 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/common.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """ -Common helper functions for working with the Microsoft tool chain. -""" - -import copy -import os -import subprocess -import re - -import SCons.Util - - -logfile = os.environ.get('SCONS_MSCOMMON_DEBUG') -if logfile == '-': - def debug(x): - print x -elif logfile: - try: - import logging - except ImportError: - debug = lambda x: open(logfile, 'a').write(x + '\n') - else: - logging.basicConfig(filename=logfile, level=logging.DEBUG) - debug = logging.debug -else: - debug = lambda x: None - - -_is_win64 = None - -def is_win64(): - """Return true if running on windows 64 bits. - - Works whether python itself runs in 64 bits or 32 bits.""" - # Unfortunately, python does not provide a useful way to determine - # if the underlying Windows OS is 32-bit or 64-bit. Worse, whether - # the Python itself is 32-bit or 64-bit affects what it returns, - # so nothing in sys.* or os.* help. - - # Apparently the best solution is to use env vars that Windows - # sets. If PROCESSOR_ARCHITECTURE is not x86, then the python - # process is running in 64 bit mode (on a 64-bit OS, 64-bit - # hardware, obviously). - # If this python is 32-bit but the OS is 64, Windows will set - # ProgramW6432 and PROCESSOR_ARCHITEW6432 to non-null. - # (Checking for HKLM\Software\Wow6432Node in the registry doesn't - # work, because some 32-bit installers create it.) - global _is_win64 - if _is_win64 is None: - # I structured these tests to make it easy to add new ones or - # add exceptions in the future, because this is a bit fragile. - _is_win64 = False - if os.environ.get('PROCESSOR_ARCHITECTURE','x86') != 'x86': - _is_win64 = True - if os.environ.get('PROCESSOR_ARCHITEW6432'): - _is_win64 = True - if os.environ.get('ProgramW6432'): - _is_win64 = True - return _is_win64 - - -def read_reg(value): - return SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, value)[0] - -def has_reg(value): - """Return True if the given key exists in HKEY_LOCAL_MACHINE, False - otherwise.""" - try: - SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, value) - ret = True - except WindowsError: - ret = False - return ret - -# Functions for fetching environment variable settings from batch files. - -def normalize_env(env, keys, force=False): - """Given a dictionary representing a shell environment, add the variables - from os.environ needed for the processing of .bat files; the keys are - controlled by the keys argument. - - It also makes sure the environment values are correctly encoded. - - If force=True, then all of the key values that exist are copied - into the returned dictionary. If force=false, values are only - copied if the key does not already exist in the copied dictionary. - - Note: the environment is copied.""" - normenv = {} - if env: - for k in env.keys(): - normenv[k] = copy.deepcopy(env[k]).encode('mbcs') - - for k in keys: - if k in os.environ and (force or not k in normenv): - normenv[k] = os.environ[k].encode('mbcs') - - return normenv - -def get_output(vcbat, args = None, env = None): - """Parse the output of given bat file, with given args.""" - - if env is None: - # Create a blank environment, for use in launching the tools - env = SCons.Environment.Environment(tools=[]) - - # TODO: This is a hard-coded list of the variables that (may) need - # to be imported from os.environ[] for v[sc]*vars*.bat file - # execution to work. This list should really be either directly - # controlled by vc.py, or else derived from the common_tools_var - # settings in vs.py. - vars = [ - 'COMSPEC', - 'VS90COMNTOOLS', - 'VS80COMNTOOLS', - 'VS71COMNTOOLS', - 'VS70COMNTOOLS', - 'VS60COMNTOOLS', - ] - env['ENV'] = normalize_env(env['ENV'], vars, force=False) - - if args: - debug("Calling '%s %s'" % (vcbat, args)) - popen = SCons.Action._subproc(env, - '"%s" %s & set' % (vcbat, args), - stdin = 'devnull', - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - else: - debug("Calling '%s'" % vcbat) - popen = SCons.Action._subproc(env, - '"%s" & set' % vcbat, - stdin = 'devnull', - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - # Use the .stdout and .stderr attributes directly because the - # .communicate() method uses the threading module on Windows - # and won't work under Pythons not built with threading. - stdout = popen.stdout.read() - stderr = popen.stderr.read() - if stderr: - # TODO: find something better to do with stderr; - # this at least prevents errors from getting swallowed. - import sys - sys.stderr.write(stderr) - if popen.wait() != 0: - raise IOError(stderr.decode("mbcs")) - - output = stdout.decode("mbcs") - return output - -def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")): - # dkeep is a dict associating key: path_list, where key is one item from - # keep, and pat_list the associated list of paths - - dkeep = dict([(i, []) for i in keep]) - - # rdk will keep the regex to match the .bat file output line starts - rdk = {} - for i in keep: - rdk[i] = re.compile('%s=(.*)' % i, re.I) - - def add_env(rmatch, key, dkeep=dkeep): - plist = rmatch.group(1).split(os.pathsep) - for p in plist: - # Do not add empty paths (when a var ends with ;) - if p: - p = p.encode('mbcs') - # XXX: For some reason, VC98 .bat file adds "" around the PATH - # values, and it screws up the environment later, so we strip - # it. - p = p.strip('"') - dkeep[key].append(p) - - for line in output.splitlines(): - for k,v in rdk.items(): - m = v.match(line) - if m: - add_env(m, k) - - return dkeep - -# TODO(sgk): unused -def output_to_dict(output): - """Given an output string, parse it to find env variables. - - Return a dict where keys are variables names, and values their content""" - envlinem = re.compile(r'^([a-zA-z0-9]+)=([\S\s]*)$') - parsedenv = {} - for line in output.splitlines(): - m = envlinem.match(line) - if m: - parsedenv[m.group(1)] = m.group(2) - return parsedenv - -# TODO(sgk): unused -def get_new(l1, l2): - """Given two list l1 and l2, return the items in l2 which are not in l1. - Order is maintained.""" - - # We don't try to be smart: lists are small, and this is not the bottleneck - # is any case - new = [] - for i in l2: - if i not in l1: - new.append(i) - - return new - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py deleted file mode 100644 index 30be8114f..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """ -""" - -import os -import re - -from common import read_reg, debug - -# Original value recorded by dcournapeau -_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot' -# On SGK's system -_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\Microsoft SDKs\.NETFramework\v2.0\InstallationFolder' - -def find_framework_root(): - # XXX: find it from environment (FrameworkDir) - try: - froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT) - debug("Found framework install root in registry: %s" % froot) - except WindowsError, e: - debug("Could not read reg key %s" % _FRAMEWORKDIR_HKEY_ROOT) - return None - - if not os.path.exists(froot): - debug("%s not found on fs" % froot) - return None - - return froot - -def query_versions(): - froot = find_framework_root() - if froot: - contents = os.listdir(froot) - - l = re.compile('v[0-9]+.*') - versions = [e for e in contents if l.match(e)] - - def versrt(a,b): - # since version numbers aren't really floats... - aa = a[1:] - bb = b[1:] - aal = aa.split('.') - bbl = bb.split('.') - # sequence comparison in python is lexicographical - # which is exactly what we want. - # Note we sort backwards so the highest version is first. - return cmp(bbl,aal) - - versions.sort(versrt) - else: - versions = [] - - return versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py deleted file mode 100644 index 6debeb697..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py +++ /dev/null @@ -1,391 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Module to detect the Platform/Windows SDK - -PSDK 2003 R1 is the earliest version detected. -""" - -import os - -import SCons.Errors -import SCons.Util - -import common - -debug = common.debug - -# SDK Checks. This is of course a mess as everything else on MS platforms. Here -# is what we do to detect the SDK: -# -# For Windows SDK >= 6.0: just look into the registry entries: -# HKLM\Software\Microsoft\Microsoft SDKs\Windows -# All the keys in there are the available versions. -# -# For Platform SDK before 6.0 (2003 server R1 and R2, etc...), there does not -# seem to be any sane registry key, so the precise location is hardcoded. -# -# For versions below 2003R1, it seems the PSDK is included with Visual Studio? -# -# Also, per the following: -# http://benjamin.smedbergs.us/blog/tag/atl/ -# VC++ Professional comes with the SDK, VC++ Express does not. - -# Location of the SDK (checked for 6.1 only) -_CURINSTALLED_SDK_HKEY_ROOT = \ - r"Software\Microsoft\Microsoft SDKs\Windows\CurrentInstallFolder" - - -class SDKDefinition(object): - """ - An abstract base class for trying to find installed SDK directories. - """ - def __init__(self, version, **kw): - self.version = version - self.__dict__.update(kw) - - def find_sdk_dir(self): - """Try to find the MS SDK from the registry. - - Return None if failed or the directory does not exist. - """ - if not SCons.Util.can_read_reg: - debug('find_sdk_dir(): can not read registry') - return None - - hkey = self.HKEY_FMT % self.hkey_data - debug('find_sdk_dir(): checking registry:%s'%hkey) - - try: - sdk_dir = common.read_reg(hkey) - except WindowsError, e: - debug('find_sdk_dir(): no SDK registry key %s' % repr(hkey)) - return None - - debug('find_sdk_dir(): Trying SDK Dir: %s'%sdk_dir) - - if not os.path.exists(sdk_dir): - debug('find_sdk_dir(): %s not on file system' % sdk_dir) - return None - - ftc = os.path.join(sdk_dir, self.sanity_check_file) - if not os.path.exists(ftc): - debug("find_sdk_dir(): sanity check %s not found" % ftc) - return None - - return sdk_dir - - def get_sdk_dir(self): - """Return the MSSSDK given the version string.""" - try: - return self._sdk_dir - except AttributeError: - sdk_dir = self.find_sdk_dir() - self._sdk_dir = sdk_dir - return sdk_dir - - def get_sdk_vc_script(self,host_arch, target_arch): - """ Return the script to initialize the VC compiler installed by SDK - """ - - if (host_arch == 'amd64' and target_arch == 'x86'): - # No cross tools needed compiling 32 bits on 64 bit machine - host_arch=target_arch - - arch_string=target_arch - if (host_arch != target_arch): - arch_string='%s_%s'%(host_arch,target_arch) - - debug("sdk.py: get_sdk_vc_script():arch_string:%s host_arch:%s target_arch:%s"%(arch_string, - host_arch, - target_arch)) - file=self.vc_setup_scripts.get(arch_string,None) - debug("sdk.py: get_sdk_vc_script():file:%s"%file) - return file - -class WindowsSDK(SDKDefinition): - """ - A subclass for trying to find installed Windows SDK directories. - """ - HKEY_FMT = r'Software\Microsoft\Microsoft SDKs\Windows\v%s\InstallationFolder' - def __init__(self, *args, **kw): - SDKDefinition.__init__(self, *args, **kw) - self.hkey_data = self.version - -class PlatformSDK(SDKDefinition): - """ - A subclass for trying to find installed Platform SDK directories. - """ - HKEY_FMT = r'Software\Microsoft\MicrosoftSDK\InstalledSDKS\%s\Install Dir' - def __init__(self, *args, **kw): - SDKDefinition.__init__(self, *args, **kw) - self.hkey_data = self.uuid - -# -# The list of VC initialization scripts installed by the SDK -# These should be tried if the vcvarsall.bat TARGET_ARCH fails -preSDK61VCSetupScripts = { 'x86' : r'bin\vcvars32.bat', - 'amd64' : r'bin\vcvarsamd64.bat', - 'x86_amd64': r'bin\vcvarsx86_amd64.bat', - 'x86_ia64' : r'bin\vcvarsx86_ia64.bat', - 'ia64' : r'bin\vcvarsia64.bat'} - -SDK61VCSetupScripts = {'x86' : r'bin\vcvars32.bat', - 'amd64' : r'bin\amd64\vcvarsamd64.bat', - 'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat', - 'x86_ia64' : r'bin\x86_ia64\vcvarsx86_ia64.bat', - 'ia64' : r'bin\ia64\vcvarsia64.bat'} - -SDK70VCSetupScripts = { 'x86' : r'bin\vcvars32.bat', - 'amd64' : r'bin\vcvars64.bat', - 'x86_amd64': r'bin\vcvarsx86_amd64.bat', - 'x86_ia64' : r'bin\vcvarsx86_ia64.bat', - 'ia64' : r'bin\vcvarsia64.bat'} - -# The list of support SDKs which we know how to detect. -# -# The first SDK found in the list is the one used by default if there -# are multiple SDKs installed. Barring good reasons to the contrary, -# this means we should list SDKs with from most recent to oldest. -# -# If you update this list, update the documentation in Tool/mssdk.xml. -SupportedSDKList = [ - WindowsSDK('7.0', - sanity_check_file=r'bin\SetEnv.Cmd', - include_subdir='include', - lib_subdir={ - 'x86' : ['lib'], - 'x86_64' : [r'lib\x64'], - 'ia64' : [r'lib\ia64'], - }, - vc_setup_scripts = SDK70VCSetupScripts, - ), - WindowsSDK('6.1', - sanity_check_file=r'bin\SetEnv.Cmd', - include_subdir='include', - lib_subdir={ - 'x86' : ['lib'], - 'x86_64' : [r'lib\x64'], - 'ia64' : [r'lib\ia64'], - }, - vc_setup_scripts = SDK61VCSetupScripts, - ), - - WindowsSDK('6.0A', - sanity_check_file=r'include\windows.h', - include_subdir='include', - lib_subdir={ - 'x86' : ['lib'], - 'x86_64' : [r'lib\x64'], - 'ia64' : [r'lib\ia64'], - }, - vc_setup_scripts = preSDK61VCSetupScripts, - ), - - WindowsSDK('6.0', - sanity_check_file=r'bin\gacutil.exe', - include_subdir='include', - lib_subdir='lib', - vc_setup_scripts = preSDK61VCSetupScripts, - ), - - PlatformSDK('2003R2', - sanity_check_file=r'SetEnv.Cmd', - uuid="D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1", - vc_setup_scripts = preSDK61VCSetupScripts, - ), - - PlatformSDK('2003R1', - sanity_check_file=r'SetEnv.Cmd', - uuid="8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3", - vc_setup_scripts = preSDK61VCSetupScripts, - ), -] - -SupportedSDKMap = {} -for sdk in SupportedSDKList: - SupportedSDKMap[sdk.version] = sdk - - -# Finding installed SDKs isn't cheap, because it goes not only to the -# registry but also to the disk to sanity-check that there is, in fact, -# an SDK installed there and that the registry entry isn't just stale. -# Find this information once, when requested, and cache it. - -InstalledSDKList = None -InstalledSDKMap = None - -def get_installed_sdks(): - global InstalledSDKList - global InstalledSDKMap - debug('sdk.py:get_installed_sdks()') - if InstalledSDKList is None: - InstalledSDKList = [] - InstalledSDKMap = {} - for sdk in SupportedSDKList: - debug('MSCommon/sdk.py: trying to find SDK %s' % sdk.version) - if sdk.get_sdk_dir(): - debug('MSCommon/sdk.py:found SDK %s' % sdk.version) - InstalledSDKList.append(sdk) - InstalledSDKMap[sdk.version] = sdk - return InstalledSDKList - - -# We may be asked to update multiple construction environments with -# SDK information. When doing this, we check on-disk for whether -# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk -# is expensive, cache results by directory. - -SDKEnvironmentUpdates = {} - -def set_sdk_by_directory(env, sdk_dir): - global SDKEnvironmentUpdates - debug('set_sdk_by_directory: Using dir:%s'%sdk_dir) - try: - env_tuple_list = SDKEnvironmentUpdates[sdk_dir] - except KeyError: - env_tuple_list = [] - SDKEnvironmentUpdates[sdk_dir] = env_tuple_list - - include_path = os.path.join(sdk_dir, 'include') - mfc_path = os.path.join(include_path, 'mfc') - atl_path = os.path.join(include_path, 'atl') - - if os.path.exists(mfc_path): - env_tuple_list.append(('INCLUDE', mfc_path)) - if os.path.exists(atl_path): - env_tuple_list.append(('INCLUDE', atl_path)) - env_tuple_list.append(('INCLUDE', include_path)) - - env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib'))) - env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib'))) - env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin'))) - - for variable, directory in env_tuple_list: - env.PrependENVPath(variable, directory) - - -# TODO(sgk): currently unused; remove? -def get_cur_sdk_dir_from_reg(): - """Try to find the platform sdk directory from the registry. - - Return None if failed or the directory does not exist""" - if not SCons.Util.can_read_reg: - debug('SCons cannot read registry') - return None - - try: - val = common.read_reg(_CURINSTALLED_SDK_HKEY_ROOT) - debug("Found current sdk dir in registry: %s" % val) - except WindowsError, e: - debug("Did not find current sdk in registry") - return None - - if not os.path.exists(val): - debug("Current sdk dir %s not on fs" % val) - return None - - return val - -def get_sdk_by_version(mssdk): - if mssdk not in SupportedSDKMap: - msg = "SDK version %s is not supported" % repr(mssdk) - raise SCons.Errors.UserError(msg) - get_installed_sdks() - return InstalledSDKMap.get(mssdk) - -def get_default_sdk(): - """Set up the default Platform/Windows SDK.""" - get_installed_sdks() - if not InstalledSDKList: - return None - return InstalledSDKList[0] - - - - -def mssdk_setup_env(env): - debug('sdk.py:mssdk_setup_env()') - if 'MSSDK_DIR' in env: - sdk_dir = env['MSSDK_DIR'] - if sdk_dir is None: - return - sdk_dir = env.subst(sdk_dir) - debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:%s'%sdk_dir) - elif 'MSSDK_VERSION' in env: - sdk_version = env['MSSDK_VERSION'] - if sdk_version is None: - msg = "SDK version %s is not installed" % repr(mssdk) - raise SCons.Errors.UserError(msg) - sdk_version = env.subst(sdk_version) - mssdk = get_sdk_by_version(sdk_version) - sdk_dir = mssdk.get_sdk_dir() - debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir) - elif 'MSVS_VERSION' in env: - msvs_version = env['MSVS_VERSION'] - debug('sdk.py:mssdk_setup_env:Getting MSVS_VERSION from env:%s'%msvs_version) - if msvs_version is None: - debug('sdk.py:mssdk_setup_env thinks msvs_version is None') - return - msvs_version = env.subst(msvs_version) - import vs - msvs = vs.get_vs_by_version(msvs_version) - debug('sdk.py:mssdk_setup_env:msvs is :%s'%msvs) - if not msvs: - debug('sdk.py:mssdk_setup_env: no VS version detected, bailingout:%s'%msvs) - return - sdk_version = msvs.sdk_version - debug('sdk.py:msvs.sdk_version is %s'%sdk_version) - if not sdk_version: - return - mssdk = get_sdk_by_version(sdk_version) - if not mssdk: - mssdk = get_default_sdk() - if not mssdk: - return - sdk_dir = mssdk.get_sdk_dir() - debug('sdk.py:mssdk_setup_env: Using MSVS_VERSION:%s'%sdk_dir) - else: - mssdk = get_default_sdk() - if not mssdk: - return - sdk_dir = mssdk.get_sdk_dir() - debug('sdk.py:mssdk_setup_env: not using any env values. sdk_dir:%s'%sdk_dir) - - set_sdk_by_directory(env, sdk_dir) - - #print "No MSVS_VERSION: this is likely to be a bug" - -def mssdk_exists(version=None): - sdks = get_installed_sdks() - if version is None: - return len(sdks) > 0 - return version in sdks - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py deleted file mode 100644 index f07f34c25..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py +++ /dev/null @@ -1,456 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -# TODO: -# * supported arch for versions: for old versions of batch file without -# argument, giving bogus argument cannot be detected, so we have to hardcode -# this here -# * print warning when msvc version specified but not found -# * find out why warning do not print -# * test on 64 bits XP + VS 2005 (and VS 6 if possible) -# * SDK -# * Assembly -__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Module for Visual C/C++ detection and configuration. -""" -import SCons.compat - -import os -import platform -from string import digits as string_digits - -import SCons.Warnings - -import common - -debug = common.debug - -import sdk - -get_installed_sdks = sdk.get_installed_sdks - - -class VisualCException(Exception): - pass - -class UnsupportedVersion(VisualCException): - pass - -class UnsupportedArch(VisualCException): - pass - -class MissingConfiguration(VisualCException): - pass - -class NoVersionFound(VisualCException): - pass - -class BatchFileExecutionError(VisualCException): - pass - -# Dict to 'canonalize' the arch -_ARCH_TO_CANONICAL = { - "amd64" : "amd64", - "emt64" : "amd64", - "i386" : "x86", - "i486" : "x86", - "i586" : "x86", - "i686" : "x86", - "ia64" : "ia64", - "itanium" : "ia64", - "x86" : "x86", - "x86_64" : "amd64", -} - -# Given a (host, target) tuple, return the argument for the bat file. Both host -# and targets should be canonalized. -_HOST_TARGET_ARCH_TO_BAT_ARCH = { - ("x86", "x86"): "x86", - ("x86", "amd64"): "x86_amd64", - ("amd64", "amd64"): "amd64", - ("amd64", "x86"): "x86", - ("x86", "ia64"): "x86_ia64" -} - -def get_host_target(env): - debug('vc.py:get_host_target()') - - host_platform = env.get('HOST_ARCH') - if not host_platform: - host_platform = platform.machine() - # TODO(2.5): the native Python platform.machine() function returns - # '' on all Python versions before 2.6, after which it also uses - # PROCESSOR_ARCHITECTURE. - if not host_platform: - host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '') - - # Retain user requested TARGET_ARCH - req_target_platform = env.get('TARGET_ARCH') - debug('vc.py:get_host_target() req_target_platform:%s'%req_target_platform) - - if req_target_platform: - # If user requested a specific platform then only try that one. - target_platform = req_target_platform - else: - target_platform = host_platform - - try: - host = _ARCH_TO_CANONICAL[host_platform.lower()] - except KeyError, e: - msg = "Unrecognized host architecture %s" - raise ValueError(msg % repr(host_platform)) - - try: - target = _ARCH_TO_CANONICAL[target_platform.lower()] - except KeyError, e: - raise ValueError("Unrecognized target architecture %s" % target_platform) - - return (host, target,req_target_platform) - -_VCVER = ["10.0", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"] - -_VCVER_TO_PRODUCT_DIR = { - '10.0': [ - r'Microsoft\VisualStudio\10.0\Setup\VC\ProductDir'], - '9.0': [ - r'Microsoft\VisualStudio\9.0\Setup\VC\ProductDir'], - '9.0Exp' : [ - r'Microsoft\VCExpress\9.0\Setup\VC\ProductDir'], - '8.0': [ - r'Microsoft\VisualStudio\8.0\Setup\VC\ProductDir'], - '8.0Exp': [ - r'Microsoft\VCExpress\8.0\Setup\VC\ProductDir'], - '7.1': [ - r'Microsoft\VisualStudio\7.1\Setup\VC\ProductDir'], - '7.0': [ - r'Microsoft\VisualStudio\7.0\Setup\VC\ProductDir'], - '6.0': [ - r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir'] -} - -def msvc_version_to_maj_min(msvc_version): - msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.']) - - t = msvc_version_numeric.split(".") - if not len(t) == 2: - raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric)) - try: - maj = int(t[0]) - min = int(t[1]) - return maj, min - except ValueError, e: - raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric)) - -def is_host_target_supported(host_target, msvc_version): - """Return True if the given (host, target) tuple is supported given the - msvc version. - - Parameters - ---------- - host_target: tuple - tuple of (canonalized) host-target, e.g. ("x86", "amd64") for cross - compilation from 32 bits windows to 64 bits. - msvc_version: str - msvc version (major.minor, e.g. 10.0) - - Note - ---- - This only check whether a given version *may* support the given (host, - target), not that the toolchain is actually present on the machine. - """ - # We assume that any Visual Studio version supports x86 as a target - if host_target[1] != "x86": - maj, min = msvc_version_to_maj_min(msvc_version) - if maj < 8: - return False - - return True - -def find_vc_pdir(msvc_version): - """Try to find the product directory for the given - version. - - Note - ---- - If for some reason the requested version could not be found, an - exception which inherits from VisualCException will be raised.""" - root = 'Software\\' - if common.is_win64(): - root = root + 'Wow6432Node\\' - try: - hkeys = _VCVER_TO_PRODUCT_DIR[msvc_version] - except KeyError: - debug("Unknown version of MSVC: %s" % msvc_version) - raise UnsupportedVersion("Unknown version %s" % msvc_version) - - for key in hkeys: - key = root + key - try: - comps = common.read_reg(key) - except WindowsError, e: - debug('find_vc_dir(): no VC registry key %s' % repr(key)) - else: - debug('find_vc_dir(): found VC in registry: %s' % comps) - if os.path.exists(comps): - return comps - else: - debug('find_vc_dir(): reg says dir is %s, but it does not exist. (ignoring)'\ - % comps) - raise MissingConfiguration("registry dir %s not found on the filesystem" % comps) - return None - -def find_batch_file(env,msvc_version,host_arch,target_arch): - """ - Find the location of the batch script which should set up the compiler - for any TARGET_ARCH whose compilers were installed by Visual Studio/VCExpress - """ - pdir = find_vc_pdir(msvc_version) - if pdir is None: - raise NoVersionFound("No version of Visual Studio found") - - debug('vc.py: find_batch_file() pdir:%s'%pdir) - - # filter out e.g. "Exp" from the version name - msvc_ver_numeric = ''.join([x for x in msvc_version if x in string_digits + "."]) - vernum = float(msvc_ver_numeric) - if 7 <= vernum < 8: - pdir = os.path.join(pdir, os.pardir, "Common7", "Tools") - batfilename = os.path.join(pdir, "vsvars32.bat") - elif vernum < 7: - pdir = os.path.join(pdir, "Bin") - batfilename = os.path.join(pdir, "vcvars32.bat") - else: # >= 8 - batfilename = os.path.join(pdir, "vcvarsall.bat") - - if not os.path.exists(batfilename): - debug("Not found: %s" % batfilename) - batfilename = None - - installed_sdks=get_installed_sdks() - for _sdk in installed_sdks: - sdk_bat_file=_sdk.get_sdk_vc_script(host_arch,target_arch) - sdk_bat_file_path=os.path.join(pdir,sdk_bat_file) - debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path) - if os.path.exists(sdk_bat_file_path): - return (batfilename,sdk_bat_file_path) - else: - debug("vc.py:find_batch_file() not found:%s"%sdk_bat_file_path) - else: - return (batfilename,None) - -__INSTALLED_VCS_RUN = None - -def cached_get_installed_vcs(): - global __INSTALLED_VCS_RUN - - if __INSTALLED_VCS_RUN is None: - ret = get_installed_vcs() - __INSTALLED_VCS_RUN = ret - - return __INSTALLED_VCS_RUN - -def get_installed_vcs(): - installed_versions = [] - for ver in _VCVER: - debug('trying to find VC %s' % ver) - try: - if find_vc_pdir(ver): - debug('found VC %s' % ver) - installed_versions.append(ver) - else: - debug('find_vc_pdir return None for ver %s' % ver) - except VisualCException, e: - debug('did not find VC %s: caught exception %s' % (ver, str(e))) - return installed_versions - -def reset_installed_vcs(): - """Make it try again to find VC. This is just for the tests.""" - __INSTALLED_VCS_RUN = None - -def script_env(script, args=None): - stdout = common.get_output(script, args) - # Stupid batch files do not set return code: we take a look at the - # beginning of the output for an error message instead - olines = stdout.splitlines() - if olines[0].startswith("The specified configuration type is missing"): - raise BatchFileExecutionError("\n".join(olines[:2])) - - return common.parse_output(stdout) - -def get_default_version(env): - debug('get_default_version()') - - msvc_version = env.get('MSVC_VERSION') - msvs_version = env.get('MSVS_VERSION') - - debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version)) - - if msvs_version and not msvc_version: - SCons.Warnings.warn( - SCons.Warnings.DeprecatedWarning, - "MSVS_VERSION is deprecated: please use MSVC_VERSION instead ") - return msvs_version - elif msvc_version and msvs_version: - if not msvc_version == msvs_version: - SCons.Warnings.warn( - SCons.Warnings.VisualVersionMismatch, - "Requested msvc version (%s) and msvs version (%s) do " \ - "not match: please use MSVC_VERSION only to request a " \ - "visual studio version, MSVS_VERSION is deprecated" \ - % (msvc_version, msvs_version)) - return msvs_version - if not msvc_version: - installed_vcs = cached_get_installed_vcs() - debug('installed_vcs:%s' % installed_vcs) - if not installed_vcs: - msg = 'No installed VCs' - debug('msv %s\n' % repr(msg)) - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg) - return None - msvc_version = installed_vcs[0] - debug('msvc_setup_env: using default installed MSVC version %s\n' % repr(msvc_version)) - - return msvc_version - -def msvc_setup_env_once(env): - try: - has_run = env["MSVC_SETUP_RUN"] - except KeyError: - has_run = False - - if not has_run: - msvc_setup_env(env) - env["MSVC_SETUP_RUN"] = True - -def msvc_find_valid_batch_script(env,version): - debug('vc.py:msvc_find_valid_batch_script()') - # Find the host platform, target platform, and if present the requested - # target platform - (host_platform, target_platform,req_target_platform) = get_host_target(env) - - # If the user hasn't specifically requested a TARGET_ARCH, and - # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable - # 64 bit tools installed - try_target_archs = [target_platform] - if not req_target_platform and target_platform=='amd64': - try_target_archs.append('x86') - - d = None - for tp in try_target_archs: - # Set to current arch. - env['TARGET_ARCH']=tp - - debug("vc.py:msvc_find_valid_batch_script() trying target_platform:%s"%tp) - host_target = (host_platform, tp) - if not is_host_target_supported(host_target, version): - warn_msg = "host, target = %s not supported for MSVC version %s" % \ - (host_target, version) - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target] - - # Try to locate a batch file for this host/target platform combo - try: - (vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp) - debug('vc.py:msvc_find_valid_batch_script() vc_script:%s sdk_script:%s'%(vc_script,sdk_script)) - except VisualCException, e: - msg = str(e) - debug('Caught exception while looking for batch file (%s)' % msg) - warn_msg = "VC version %s not installed. " + \ - "C/C++ compilers are most likely not set correctly.\n" + \ - " Installed versions are: %s" - warn_msg = warn_msg % (version, cached_get_installed_vcs()) - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - continue - - # Try to use the located batch file for this host/target platform combo - debug('vc.py:msvc_find_valid_batch_script() use_script 2 %s, args:%s\n' % (repr(vc_script), arg)) - if vc_script: - try: - d = script_env(vc_script, args=arg) - except BatchFileExecutionError, e: - debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e)) - vc_script=None - if not vc_script and sdk_script: - debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script)) - try: - d = script_env(sdk_script,args=[]) - except BatchFileExecutionError,e: - debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e)) - continue - elif not vc_script and not sdk_script: - debug('vc.py:msvc_find_valid_batch_script() use_script 6: Neither VC script nor SDK script found') - continue - - # If we cannot find a viable installed compiler, reset the TARGET_ARCH - # To it's initial value - if not d: - env['TARGET_ARCH']=req_target_platform - - return d - - -def msvc_setup_env(env): - debug('msvc_setup_env()') - - version = get_default_version(env) - if version is None: - warn_msg = "No version of Visual Studio compiler found - C/C++ " \ - "compilers most likely not set correctly" - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - return None - debug('msvc_setup_env: using specified MSVC version %s\n' % repr(version)) - - # XXX: we set-up both MSVS version for backward - # compatibility with the msvs tool - env['MSVC_VERSION'] = version - env['MSVS_VERSION'] = version - env['MSVS'] = {} - - - use_script = env.get('MSVC_USE_SCRIPT', True) - if SCons.Util.is_String(use_script): - debug('vc.py:msvc_setup_env() use_script 1 %s\n' % repr(use_script)) - d = script_env(use_script) - elif use_script: - d = msvc_find_valid_batch_script(env,version) - debug('vc.py:msvc_setup_env() use_script 2 %s\n' % d) - if not d: - return d - else: - debug('MSVC_USE_SCRIPT set to False') - warn_msg = "MSVC_USE_SCRIPT set to False, assuming environment " \ - "set correctly." - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - return None - - for k, v in d.items(): - debug('vc.py:msvc_setup_env() env:%s -> %s'%(k,v)) - env.PrependENVPath(k, v, delete_existing=True) - -def msvc_exists(version=None): - vcs = cached_get_installed_vcs() - if version is None: - return len(vcs) > 0 - return version in vcs - diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py deleted file mode 100644 index 06030e24d..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py +++ /dev/null @@ -1,499 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """Module to detect Visual Studio and/or Visual C/C++ -""" - -import os - -import SCons.Errors -import SCons.Util - -from common import debug, \ - get_output, \ - is_win64, \ - normalize_env, \ - parse_output, \ - read_reg - -import SCons.Tool.MSCommon.vc - -class VisualStudio(object): - """ - An abstract base class for trying to find installed versions of - Visual Studio. - """ - def __init__(self, version, **kw): - self.version = version - kw['vc_version'] = kw.get('vc_version', version) - kw['sdk_version'] = kw.get('sdk_version', version) - self.__dict__.update(kw) - self._cache = {} - - # - - def find_batch_file(self): - vs_dir = self.get_vs_dir() - if not vs_dir: - debug('find_executable(): no vs_dir') - return None - batch_file = os.path.join(vs_dir, self.batch_file_path) - batch_file = os.path.normpath(batch_file) - if not os.path.isfile(batch_file): - debug('find_batch_file(): %s not on file system' % batch_file) - return None - return batch_file - - def find_vs_dir_by_vc(self): - SCons.Tool.MSCommon.vc.get_installed_vcs() - dir = SCons.Tool.MSCommon.vc.find_vc_pdir(self.vc_version) - if not dir: - debug('find_vs_dir(): no installed VC %s' % self.vc_version) - return None - return dir - - def find_vs_dir_by_reg(self): - root = 'Software\\' - - if is_win64(): - root = root + 'Wow6432Node\\' - for key in self.hkeys: - if key=='use_dir': - return self.find_vs_dir_by_vc() - key = root + key - try: - comps = read_reg(key) - except WindowsError, e: - debug('find_vs_dir_by_reg(): no VS registry key %s' % repr(key)) - else: - debug('find_vs_dir_by_reg(): found VS in registry: %s' % comps) - return comps - return None - - def find_vs_dir(self): - """ Can use registry or location of VC to find vs dir - First try to find by registry, and if that fails find via VC dir - """ - - - if True: - vs_dir=self.find_vs_dir_by_reg() - return vs_dir - else: - return self.find_vs_dir_by_vc() - - def find_executable(self): - vs_dir = self.get_vs_dir() - if not vs_dir: - debug('find_executable(): no vs_dir (%s)'%vs_dir) - return None - executable = os.path.join(vs_dir, self.executable_path) - executable = os.path.normpath(executable) - if not os.path.isfile(executable): - debug('find_executable(): %s not on file system' % executable) - return None - return executable - - # - - def get_batch_file(self): - try: - return self._cache['batch_file'] - except KeyError: - batch_file = self.find_batch_file() - self._cache['batch_file'] = batch_file - return batch_file - - def get_executable(self): - try: - debug('get_executable using cache:%s'%self._cache['executable']) - return self._cache['executable'] - except KeyError: - executable = self.find_executable() - self._cache['executable'] = executable - debug('get_executable not in cache:%s'%executable) - return executable - - def get_vs_dir(self): - try: - return self._cache['vs_dir'] - except KeyError: - vs_dir = self.find_vs_dir() - self._cache['vs_dir'] = vs_dir - return vs_dir - - def get_supported_arch(self): - try: - return self._cache['supported_arch'] - except KeyError: - # RDEVE: for the time being use hardcoded lists - # supported_arch = self.find_supported_arch() - self._cache['supported_arch'] = self.supported_arch - return self.supported_arch - - def reset(self): - self._cache = {} - -# The list of supported Visual Studio versions we know how to detect. -# -# How to look for .bat file ? -# - VS 2008 Express (x86): -# * from registry key productdir, gives the full path to vsvarsall.bat. In -# HKEY_LOCAL_MACHINE): -# Software\Microsoft\VCEpress\9.0\Setup\VC\productdir -# * from environmnent variable VS90COMNTOOLS: the path is then ..\..\VC -# relatively to the path given by the variable. -# -# - VS 2008 Express (WoW6432: 32 bits on windows x64): -# Software\Wow6432Node\Microsoft\VCEpress\9.0\Setup\VC\productdir -# -# - VS 2005 Express (x86): -# * from registry key productdir, gives the full path to vsvarsall.bat. In -# HKEY_LOCAL_MACHINE): -# Software\Microsoft\VCEpress\8.0\Setup\VC\productdir -# * from environmnent variable VS80COMNTOOLS: the path is then ..\..\VC -# relatively to the path given by the variable. -# -# - VS 2005 Express (WoW6432: 32 bits on windows x64): does not seem to have a -# productdir ? -# -# - VS 2003 .Net (pro edition ? x86): -# * from registry key productdir. The path is then ..\Common7\Tools\ -# relatively to the key. The key is in HKEY_LOCAL_MACHINE): -# Software\Microsoft\VisualStudio\7.1\Setup\VC\productdir -# * from environmnent variable VS71COMNTOOLS: the path is the full path to -# vsvars32.bat -# -# - VS 98 (VS 6): -# * from registry key productdir. The path is then Bin -# relatively to the key. The key is in HKEY_LOCAL_MACHINE): -# Software\Microsoft\VisualStudio\6.0\Setup\VC98\productdir -# -# The first version found in the list is the one used by default if -# there are multiple versions installed. Barring good reasons to -# the contrary, this means we should list versions from most recent -# to oldest. Pro versions get listed before Express versions on the -# assumption that, by default, you'd rather use the version you paid -# good money for in preference to whatever Microsoft makes available -# for free. -# -# If you update this list, update the documentation in Tool/msvs.xml. - -SupportedVSList = [ - # Visual Studio 2010 - # TODO: find the settings, perhaps from someone with a CTP copy? - #VisualStudio('TBD', - # hkey_root=r'TBD', - # common_tools_var='TBD', - # executable_path=r'TBD', - # default_dirname='TBD', - #), - - # Visual Studio 2008 - # The batch file we look for is in the VC directory, - # so the devenv.com executable is up in ..\..\Common7\IDE. - VisualStudio('9.0', - sdk_version='6.1', - hkeys=[r'Microsoft\VisualStudio\9.0\Setup\VS\ProductDir'], - common_tools_var='VS90COMNTOOLS', - executable_path=r'Common7\IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 9', - supported_arch=['x86', 'amd64'], - ), - - # Visual C++ 2008 Express Edition - # The batch file we look for is in the VC directory, - # so the VCExpress.exe executable is up in ..\..\Common7\IDE. - VisualStudio('9.0Exp', - vc_version='9.0', - sdk_version='6.1', - hkeys=[r'Microsoft\VCExpress\9.0\Setup\VS\ProductDir'], - common_tools_var='VS90COMNTOOLS', - executable_path=r'Common7\IDE\VCExpress.exe', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 9', - supported_arch=['x86'], - ), - - # Visual Studio 2005 - # The batch file we look for is in the VC directory, - # so the devenv.com executable is up in ..\..\Common7\IDE. - VisualStudio('8.0', - sdk_version='6.0A', - hkeys=[r'Microsoft\VisualStudio\8.0\Setup\VS\ProductDir'], - common_tools_var='VS80COMNTOOLS', - executable_path=r'Common7\IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 8', - supported_arch=['x86', 'amd64'], - ), - - # Visual C++ 2005 Express Edition - # The batch file we look for is in the VC directory, - # so the VCExpress.exe executable is up in ..\..\Common7\IDE. - VisualStudio('8.0Exp', - vc_version='8.0Exp', - sdk_version='6.0A', - hkeys=[r'Microsoft\VCExpress\8.0\Setup\VS\ProductDir'], - common_tools_var='VS80COMNTOOLS', - executable_path=r'Common7\IDE\VCExpress.exe', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 8', - supported_arch=['x86'], - ), - - # Visual Studio .NET 2003 - # The batch file we look for is in the Common7\Tools directory, - # so the devenv.com executable is next door in ..\IDE. - VisualStudio('7.1', - sdk_version='6.0', - hkeys=[r'Microsoft\VisualStudio\7.1\Setup\VS\ProductDir'], - common_tools_var='VS71COMNTOOLS', - executable_path=r'Common7\IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio .NET 2003', - supported_arch=['x86'], - ), - - # Visual Studio .NET - # The batch file we look for is in the Common7\Tools directory, - # so the devenv.com executable is next door in ..\IDE. - VisualStudio('7.0', - sdk_version='2003R2', - hkeys=[r'Microsoft\VisualStudio\7.0\Setup\VS\ProductDir'], - common_tools_var='VS70COMNTOOLS', - executable_path=r'IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio .NET', - supported_arch=['x86'], - ), - - # Visual Studio 6.0 - VisualStudio('6.0', - sdk_version='2003R1', - hkeys=[r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio\ProductDir', - 'use_dir'], - common_tools_var='VS60COMNTOOLS', - executable_path=r'Common\MSDev98\Bin\MSDEV.COM', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio', - supported_arch=['x86'], - ), -] - -SupportedVSMap = {} -for vs in SupportedVSList: - SupportedVSMap[vs.version] = vs - - -# Finding installed versions of Visual Studio isn't cheap, because it -# goes not only to the registry but also to the disk to sanity-check -# that there is, in fact, a Visual Studio directory there and that the -# registry entry isn't just stale. Find this information once, when -# requested, and cache it. - -InstalledVSList = None -InstalledVSMap = None - -def get_installed_visual_studios(): - global InstalledVSList - global InstalledVSMap - if InstalledVSList is None: - InstalledVSList = [] - InstalledVSMap = {} - for vs in SupportedVSList: - debug('trying to find VS %s' % vs.version) - if vs.get_executable(): - debug('found VS %s' % vs.version) - InstalledVSList.append(vs) - InstalledVSMap[vs.version] = vs - return InstalledVSList - -def reset_installed_visual_studios(): - global InstalledVSList - global InstalledVSMap - InstalledVSList = None - InstalledVSMap = None - for vs in SupportedVSList: - vs.reset() - - # Need to clear installed VC's as well as they are used in finding - # installed VS's - SCons.Tool.MSCommon.vc.reset_installed_vcs() - - -# We may be asked to update multiple construction environments with -# SDK information. When doing this, we check on-disk for whether -# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk -# is expensive, cache results by directory. - -#SDKEnvironmentUpdates = {} -# -#def set_sdk_by_directory(env, sdk_dir): -# global SDKEnvironmentUpdates -# try: -# env_tuple_list = SDKEnvironmentUpdates[sdk_dir] -# except KeyError: -# env_tuple_list = [] -# SDKEnvironmentUpdates[sdk_dir] = env_tuple_list -# -# include_path = os.path.join(sdk_dir, 'include') -# mfc_path = os.path.join(include_path, 'mfc') -# atl_path = os.path.join(include_path, 'atl') -# -# if os.path.exists(mfc_path): -# env_tuple_list.append(('INCLUDE', mfc_path)) -# if os.path.exists(atl_path): -# env_tuple_list.append(('INCLUDE', atl_path)) -# env_tuple_list.append(('INCLUDE', include_path)) -# -# env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib'))) -# env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib'))) -# env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin'))) -# -# for variable, directory in env_tuple_list: -# env.PrependENVPath(variable, directory) - -def msvs_exists(): - return (len(get_installed_visual_studios()) > 0) - -def get_vs_by_version(msvs): - global InstalledVSMap - global SupportedVSMap - - debug('vs.py:get_vs_by_version()') - if msvs not in SupportedVSMap: - msg = "Visual Studio version %s is not supported" % repr(msvs) - raise SCons.Errors.UserError(msg) - get_installed_visual_studios() - vs = InstalledVSMap.get(msvs) - debug('InstalledVSMap:%s'%InstalledVSMap) - debug('vs.py:get_vs_by_version: found vs:%s'%vs) - # Some check like this would let us provide a useful error message - # if they try to set a Visual Studio version that's not installed. - # However, we also want to be able to run tests (like the unit - # tests) on systems that don't, or won't ever, have it installed. - # It might be worth resurrecting this, with some configurable - # setting that the tests can use to bypass the check. - #if not vs: - # msg = "Visual Studio version %s is not installed" % repr(msvs) - # raise SCons.Errors.UserError, msg - return vs - -def get_default_version(env): - """Returns the default version string to use for MSVS. - - If no version was requested by the user through the MSVS environment - variable, query all the available the visual studios through - query_versions, and take the highest one. - - Return - ------ - version: str - the default version. - """ - if 'MSVS' not in env or not SCons.Util.is_Dict(env['MSVS']): - versions = [vs.version for vs in get_installed_visual_studios()] - env['MSVS'] = {'VERSIONS' : versions} - else: - versions = env['MSVS'].get('VERSIONS', []) - - if 'MSVS_VERSION' not in env: - if versions: - env['MSVS_VERSION'] = versions[0] #use highest version by default - else: - env['MSVS_VERSION'] = SupportedVSList[0].version - - env['MSVS']['VERSION'] = env['MSVS_VERSION'] - - return env['MSVS_VERSION'] - -def get_default_arch(env): - """Return the default arch to use for MSVS - - if no version was requested by the user through the MSVS_ARCH environment - variable, select x86 - - Return - ------ - arch: str - """ - arch = env.get('MSVS_ARCH', 'x86') - - msvs = InstalledVSMap.get(env['MSVS_VERSION']) - - if not msvs: - arch = 'x86' - elif not arch in msvs.get_supported_arch(): - fmt = "Visual Studio version %s does not support architecture %s" - raise SCons.Errors.UserError(fmt % (env['MSVS_VERSION'], arch)) - - return arch - -def merge_default_version(env): - version = get_default_version(env) - arch = get_default_arch(env) - -def msvs_setup_env(env): - batfilename = msvs.get_batch_file() - msvs = get_vs_by_version(version) - if msvs is None: - return - - # XXX: I think this is broken. This will silently set a bogus tool instead - # of failing, but there is no other way with the current scons tool - # framework - if batfilename is not None: - - vars = ('LIB', 'LIBPATH', 'PATH', 'INCLUDE') - - msvs_list = get_installed_visual_studios() - vscommonvarnames = [vs.common_tools_var for vs in msvs_list] - save_ENV = env['ENV'] - nenv = normalize_env(env['ENV'], - ['COMSPEC'] + vscommonvarnames, - force=True) - try: - output = get_output(batfilename, arch, env=nenv) - finally: - env['ENV'] = save_ENV - vars = parse_output(output, vars) - - for k, v in vars.items(): - env.PrependENVPath(k, v, delete_existing=1) - -def query_versions(): - """Query the system to get available versions of VS. A version is - considered when a batfile is found.""" - msvs_list = get_installed_visual_studios() - versions = [msvs.version for msvs in msvs_list] - return versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py deleted file mode 100644 index 43d9f6ee8..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py +++ /dev/null @@ -1,103 +0,0 @@ -"""SCons.Tool.Perforce.py - -Tool-specific initialization for Perforce Source Code Management system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/Perforce.py 5023 2010/06/14 22:05:46 scons" - -import os - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Util - -# This function should maybe be moved to SCons.Util? -from SCons.Tool.PharLapCommon import addPathIfNotExists - - -# Variables that we want to import from the base OS environment. -_import_env = [ 'P4PORT', 'P4CLIENT', 'P4USER', 'USER', 'USERNAME', 'P4PASSWD', - 'P4CHARSET', 'P4LANGUAGE', 'SystemRoot' ] - -PerforceAction = SCons.Action.Action('$P4COM', '$P4COMSTR') - -def generate(env): - """Add a Builder factory function and construction variables for - Perforce to an Environment.""" - - def PerforceFactory(env=env): - """ """ - import SCons.Warnings as W - W.warn(W.DeprecatedSourceCodeWarning, """The Perforce() factory is deprecated and there is no replacement.""") - return SCons.Builder.Builder(action = PerforceAction, env = env) - - #setattr(env, 'Perforce', PerforceFactory) - env.Perforce = PerforceFactory - - env['P4'] = 'p4' - env['P4FLAGS'] = SCons.Util.CLVar('') - env['P4COM'] = '$P4 $P4FLAGS sync $TARGET' - try: - environ = env['ENV'] - except KeyError: - environ = {} - env['ENV'] = environ - - # Perforce seems to use the PWD environment variable rather than - # calling getcwd() for itself, which is odd. If no PWD variable - # is present, p4 WILL call getcwd, but this seems to cause problems - # with good ol' Windows's tilde-mangling for long file names. - environ['PWD'] = env.Dir('#').get_abspath() - - for var in _import_env: - v = os.environ.get(var) - if v: - environ[var] = v - - if SCons.Util.can_read_reg: - # If we can read the registry, add the path to Perforce to our environment. - try: - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Perforce\\environment') - val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT') - addPathIfNotExists(environ, 'PATH', val) - except SCons.Util.RegError: - # Can't detect where Perforce is, hope the user has it set in the - # PATH. - pass - -def exists(env): - return env.Detect('p4') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py deleted file mode 100644 index 64dd02fd5..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py +++ /dev/null @@ -1,137 +0,0 @@ -"""SCons.Tool.PharLapCommon - -This module contains common code used by all Tools for the -Phar Lap ETS tool chain. Right now, this is linkloc and -386asm. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/PharLapCommon.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path -import SCons.Errors -import SCons.Util -import re - -def getPharLapPath(): - """Reads the registry to find the installed path of the Phar Lap ETS - development kit. - - Raises UserError if no installed version of Phar Lap can - be found.""" - - if not SCons.Util.can_read_reg: - raise SCons.Errors.InternalError("No Windows registry module was found") - try: - k=SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, - 'SOFTWARE\\Pharlap\\ETS') - val, type = SCons.Util.RegQueryValueEx(k, 'BaseDir') - - # The following is a hack...there is (not surprisingly) - # an odd issue in the Phar Lap plug in that inserts - # a bunch of junk data after the phar lap path in the - # registry. We must trim it. - idx=val.find('\0') - if idx >= 0: - val = val[:idx] - - return os.path.normpath(val) - except SCons.Util.RegError: - raise SCons.Errors.UserError("Cannot find Phar Lap ETS path in the registry. Is it installed properly?") - -REGEX_ETS_VER = re.compile(r'#define\s+ETS_VER\s+([0-9]+)') - -def getPharLapVersion(): - """Returns the version of the installed ETS Tool Suite as a - decimal number. This version comes from the ETS_VER #define in - the embkern.h header. For example, '#define ETS_VER 1010' (which - is what Phar Lap 10.1 defines) would cause this method to return - 1010. Phar Lap 9.1 does not have such a #define, but this method - will return 910 as a default. - - Raises UserError if no installed version of Phar Lap can - be found.""" - - include_path = os.path.join(getPharLapPath(), os.path.normpath("include/embkern.h")) - if not os.path.exists(include_path): - raise SCons.Errors.UserError("Cannot find embkern.h in ETS include directory.\nIs Phar Lap ETS installed properly?") - mo = REGEX_ETS_VER.search(open(include_path, 'r').read()) - if mo: - return int(mo.group(1)) - # Default return for Phar Lap 9.1 - return 910 - -def addPathIfNotExists(env_dict, key, path, sep=os.pathsep): - """This function will take 'key' out of the dictionary - 'env_dict', then add the path 'path' to that key if it is not - already there. This treats the value of env_dict[key] as if it - has a similar format to the PATH variable...a list of paths - separated by tokens. The 'path' will get added to the list if it - is not already there.""" - try: - is_list = 1 - paths = env_dict[key] - if not SCons.Util.is_List(env_dict[key]): - paths = paths.split(sep) - is_list = 0 - if os.path.normcase(path) not in list(map(os.path.normcase, paths)): - paths = [ path ] + paths - if is_list: - env_dict[key] = paths - else: - env_dict[key] = sep.join(paths) - except KeyError: - env_dict[key] = path - -def addPharLapPaths(env): - """This function adds the path to the Phar Lap binaries, includes, - and libraries, if they are not already there.""" - ph_path = getPharLapPath() - - try: - env_dict = env['ENV'] - except KeyError: - env_dict = {} - env['ENV'] = env_dict - addPathIfNotExists(env_dict, 'PATH', - os.path.join(ph_path, 'bin')) - addPathIfNotExists(env_dict, 'INCLUDE', - os.path.join(ph_path, 'include')) - addPathIfNotExists(env_dict, 'LIB', - os.path.join(ph_path, 'lib')) - addPathIfNotExists(env_dict, 'LIB', - os.path.join(ph_path, os.path.normpath('lib/vclib'))) - - env['PHARLAP_PATH'] = getPharLapPath() - env['PHARLAP_VERSION'] = str(getPharLapVersion()) - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py deleted file mode 100644 index 5c5a6bd11..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.RCS.py - -Tool-specific initialization for RCS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/RCS.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - RCS to an Environment.""" - - def RCSFactory(env=env): - """ """ - import SCons.Warnings as W - W.warn(W.DeprecatedSourceCodeWarning, """The RCS() factory is deprecated and there is no replacement.""") - act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR') - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'RCS', RCSFactory) - env.RCS = RCSFactory - - env['RCS'] = 'rcs' - env['RCS_CO'] = 'co' - env['RCS_COFLAGS'] = SCons.Util.CLVar('') - env['RCS_COCOM'] = '$RCS_CO $RCS_COFLAGS $TARGET' - -def exists(env): - return env.Detect('rcs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py deleted file mode 100644 index 2983b8365..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.SCCS.py - -Tool-specific initialization for SCCS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/SCCS.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - SCCS to an Environment.""" - - def SCCSFactory(env=env): - """ """ - import SCons.Warnings as W - W.warn(W.DeprecatedSourceCodeWarning, """The SCCS() factory is deprecated and there is no replacement.""") - act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR') - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'SCCS', SCCSFactory) - env.SCCS = SCCSFactory - - env['SCCS'] = 'sccs' - env['SCCSFLAGS'] = SCons.Util.CLVar('') - env['SCCSGETFLAGS'] = SCons.Util.CLVar('') - env['SCCSCOM'] = '$SCCS $SCCSFLAGS get $SCCSGETFLAGS $TARGET' - -def exists(env): - return env.Detect('sccs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py deleted file mode 100644 index 26ff700d9..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py +++ /dev/null @@ -1,71 +0,0 @@ -"""SCons.Tool.Subversion.py - -Tool-specific initialization for Subversion. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/Subversion.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - Subversion to an Environment.""" - - def SubversionFactory(repos, module='', env=env): - """ """ - # fail if repos is not an absolute path name? - import SCons.Warnings as W - W.warn(W.DeprecatedSourceCodeWarning, """The Subversion() factory is deprecated and there is no replacement.""") - if module != '': - module = os.path.join(module, '') - act = SCons.Action.Action('$SVNCOM', '$SVNCOMSTR') - return SCons.Builder.Builder(action = act, - env = env, - SVNREPOSITORY = repos, - SVNMODULE = module) - - #setattr(env, 'Subversion', SubversionFactory) - env.Subversion = SubversionFactory - - env['SVN'] = 'svn' - env['SVNFLAGS'] = SCons.Util.CLVar('') - env['SVNCOM'] = '$SVN $SVNFLAGS cat $SVNREPOSITORY/$SVNMODULE$TARGET > $TARGET' - -def exists(env): - return env.Detect('svn') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py deleted file mode 100644 index e38d85f22..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py +++ /dev/null @@ -1,681 +0,0 @@ -"""SCons.Tool - -SCons tool selection. - -This looks for modules that define a callable object that can modify -a construction environment as appropriate for a given tool (or tool -chain). - -Note that because this subsystem just *selects* a callable that can -modify a construction environment, it's possible for people to define -their own "tool specification" in an arbitrary callable function. No -one needs to use or tie in to this subsystem in order to roll their own -tool definition. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/__init__.py 5023 2010/06/14 22:05:46 scons" - -import imp -import sys - -import SCons.Builder -import SCons.Errors -import SCons.Node.FS -import SCons.Scanner -import SCons.Scanner.C -import SCons.Scanner.D -import SCons.Scanner.LaTeX -import SCons.Scanner.Prog - -DefaultToolpath=[] - -CScanner = SCons.Scanner.C.CScanner() -DScanner = SCons.Scanner.D.DScanner() -LaTeXScanner = SCons.Scanner.LaTeX.LaTeXScanner() -PDFLaTeXScanner = SCons.Scanner.LaTeX.PDFLaTeXScanner() -ProgramScanner = SCons.Scanner.Prog.ProgramScanner() -SourceFileScanner = SCons.Scanner.Base({}, name='SourceFileScanner') - -CSuffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc", - ".h", ".H", ".hxx", ".hpp", ".hh", - ".F", ".fpp", ".FPP", - ".m", ".mm", - ".S", ".spp", ".SPP"] - -DSuffixes = ['.d'] - -IDLSuffixes = [".idl", ".IDL"] - -LaTeXSuffixes = [".tex", ".ltx", ".latex"] - -for suffix in CSuffixes: - SourceFileScanner.add_scanner(suffix, CScanner) - -for suffix in DSuffixes: - SourceFileScanner.add_scanner(suffix, DScanner) - -# FIXME: what should be done here? Two scanners scan the same extensions, -# but look for different files, e.g., "picture.eps" vs. "picture.pdf". -# The builders for DVI and PDF explicitly reference their scanners -# I think that means this is not needed??? -for suffix in LaTeXSuffixes: - SourceFileScanner.add_scanner(suffix, LaTeXScanner) - SourceFileScanner.add_scanner(suffix, PDFLaTeXScanner) - -class Tool(object): - def __init__(self, name, toolpath=[], **kw): - self.name = name - self.toolpath = toolpath + DefaultToolpath - # remember these so we can merge them into the call - self.init_kw = kw - - module = self._tool_module() - self.generate = module.generate - self.exists = module.exists - if hasattr(module, 'options'): - self.options = module.options - - def _tool_module(self): - # TODO: Interchange zipimport with normal initilization for better error reporting - oldpythonpath = sys.path - sys.path = self.toolpath + sys.path - - try: - try: - file, path, desc = imp.find_module(self.name, self.toolpath) - try: - return imp.load_module(self.name, file, path, desc) - finally: - if file: - file.close() - except ImportError, e: - if str(e)!="No module named %s"%self.name: - raise SCons.Errors.EnvironmentError(e) - try: - import zipimport - except ImportError: - pass - else: - for aPath in self.toolpath: - try: - importer = zipimport.zipimporter(aPath) - return importer.load_module(self.name) - except ImportError, e: - pass - finally: - sys.path = oldpythonpath - - full_name = 'SCons.Tool.' + self.name - try: - return sys.modules[full_name] - except KeyError: - try: - smpath = sys.modules['SCons.Tool'].__path__ - try: - file, path, desc = imp.find_module(self.name, smpath) - module = imp.load_module(full_name, file, path, desc) - setattr(SCons.Tool, self.name, module) - if file: - file.close() - return module - except ImportError, e: - if str(e)!="No module named %s"%self.name: - raise SCons.Errors.EnvironmentError(e) - try: - import zipimport - importer = zipimport.zipimporter( sys.modules['SCons.Tool'].__path__[0] ) - module = importer.load_module(full_name) - setattr(SCons.Tool, self.name, module) - return module - except ImportError, e: - m = "No tool named '%s': %s" % (self.name, e) - raise SCons.Errors.EnvironmentError(m) - except ImportError, e: - m = "No tool named '%s': %s" % (self.name, e) - raise SCons.Errors.EnvironmentError(m) - - def __call__(self, env, *args, **kw): - if self.init_kw is not None: - # Merge call kws into init kws; - # but don't bash self.init_kw. - if kw is not None: - call_kw = kw - kw = self.init_kw.copy() - kw.update(call_kw) - else: - kw = self.init_kw - env.Append(TOOLS = [ self.name ]) - if hasattr(self, 'options'): - import SCons.Variables - if 'options' not in env: - from SCons.Script import ARGUMENTS - env['options']=SCons.Variables.Variables(args=ARGUMENTS) - opts=env['options'] - - self.options(opts) - opts.Update(env) - - self.generate(env, *args, **kw) - - def __str__(self): - return self.name - -########################################################################## -# Create common executable program / library / object builders - -def createProgBuilder(env): - """This is a utility function that creates the Program - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - program = env['BUILDERS']['Program'] - except KeyError: - import SCons.Defaults - program = SCons.Builder.Builder(action = SCons.Defaults.LinkAction, - emitter = '$PROGEMITTER', - prefix = '$PROGPREFIX', - suffix = '$PROGSUFFIX', - src_suffix = '$OBJSUFFIX', - src_builder = 'Object', - target_scanner = ProgramScanner) - env['BUILDERS']['Program'] = program - - return program - -def createStaticLibBuilder(env): - """This is a utility function that creates the StaticLibrary - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - static_lib = env['BUILDERS']['StaticLibrary'] - except KeyError: - action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ] - if env.Detect('ranlib'): - ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR") - action_list.append(ranlib_action) - - static_lib = SCons.Builder.Builder(action = action_list, - emitter = '$LIBEMITTER', - prefix = '$LIBPREFIX', - suffix = '$LIBSUFFIX', - src_suffix = '$OBJSUFFIX', - src_builder = 'StaticObject') - env['BUILDERS']['StaticLibrary'] = static_lib - env['BUILDERS']['Library'] = static_lib - - return static_lib - -def createSharedLibBuilder(env): - """This is a utility function that creates the SharedLibrary - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - shared_lib = env['BUILDERS']['SharedLibrary'] - except KeyError: - import SCons.Defaults - action_list = [ SCons.Defaults.SharedCheck, - SCons.Defaults.ShLinkAction ] - shared_lib = SCons.Builder.Builder(action = action_list, - emitter = "$SHLIBEMITTER", - prefix = '$SHLIBPREFIX', - suffix = '$SHLIBSUFFIX', - target_scanner = ProgramScanner, - src_suffix = '$SHOBJSUFFIX', - src_builder = 'SharedObject') - env['BUILDERS']['SharedLibrary'] = shared_lib - - return shared_lib - -def createLoadableModuleBuilder(env): - """This is a utility function that creates the LoadableModule - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - ld_module = env['BUILDERS']['LoadableModule'] - except KeyError: - import SCons.Defaults - action_list = [ SCons.Defaults.SharedCheck, - SCons.Defaults.LdModuleLinkAction ] - ld_module = SCons.Builder.Builder(action = action_list, - emitter = "$LDMODULEEMITTER", - prefix = '$LDMODULEPREFIX', - suffix = '$LDMODULESUFFIX', - target_scanner = ProgramScanner, - src_suffix = '$SHOBJSUFFIX', - src_builder = 'SharedObject') - env['BUILDERS']['LoadableModule'] = ld_module - - return ld_module - -def createObjBuilders(env): - """This is a utility function that creates the StaticObject - and SharedObject Builders in an Environment if they - are not there already. - - If they are there already, we return the existing ones. - - This is a separate function because soooo many Tools - use this functionality. - - The return is a 2-tuple of (StaticObject, SharedObject) - """ - - - try: - static_obj = env['BUILDERS']['StaticObject'] - except KeyError: - static_obj = SCons.Builder.Builder(action = {}, - emitter = {}, - prefix = '$OBJPREFIX', - suffix = '$OBJSUFFIX', - src_builder = ['CFile', 'CXXFile'], - source_scanner = SourceFileScanner, - single_source = 1) - env['BUILDERS']['StaticObject'] = static_obj - env['BUILDERS']['Object'] = static_obj - - try: - shared_obj = env['BUILDERS']['SharedObject'] - except KeyError: - shared_obj = SCons.Builder.Builder(action = {}, - emitter = {}, - prefix = '$SHOBJPREFIX', - suffix = '$SHOBJSUFFIX', - src_builder = ['CFile', 'CXXFile'], - source_scanner = SourceFileScanner, - single_source = 1) - env['BUILDERS']['SharedObject'] = shared_obj - - return (static_obj, shared_obj) - -def createCFileBuilders(env): - """This is a utility function that creates the CFile/CXXFile - Builders in an Environment if they - are not there already. - - If they are there already, we return the existing ones. - - This is a separate function because soooo many Tools - use this functionality. - - The return is a 2-tuple of (CFile, CXXFile) - """ - - try: - c_file = env['BUILDERS']['CFile'] - except KeyError: - c_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$CFILESUFFIX'}) - env['BUILDERS']['CFile'] = c_file - - env.SetDefault(CFILESUFFIX = '.c') - - try: - cxx_file = env['BUILDERS']['CXXFile'] - except KeyError: - cxx_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$CXXFILESUFFIX'}) - env['BUILDERS']['CXXFile'] = cxx_file - env.SetDefault(CXXFILESUFFIX = '.cc') - - return (c_file, cxx_file) - -########################################################################## -# Create common Java builders - -def CreateJarBuilder(env): - try: - java_jar = env['BUILDERS']['Jar'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - jar_com = SCons.Action.Action('$JARCOM', '$JARCOMSTR') - java_jar = SCons.Builder.Builder(action = jar_com, - suffix = '$JARSUFFIX', - src_suffix = '$JAVACLASSSUFIX', - src_builder = 'JavaClassFile', - source_factory = fs.Entry) - env['BUILDERS']['Jar'] = java_jar - return java_jar - -def CreateJavaHBuilder(env): - try: - java_javah = env['BUILDERS']['JavaH'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - java_javah_com = SCons.Action.Action('$JAVAHCOM', '$JAVAHCOMSTR') - java_javah = SCons.Builder.Builder(action = java_javah_com, - src_suffix = '$JAVACLASSSUFFIX', - target_factory = fs.Entry, - source_factory = fs.File, - src_builder = 'JavaClassFile') - env['BUILDERS']['JavaH'] = java_javah - return java_javah - -def CreateJavaClassFileBuilder(env): - try: - java_class_file = env['BUILDERS']['JavaClassFile'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - java_class_file = SCons.Builder.Builder(action = javac_com, - emitter = {}, - #suffix = '$JAVACLASSSUFFIX', - src_suffix = '$JAVASUFFIX', - src_builder = ['JavaFile'], - target_factory = fs.Entry, - source_factory = fs.File) - env['BUILDERS']['JavaClassFile'] = java_class_file - return java_class_file - -def CreateJavaClassDirBuilder(env): - try: - java_class_dir = env['BUILDERS']['JavaClassDir'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - java_class_dir = SCons.Builder.Builder(action = javac_com, - emitter = {}, - target_factory = fs.Dir, - source_factory = fs.Dir) - env['BUILDERS']['JavaClassDir'] = java_class_dir - return java_class_dir - -def CreateJavaFileBuilder(env): - try: - java_file = env['BUILDERS']['JavaFile'] - except KeyError: - java_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$JAVASUFFIX'}) - env['BUILDERS']['JavaFile'] = java_file - env['JAVASUFFIX'] = '.java' - return java_file - -class ToolInitializerMethod(object): - """ - This is added to a construction environment in place of a - method(s) normally called for a Builder (env.Object, env.StaticObject, - etc.). When called, it has its associated ToolInitializer - object search the specified list of tools and apply the first - one that exists to the construction environment. It then calls - whatever builder was (presumably) added to the construction - environment in place of this particular instance. - """ - def __init__(self, name, initializer): - """ - Note: we store the tool name as __name__ so it can be used by - the class that attaches this to a construction environment. - """ - self.__name__ = name - self.initializer = initializer - - def get_builder(self, env): - """ - Returns the appropriate real Builder for this method name - after having the associated ToolInitializer object apply - the appropriate Tool module. - """ - builder = getattr(env, self.__name__) - - self.initializer.apply_tools(env) - - builder = getattr(env, self.__name__) - if builder is self: - # There was no Builder added, which means no valid Tool - # for this name was found (or possibly there's a mismatch - # between the name we were called by and the Builder name - # added by the Tool module). - return None - - self.initializer.remove_methods(env) - - return builder - - def __call__(self, env, *args, **kw): - """ - """ - builder = self.get_builder(env) - if builder is None: - return [], [] - return builder(*args, **kw) - -class ToolInitializer(object): - """ - A class for delayed initialization of Tools modules. - - Instances of this class associate a list of Tool modules with - a list of Builder method names that will be added by those Tool - modules. As part of instantiating this object for a particular - construction environment, we also add the appropriate - ToolInitializerMethod objects for the various Builder methods - that we want to use to delay Tool searches until necessary. - """ - def __init__(self, env, tools, names): - if not SCons.Util.is_List(tools): - tools = [tools] - if not SCons.Util.is_List(names): - names = [names] - self.env = env - self.tools = tools - self.names = names - self.methods = {} - for name in names: - method = ToolInitializerMethod(name, self) - self.methods[name] = method - env.AddMethod(method) - - def remove_methods(self, env): - """ - Removes the methods that were added by the tool initialization - so we no longer copy and re-bind them when the construction - environment gets cloned. - """ - for method in self.methods.values(): - env.RemoveMethod(method) - - def apply_tools(self, env): - """ - Searches the list of associated Tool modules for one that - exists, and applies that to the construction environment. - """ - for t in self.tools: - tool = SCons.Tool.Tool(t) - if tool.exists(env): - env.Tool(tool) - return - - # If we fall through here, there was no tool module found. - # This is where we can put an informative error message - # about the inability to find the tool. We'll start doing - # this as we cut over more pre-defined Builder+Tools to use - # the ToolInitializer class. - -def Initializers(env): - ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs']) - def Install(self, *args, **kw): - return self._InternalInstall(*args, **kw) - def InstallAs(self, *args, **kw): - return self._InternalInstallAs(*args, **kw) - env.AddMethod(Install) - env.AddMethod(InstallAs) - -def FindTool(tools, env): - for tool in tools: - t = Tool(tool) - if t.exists(env): - return tool - return None - -def FindAllTools(tools, env): - def ToolExists(tool, env=env): - return Tool(tool).exists(env) - return list(filter (ToolExists, tools)) - -def tool_list(platform, env): - - other_plat_tools=[] - # XXX this logic about what tool to prefer on which platform - # should be moved into either the platform files or - # the tool files themselves. - # The search orders here are described in the man page. If you - # change these search orders, update the man page as well. - if str(platform) == 'win32': - "prefer Microsoft tools on Windows" - linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ] - c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ] - cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'c++', 'bcc32' ] - assemblers = ['masm', 'nasm', 'gas', '386asm' ] - fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran'] - ars = ['mslib', 'ar', 'tlib'] - other_plat_tools=['msvs','midl'] - elif str(platform) == 'os2': - "prefer IBM tools on OS/2" - linkers = ['ilink', 'gnulink', ]#'mslink'] - c_compilers = ['icc', 'gcc',]# 'msvc', 'cc'] - cxx_compilers = ['icc', 'g++',]# 'msvc', 'c++'] - assemblers = ['nasm',]# 'masm', 'gas'] - fortran_compilers = ['ifl', 'g77'] - ars = ['ar',]# 'mslib'] - elif str(platform) == 'irix': - "prefer MIPSPro on IRIX" - linkers = ['sgilink', 'gnulink'] - c_compilers = ['sgicc', 'gcc', 'cc'] - cxx_compilers = ['sgic++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran'] - ars = ['sgiar'] - elif str(platform) == 'sunos': - "prefer Forte tools on SunOS" - linkers = ['sunlink', 'gnulink'] - c_compilers = ['suncc', 'gcc', 'cc'] - cxx_compilers = ['sunc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77', - 'gfortran', 'g77', 'fortran'] - ars = ['sunar'] - elif str(platform) == 'hpux': - "prefer aCC tools on HP-UX" - linkers = ['hplink', 'gnulink'] - c_compilers = ['hpcc', 'gcc', 'cc'] - cxx_compilers = ['hpc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran'] - ars = ['ar'] - elif str(platform) == 'aix': - "prefer AIX Visual Age tools on AIX" - linkers = ['aixlink', 'gnulink'] - c_compilers = ['aixcc', 'gcc', 'cc'] - cxx_compilers = ['aixc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'aixf77', 'g77', 'fortran'] - ars = ['ar'] - elif str(platform) == 'darwin': - "prefer GNU tools on Mac OS X, except for some linkers and IBM tools" - linkers = ['applelink', 'gnulink'] - c_compilers = ['gcc', 'cc'] - cxx_compilers = ['g++', 'c++'] - assemblers = ['as'] - fortran_compilers = ['gfortran', 'f95', 'f90', 'g77'] - ars = ['ar'] - else: - "prefer GNU tools on all other platforms" - linkers = ['gnulink', 'mslink', 'ilink'] - c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc'] - cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++'] - assemblers = ['gas', 'nasm', 'masm'] - fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77'] - ars = ['ar', 'mslib'] - - c_compiler = FindTool(c_compilers, env) or c_compilers[0] - - # XXX this logic about what tool provides what should somehow be - # moved into the tool files themselves. - if c_compiler and c_compiler == 'mingw': - # MinGW contains a linker, C compiler, C++ compiler, - # Fortran compiler, archiver and assembler: - cxx_compiler = None - linker = None - assembler = None - fortran_compiler = None - ar = None - else: - # Don't use g++ if the C compiler has built-in C++ support: - if c_compiler in ('msvc', 'intelc', 'icc'): - cxx_compiler = None - else: - cxx_compiler = FindTool(cxx_compilers, env) or cxx_compilers[0] - linker = FindTool(linkers, env) or linkers[0] - assembler = FindTool(assemblers, env) or assemblers[0] - fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0] - ar = FindTool(ars, env) or ars[0] - - other_tools = FindAllTools(other_plat_tools + [ - 'dmd', - #TODO: merge 'install' into 'filesystem' and - # make 'filesystem' the default - 'filesystem', - 'm4', - 'wix', #'midl', 'msvs', - # Parser generators - 'lex', 'yacc', - # Foreign function interface - 'rpcgen', 'swig', - # Java - 'jar', 'javac', 'javah', 'rmic', - # TeX - 'dvipdf', 'dvips', 'gs', - 'tex', 'latex', 'pdflatex', 'pdftex', - # Archivers - 'tar', 'zip', 'rpm', - # SourceCode factories - 'BitKeeper', 'CVS', 'Perforce', - 'RCS', 'SCCS', # 'Subversion', - ], env) - - tools = ([linker, c_compiler, cxx_compiler, - fortran_compiler, assembler, ar] - + other_tools) - - return [x for x in tools if x] - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py deleted file mode 100644 index 62c5ef740..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py +++ /dev/null @@ -1,82 +0,0 @@ -"""SCons.Tool.aixc++ - -Tool-specific initialization for IBM xlC / Visual Age C++ compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixc++.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Platform.aix - -cplusplus = __import__('c++', globals(), locals(), []) - -packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp'] - -def get_xlc(env): - xlc = env.get('CXX', 'xlC') - xlc_r = env.get('SHCXX', 'xlC_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) - -def smart_cxxflags(source, target, env, for_signature): - build_dir = env.GetBuildPath() - if build_dir: - return '-qtempinc=' + os.path.join(build_dir, 'tempinc') - return '' - -def generate(env): - """Add Builders and construction variables for xlC / Visual Age - suite to an Environment.""" - path, _cxx, _shcxx, version = get_xlc(env) - if path: - _cxx = os.path.join(path, _cxx) - _shcxx = os.path.join(path, _shcxx) - - cplusplus.generate(env) - - env['CXX'] = _cxx - env['SHCXX'] = _shcxx - env['CXXVERSION'] = version - env['SHOBJSUFFIX'] = '.pic.o' - -def exists(env): - path, _cxx, _shcxx, version = get_xlc(env) - if path and _cxx: - xlc = os.path.join(path, _cxx) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py deleted file mode 100644 index bf1de3414..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py +++ /dev/null @@ -1,74 +0,0 @@ -"""SCons.Tool.aixcc - -Tool-specific initialization for IBM xlc / Visual Age C compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixcc.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Platform.aix - -import cc - -packages = ['vac.C', 'ibmcxx.cmp'] - -def get_xlc(env): - xlc = env.get('CC', 'xlc') - xlc_r = env.get('SHCC', 'xlc_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) - -def generate(env): - """Add Builders and construction variables for xlc / Visual Age - suite to an Environment.""" - path, _cc, _shcc, version = get_xlc(env) - if path: - _cc = os.path.join(path, _cc) - _shcc = os.path.join(path, _shcc) - - cc.generate(env) - - env['CC'] = _cc - env['SHCC'] = _shcc - env['CCVERSION'] = version - -def exists(env): - path, _cc, _shcc, version = get_xlc(env) - if path and _cc: - xlc = os.path.join(path, _cc) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py deleted file mode 100644 index f68024779..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py +++ /dev/null @@ -1,80 +0,0 @@ -"""engine.SCons.Tool.aixf77 - -Tool-specific initialization for IBM Visual Age f77 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixf77.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -#import SCons.Platform.aix - -import f77 - -# It would be good to look for the AIX F77 package the same way we're now -# looking for the C and C++ packages. This should be as easy as supplying -# the correct package names in the following list and uncommenting the -# SCons.Platform.aix_get_xlc() call the in the function below. -packages = [] - -def get_xlf77(env): - xlf77 = env.get('F77', 'xlf77') - xlf77_r = env.get('SHF77', 'xlf77_r') - #return SCons.Platform.aix.get_xlc(env, xlf77, xlf77_r, packages) - return (None, xlf77, xlf77_r, None) - -def generate(env): - """ - Add Builders and construction variables for the Visual Age FORTRAN - compiler to an Environment. - """ - path, _f77, _shf77, version = get_xlf77(env) - if path: - _f77 = os.path.join(path, _f77) - _shf77 = os.path.join(path, _shf77) - - f77.generate(env) - - env['F77'] = _f77 - env['SHF77'] = _shf77 - -def exists(env): - path, _f77, _shf77, version = get_xlf77(env) - if path and _f77: - xlf77 = os.path.join(path, _f77) - if os.path.exists(xlf77): - return xlf77 - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py deleted file mode 100644 index 9531a4bbd..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py +++ /dev/null @@ -1,76 +0,0 @@ -"""SCons.Tool.aixlink - -Tool-specific initialization for the IBM Visual Age linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixlink.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path - -import SCons.Util - -import aixcc -import link - -cplusplus = __import__('c++', globals(), locals(), []) - -def smart_linkflags(source, target, env, for_signature): - if cplusplus.iscplusplus(source): - build_dir = env.subst('$BUILDDIR', target=target, source=source) - if build_dir: - return '-qtempinc=' + os.path.join(build_dir, 'tempinc') - return '' - -def generate(env): - """ - Add Builders and construction variables for Visual Age linker to - an Environment. - """ - link.generate(env) - - env['SMARTLINKFLAGS'] = smart_linkflags - env['LINKFLAGS'] = SCons.Util.CLVar('$SMARTLINKFLAGS') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218') - env['SHLIBSUFFIX'] = '.a' - -def exists(env): - path, _cc, _shcc, version = aixcc.get_xlc(env) - if path and _cc: - xlc = os.path.join(path, _cc) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py deleted file mode 100644 index 4b3ae775d..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py +++ /dev/null @@ -1,71 +0,0 @@ -"""SCons.Tool.applelink - -Tool-specific initialization for the Apple gnu-like linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/applelink.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Util - -# Even though the Mac is based on the GNU toolchain, it doesn't understand -# the -rpath option, so we use the "link" tool instead of "gnulink". -import link - -def generate(env): - """Add Builders and construction variables for applelink to an - Environment.""" - link.generate(env) - - env['FRAMEWORKPATHPREFIX'] = '-F' - env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}' - env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}' - env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib') - env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - - # override the default for loadable modules, which are different - # on OS X than dynamic shared libs. echoing what XCode does for - # pre/suffixes: - env['LDMODULEPREFIX'] = '' - env['LDMODULESUFFIX'] = '' - env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle') - env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - - - -def exists(env): - return env['PLATFORM'] == 'darwin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ar.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ar.py deleted file mode 100644 index 68effb128..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ar.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.ar - -Tool-specific initialization for ar (library archive). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ar.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - env['AR'] = 'ar' - env['ARFLAGS'] = SCons.Util.CLVar('rc') - env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - - if env.Detect('ranlib'): - env['RANLIB'] = 'ranlib' - env['RANLIBFLAGS'] = SCons.Util.CLVar('') - env['RANLIBCOM'] = '$RANLIB $RANLIBFLAGS $TARGET' - -def exists(env): - return env.Detect('ar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/as.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/as.py deleted file mode 100644 index f18ff573b..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/as.py +++ /dev/null @@ -1,78 +0,0 @@ -"""SCons.Tool.as - -Tool-specific initialization for as, the generic Posix assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/as.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -assemblers = ['as'] - -ASSuffixes = ['.s', '.asm', '.ASM'] -ASPPSuffixes = ['.spp', '.SPP', '.sx'] -if SCons.Util.case_sensitive_suffixes('.s', '.S'): - ASPPSuffixes.extend(['.S']) -else: - ASSuffixes.extend(['.S']) - -def generate(env): - """Add Builders and construction variables for as to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in ASSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASAction) - shared_obj.add_action(suffix, SCons.Defaults.ASAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - for suffix in ASPPSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASPPAction) - shared_obj.add_action(suffix, SCons.Defaults.ASPPAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['AS'] = env.Detect(assemblers) or 'as' - env['ASFLAGS'] = SCons.Util.CLVar('') - env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES' - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES' - -def exists(env): - return env.Detect(assemblers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py deleted file mode 100644 index b7c7bf295..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py +++ /dev/null @@ -1,81 +0,0 @@ -"""SCons.Tool.bcc32 - -XXX - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/bcc32.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def findIt(program, env): - # First search in the SCons path and then the OS path: - borwin = env.WhereIs(program) or SCons.Util.WhereIs(program) - if borwin: - dir = os.path.dirname(borwin) - env.PrependENVPath('PATH', dir) - return borwin - -def generate(env): - findIt('bcc32', env) - """Add Builders and construction variables for bcc to an - Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - for suffix in ['.c', '.cpp']: - static_obj.add_action(suffix, SCons.Defaults.CAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['CC'] = 'bcc32' - env['CCFLAGS'] = SCons.Util.CLVar('') - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC -q $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES' - env['SHCC'] = '$CC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC -WD $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES' - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.dll' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - env['CFILESUFFIX'] = '.cpp' - -def exists(env): - return findIt('bcc32', env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/c++.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/c++.py deleted file mode 100644 index 907324d7f..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/c++.py +++ /dev/null @@ -1,99 +0,0 @@ -"""SCons.Tool.c++ - -Tool-specific initialization for generic Posix C++ compilers. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/c++.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Tool -import SCons.Defaults -import SCons.Util - -compilers = ['CC', 'c++'] - -CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm'] -if SCons.Util.case_sensitive_suffixes('.c', '.C'): - CXXSuffixes.append('.C') - -def iscplusplus(source): - if not source: - # Source might be None for unusual cases like SConf. - return 0 - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext in CXXSuffixes: - return 1 - return 0 - -def generate(env): - """ - Add Builders and construction variables for Visual Age C++ compilers - to an Environment. - """ - import SCons.Tool - import SCons.Tool.cc - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in CXXSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CXXAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - SCons.Tool.cc.add_common_cc_variables(env) - - env['CXX'] = 'c++' - env['CXXFLAGS'] = SCons.Util.CLVar('') - env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' - env['SHCXX'] = '$CXX' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHCXXCOM'] = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' - - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.os' - env['OBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - - env['CXXFILESUFFIX'] = '.cc' - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cc.py deleted file mode 100644 index c3a6b922e..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cc.py +++ /dev/null @@ -1,102 +0,0 @@ -"""SCons.Tool.cc - -Tool-specific initialization for generic Posix C compilers. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/cc.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Tool -import SCons.Defaults -import SCons.Util - -CSuffixes = ['.c', '.m'] -if not SCons.Util.case_sensitive_suffixes('.c', '.C'): - CSuffixes.append('.C') - -def add_common_cc_variables(env): - """ - Add underlying common "C compiler" variables that - are used by multiple tools (specifically, c++). - """ - if '_CCCOMCOM' not in env: - env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' - # It's a hack to test for darwin here, but the alternative - # of creating an applecc.py to contain this seems overkill. - # Maybe someday the Apple platform will require more setup and - # this logic will be moved. - env['FRAMEWORKS'] = SCons.Util.CLVar('') - env['FRAMEWORKPATH'] = SCons.Util.CLVar('') - if env['PLATFORM'] == 'darwin': - env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH' - - if 'CCFLAGS' not in env: - env['CCFLAGS'] = SCons.Util.CLVar('') - - if 'SHCCFLAGS' not in env: - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - -def generate(env): - """ - Add Builders and construction variables for C compilers to an Environment. - """ - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in CSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - add_common_cc_variables(env) - - env['CC'] = 'cc' - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' - env['SHCC'] = '$CC' - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' - - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.os' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - - env['CFILESUFFIX'] = '.c' - -def exists(env): - return env.Detect('cc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py deleted file mode 100644 index 4860241bb..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py +++ /dev/null @@ -1,58 +0,0 @@ -"""engine.SCons.Tool.cvf - -Tool-specific initialization for the Compaq Visual Fortran compiler. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/cvf.py 5023 2010/06/14 22:05:46 scons" - -import fortran - -compilers = ['f90'] - -def generate(env): - """Add Builders and construction variables for compaq visual fortran to an Environment.""" - - fortran.generate(env) - - env['FORTRAN'] = 'f90' - env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['OBJSUFFIX'] = '.obj' - env['FORTRANMODDIR'] = '${TARGET.dir}' - env['FORTRANMODDIRPREFIX'] = '/module:' - env['FORTRANMODDIRSUFFIX'] = '' - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/default.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/default.py deleted file mode 100644 index a2883d7de..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/default.py +++ /dev/null @@ -1,50 +0,0 @@ -"""SCons.Tool.default - -Initialization with a default tool list. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/default.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Tool - -def generate(env): - """Add default tools.""" - for t in SCons.Tool.tool_list(env['PLATFORM'], env): - SCons.Tool.Tool(t)(env) - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py deleted file mode 100644 index a26935468..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py +++ /dev/null @@ -1,223 +0,0 @@ -"""SCons.Tool.dmd - -Tool-specific initialization for the Digital Mars D compiler. -(http://digitalmars.com/d) - -Coded by Andy Friesen (andy@ikagames.com) -15 November 2003 - -There are a number of problems with this script at this point in time. -The one that irritates me the most is the Windows linker setup. The D -linker doesn't have a way to add lib paths on the commandline, as far -as I can see. You have to specify paths relative to the SConscript or -use absolute paths. To hack around it, add '#/blah'. This will link -blah.lib from the directory where SConstruct resides. - -Compiler variables: - DC - The name of the D compiler to use. Defaults to dmd or gdmd, - whichever is found. - DPATH - List of paths to search for import modules. - DVERSIONS - List of version tags to enable when compiling. - DDEBUG - List of debug tags to enable when compiling. - -Linker related variables: - LIBS - List of library files to link in. - DLINK - Name of the linker to use. Defaults to dmd or gdmd. - DLINKFLAGS - List of linker flags. - -Lib tool variables: - DLIB - Name of the lib tool to use. Defaults to lib. - DLIBFLAGS - List of flags to pass to the lib tool. - LIBS - Same as for the linker. (libraries to pull into the .lib) -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/dmd.py 5023 2010/06/14 22:05:46 scons" - -import os - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Scanner.D -import SCons.Tool - -# Adapted from c++.py -def isD(source): - if not source: - return 0 - - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext == '.d': - return 1 - return 0 - -smart_link = {} - -smart_lib = {} - -def generate(env): - global smart_link - global smart_lib - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - DAction = SCons.Action.Action('$DCOM', '$DCOMSTR') - - static_obj.add_action('.d', DAction) - shared_obj.add_action('.d', DAction) - static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter) - - dc = env.Detect(['dmd', 'gdmd']) - env['DC'] = dc - env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES' - env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['_DVERFLAGS'] = '$( ${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)} $)' - env['_DDEBUGFLAGS'] = '$( ${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)} $)' - env['_DFLAGS'] = '$( ${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)} $)' - - env['DPATH'] = ['#/'] - env['DFLAGS'] = [] - env['DVERSIONS'] = [] - env['DDEBUG'] = [] - - if dc: - # Add the path to the standard library. - # This is merely for the convenience of the dependency scanner. - dmd_path = env.WhereIs(dc) - if dmd_path: - x = dmd_path.rindex(dc) - phobosDir = dmd_path[:x] + '/../src/phobos' - if os.path.isdir(phobosDir): - env.Append(DPATH = [phobosDir]) - - env['DINCPREFIX'] = '-I' - env['DINCSUFFIX'] = '' - env['DVERPREFIX'] = '-version=' - env['DVERSUFFIX'] = '' - env['DDEBUGPREFIX'] = '-debug=' - env['DDEBUGSUFFIX'] = '' - env['DFLAGPREFIX'] = '-' - env['DFLAGSUFFIX'] = '' - env['DFILESUFFIX'] = '.d' - - # Need to use the Digital Mars linker/lib on windows. - # *nix can just use GNU link. - if env['PLATFORM'] == 'win32': - env['DLINK'] = '$DC' - env['DLINKCOM'] = '$DLINK -of$TARGET $SOURCES $DFLAGS $DLINKFLAGS $_DLINKLIBFLAGS' - env['DLIB'] = 'lib' - env['DLIBCOM'] = '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLINKLIBFLAGS' - - env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['_DLIBFLAGS'] = '$( ${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)} $)' - env['DLINKFLAGS'] = [] - env['DLIBLINKPREFIX'] = '' - env['DLIBLINKSUFFIX'] = '.lib' - env['DLIBFLAGPREFIX'] = '-' - env['DLIBFLAGSUFFIX'] = '' - env['DLINKFLAGPREFIX'] = '-' - env['DLINKFLAGSUFFIX'] = '' - - SCons.Tool.createStaticLibBuilder(env) - - # Basically, we hijack the link and ar builders with our own. - # these builders check for the presence of D source, and swap out - # the system's defaults for the Digital Mars tools. If there's no D - # source, then we silently return the previous settings. - linkcom = env.get('LINKCOM') - try: - env['SMART_LINKCOM'] = smart_link[linkcom] - except KeyError: - def _smartLink(source, target, env, for_signature, - defaultLinker=linkcom): - if isD(source): - # XXX I'm not sure how to add a $DLINKCOMSTR variable - # so that it works with this _smartLink() logic, - # and I don't have a D compiler/linker to try it out, - # so we'll leave it alone for now. - return '$DLINKCOM' - else: - return defaultLinker - env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink - - arcom = env.get('ARCOM') - try: - env['SMART_ARCOM'] = smart_lib[arcom] - except KeyError: - def _smartLib(source, target, env, for_signature, - defaultLib=arcom): - if isD(source): - # XXX I'm not sure how to add a $DLIBCOMSTR variable - # so that it works with this _smartLib() logic, and - # I don't have a D compiler/archiver to try it out, - # so we'll leave it alone for now. - return '$DLIBCOM' - else: - return defaultLib - env['SMART_ARCOM'] = smart_lib[arcom] = _smartLib - - # It is worth noting that the final space in these strings is - # absolutely pivotal. SCons sees these as actions and not generators - # if it is not there. (very bad) - env['ARCOM'] = '$SMART_ARCOM ' - env['LINKCOM'] = '$SMART_LINKCOM ' - else: # assuming linux - linkcom = env.get('LINKCOM') - try: - env['SMART_LINKCOM'] = smart_link[linkcom] - except KeyError: - def _smartLink(source, target, env, for_signature, - defaultLinker=linkcom, dc=dc): - if isD(source): - try: - libs = env['LIBS'] - except KeyError: - libs = [] - if 'phobos' not in libs and 'gphobos' not in libs: - if dc is 'dmd': - env.Append(LIBS = ['phobos']) - elif dc is 'gdmd': - env.Append(LIBS = ['gphobos']) - if 'pthread' not in libs: - env.Append(LIBS = ['pthread']) - if 'm' not in libs: - env.Append(LIBS = ['m']) - return defaultLinker - env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink - - env['LINKCOM'] = '$SMART_LINKCOM ' - -def exists(env): - return env.Detect(['dmd', 'gdmd']) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py deleted file mode 100644 index 7eb9de497..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.dvi - -Common DVI Builder definition for various other Tool modules that use it. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/dvi.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Builder -import SCons.Tool - -DVIBuilder = None - -def generate(env): - try: - env['BUILDERS']['DVI'] - except KeyError: - global DVIBuilder - - if DVIBuilder is None: - # The suffix is hard-coded to '.dvi', not configurable via a - # construction variable like $DVISUFFIX, because the output - # file name is hard-coded within TeX. - DVIBuilder = SCons.Builder.Builder(action = {}, - source_scanner = SCons.Tool.LaTeXScanner, - suffix = '.dvi', - emitter = {}, - source_ext_match = None) - - env['BUILDERS']['DVI'] = DVIBuilder - -def exists(env): - # This only puts a skeleton Builder in place, so if someone - # references this Tool directly, it's always "available." - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py deleted file mode 100644 index 1b352b366..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py +++ /dev/null @@ -1,124 +0,0 @@ -"""SCons.Tool.dvipdf - -Tool-specific initialization for dvipdf. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/dvipdf.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Defaults -import SCons.Tool.pdf -import SCons.Tool.tex -import SCons.Util - -_null = SCons.Scanner.LaTeX._null - -def DviPdfPsFunction(XXXDviAction, target = None, source= None, env=None): - """A builder for DVI files that sets the TEXPICTS environment - variable before running dvi2ps or dvipdf.""" - - try: - abspath = source[0].attributes.path - except AttributeError : - abspath = '' - - saved_env = SCons.Scanner.LaTeX.modify_env_var(env, 'TEXPICTS', abspath) - - result = XXXDviAction(target, source, env) - - if saved_env is _null: - try: - del env['ENV']['TEXPICTS'] - except KeyError: - pass # was never set - else: - env['ENV']['TEXPICTS'] = saved_env - - return result - -def DviPdfFunction(target = None, source= None, env=None): - result = DviPdfPsFunction(PDFAction,target,source,env) - return result - -def DviPdfStrFunction(target = None, source= None, env=None): - """A strfunction for dvipdf that returns the appropriate - command string for the no_exec options.""" - if env.GetOption("no_exec"): - result = env.subst('$DVIPDFCOM',0,target,source) - else: - result = '' - return result - -PDFAction = None -DVIPDFAction = None - -def PDFEmitter(target, source, env): - """Strips any .aux or .log files from the input source list. - These are created by the TeX Builder that in all likelihood was - used to generate the .dvi file we're using as input, and we only - care about the .dvi file. - """ - def strip_suffixes(n): - return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log'] - source = list(filter(strip_suffixes, source)) - return (target, source) - -def generate(env): - """Add Builders and construction variables for dvipdf to an Environment.""" - global PDFAction - if PDFAction is None: - PDFAction = SCons.Action.Action('$DVIPDFCOM', '$DVIPDFCOMSTR') - - global DVIPDFAction - if DVIPDFAction is None: - DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.dvi', DVIPDFAction) - bld.add_emitter('.dvi', PDFEmitter) - - env['DVIPDF'] = 'dvipdf' - env['DVIPDFFLAGS'] = SCons.Util.CLVar('') - env['DVIPDFCOM'] = 'cd ${TARGET.dir} && $DVIPDF $DVIPDFFLAGS ${SOURCE.file} ${TARGET.file}' - - # Deprecated synonym. - env['PDFCOM'] = ['$DVIPDFCOM'] - -def exists(env): - return env.Detect('dvipdf') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py deleted file mode 100644 index d6e700648..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py +++ /dev/null @@ -1,94 +0,0 @@ -"""SCons.Tool.dvips - -Tool-specific initialization for dvips. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/dvips.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Builder -import SCons.Tool.dvipdf -import SCons.Util - -def DviPsFunction(target = None, source= None, env=None): - result = SCons.Tool.dvipdf.DviPdfPsFunction(PSAction,target,source,env) - return result - -def DviPsStrFunction(target = None, source= None, env=None): - """A strfunction for dvipdf that returns the appropriate - command string for the no_exec options.""" - if env.GetOption("no_exec"): - result = env.subst('$PSCOM',0,target,source) - else: - result = '' - return result - -PSAction = None -DVIPSAction = None -PSBuilder = None - -def generate(env): - """Add Builders and construction variables for dvips to an Environment.""" - global PSAction - if PSAction is None: - PSAction = SCons.Action.Action('$PSCOM', '$PSCOMSTR') - - global DVIPSAction - if DVIPSAction is None: - DVIPSAction = SCons.Action.Action(DviPsFunction, strfunction = DviPsStrFunction) - - global PSBuilder - if PSBuilder is None: - PSBuilder = SCons.Builder.Builder(action = PSAction, - prefix = '$PSPREFIX', - suffix = '$PSSUFFIX', - src_suffix = '.dvi', - src_builder = 'DVI', - single_source=True) - - env['BUILDERS']['PostScript'] = PSBuilder - - env['DVIPS'] = 'dvips' - env['DVIPSFLAGS'] = SCons.Util.CLVar('') - # I'm not quite sure I got the directories and filenames right for variant_dir - # We need to be in the correct directory for the sake of latex \includegraphics eps included files. - env['PSCOM'] = 'cd ${TARGET.dir} && $DVIPS $DVIPSFLAGS -o ${TARGET.file} ${SOURCE.file}' - env['PSPREFIX'] = '' - env['PSSUFFIX'] = '.ps' - -def exists(env): - return env.Detect('dvips') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f77.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f77.py deleted file mode 100644 index d4ec88770..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f77.py +++ /dev/null @@ -1,62 +0,0 @@ -"""engine.SCons.Tool.f77 - -Tool-specific initialization for the generic Posix f77 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/f77.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env - -compilers = ['f77'] - -def generate(env): - add_all_to_env(env) - add_f77_to_env(env) - - fcomp = env.Detect(compilers) or 'f77' - env['F77'] = fcomp - env['SHF77'] = fcomp - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = fcomp - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f90.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f90.py deleted file mode 100644 index b8829b7a1..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f90.py +++ /dev/null @@ -1,62 +0,0 @@ -"""engine.SCons.Tool.f90 - -Tool-specific initialization for the generic Posix f90 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/f90.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f90_to_env - -compilers = ['f90'] - -def generate(env): - add_all_to_env(env) - add_f90_to_env(env) - - fc = env.Detect(compilers) or 'f90' - env['F90'] = fc - env['SHF90'] = fc - - env['FORTRAN'] = fc - env['SHFORTRAN'] = fc - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f95.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f95.py deleted file mode 100644 index 66be30815..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/f95.py +++ /dev/null @@ -1,63 +0,0 @@ -"""engine.SCons.Tool.f95 - -Tool-specific initialization for the generic Posix f95 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/f95.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util -import fortran -from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env - -compilers = ['f95'] - -def generate(env): - add_all_to_env(env) - add_f95_to_env(env) - - fcomp = env.Detect(compilers) or 'f95' - env['F95'] = fcomp - env['SHF95'] = fcomp - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = fcomp - - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py deleted file mode 100644 index 6bceb14e2..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py +++ /dev/null @@ -1,98 +0,0 @@ -"""SCons.Tool.filesystem - -Tool-specific initialization for the filesystem tools. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/filesystem.py 5023 2010/06/14 22:05:46 scons" - -import SCons -from SCons.Tool.install import copyFunc - -copyToBuilder, copyAsBuilder = None, None - -def copyto_emitter(target, source, env): - """ changes the path of the source to be under the target (which - are assumed to be directories. - """ - n_target = [] - - for t in target: - n_target = n_target + [t.File( str( s ) ) for s in source] - - return (n_target, source) - -def copy_action_func(target, source, env): - assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(list(map(str, target)),list(map(str, source))) - - for t, s in zip(target, source): - if copyFunc(t.get_path(), s.get_path(), env): - return 1 - - return 0 - -def copy_action_str(target, source, env): - return env.subst_target_source(env['COPYSTR'], 0, target, source) - -copy_action = SCons.Action.Action( copy_action_func, copy_action_str ) - -def generate(env): - try: - env['BUILDERS']['CopyTo'] - env['BUILDERS']['CopyAs'] - except KeyError, e: - global copyToBuilder - if copyToBuilder is None: - copyToBuilder = SCons.Builder.Builder( - action = copy_action, - target_factory = env.fs.Dir, - source_factory = env.fs.Entry, - multi = 1, - emitter = [ copyto_emitter, ] ) - - global copyAsBuilder - if copyAsBuilder is None: - copyAsBuilder = SCons.Builder.Builder( - action = copy_action, - target_factory = env.fs.Entry, - source_factory = env.fs.Entry ) - - env['BUILDERS']['CopyTo'] = copyToBuilder - env['BUILDERS']['CopyAs'] = copyAsBuilder - - env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"' - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py deleted file mode 100644 index f7b4e8d05..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py +++ /dev/null @@ -1,62 +0,0 @@ -"""SCons.Tool.fortran - -Tool-specific initialization for a generic Posix f77/f90 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/fortran.py 5023 2010/06/14 22:05:46 scons" - -import re - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_fortran_to_env - -compilers = ['f95', 'f90', 'f77'] - -def generate(env): - add_all_to_env(env) - add_fortran_to_env(env) - - fc = env.Detect(compilers) or 'f77' - env['SHFORTRAN'] = fc - env['FORTRAN'] = fc - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g++.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g++.py deleted file mode 100644 index fa93329e4..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g++.py +++ /dev/null @@ -1,90 +0,0 @@ -"""SCons.Tool.g++ - -Tool-specific initialization for g++. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/g++.py 5023 2010/06/14 22:05:46 scons" - -import os.path -import re -import subprocess - -import SCons.Tool -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -compilers = ['g++'] - -def generate(env): - """Add Builders and construction variables for g++ to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - cplusplus.generate(env) - - env['CXX'] = env.Detect(compilers) - - # platform specific settings - if env['PLATFORM'] == 'aix': - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc') - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - elif env['PLATFORM'] == 'hpux': - env['SHOBJSUFFIX'] = '.pic.o' - elif env['PLATFORM'] == 'sunos': - env['SHOBJSUFFIX'] = '.pic.o' - # determine compiler version - if env['CXX']: - #pipe = SCons.Action._subproc(env, [env['CXX'], '-dumpversion'], - pipe = SCons.Action._subproc(env, [env['CXX'], '--version'], - stdin = 'devnull', - stderr = 'devnull', - stdout = subprocess.PIPE) - if pipe.wait() != 0: return - # -dumpversion was added in GCC 3.0. As long as we're supporting - # GCC versions older than that, we should use --version and a - # regular expression. - #line = pipe.stdout.read().strip() - #if line: - # env['CXXVERSION'] = line - line = pipe.stdout.readline() - match = re.search(r'[0-9]+(\.[0-9]+)+', line) - if match: - env['CXXVERSION'] = match.group(0) - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g77.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g77.py deleted file mode 100644 index c21f34b6e..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/g77.py +++ /dev/null @@ -1,73 +0,0 @@ -"""engine.SCons.Tool.g77 - -Tool-specific initialization for g77. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/g77.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env - -compilers = ['g77', 'f77'] - -def generate(env): - """Add Builders and construction variables for g77 to an Environment.""" - add_all_to_env(env) - add_f77_to_env(env) - - fcomp = env.Detect(compilers) or 'g77' - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS') - env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS') - else: - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -fPIC') - env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -fPIC') - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = '$FORTRAN' - - env['F77'] = fcomp - env['SHF77'] = '$F77' - - env['INCFORTRANPREFIX'] = "-I" - env['INCFORTRANSUFFIX'] = "" - - env['INCF77PREFIX'] = "-I" - env['INCF77SUFFIX'] = "" - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gas.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gas.py deleted file mode 100644 index 0ec021a63..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gas.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.gas - -Tool-specific initialization for as, the Gnu assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gas.py 5023 2010/06/14 22:05:46 scons" - -as_module = __import__('as', globals(), locals(), []) - -assemblers = ['as', 'gas'] - -def generate(env): - """Add Builders and construction variables for as to an Environment.""" - as_module.generate(env) - - env['AS'] = env.Detect(assemblers) or 'as' - -def exists(env): - return env.Detect(assemblers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py deleted file mode 100644 index 5d1a7d5b0..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py +++ /dev/null @@ -1,80 +0,0 @@ -"""SCons.Tool.gcc - -Tool-specific initialization for gcc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gcc.py 5023 2010/06/14 22:05:46 scons" - -import cc -import os -import re -import subprocess - -import SCons.Util - -compilers = ['gcc', 'cc'] - -def generate(env): - """Add Builders and construction variables for gcc to an Environment.""" - cc.generate(env) - - env['CC'] = env.Detect(compilers) or 'gcc' - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - else: - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC') - # determine compiler version - if env['CC']: - #pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'], - pipe = SCons.Action._subproc(env, [env['CC'], '--version'], - stdin = 'devnull', - stderr = 'devnull', - stdout = subprocess.PIPE) - if pipe.wait() != 0: return - # -dumpversion was added in GCC 3.0. As long as we're supporting - # GCC versions older than that, we should use --version and a - # regular expression. - #line = pipe.stdout.read().strip() - #if line: - # env['CCVERSION'] = line - line = pipe.stdout.readline() - match = re.search(r'[0-9]+(\.[0-9]+)+', line) - if match: - env['CCVERSION'] = match.group(0) - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py deleted file mode 100644 index 2a3872e58..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.gfortran - -Tool-specific initialization for gfortran, the GNU Fortran 95/Fortran -2003 compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gfortran.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Util - -import fortran - -def generate(env): - """Add Builders and construction variables for gfortran to an - Environment.""" - fortran.generate(env) - - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - env['%s' % dialect] = 'gfortran' - env['SH%s' % dialect] = '$%s' % dialect - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect) - else: - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect) - - env['INC%sPREFIX' % dialect] = "-I" - env['INC%sSUFFIX' % dialect] = "" - -def exists(env): - return env.Detect('gfortran') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py deleted file mode 100644 index 9845a6942..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.gnulink - -Tool-specific initialization for the gnu linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gnulink.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Util - -import link - -linkers = ['g++', 'gcc'] - -def generate(env): - """Add Builders and construction variables for gnulink to an Environment.""" - link.generate(env) - - if env['PLATFORM'] == 'hpux': - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC') - - # __RPATH is set to $_RPATH in the platform specification if that - # platform supports it. - env.Append(LINKFLAGS=['$__RPATH']) - env['RPATHPREFIX'] = '-Wl,-rpath=' - env['RPATHSUFFIX'] = '' - env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}' - -def exists(env): - return env.Detect(linkers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gs.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gs.py deleted file mode 100644 index 8ab63d7d4..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/gs.py +++ /dev/null @@ -1,81 +0,0 @@ -"""SCons.Tool.gs - -Tool-specific initialization for Ghostscript. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gs.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Platform -import SCons.Util - -# Ghostscript goes by different names on different platforms... -platform = SCons.Platform.platform_default() - -if platform == 'os2': - gs = 'gsos2' -elif platform == 'win32': - gs = 'gswin32c' -else: - gs = 'gs' - -GhostscriptAction = None - -def generate(env): - """Add Builders and construction variables for Ghostscript to an - Environment.""" - - global GhostscriptAction - if GhostscriptAction is None: - GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR') - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.ps', GhostscriptAction) - - env['GS'] = gs - env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite') - env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES' - - -def exists(env): - if 'PS2PDF' in env: - return env.Detect(env['PS2PDF']) - else: - return env.Detect(gs) or SCons.Util.WhereIs(gs) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py deleted file mode 100644 index 5be38545b..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py +++ /dev/null @@ -1,84 +0,0 @@ -"""SCons.Tool.hpc++ - -Tool-specific initialization for c++ on HP/UX. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/hpc++.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -acc = None - -# search for the acc compiler and linker front end - -try: - dirs = os.listdir('/opt') -except (IOError, OSError): - # Not being able to read the directory because it doesn't exist - # (IOError) or isn't readable (OSError) is okay. - dirs = [] - -for dir in dirs: - cc = '/opt/' + dir + '/bin/aCC' - if os.path.exists(cc): - acc = cc - break - - -def generate(env): - """Add Builders and construction variables for g++ to an Environment.""" - cplusplus.generate(env) - - if acc: - env['CXX'] = acc or 'aCC' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') - # determine version of aCC - line = os.popen(acc + ' -V 2>&1').readline().rstrip() - if line.find('aCC: HP ANSI C++') == 0: - env['CXXVERSION'] = line.split()[-1] - - if env['PLATFORM'] == 'cygwin': - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - else: - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') - -def exists(env): - return acc - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py deleted file mode 100644 index 24b48c778..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.hpcc - -Tool-specific initialization for HP aCC and cc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/hpcc.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Util - -import cc - -def generate(env): - """Add Builders and construction variables for aCC & cc to an Environment.""" - cc.generate(env) - - env['CXX'] = 'aCC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS +Z') - -def exists(env): - return env.Detect('aCC') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py deleted file mode 100644 index b2ad1ca07..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.Tool.hplink - -Tool-specific initialization for the HP linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/hplink.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path - -import SCons.Util - -import link - -ccLinker = None - -# search for the acc compiler and linker front end - -try: - dirs = os.listdir('/opt') -except (IOError, OSError): - # Not being able to read the directory because it doesn't exist - # (IOError) or isn't readable (OSError) is okay. - dirs = [] - -for dir in dirs: - linker = '/opt/' + dir + '/bin/aCC' - if os.path.exists(linker): - ccLinker = linker - break - -def generate(env): - """ - Add Builders and construction variables for Visual Age linker to - an Environment. - """ - link.generate(env) - - env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,+s -Wl,+vnocompatwarnings') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -b') - env['SHLIBSUFFIX'] = '.sl' - -def exists(env): - return ccLinker - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icc.py deleted file mode 100644 index fd5affeb8..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icc.py +++ /dev/null @@ -1,59 +0,0 @@ -"""engine.SCons.Tool.icc - -Tool-specific initialization for the OS/2 icc compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/icc.py 5023 2010/06/14 22:05:46 scons" - -import cc - -def generate(env): - """Add Builders and construction variables for the OS/2 to an Environment.""" - cc.generate(env) - - env['CC'] = 'icc' - env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET' - env['CXXCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET' - env['CPPDEFPREFIX'] = '/D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '/I' - env['INCSUFFIX'] = '' - env['CFILESUFFIX'] = '.c' - env['CXXFILESUFFIX'] = '.cc' - -def exists(env): - return env.Detect('icc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icl.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icl.py deleted file mode 100644 index f1da77898..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/icl.py +++ /dev/null @@ -1,52 +0,0 @@ -"""engine.SCons.Tool.icl - -Tool-specific initialization for the Intel C/C++ compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/icl.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Tool.intelc - -# This has been completely superceded by intelc.py, which can -# handle both Windows and Linux versions. - -def generate(*args, **kw): - """Add Builders and construction variables for icl to an Environment.""" - return SCons.Tool.intelc.generate(*args, **kw) - -def exists(*args, **kw): - return SCons.Tool.intelc.exists(*args, **kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py deleted file mode 100644 index 17ceb34c5..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py +++ /dev/null @@ -1,72 +0,0 @@ -"""SCons.Tool.ifl - -Tool-specific initialization for the Intel Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ifl.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env - -def generate(env): - """Add Builders and construction variables for ifl to an Environment.""" - fscan = FortranScan("FORTRANPATH") - SCons.Tool.SourceFileScanner.add_scanner('.i', fscan) - SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan) - - if 'FORTRANFILESUFFIXES' not in env: - env['FORTRANFILESUFFIXES'] = ['.i'] - else: - env['FORTRANFILESUFFIXES'].append('.i') - - if 'F90FILESUFFIXES' not in env: - env['F90FILESUFFIXES'] = ['.i90'] - else: - env['F90FILESUFFIXES'].append('.i90') - - add_all_to_env(env) - - env['FORTRAN'] = 'ifl' - env['SHFORTRAN'] = '$FORTRAN' - env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - -def exists(env): - return env.Detect('ifl') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py deleted file mode 100644 index 06bf48426..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py +++ /dev/null @@ -1,88 +0,0 @@ -"""SCons.Tool.ifort - -Tool-specific initialization for newer versions of the Intel Fortran Compiler -for Linux/Windows (and possibly Mac OS X). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ifort.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env - -def generate(env): - """Add Builders and construction variables for ifort to an Environment.""" - # ifort supports Fortran 90 and Fortran 95 - # Additionally, ifort recognizes more file extensions. - fscan = FortranScan("FORTRANPATH") - SCons.Tool.SourceFileScanner.add_scanner('.i', fscan) - SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan) - - if 'FORTRANFILESUFFIXES' not in env: - env['FORTRANFILESUFFIXES'] = ['.i'] - else: - env['FORTRANFILESUFFIXES'].append('.i') - - if 'F90FILESUFFIXES' not in env: - env['F90FILESUFFIXES'] = ['.i90'] - else: - env['F90FILESUFFIXES'].append('.i90') - - add_all_to_env(env) - - fc = 'ifort' - - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - env['%s' % dialect] = fc - env['SH%s' % dialect] = '$%s' % dialect - if env['PLATFORM'] == 'posix': - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect) - - if env['PLATFORM'] == 'win32': - # On Windows, the ifort compiler specifies the object on the - # command line with -object:, not -o. Massage the necessary - # command-line construction variables. - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - for var in ['%sCOM' % dialect, '%sPPCOM' % dialect, - 'SH%sCOM' % dialect, 'SH%sPPCOM' % dialect]: - env[var] = env[var].replace('-o $TARGET', '-object:$TARGET') - env['FORTRANMODDIRPREFIX'] = "/module:" - else: - env['FORTRANMODDIRPREFIX'] = "-module " - -def exists(env): - return env.Detect('ifort') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py deleted file mode 100644 index 71025d187..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py +++ /dev/null @@ -1,59 +0,0 @@ -"""SCons.Tool.ilink - -Tool-specific initialization for the OS/2 ilink linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ilink.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def generate(env): - """Add Builders and construction variables for ilink to an Environment.""" - SCons.Tool.createProgBuilder(env) - - env['LINK'] = 'ilink' - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK $LINKFLAGS /O:$TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBDIRPREFIX']='/LIBPATH:' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - -def exists(env): - return env.Detect('ilink') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py deleted file mode 100644 index fb570f823..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py +++ /dev/null @@ -1,60 +0,0 @@ -"""SCons.Tool.ilink32 - -XXX - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ilink32.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Tool -import SCons.Tool.bcc32 -import SCons.Util - -def generate(env): - """Add Builders and construction variables for Borland ilink to an - Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['LINK'] = '$CC' - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK -q $LINKFLAGS -e$TARGET $SOURCES $LIBS' - env['LIBDIRPREFIX']='' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - -def exists(env): - # Uses bcc32 to do linking as it generally knows where the standard - # LIBS are and set up the linking correctly - return SCons.Tool.bcc32.findIt('bcc32', env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/install.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/install.py deleted file mode 100644 index 7b61bde7d..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/install.py +++ /dev/null @@ -1,229 +0,0 @@ -"""SCons.Tool.install - -Tool-specific initialization for the install tool. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/install.py 5023 2010/06/14 22:05:46 scons" - -import os -import shutil -import stat - -import SCons.Action -from SCons.Util import make_path_relative - -# -# We keep track of *all* installed files. -_INSTALLED_FILES = [] -_UNIQUE_INSTALLED_FILES = None - -# -# Functions doing the actual work of the Install Builder. -# -def copyFunc(dest, source, env): - """Install a source file or directory into a destination by copying, - (including copying permission/mode bits).""" - - if os.path.isdir(source): - if os.path.exists(dest): - if not os.path.isdir(dest): - raise SCons.Errors.UserError("cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source))) - else: - parent = os.path.split(dest)[0] - if not os.path.exists(parent): - os.makedirs(parent) - shutil.copytree(source, dest) - else: - shutil.copy2(source, dest) - st = os.stat(source) - os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - - return 0 - -def installFunc(target, source, env): - """Install a source file into a target using the function specified - as the INSTALL construction variable.""" - try: - install = env['INSTALL'] - except KeyError: - raise SCons.Errors.UserError('Missing INSTALL construction variable.') - - assert len(target)==len(source), \ - "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target))) - for t,s in zip(target,source): - if install(t.get_path(),s.get_path(),env): - return 1 - - return 0 - -def stringFunc(target, source, env): - installstr = env.get('INSTALLSTR') - if installstr: - return env.subst_target_source(installstr, 0, target, source) - target = str(target[0]) - source = str(source[0]) - if os.path.isdir(source): - type = 'directory' - else: - type = 'file' - return 'Install %s: "%s" as "%s"' % (type, source, target) - -# -# Emitter functions -# -def add_targets_to_INSTALLED_FILES(target, source, env): - """ an emitter that adds all target files to the list stored in the - _INSTALLED_FILES global variable. This way all installed files of one - scons call will be collected. - """ - global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES - _INSTALLED_FILES.extend(target) - _UNIQUE_INSTALLED_FILES = None - return (target, source) - -class DESTDIR_factory(object): - """ a node factory, where all files will be relative to the dir supplied - in the constructor. - """ - def __init__(self, env, dir): - self.env = env - self.dir = env.arg2nodes( dir, env.fs.Dir )[0] - - def Entry(self, name): - name = make_path_relative(name) - return self.dir.Entry(name) - - def Dir(self, name): - name = make_path_relative(name) - return self.dir.Dir(name) - -# -# The Builder Definition -# -install_action = SCons.Action.Action(installFunc, stringFunc) -installas_action = SCons.Action.Action(installFunc, stringFunc) - -BaseInstallBuilder = None - -def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw): - if target and dir: - import SCons.Errors - raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.") - if not dir: - dir=target - - import SCons.Script - install_sandbox = SCons.Script.GetOption('install_sandbox') - if install_sandbox: - target_factory = DESTDIR_factory(env, install_sandbox) - else: - target_factory = env.fs - - try: - dnodes = env.arg2nodes(dir, target_factory.Dir) - except TypeError: - raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir)) - sources = env.arg2nodes(source, env.fs.Entry) - tgt = [] - for dnode in dnodes: - for src in sources: - # Prepend './' so the lookup doesn't interpret an initial - # '#' on the file name portion as meaning the Node should - # be relative to the top-level SConstruct directory. - target = env.fs.Entry('.'+os.sep+src.name, dnode) - #tgt.extend(BaseInstallBuilder(env, target, src, **kw)) - tgt.extend(BaseInstallBuilder(env, target, src, **kw)) - return tgt - -def InstallAsBuilderWrapper(env, target=None, source=None, **kw): - result = [] - for src, tgt in map(lambda x, y: (x, y), source, target): - #result.extend(BaseInstallBuilder(env, tgt, src, **kw)) - result.extend(BaseInstallBuilder(env, tgt, src, **kw)) - return result - -added = None - -def generate(env): - - from SCons.Script import AddOption, GetOption - global added - if not added: - added = 1 - AddOption('--install-sandbox', - dest='install_sandbox', - type="string", - action="store", - help='A directory under which all installed files will be placed.') - - global BaseInstallBuilder - if BaseInstallBuilder is None: - install_sandbox = GetOption('install_sandbox') - if install_sandbox: - target_factory = DESTDIR_factory(env, install_sandbox) - else: - target_factory = env.fs - - BaseInstallBuilder = SCons.Builder.Builder( - action = install_action, - target_factory = target_factory.Entry, - source_factory = env.fs.Entry, - multi = 1, - emitter = [ add_targets_to_INSTALLED_FILES, ], - name = 'InstallBuilder') - - env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper - env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper - - # We'd like to initialize this doing something like the following, - # but there isn't yet support for a ${SOURCE.type} expansion that - # will print "file" or "directory" depending on what's being - # installed. For now we punt by not initializing it, and letting - # the stringFunc() that we put in the action fall back to the - # hand-crafted default string if it's not set. - # - #try: - # env['INSTALLSTR'] - #except KeyError: - # env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"' - - try: - env['INSTALL'] - except KeyError: - env['INSTALL'] = copyFunc - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py deleted file mode 100644 index 10e92cdef..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py +++ /dev/null @@ -1,482 +0,0 @@ -"""SCons.Tool.icl - -Tool-specific initialization for the Intel C/C++ compiler. -Supports Linux and Windows compilers, v7 and up. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -from __future__ import division - -__revision__ = "src/engine/SCons/Tool/intelc.py 5023 2010/06/14 22:05:46 scons" - -import math, sys, os.path, glob, string, re - -is_windows = sys.platform == 'win32' -is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or - ('PROCESSOR_ARCHITEW6432' in os.environ and - os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64')) -is_linux = sys.platform == 'linux2' -is_mac = sys.platform == 'darwin' - -if is_windows: - import SCons.Tool.msvc -elif is_linux: - import SCons.Tool.gcc -elif is_mac: - import SCons.Tool.gcc -import SCons.Util -import SCons.Warnings - -# Exceptions for this tool -class IntelCError(SCons.Errors.InternalError): - pass -class MissingRegistryError(IntelCError): # missing registry entry - pass -class MissingDirError(IntelCError): # dir not found - pass -class NoRegistryModuleError(IntelCError): # can't read registry at all - pass - -def uniquify(s): - """Return a sequence containing only one copy of each unique element from input sequence s. - Does not preserve order. - Input sequence must be hashable (i.e. must be usable as a dictionary key).""" - u = {} - for x in s: - u[x] = 1 - return list(u.keys()) - -def linux_ver_normalize(vstr): - """Normalize a Linux compiler version number. - Intel changed from "80" to "9.0" in 2005, so we assume if the number - is greater than 60 it's an old-style number and otherwise new-style. - Always returns an old-style float like 80 or 90 for compatibility with Windows. - Shades of Y2K!""" - # Check for version number like 9.1.026: return 91.026 - m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr) - if m: - vmaj,vmin,build = m.groups() - return float(vmaj) * 10. + float(vmin) + float(build) / 1000.; - else: - f = float(vstr) - if is_windows: - return f - else: - if f < 60: return f * 10.0 - else: return f - -def check_abi(abi): - """Check for valid ABI (application binary interface) name, - and map into canonical one""" - if not abi: - return None - abi = abi.lower() - # valid_abis maps input name to canonical name - if is_windows: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'ia64' : 'ia64', - 'em64t' : 'em64t', - 'amd64' : 'em64t'} - if is_linux: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'x86_64' : 'x86_64', - 'em64t' : 'x86_64', - 'amd64' : 'x86_64'} - if is_mac: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'x86_64' : 'x86_64', - 'em64t' : 'x86_64'} - try: - abi = valid_abis[abi] - except KeyError: - raise SCons.Errors.UserError("Intel compiler: Invalid ABI %s, valid values are %s"% \ - (abi, list(valid_abis.keys()))) - return abi - -def vercmp(a, b): - """Compare strings as floats, - but Intel changed Linux naming convention at 9.0""" - return cmp(linux_ver_normalize(b), linux_ver_normalize(a)) - -def get_version_from_list(v, vlist): - """See if we can match v (string) in vlist (list of strings) - Linux has to match in a fuzzy way.""" - if is_windows: - # Simple case, just find it in the list - if v in vlist: return v - else: return None - else: - # Fuzzy match: normalize version number first, but still return - # original non-normalized form. - fuzz = 0.001 - for vi in vlist: - if math.fabs(linux_ver_normalize(vi) - linux_ver_normalize(v)) < fuzz: - return vi - # Not found - return None - -def get_intel_registry_value(valuename, version=None, abi=None): - """ - Return a value from the Intel compiler registry tree. (Windows only) - """ - # Open the key: - if is_win64: - K = 'Software\\Wow6432Node\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper() - else: - K = 'Software\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper() - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K) - except SCons.Util.RegError: - raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi)) - - # Get the value: - try: - v = SCons.Util.RegQueryValueEx(k, valuename)[0] - return v # or v.encode('iso-8859-1', 'replace') to remove unicode? - except SCons.Util.RegError: - raise MissingRegistryError("%s\\%s was not found in the registry."%(K, valuename)) - - -def get_all_compiler_versions(): - """Returns a sorted list of strings, like "70" or "80" or "9.0" - with most recent compiler version first. - """ - versions=[] - if is_windows: - if is_win64: - keyname = 'Software\\WoW6432Node\\Intel\\Compilers\\C++' - else: - keyname = 'Software\\Intel\\Compilers\\C++' - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, - keyname) - except WindowsError: - return [] - i = 0 - versions = [] - try: - while i < 100: - subkey = SCons.Util.RegEnumKey(k, i) # raises EnvironmentError - # Check that this refers to an existing dir. - # This is not 100% perfect but should catch common - # installation issues like when the compiler was installed - # and then the install directory deleted or moved (rather - # than uninstalling properly), so the registry values - # are still there. - ok = False - for try_abi in ('IA32', 'IA32e', 'IA64', 'EM64T'): - try: - d = get_intel_registry_value('ProductDir', subkey, try_abi) - except MissingRegistryError: - continue # not found in reg, keep going - if os.path.exists(d): ok = True - if ok: - versions.append(subkey) - else: - try: - # Registry points to nonexistent dir. Ignore this - # version. - value = get_intel_registry_value('ProductDir', subkey, 'IA32') - except MissingRegistryError, e: - - # Registry key is left dangling (potentially - # after uninstalling). - - print \ - "scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \ - "scons: *** It seems that the compiler was uninstalled and that the registry\n" \ - "scons: *** was not cleaned up properly.\n" % subkey - else: - print "scons: *** Ignoring "+str(value) - - i = i + 1 - except EnvironmentError: - # no more subkeys - pass - elif is_linux: - for d in glob.glob('/opt/intel_cc_*'): - # Typical dir here is /opt/intel_cc_80. - m = re.search(r'cc_(.*)$', d) - if m: - versions.append(m.group(1)) - for d in glob.glob('/opt/intel/cc*/*'): - # Typical dir here is /opt/intel/cc/9.0 for IA32, - # /opt/intel/cce/9.0 for EMT64 (AMD64) - m = re.search(r'([0-9.]+)$', d) - if m: - versions.append(m.group(1)) - elif is_mac: - for d in glob.glob('/opt/intel/cc*/*'): - # Typical dir here is /opt/intel/cc/9.0 for IA32, - # /opt/intel/cce/9.0 for EMT64 (AMD64) - m = re.search(r'([0-9.]+)$', d) - if m: - versions.append(m.group(1)) - return sorted(uniquify(versions)) # remove dups - -def get_intel_compiler_top(version, abi): - """ - Return the main path to the top-level dir of the Intel compiler, - using the given version. - The compiler will be in /bin/icl.exe (icc on linux), - the include dir is /include, etc. - """ - - if is_windows: - if not SCons.Util.can_read_reg: - raise NoRegistryModuleError("No Windows registry module was found") - top = get_intel_registry_value('ProductDir', version, abi) - # pre-11, icl was in Bin. 11 and later, it's in Bin/ apparently. - if not os.path.exists(os.path.join(top, "Bin", "icl.exe")) \ - and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")): - raise MissingDirError("Can't find Intel compiler in %s"%(top)) - elif is_mac or is_linux: - # first dir is new (>=9.0) style, second is old (8.0) style. - dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s') - if abi == 'x86_64': - dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64 - top=None - for d in dirs: - if os.path.exists(os.path.join(d%version, "bin", "icc")): - top = d%version - break - if not top: - raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi)) - return top - - -def generate(env, version=None, abi=None, topdir=None, verbose=0): - """Add Builders and construction variables for Intel C/C++ compiler - to an Environment. - args: - version: (string) compiler version to use, like "80" - abi: (string) 'win32' or whatever Itanium version wants - topdir: (string) compiler top dir, like - "c:\Program Files\Intel\Compiler70" - If topdir is used, version and abi are ignored. - verbose: (int) if >0, prints compiler version used. - """ - if not (is_mac or is_linux or is_windows): - # can't handle this platform - return - - if is_windows: - SCons.Tool.msvc.generate(env) - elif is_linux: - SCons.Tool.gcc.generate(env) - elif is_mac: - SCons.Tool.gcc.generate(env) - - # if version is unspecified, use latest - vlist = get_all_compiler_versions() - if not version: - if vlist: - version = vlist[0] - else: - # User may have specified '90' but we need to get actual dirname '9.0'. - # get_version_from_list does that mapping. - v = get_version_from_list(version, vlist) - if not v: - raise SCons.Errors.UserError("Invalid Intel compiler version %s: "%version + \ - "installed versions are %s"%(', '.join(vlist))) - version = v - - # if abi is unspecified, use ia32 - # alternatives are ia64 for Itanium, or amd64 or em64t or x86_64 (all synonyms here) - abi = check_abi(abi) - if abi is None: - if is_mac or is_linux: - # Check if we are on 64-bit linux, default to 64 then. - uname_m = os.uname()[4] - if uname_m == 'x86_64': - abi = 'x86_64' - else: - abi = 'ia32' - else: - if is_win64: - abi = 'em64t' - else: - abi = 'ia32' - - if version and not topdir: - try: - topdir = get_intel_compiler_top(version, abi) - except (SCons.Util.RegError, IntelCError): - topdir = None - - if not topdir: - # Normally this is an error, but it might not be if the compiler is - # on $PATH and the user is importing their env. - class ICLTopDirWarning(SCons.Warnings.Warning): - pass - if (is_mac or is_linux) and not env.Detect('icc') or \ - is_windows and not env.Detect('icl'): - - SCons.Warnings.enableWarningClass(ICLTopDirWarning) - SCons.Warnings.warn(ICLTopDirWarning, - "Failed to find Intel compiler for version='%s', abi='%s'"% - (str(version), str(abi))) - else: - # should be cleaned up to say what this other version is - # since in this case we have some other Intel compiler installed - SCons.Warnings.enableWarningClass(ICLTopDirWarning) - SCons.Warnings.warn(ICLTopDirWarning, - "Can't find Intel compiler top dir for version='%s', abi='%s'"% - (str(version), str(abi))) - - if topdir: - if verbose: - print "Intel C compiler: using version %s (%g), abi %s, in '%s'"%\ - (repr(version), linux_ver_normalize(version),abi,topdir) - if is_linux: - # Show the actual compiler version by running the compiler. - os.system('%s/bin/icc --version'%topdir) - if is_mac: - # Show the actual compiler version by running the compiler. - os.system('%s/bin/icc --version'%topdir) - - env['INTEL_C_COMPILER_TOP'] = topdir - if is_linux: - paths={'INCLUDE' : 'include', - 'LIB' : 'lib', - 'PATH' : 'bin', - 'LD_LIBRARY_PATH' : 'lib'} - for p in paths.keys(): - env.PrependENVPath(p, os.path.join(topdir, paths[p])) - if is_mac: - paths={'INCLUDE' : 'include', - 'LIB' : 'lib', - 'PATH' : 'bin', - 'LD_LIBRARY_PATH' : 'lib'} - for p in paths.keys(): - env.PrependENVPath(p, os.path.join(topdir, paths[p])) - if is_windows: - # env key reg valname default subdir of top - paths=(('INCLUDE', 'IncludeDir', 'Include'), - ('LIB' , 'LibDir', 'Lib'), - ('PATH' , 'BinDir', 'Bin')) - # We are supposed to ignore version if topdir is set, so set - # it to the emptry string if it's not already set. - if version is None: - version = '' - # Each path has a registry entry, use that or default to subdir - for p in paths: - try: - path=get_intel_registry_value(p[1], version, abi) - # These paths may have $(ICInstallDir) - # which needs to be substituted with the topdir. - path=path.replace('$(ICInstallDir)', topdir + os.sep) - except IntelCError: - # Couldn't get it from registry: use default subdir of topdir - env.PrependENVPath(p[0], os.path.join(topdir, p[2])) - else: - env.PrependENVPath(p[0], path.split(os.pathsep)) - # print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]])) - - if is_windows: - env['CC'] = 'icl' - env['CXX'] = 'icl' - env['LINK'] = 'xilink' - else: - env['CC'] = 'icc' - env['CXX'] = 'icpc' - # Don't reset LINK here; - # use smart_link which should already be here from link.py. - #env['LINK'] = '$CC' - env['AR'] = 'xiar' - env['LD'] = 'xild' # not used by default - - # This is not the exact (detailed) compiler version, - # just the major version as determined above or specified - # by the user. It is a float like 80 or 90, in normalized form for Linux - # (i.e. even for Linux 9.0 compiler, still returns 90 rather than 9.0) - if version: - env['INTEL_C_COMPILER_VERSION']=linux_ver_normalize(version) - - if is_windows: - # Look for license file dir - # in system environment, registry, and default location. - envlicdir = os.environ.get("INTEL_LICENSE_FILE", '') - K = ('SOFTWARE\Intel\Licenses') - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K) - reglicdir = SCons.Util.RegQueryValueEx(k, "w_cpp")[0] - except (AttributeError, SCons.Util.RegError): - reglicdir = "" - defaultlicdir = r'C:\Program Files\Common Files\Intel\Licenses' - - licdir = None - for ld in [envlicdir, reglicdir]: - # If the string contains an '@', then assume it's a network - # license (port@system) and good by definition. - if ld and (ld.find('@') != -1 or os.path.exists(ld)): - licdir = ld - break - if not licdir: - licdir = defaultlicdir - if not os.path.exists(licdir): - class ICLLicenseDirWarning(SCons.Warnings.Warning): - pass - SCons.Warnings.enableWarningClass(ICLLicenseDirWarning) - SCons.Warnings.warn(ICLLicenseDirWarning, - "Intel license dir was not found." - " Tried using the INTEL_LICENSE_FILE environment variable (%s), the registry (%s) and the default path (%s)." - " Using the default path as a last resort." - % (envlicdir, reglicdir, defaultlicdir)) - env['ENV']['INTEL_LICENSE_FILE'] = licdir - -def exists(env): - if not (is_mac or is_linux or is_windows): - # can't handle this platform - return 0 - - try: - versions = get_all_compiler_versions() - except (SCons.Util.RegError, IntelCError): - versions = None - detected = versions is not None and len(versions) > 0 - if not detected: - # try env.Detect, maybe that will work - if is_windows: - return env.Detect('icl') - elif is_linux: - return env.Detect('icc') - elif is_mac: - return env.Detect('icc') - return detected - -# end of file - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py deleted file mode 100644 index c6920531d..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py +++ /dev/null @@ -1,67 +0,0 @@ -"""SCons.Tool.ipkg - -Tool-specific initialization for ipkg. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -The ipkg tool calls the ipkg-build. Its only argument should be the -packages fake_root. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ipkg.py 5023 2010/06/14 22:05:46 scons" - -import os - -import SCons.Builder - -def generate(env): - """Add Builders and construction variables for ipkg to an Environment.""" - try: - bld = env['BUILDERS']['Ipkg'] - except KeyError: - bld = SCons.Builder.Builder( action = '$IPKGCOM', - suffix = '$IPKGSUFFIX', - source_scanner = None, - target_scanner = None) - env['BUILDERS']['Ipkg'] = bld - - env['IPKG'] = 'ipkg-build' - env['IPKGCOM'] = '$IPKG $IPKGFLAGS ${SOURCE}' - env['IPKGUSER'] = os.popen('id -un').read().strip() - env['IPKGGROUP'] = os.popen('id -gn').read().strip() - env['IPKGFLAGS'] = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP') - env['IPKGSUFFIX'] = '.ipk' - -def exists(env): - return env.Detect('ipkg-build') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/jar.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/jar.py deleted file mode 100644 index 9cb4efffc..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/jar.py +++ /dev/null @@ -1,110 +0,0 @@ -"""SCons.Tool.jar - -Tool-specific initialization for jar. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/jar.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Subst -import SCons.Util - -def jarSources(target, source, env, for_signature): - """Only include sources that are not a manifest file.""" - try: - env['JARCHDIR'] - except KeyError: - jarchdir_set = False - else: - jarchdir_set = True - jarchdir = env.subst('$JARCHDIR', target=target, source=source) - if jarchdir: - jarchdir = env.fs.Dir(jarchdir) - result = [] - for src in source: - contents = src.get_text_contents() - if contents[:16] != "Manifest-Version": - if jarchdir_set: - _chdir = jarchdir - else: - try: - _chdir = src.attributes.java_classdir - except AttributeError: - _chdir = None - if _chdir: - # If we are changing the dir with -C, then sources should - # be relative to that directory. - src = SCons.Subst.Literal(src.get_path(_chdir)) - result.append('-C') - result.append(_chdir) - result.append(src) - return result - -def jarManifest(target, source, env, for_signature): - """Look in sources for a manifest file, if any.""" - for src in source: - contents = src.get_text_contents() - if contents[:16] == "Manifest-Version": - return src - return '' - -def jarFlags(target, source, env, for_signature): - """If we have a manifest, make sure that the 'm' - flag is specified.""" - jarflags = env.subst('$JARFLAGS', target=target, source=source) - for src in source: - contents = src.get_text_contents() - if contents[:16] == "Manifest-Version": - if not 'm' in jarflags: - return jarflags + 'm' - break - return jarflags - -def generate(env): - """Add Builders and construction variables for jar to an Environment.""" - SCons.Tool.CreateJarBuilder(env) - - env['JAR'] = 'jar' - env['JARFLAGS'] = SCons.Util.CLVar('cf') - env['_JARFLAGS'] = jarFlags - env['_JARMANIFEST'] = jarManifest - env['_JARSOURCES'] = jarSources - env['_JARCOM'] = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES' - env['JARCOM'] = "${TEMPFILE('$_JARCOM')}" - env['JARSUFFIX'] = '.jar' - -def exists(env): - return env.Detect('jar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javac.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javac.py deleted file mode 100644 index 66651c3e5..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javac.py +++ /dev/null @@ -1,230 +0,0 @@ -"""SCons.Tool.javac - -Tool-specific initialization for javac. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/javac.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path - -import SCons.Action -import SCons.Builder -from SCons.Node.FS import _my_normcase -from SCons.Tool.JavaCommon import parse_java_file -import SCons.Util - -def classname(path): - """Turn a string (path name) into a Java class name.""" - return os.path.normpath(path).replace(os.sep, '.') - -def emit_java_classes(target, source, env): - """Create and return lists of source java files - and their corresponding target class files. - """ - java_suffix = env.get('JAVASUFFIX', '.java') - class_suffix = env.get('JAVACLASSSUFFIX', '.class') - - target[0].must_be_same(SCons.Node.FS.Dir) - classdir = target[0] - - s = source[0].rentry().disambiguate() - if isinstance(s, SCons.Node.FS.File): - sourcedir = s.dir.rdir() - elif isinstance(s, SCons.Node.FS.Dir): - sourcedir = s.rdir() - else: - raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % s.__class__) - - slist = [] - js = _my_normcase(java_suffix) - for entry in source: - entry = entry.rentry().disambiguate() - if isinstance(entry, SCons.Node.FS.File): - slist.append(entry) - elif isinstance(entry, SCons.Node.FS.Dir): - result = SCons.Util.OrderedDict() - dirnode = entry.rdir() - def find_java_files(arg, dirpath, filenames): - java_files = sorted([n for n in filenames - if _my_normcase(n).endswith(js)]) - mydir = dirnode.Dir(dirpath) - java_paths = [mydir.File(f) for f in java_files] - for jp in java_paths: - arg[jp] = True - for dirpath, dirnames, filenames in os.walk(dirnode.get_abspath()): - find_java_files(result, dirpath, filenames) - entry.walk(find_java_files, result) - - slist.extend(list(result.keys())) - else: - raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % entry.__class__) - - version = env.get('JAVAVERSION', '1.4') - full_tlist = [] - for f in slist: - tlist = [] - source_file_based = True - pkg_dir = None - if not f.is_derived(): - pkg_dir, classes = parse_java_file(f.rfile().get_abspath(), version) - if classes: - source_file_based = False - if pkg_dir: - d = target[0].Dir(pkg_dir) - p = pkg_dir + os.sep - else: - d = target[0] - p = '' - for c in classes: - t = d.File(c + class_suffix) - t.attributes.java_classdir = classdir - t.attributes.java_sourcedir = sourcedir - t.attributes.java_classname = classname(p + c) - tlist.append(t) - - if source_file_based: - base = f.name[:-len(java_suffix)] - if pkg_dir: - t = target[0].Dir(pkg_dir).File(base + class_suffix) - else: - t = target[0].File(base + class_suffix) - t.attributes.java_classdir = classdir - t.attributes.java_sourcedir = f.dir - t.attributes.java_classname = classname(base) - tlist.append(t) - - for t in tlist: - t.set_specific_source([f]) - - full_tlist.extend(tlist) - - return full_tlist, slist - -JavaAction = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - -JavaBuilder = SCons.Builder.Builder(action = JavaAction, - emitter = emit_java_classes, - target_factory = SCons.Node.FS.Entry, - source_factory = SCons.Node.FS.Entry) - -class pathopt(object): - """ - Callable object for generating javac-style path options from - a construction variable (e.g. -classpath, -sourcepath). - """ - def __init__(self, opt, var, default=None): - self.opt = opt - self.var = var - self.default = default - - def __call__(self, target, source, env, for_signature): - path = env[self.var] - if path and not SCons.Util.is_List(path): - path = [path] - if self.default: - path = path + [ env[self.default] ] - if path: - return [self.opt, os.pathsep.join(path)] - #return self.opt + " " + os.pathsep.join(path) - else: - return [] - #return "" - -def Java(env, target, source, *args, **kw): - """ - A pseudo-Builder wrapper around the separate JavaClass{File,Dir} - Builders. - """ - if not SCons.Util.is_List(target): - target = [target] - if not SCons.Util.is_List(source): - source = [source] - - # Pad the target list with repetitions of the last element in the - # list so we have a target for every source element. - target = target + ([target[-1]] * (len(source) - len(target))) - - java_suffix = env.subst('$JAVASUFFIX') - result = [] - - for t, s in zip(target, source): - if isinstance(s, SCons.Node.FS.Base): - if isinstance(s, SCons.Node.FS.File): - b = env.JavaClassFile - else: - b = env.JavaClassDir - else: - if os.path.isfile(s): - b = env.JavaClassFile - elif os.path.isdir(s): - b = env.JavaClassDir - elif s[-len(java_suffix):] == java_suffix: - b = env.JavaClassFile - else: - b = env.JavaClassDir - result.extend(b(t, s, *args, **kw)) - - return result - -def generate(env): - """Add Builders and construction variables for javac to an Environment.""" - java_file = SCons.Tool.CreateJavaFileBuilder(env) - java_class = SCons.Tool.CreateJavaClassFileBuilder(env) - java_class_dir = SCons.Tool.CreateJavaClassDirBuilder(env) - java_class.add_emitter(None, emit_java_classes) - java_class.add_emitter(env.subst('$JAVASUFFIX'), emit_java_classes) - java_class_dir.emitter = emit_java_classes - - env.AddMethod(Java) - - env['JAVAC'] = 'javac' - env['JAVACFLAGS'] = SCons.Util.CLVar('') - env['JAVABOOTCLASSPATH'] = [] - env['JAVACLASSPATH'] = [] - env['JAVASOURCEPATH'] = [] - env['_javapathopt'] = pathopt - env['_JAVABOOTCLASSPATH'] = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} ' - env['_JAVACLASSPATH'] = '${_javapathopt("-classpath", "JAVACLASSPATH")} ' - env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} ' - env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}' - env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES' - env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM')}" - env['JAVACLASSSUFFIX'] = '.class' - env['JAVASUFFIX'] = '.java' - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javah.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javah.py deleted file mode 100644 index e92c42302..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/javah.py +++ /dev/null @@ -1,137 +0,0 @@ -"""SCons.Tool.javah - -Tool-specific initialization for javah. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/javah.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Tool.javac -import SCons.Util - -def emit_java_headers(target, source, env): - """Create and return lists of Java stub header files that will - be created from a set of class files. - """ - class_suffix = env.get('JAVACLASSSUFFIX', '.class') - classdir = env.get('JAVACLASSDIR') - - if not classdir: - try: - s = source[0] - except IndexError: - classdir = '.' - else: - try: - classdir = s.attributes.java_classdir - except AttributeError: - classdir = '.' - classdir = env.Dir(classdir).rdir() - - if str(classdir) == '.': - c_ = None - else: - c_ = str(classdir) + os.sep - - slist = [] - for src in source: - try: - classname = src.attributes.java_classname - except AttributeError: - classname = str(src) - if c_ and classname[:len(c_)] == c_: - classname = classname[len(c_):] - if class_suffix and classname[-len(class_suffix):] == class_suffix: - classname = classname[:-len(class_suffix)] - classname = SCons.Tool.javac.classname(classname) - s = src.rfile() - s.attributes.java_classname = classname - slist.append(s) - - s = source[0].rfile() - if not hasattr(s.attributes, 'java_classdir'): - s.attributes.java_classdir = classdir - - if target[0].__class__ is SCons.Node.FS.File: - tlist = target - else: - if not isinstance(target[0], SCons.Node.FS.Dir): - target[0].__class__ = SCons.Node.FS.Dir - target[0]._morph() - tlist = [] - for s in source: - fname = s.attributes.java_classname.replace('.', '_') + '.h' - t = target[0].File(fname) - t.attributes.java_lookupdir = target[0] - tlist.append(t) - - return tlist, source - -def JavaHOutFlagGenerator(target, source, env, for_signature): - try: - t = target[0] - except (AttributeError, IndexError, TypeError): - t = target - try: - return '-d ' + str(t.attributes.java_lookupdir) - except AttributeError: - return '-o ' + str(t) - -def getJavaHClassPath(env,target, source, for_signature): - path = "${SOURCE.attributes.java_classdir}" - if 'JAVACLASSPATH' in env and env['JAVACLASSPATH']: - path = SCons.Util.AppendPath(path, env['JAVACLASSPATH']) - return "-classpath %s" % (path) - -def generate(env): - """Add Builders and construction variables for javah to an Environment.""" - java_javah = SCons.Tool.CreateJavaHBuilder(env) - java_javah.emitter = emit_java_headers - - env['_JAVAHOUTFLAG'] = JavaHOutFlagGenerator - env['JAVAH'] = 'javah' - env['JAVAHFLAGS'] = SCons.Util.CLVar('') - env['_JAVAHCLASSPATH'] = getJavaHClassPath - env['JAVAHCOM'] = '$JAVAH $JAVAHFLAGS $_JAVAHOUTFLAG $_JAVAHCLASSPATH ${SOURCES.attributes.java_classname}' - env['JAVACLASSSUFFIX'] = '.class' - -def exists(env): - return env.Detect('javah') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/latex.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/latex.py deleted file mode 100644 index e4f1a51f2..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/latex.py +++ /dev/null @@ -1,79 +0,0 @@ -"""SCons.Tool.latex - -Tool-specific initialization for LaTeX. -Generates .dvi files from .latex or .ltx files - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/latex.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.LaTeX -import SCons.Util -import SCons.Tool -import SCons.Tool.tex - -def LaTeXAuxFunction(target = None, source= None, env=None): - result = SCons.Tool.tex.InternalLaTeXAuxAction( SCons.Tool.tex.LaTeXAction, target, source, env ) - if result != 0: - SCons.Tool.tex.check_file_error_message(env['LATEX']) - return result - -LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction, - strfunction=SCons.Tool.tex.TeXLaTeXStrFunction) - -def generate(env): - """Add Builders and construction variables for LaTeX to an Environment.""" - - env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes) - - import dvi - dvi.generate(env) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['DVI'] - bld.add_action('.ltx', LaTeXAuxAction) - bld.add_action('.latex', LaTeXAuxAction) - bld.add_emitter('.ltx', SCons.Tool.tex.tex_eps_emitter) - bld.add_emitter('.latex', SCons.Tool.tex.tex_eps_emitter) - - SCons.Tool.tex.generate_common(env) - -def exists(env): - return env.Detect('latex') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/lex.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/lex.py deleted file mode 100644 index aad500460..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/lex.py +++ /dev/null @@ -1,97 +0,0 @@ -"""SCons.Tool.lex - -Tool-specific initialization for lex. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/lex.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Action -import SCons.Tool -import SCons.Util - -LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR") - -def lexEmitter(target, source, env): - sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0])) - - if sourceExt == ".lm": # If using Objective-C - target = [sourceBase + ".m"] # the extension is ".m". - - # This emitter essentially tries to add to the target all extra - # files generated by flex. - - # Different options that are used to trigger the creation of extra files. - fileGenOptions = ["--header-file=", "--tables-file="] - - lexflags = env.subst("$LEXFLAGS", target=target, source=source) - for option in SCons.Util.CLVar(lexflags): - for fileGenOption in fileGenOptions: - l = len(fileGenOption) - if option[:l] == fileGenOption: - # A file generating option is present, so add the - # file name to the target list. - fileName = option[l:].strip() - target.append(fileName) - return (target, source) - -def generate(env): - """Add Builders and construction variables for lex to an Environment.""" - c_file, cxx_file = SCons.Tool.createCFileBuilders(env) - - # C - c_file.add_action(".l", LexAction) - c_file.add_emitter(".l", lexEmitter) - - c_file.add_action(".lex", LexAction) - c_file.add_emitter(".lex", lexEmitter) - - # Objective-C - cxx_file.add_action(".lm", LexAction) - cxx_file.add_emitter(".lm", lexEmitter) - - # C++ - cxx_file.add_action(".ll", LexAction) - cxx_file.add_emitter(".ll", lexEmitter) - - env["LEX"] = env.Detect("flex") or "lex" - env["LEXFLAGS"] = SCons.Util.CLVar("") - env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET" - -def exists(env): - return env.Detect(["flex", "lex"]) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/link.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/link.py deleted file mode 100644 index 5905fe9ff..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/link.py +++ /dev/null @@ -1,121 +0,0 @@ -"""SCons.Tool.link - -Tool-specific initialization for the generic Posix linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/link.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util -import SCons.Warnings - -from SCons.Tool.FortranCommon import isfortran - -cplusplus = __import__('c++', globals(), locals(), []) - -issued_mixed_link_warning = False - -def smart_link(source, target, env, for_signature): - has_cplusplus = cplusplus.iscplusplus(source) - has_fortran = isfortran(env, source) - if has_cplusplus and has_fortran: - global issued_mixed_link_warning - if not issued_mixed_link_warning: - msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \ - "This may generate a buggy executable if the '%s'\n\t" + \ - "compiler does not know how to deal with Fortran runtimes." - SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning, - msg % env.subst('$CXX')) - issued_mixed_link_warning = True - return '$CXX' - elif has_fortran: - return '$FORTRAN' - elif has_cplusplus: - return '$CXX' - return '$CC' - -def shlib_emitter(target, source, env): - for tgt in target: - tgt.attributes.shared = 1 - return (target, source) - -def generate(env): - """Add Builders and construction variables for gnulink to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - # don't set up the emitter, cause AppendUnique will generate a list - # starting with None :-( - env.Append(SHLIBEMITTER = [shlib_emitter]) - env['SMARTLINK'] = smart_link - env['LINK'] = "$SMARTLINK" - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBDIRPREFIX']='-L' - env['LIBDIRSUFFIX']='' - env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}' - env['LIBLINKPREFIX']='-l' - env['LIBLINKSUFFIX']='' - - if env['PLATFORM'] == 'hpux': - env['SHLIBSUFFIX'] = '.sl' - elif env['PLATFORM'] == 'aix': - env['SHLIBSUFFIX'] = '.a' - - # For most platforms, a loadable module is the same as a shared - # library. Platforms which are different can override these, but - # setting them the same means that LoadableModule works everywhere. - SCons.Tool.createLoadableModuleBuilder(env) - env['LDMODULE'] = '$SHLINK' - # don't set up the emitter, cause AppendUnique will generate a list - # starting with None :-( - env.Append(LDMODULEEMITTER='$SHLIBEMITTER') - env['LDMODULEPREFIX'] = '$SHLIBPREFIX' - env['LDMODULESUFFIX'] = '$SHLIBSUFFIX' - env['LDMODULEFLAGS'] = '$SHLINKFLAGS' - env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - - - -def exists(env): - # This module isn't really a Tool on its own, it's common logic for - # other linkers. - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py deleted file mode 100644 index ab5b735ed..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py +++ /dev/null @@ -1,112 +0,0 @@ -"""SCons.Tool.linkloc - -Tool specification for the LinkLoc linker for the Phar Lap ETS embedded -operating system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/linkloc.py 5023 2010/06/14 22:05:46 scons" - -import os.path -import re - -import SCons.Action -import SCons.Defaults -import SCons.Errors -import SCons.Tool -import SCons.Util - -from SCons.Tool.MSCommon import msvs_exists, merge_default_version -from SCons.Tool.PharLapCommon import addPharLapPaths - -_re_linker_command = re.compile(r'(\s)@\s*([^\s]+)') - -def repl_linker_command(m): - # Replaces any linker command file directives (e.g. "@foo.lnk") with - # the actual contents of the file. - try: - f=open(m.group(2), "r") - return m.group(1) + f.read() - except IOError: - # the linker should return an error if it can't - # find the linker command file so we will remain quiet. - # However, we will replace the @ with a # so we will not continue - # to find it with recursive substitution - return m.group(1) + '#' + m.group(2) - -class LinklocGenerator(object): - def __init__(self, cmdline): - self.cmdline = cmdline - - def __call__(self, env, target, source, for_signature): - if for_signature: - # Expand the contents of any linker command files recursively - subs = 1 - strsub = env.subst(self.cmdline, target=target, source=source) - while subs: - strsub, subs = _re_linker_command.subn(repl_linker_command, strsub) - return strsub - else: - return "${TEMPFILE('" + self.cmdline + "')}" - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SUBST_CMD_FILE'] = LinklocGenerator - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS') - env['SHLINKCOM'] = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}' - env['SHLIBEMITTER']= None - env['LINK'] = "linkloc" - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}' - env['LIBDIRPREFIX']='-libpath ' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='-lib ' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - # Set-up ms tools paths for default version - merge_default_version(env) - - addPharLapPaths(env) - -def exists(env): - if msvs_exists(): - return env.Detect('linkloc') - else: - return 0 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/m4.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/m4.py deleted file mode 100644 index f43b59434..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/m4.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.m4 - -Tool-specific initialization for m4. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/m4.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add Builders and construction variables for m4 to an Environment.""" - M4Action = SCons.Action.Action('$M4COM', '$M4COMSTR') - bld = SCons.Builder.Builder(action = M4Action, src_suffix = '.m4') - - env['BUILDERS']['M4'] = bld - - # .m4 files might include other files, and it would be pretty hard - # to write a scanner for it, so let's just cd to the dir of the m4 - # file and run from there. - # The src_suffix setup is like so: file.c.m4 -> file.c, - # file.cpp.m4 -> file.cpp etc. - env['M4'] = 'm4' - env['M4FLAGS'] = SCons.Util.CLVar('-E') - env['M4COM'] = 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ${TARGET.abspath}' - -def exists(env): - return env.Detect('m4') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/masm.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/masm.py deleted file mode 100644 index 5bb936a27..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/masm.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.Tool.masm - -Tool-specific initialization for the Microsoft Assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/masm.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -ASSuffixes = ['.s', '.asm', '.ASM'] -ASPPSuffixes = ['.spp', '.SPP', '.sx'] -if SCons.Util.case_sensitive_suffixes('.s', '.S'): - ASPPSuffixes.extend(['.S']) -else: - ASSuffixes.extend(['.S']) - -def generate(env): - """Add Builders and construction variables for masm to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in ASSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASAction) - shared_obj.add_action(suffix, SCons.Defaults.ASAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - for suffix in ASPPSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASPPAction) - shared_obj.add_action(suffix, SCons.Defaults.ASPPAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['AS'] = 'ml' - env['ASFLAGS'] = SCons.Util.CLVar('/nologo') - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASCOM'] = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c /Fo$TARGET $SOURCES' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - -def exists(env): - return env.Detect('ml') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/midl.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/midl.py deleted file mode 100644 index 67660d155..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/midl.py +++ /dev/null @@ -1,88 +0,0 @@ -"""SCons.Tool.midl - -Tool-specific initialization for midl (Microsoft IDL compiler). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/midl.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Scanner.IDL -import SCons.Util - -from MSCommon import msvc_exists - -def midl_emitter(target, source, env): - """Produces a list of outputs from the MIDL compiler""" - base, ext = SCons.Util.splitext(str(target[0])) - tlb = target[0] - incl = base + '.h' - interface = base + '_i.c' - t = [tlb, incl, interface] - - midlcom = env['MIDLCOM'] - - if midlcom.find('/proxy') != -1: - proxy = base + '_p.c' - t.append(proxy) - if midlcom.find('/dlldata') != -1: - dlldata = base + '_data.c' - t.append(dlldata) - - return (t,source) - -idl_scanner = SCons.Scanner.IDL.IDLScan() - -midl_action = SCons.Action.Action('$MIDLCOM', '$MIDLCOMSTR') - -midl_builder = SCons.Builder.Builder(action = midl_action, - src_suffix = '.idl', - suffix='.tlb', - emitter = midl_emitter, - source_scanner = idl_scanner) - -def generate(env): - """Add Builders and construction variables for midl to an Environment.""" - - env['MIDL'] = 'MIDL.EXE' - env['MIDLFLAGS'] = SCons.Util.CLVar('/nologo') - env['MIDLCOM'] = '$MIDL $MIDLFLAGS /tlb ${TARGETS[0]} /h ${TARGETS[1]} /iid ${TARGETS[2]} /proxy ${TARGETS[3]} /dlldata ${TARGETS[4]} $SOURCE 2> NUL' - env['BUILDERS']['TypeLibrary'] = midl_builder - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py deleted file mode 100644 index 6df46e0e3..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py +++ /dev/null @@ -1,158 +0,0 @@ -"""SCons.Tool.gcc - -Tool-specific initialization for MinGW (http://www.mingw.org/) - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mingw.py 5023 2010/06/14 22:05:46 scons" - -import os -import os.path - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Tool -import SCons.Util - -# This is what we search for to find mingw: -key_program = 'mingw32-gcc' - -def find(env): - # First search in the SCons path and then the OS path: - return env.WhereIs(key_program) or SCons.Util.WhereIs(key_program) - -def shlib_generator(target, source, env, for_signature): - cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS']) - - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - if dll: cmd.extend(['-o', dll]) - - cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS']) - - implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') - if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature)) - - def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - insert_def = env.subst("$WINDOWS_INSERT_DEF") - if not insert_def in ['', '0', 0] and def_target: \ - cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature)) - - return [cmd] - -def shlib_emitter(target, source, env): - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - no_import_lib = env.get('no_import_lib', 0) - - if not dll: - raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")) - - if not no_import_lib and \ - not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'): - - # Append an import library to the list of targets. - target.append(env.ReplaceIxes(dll, - 'SHLIBPREFIX', 'SHLIBSUFFIX', - 'LIBPREFIX', 'LIBSUFFIX')) - - # Append a def file target if there isn't already a def file target - # or a def file source. There is no option to disable def file - # target emitting, because I can't figure out why someone would ever - # want to turn it off. - def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - if not def_source and not def_target: - target.append(env.ReplaceIxes(dll, - 'SHLIBPREFIX', 'SHLIBSUFFIX', - 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')) - - return (target, source) - - -shlib_action = SCons.Action.Action(shlib_generator, generator=1) - -res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR') - -res_builder = SCons.Builder.Builder(action=res_action, suffix='.o', - source_scanner=SCons.Tool.SourceFileScanner) -SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan) - -def generate(env): - mingw = find(env) - if mingw: - dir = os.path.dirname(mingw) - env.PrependENVPath('PATH', dir ) - - - # Most of mingw is the same as gcc and friends... - gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'm4'] - for tool in gnu_tools: - SCons.Tool.Tool(tool)(env) - - #... but a few things differ: - env['CC'] = 'gcc' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['CXX'] = 'g++' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - env['SHLINKCOM'] = shlib_action - env['LDMODULECOM'] = shlib_action - env.Append(SHLIBEMITTER = [shlib_emitter]) - env['AS'] = 'as' - - env['WIN32DEFPREFIX'] = '' - env['WIN32DEFSUFFIX'] = '.def' - env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}' - env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}' - - env['SHOBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - - env['RC'] = 'windres' - env['RCFLAGS'] = SCons.Util.CLVar('') - env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['RCINCPREFIX'] = '--include-dir ' - env['RCINCSUFFIX'] = '' - env['RCCOM'] = '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET' - env['BUILDERS']['RES'] = res_builder - - # Some setting from the platform also have to be overridden: - env['OBJSUFFIX'] = '.o' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - -def exists(env): - return find(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py deleted file mode 100644 index a2933cbab..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.mslib - -Tool-specific initialization for lib (MicroSoft library archiver). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mslib.py 5023 2010/06/14 22:05:46 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Tool.msvs -import SCons.Tool.msvc -import SCons.Util - -from MSCommon import msvc_exists, msvc_setup_env_once - -def generate(env): - """Add Builders and construction variables for lib to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - # Set-up ms tools paths - msvc_setup_env_once(env) - - env['AR'] = 'lib' - env['ARFLAGS'] = SCons.Util.CLVar('/nologo') - env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}" - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py deleted file mode 100644 index c291ba908..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py +++ /dev/null @@ -1,266 +0,0 @@ -"""SCons.Tool.mslink - -Tool-specific initialization for the Microsoft linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mslink.py 5023 2010/06/14 22:05:46 scons" - -import os.path - -import SCons.Action -import SCons.Defaults -import SCons.Errors -import SCons.Platform.win32 -import SCons.Tool -import SCons.Tool.msvc -import SCons.Tool.msvs -import SCons.Util - -from MSCommon import msvc_setup_env_once, msvc_exists - -def pdbGenerator(env, target, source, for_signature): - try: - return ['/PDB:%s' % target[0].attributes.pdb, '/DEBUG'] - except (AttributeError, IndexError): - return None - -def _dllTargets(target, source, env, for_signature, paramtp): - listCmd = [] - dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp) - if dll: listCmd.append("/out:%s"%dll.get_string(for_signature)) - - implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') - if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature)) - - return listCmd - -def _dllSources(target, source, env, for_signature, paramtp): - listCmd = [] - - deffile = env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX") - for src in source: - # Check explicitly for a non-None deffile so that the __cmp__ - # method of the base SCons.Util.Proxy class used for some Node - # proxies doesn't try to use a non-existent __dict__ attribute. - if deffile and src == deffile: - # Treat this source as a .def file. - listCmd.append("/def:%s" % src.get_string(for_signature)) - else: - # Just treat it as a generic source file. - listCmd.append(src) - return listCmd - -def windowsShlinkTargets(target, source, env, for_signature): - return _dllTargets(target, source, env, for_signature, 'SHLIB') - -def windowsShlinkSources(target, source, env, for_signature): - return _dllSources(target, source, env, for_signature, 'SHLIB') - -def _windowsLdmodTargets(target, source, env, for_signature): - """Get targets for loadable modules.""" - return _dllTargets(target, source, env, for_signature, 'LDMODULE') - -def _windowsLdmodSources(target, source, env, for_signature): - """Get sources for loadable modules.""" - return _dllSources(target, source, env, for_signature, 'LDMODULE') - -def _dllEmitter(target, source, env, paramtp): - """Common implementation of dll emitter.""" - SCons.Tool.msvc.validate_vars(env) - - extratargets = [] - extrasources = [] - - dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp) - no_import_lib = env.get('no_import_lib', 0) - - if not dll: - raise SCons.Errors.UserError('A shared library should have exactly one target with the suffix: %s' % env.subst('$%sSUFFIX' % paramtp)) - - insert_def = env.subst("$WINDOWS_INSERT_DEF") - if not insert_def in ['', '0', 0] and \ - not env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"): - - # append a def file to the list of sources - extrasources.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX")) - - version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0')) - if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0): - # MSVC 8 automatically generates .manifest files that must be installed - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSSHLIBMANIFESTPREFIX", "WINDOWSSHLIBMANIFESTSUFFIX")) - - if 'PDB' in env and env['PDB']: - pdb = env.arg2nodes('$PDB', target=target, source=source)[0] - extratargets.append(pdb) - target[0].attributes.pdb = pdb - - if not no_import_lib and \ - not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"): - # Append an import library to the list of targets. - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "LIBPREFIX", "LIBSUFFIX")) - # and .exp file is created if there are exports from a DLL - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSEXPPREFIX", "WINDOWSEXPSUFFIX")) - - return (target+extratargets, source+extrasources) - -def windowsLibEmitter(target, source, env): - return _dllEmitter(target, source, env, 'SHLIB') - -def ldmodEmitter(target, source, env): - """Emitter for loadable modules. - - Loadable modules are identical to shared libraries on Windows, but building - them is subject to different parameters (LDMODULE*). - """ - return _dllEmitter(target, source, env, 'LDMODULE') - -def prog_emitter(target, source, env): - SCons.Tool.msvc.validate_vars(env) - - extratargets = [] - - exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX") - if not exe: - raise SCons.Errors.UserError("An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX")) - - version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0')) - if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0): - # MSVC 8 automatically generates .manifest files that have to be installed - extratargets.append( - env.ReplaceIxes(exe, - "PROGPREFIX", "PROGSUFFIX", - "WINDOWSPROGMANIFESTPREFIX", "WINDOWSPROGMANIFESTSUFFIX")) - - if 'PDB' in env and env['PDB']: - pdb = env.arg2nodes('$PDB', target=target, source=source)[0] - extratargets.append(pdb) - target[0].attributes.pdb = pdb - - return (target+extratargets,source) - -def RegServerFunc(target, source, env): - if 'register' in env and env['register']: - ret = regServerAction([target[0]], [source[0]], env) - if ret: - raise SCons.Errors.UserError("Unable to register %s" % target[0]) - else: - print "Registered %s sucessfully" % target[0] - return ret - return 0 - -regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR") -regServerCheck = SCons.Action.Action(RegServerFunc, None) -shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES")}') -compositeShLinkAction = shlibLinkAction + regServerCheck -ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES")}') -compositeLdmodAction = ldmodLinkAction + regServerCheck - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll') - env['_SHLINK_TARGETS'] = windowsShlinkTargets - env['_SHLINK_SOURCES'] = windowsShlinkSources - env['SHLINKCOM'] = compositeShLinkAction - env.Append(SHLIBEMITTER = [windowsLibEmitter]) - env['LINK'] = 'link' - env['LINKFLAGS'] = SCons.Util.CLVar('/nologo') - env['_PDB'] = pdbGenerator - env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows")}' - env.Append(PROGEMITTER = [prog_emitter]) - env['LIBDIRPREFIX']='/LIBPATH:' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - env['WIN32DEFPREFIX'] = '' - env['WIN32DEFSUFFIX'] = '.def' - env['WIN32_INSERT_DEF'] = 0 - env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}' - env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}' - env['WINDOWS_INSERT_DEF'] = '${WIN32_INSERT_DEF}' - - env['WIN32EXPPREFIX'] = '' - env['WIN32EXPSUFFIX'] = '.exp' - env['WINDOWSEXPPREFIX'] = '${WIN32EXPPREFIX}' - env['WINDOWSEXPSUFFIX'] = '${WIN32EXPSUFFIX}' - - env['WINDOWSSHLIBMANIFESTPREFIX'] = '' - env['WINDOWSSHLIBMANIFESTSUFFIX'] = '${SHLIBSUFFIX}.manifest' - env['WINDOWSPROGMANIFESTPREFIX'] = '' - env['WINDOWSPROGMANIFESTSUFFIX'] = '${PROGSUFFIX}.manifest' - - env['REGSVRACTION'] = regServerCheck - env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32') - env['REGSVRFLAGS'] = '/s ' - env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}' - - # Set-up ms tools paths - msvc_setup_env_once(env) - - - # Loadable modules are on Windows the same as shared libraries, but they - # are subject to different build parameters (LDMODULE* variables). - # Therefore LDMODULE* variables correspond as much as possible to - # SHLINK*/SHLIB* ones. - SCons.Tool.createLoadableModuleBuilder(env) - env['LDMODULE'] = '$SHLINK' - env['LDMODULEPREFIX'] = '$SHLIBPREFIX' - env['LDMODULESUFFIX'] = '$SHLIBSUFFIX' - env['LDMODULEFLAGS'] = '$SHLINKFLAGS' - env['_LDMODULE_TARGETS'] = _windowsLdmodTargets - env['_LDMODULE_SOURCES'] = _windowsLdmodSources - env['LDMODULEEMITTER'] = [ldmodEmitter] - env['LDMODULECOM'] = compositeLdmodAction - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py deleted file mode 100644 index 08898c61c..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mssdk.py 5023 2010/06/14 22:05:46 scons" - -"""engine.SCons.Tool.mssdk - -Tool-specific initialization for Microsoft SDKs, both Platform -SDKs and Windows SDKs. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -from MSCommon import mssdk_exists, \ - mssdk_setup_env - -def generate(env): - """Add construction variables for an MS SDK to an Environment.""" - mssdk_setup_env(env) - -def exists(env): - return mssdk_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py deleted file mode 100644 index 8c1358079..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py +++ /dev/null @@ -1,268 +0,0 @@ -"""engine.SCons.Tool.msvc - -Tool-specific initialization for Microsoft Visual C/C++. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/msvc.py 5023 2010/06/14 22:05:46 scons" - -import os.path -import re -import sys - -import SCons.Action -import SCons.Builder -import SCons.Errors -import SCons.Platform.win32 -import SCons.Tool -import SCons.Tool.msvs -import SCons.Util -import SCons.Warnings -import SCons.Scanner.RC - -from MSCommon import msvc_exists, msvc_setup_env_once - -CSuffixes = ['.c', '.C'] -CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++'] - -def validate_vars(env): - """Validate the PCH and PCHSTOP construction variables.""" - if 'PCH' in env and env['PCH']: - if 'PCHSTOP' not in env: - raise SCons.Errors.UserError("The PCHSTOP construction must be defined if PCH is defined.") - if not SCons.Util.is_String(env['PCHSTOP']): - raise SCons.Errors.UserError("The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP']) - -def pch_emitter(target, source, env): - """Adds the object file target.""" - - validate_vars(env) - - pch = None - obj = None - - for t in target: - if SCons.Util.splitext(str(t))[1] == '.pch': - pch = t - if SCons.Util.splitext(str(t))[1] == '.obj': - obj = t - - if not obj: - obj = SCons.Util.splitext(str(pch))[0]+'.obj' - - target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work - - return (target, source) - -def object_emitter(target, source, env, parent_emitter): - """Sets up the PCH dependencies for an object file.""" - - validate_vars(env) - - parent_emitter(target, source, env) - - # Add a dependency, but only if the target (e.g. 'Source1.obj') - # doesn't correspond to the pre-compiled header ('Source1.pch'). - # If the basenames match, then this was most likely caused by - # someone adding the source file to both the env.PCH() and the - # env.Program() calls, and adding the explicit dependency would - # cause a cycle on the .pch file itself. - # - # See issue #2505 for a discussion of what to do if it turns - # out this assumption causes trouble in the wild: - # http://scons.tigris.org/issues/show_bug.cgi?id=2505 - if 'PCH' in env: - pch = env['PCH'] - if str(target[0]) != SCons.Util.splitext(str(pch))[0] + '.obj': - env.Depends(target, pch) - - return (target, source) - -def static_object_emitter(target, source, env): - return object_emitter(target, source, env, - SCons.Defaults.StaticObjectEmitter) - -def shared_object_emitter(target, source, env): - return object_emitter(target, source, env, - SCons.Defaults.SharedObjectEmitter) - -pch_action = SCons.Action.Action('$PCHCOM', '$PCHCOMSTR') -pch_builder = SCons.Builder.Builder(action=pch_action, suffix='.pch', - emitter=pch_emitter, - source_scanner=SCons.Tool.SourceFileScanner) - - -# Logic to build .rc files into .res files (resource files) -res_scanner = SCons.Scanner.RC.RCScan() -res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR') -res_builder = SCons.Builder.Builder(action=res_action, - src_suffix='.rc', - suffix='.res', - src_builder=[], - source_scanner=res_scanner) - -def msvc_batch_key(action, env, target, source): - """ - Returns a key to identify unique batches of sources for compilation. - - If batching is enabled (via the $MSVC_BATCH setting), then all - target+source pairs that use the same action, defined by the same - environment, and have the same target and source directories, will - be batched. - - Returning None specifies that the specified target+source should not - be batched with other compilations. - """ - b = env.subst('$MSVC_BATCH') - if b in (None, '', '0'): - # We're not using batching; return no key. - return None - t = target[0] - s = source[0] - if os.path.splitext(t.name)[0] != os.path.splitext(s.name)[0]: - # The base names are different, so this *must* be compiled - # separately; return no key. - return None - return (id(action), id(env), t.dir, s.dir) - -def msvc_output_flag(target, source, env, for_signature): - """ - Returns the correct /Fo flag for batching. - - If batching is disabled or there's only one source file, then we - return an /Fo string that specifies the target explicitly. Otherwise, - we return an /Fo string that just specifies the first target's - directory (where the Visual C/C++ compiler will put the .obj files). - """ - b = env.subst('$MSVC_BATCH') - if b in (None, '', '0') or len(source) == 1: - return '/Fo$TARGET' - else: - # The Visual C/C++ compiler requires a \ at the end of the /Fo - # option to indicate an output directory. We use os.sep here so - # that the test(s) for this can be run on non-Windows systems - # without having a hard-coded backslash mess up command-line - # argument parsing. - return '/Fo${TARGET.dir}' + os.sep - -CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') - -def generate(env): - """Add Builders and construction variables for MSVC++ to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - # TODO(batch): shouldn't reach in to cmdgen this way; necessary - # for now to bypass the checks in Builder.DictCmdGenerator.__call__() - # and allow .cc and .cpp to be compiled in the same command line. - static_obj.cmdgen.source_ext_match = False - shared_obj.cmdgen.source_ext_match = False - - for suffix in CSuffixes: - static_obj.add_action(suffix, CAction) - shared_obj.add_action(suffix, ShCAction) - static_obj.add_emitter(suffix, static_object_emitter) - shared_obj.add_emitter(suffix, shared_object_emitter) - - for suffix in CXXSuffixes: - static_obj.add_action(suffix, CXXAction) - shared_obj.add_action(suffix, ShCXXAction) - static_obj.add_emitter(suffix, static_object_emitter) - shared_obj.add_emitter(suffix, shared_object_emitter) - - env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}']) - env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}']) - env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag - env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS' - env['CC'] = 'cl' - env['CCFLAGS'] = SCons.Util.CLVar('/nologo') - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM' - env['SHCC'] = '$CC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM' - env['CXX'] = '$CC' - env['CXXFLAGS'] = SCons.Util.CLVar('$( /TP $)') - env['CXXCOM'] = '$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM' - env['SHCXX'] = '$CXX' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHCXXCOM'] = '$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM' - env['CPPDEFPREFIX'] = '/D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '/I' - env['INCSUFFIX'] = '' -# env.Append(OBJEMITTER = [static_object_emitter]) -# env.Append(SHOBJEMITTER = [shared_object_emitter]) - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - - env['RC'] = 'rc' - env['RCFLAGS'] = SCons.Util.CLVar('') - env['RCSUFFIXES']=['.rc','.rc2'] - env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES' - env['BUILDERS']['RES'] = res_builder - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - - # Set-up ms tools paths - msvc_setup_env_once(env) - - env['CFILESUFFIX'] = '.c' - env['CXXFILESUFFIX'] = '.cc' - - env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}']) - env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS' - env['BUILDERS']['PCH'] = pch_builder - - if 'ENV' not in env: - env['ENV'] = {} - if 'SystemRoot' not in env['ENV']: # required for dlls in the winsxs folders - env['ENV']['SystemRoot'] = SCons.Platform.win32.get_system_root() - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py deleted file mode 100644 index 34fc0e751..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py +++ /dev/null @@ -1,1388 +0,0 @@ -"""SCons.Tool.msvs - -Tool-specific initialization for Microsoft Visual Studio project files. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Tool/msvs.py 5023 2010/06/14 22:05:46 scons" - -import SCons.compat - -import base64 -import hashlib -import ntpath -import os -# compat layer imports "cPickle" for us if it's available. -import pickle -import re -import sys - -import SCons.Builder -import SCons.Node.FS -import SCons.Platform.win32 -import SCons.Script.SConscript -import SCons.Util -import SCons.Warnings - -from MSCommon import msvc_exists, msvc_setup_env_once -from SCons.Defaults import processDefines - -############################################################################## -# Below here are the classes and functions for generation of -# DSP/DSW/SLN/VCPROJ files. -############################################################################## - -def xmlify(s): - s = s.replace("&", "&") # do this first - s = s.replace("'", "'") - s = s.replace('"', """) - return s - -external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}' - -def _generateGUID(slnfile, name): - """This generates a dummy GUID for the sln file to use. It is - based on the MD5 signatures of the sln filename plus the name of - the project. It basically just needs to be unique, and not - change with each invocation.""" - m = hashlib.md5() - # Normalize the slnfile path to a Windows path (\ separators) so - # the generated file has a consistent GUID even if we generate - # it on a non-Windows platform. - m.update(ntpath.normpath(str(slnfile)) + str(name)) - solution = m.hexdigest().upper() - # convert most of the signature to GUID form (discard the rest) - solution = "{" + solution[:8] + "-" + solution[8:12] + "-" + solution[12:16] + "-" + solution[16:20] + "-" + solution[20:32] + "}" - return solution - -version_re = re.compile(r'(\d+\.\d+)(.*)') - -def msvs_parse_version(s): - """ - Split a Visual Studio version, which may in fact be something like - '7.0Exp', into is version number (returned as a float) and trailing - "suite" portion. - """ - num, suite = version_re.match(s).groups() - return float(num), suite - -# This is how we re-invoke SCons from inside MSVS Project files. -# The problem is that we might have been invoked as either scons.bat -# or scons.py. If we were invoked directly as scons.py, then we could -# use sys.argv[0] to find the SCons "executable," but that doesn't work -# if we were invoked as scons.bat, which uses "python -c" to execute -# things and ends up with "-c" as sys.argv[0]. Consequently, we have -# the MSVS Project file invoke SCons the same way that scons.bat does, -# which works regardless of how we were invoked. -def getExecScriptMain(env, xml=None): - scons_home = env.get('SCONS_HOME') - if not scons_home and 'SCONS_LIB_DIR' in os.environ: - scons_home = os.environ['SCONS_LIB_DIR'] - if scons_home: - exec_script_main = "from os.path import join; import sys; sys.path = [ r'%s' ] + sys.path; import SCons.Script; SCons.Script.main()" % scons_home - else: - version = SCons.__version__ - exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%(version)s'), join(sys.prefix, 'scons-%(version)s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % locals() - if xml: - exec_script_main = xmlify(exec_script_main) - return exec_script_main - -# The string for the Python executable we tell the Project file to use -# is either sys.executable or, if an external PYTHON_ROOT environment -# variable exists, $(PYTHON)ROOT\\python.exe (generalized a little to -# pluck the actual executable name from sys.executable). -try: - python_root = os.environ['PYTHON_ROOT'] -except KeyError: - python_executable = sys.executable -else: - python_executable = os.path.join('$$(PYTHON_ROOT)', - os.path.split(sys.executable)[1]) - -class Config(object): - pass - -def splitFully(path): - dir, base = os.path.split(path) - if dir and dir != '' and dir != path: - return splitFully(dir)+[base] - if base == '': - return [] - return [base] - -def makeHierarchy(sources): - '''Break a list of files into a hierarchy; for each value, if it is a string, - then it is a file. If it is a dictionary, it is a folder. The string is - the original path of the file.''' - - hierarchy = {} - for file in sources: - path = splitFully(file) - if len(path): - dict = hierarchy - for part in path[:-1]: - if part not in dict: - dict[part] = {} - dict = dict[part] - dict[path[-1]] = file - #else: - # print 'Warning: failed to decompose path for '+str(file) - return hierarchy - -class _DSPGenerator(object): - """ Base class for DSP generators """ - - srcargs = [ - 'srcs', - 'incs', - 'localincs', - 'resources', - 'misc'] - - def __init__(self, dspfile, source, env): - self.dspfile = str(dspfile) - try: - get_abspath = dspfile.get_abspath - except AttributeError: - self.dspabs = os.path.abspath(dspfile) - else: - self.dspabs = get_abspath() - - if 'variant' not in env: - raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\ - "'Release') to create an MSVSProject.") - elif SCons.Util.is_String(env['variant']): - variants = [env['variant']] - elif SCons.Util.is_List(env['variant']): - variants = env['variant'] - - if 'buildtarget' not in env or env['buildtarget'] == None: - buildtarget = [''] - elif SCons.Util.is_String(env['buildtarget']): - buildtarget = [env['buildtarget']] - elif SCons.Util.is_List(env['buildtarget']): - if len(env['buildtarget']) != len(variants): - raise SCons.Errors.InternalError("Sizes of 'buildtarget' and 'variant' lists must be the same.") - buildtarget = [] - for bt in env['buildtarget']: - if SCons.Util.is_String(bt): - buildtarget.append(bt) - else: - buildtarget.append(bt.get_abspath()) - else: - buildtarget = [env['buildtarget'].get_abspath()] - if len(buildtarget) == 1: - bt = buildtarget[0] - buildtarget = [] - for _ in variants: - buildtarget.append(bt) - - if 'outdir' not in env or env['outdir'] == None: - outdir = [''] - elif SCons.Util.is_String(env['outdir']): - outdir = [env['outdir']] - elif SCons.Util.is_List(env['outdir']): - if len(env['outdir']) != len(variants): - raise SCons.Errors.InternalError("Sizes of 'outdir' and 'variant' lists must be the same.") - outdir = [] - for s in env['outdir']: - if SCons.Util.is_String(s): - outdir.append(s) - else: - outdir.append(s.get_abspath()) - else: - outdir = [env['outdir'].get_abspath()] - if len(outdir) == 1: - s = outdir[0] - outdir = [] - for v in variants: - outdir.append(s) - - if 'runfile' not in env or env['runfile'] == None: - runfile = buildtarget[-1:] - elif SCons.Util.is_String(env['runfile']): - runfile = [env['runfile']] - elif SCons.Util.is_List(env['runfile']): - if len(env['runfile']) != len(variants): - raise SCons.Errors.InternalError("Sizes of 'runfile' and 'variant' lists must be the same.") - runfile = [] - for s in env['runfile']: - if SCons.Util.is_String(s): - runfile.append(s) - else: - runfile.append(s.get_abspath()) - else: - runfile = [env['runfile'].get_abspath()] - if len(runfile) == 1: - s = runfile[0] - runfile = [] - for v in variants: - runfile.append(s) - - self.sconscript = env['MSVSSCONSCRIPT'] - - cmdargs = env.get('cmdargs', '') - - self.env = env - - if 'name' in self.env: - self.name = self.env['name'] - else: - self.name = os.path.basename(SCons.Util.splitext(self.dspfile)[0]) - self.name = self.env.subst(self.name) - - sourcenames = [ - 'Source Files', - 'Header Files', - 'Local Headers', - 'Resource Files', - 'Other Files'] - - self.sources = {} - for n in sourcenames: - self.sources[n] = [] - - self.configs = {} - - self.nokeep = 0 - if 'nokeep' in env and env['variant'] != 0: - self.nokeep = 1 - - if self.nokeep == 0 and os.path.exists(self.dspabs): - self.Parse() - - for t in zip(sourcenames,self.srcargs): - if t[1] in self.env: - if SCons.Util.is_List(self.env[t[1]]): - for i in self.env[t[1]]: - if not i in self.sources[t[0]]: - self.sources[t[0]].append(i) - else: - if not self.env[t[1]] in self.sources[t[0]]: - self.sources[t[0]].append(self.env[t[1]]) - - for n in sourcenames: - #TODO 2.4: compat layer supports sorted(key=) but not sort(key=) - #TODO 2.4: self.sources[n].sort(key=lambda a: a.lower()) - self.sources[n] = sorted(self.sources[n], key=lambda a: a.lower()) - - def AddConfig(self, variant, buildtarget, outdir, runfile, cmdargs, dspfile=dspfile): - config = Config() - config.buildtarget = buildtarget - config.outdir = outdir - config.cmdargs = cmdargs - config.runfile = runfile - - match = re.match('(.*)\|(.*)', variant) - if match: - config.variant = match.group(1) - config.platform = match.group(2) - else: - config.variant = variant - config.platform = 'Win32' - - self.configs[variant] = config - print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'" - - for i in range(len(variants)): - AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs) - - self.platforms = [] - for key in self.configs.keys(): - platform = self.configs[key].platform - if not platform in self.platforms: - self.platforms.append(platform) - - def Build(self): - pass - -V6DSPHeader = """\ -# Microsoft Developer Studio Project File - Name="%(name)s" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) External Target" 0x0106 - -CFG=%(name)s - Win32 %(confkey)s -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "%(name)s.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "%(name)s.mak" CFG="%(name)s - Win32 %(confkey)s" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -""" - -class _GenerateV6DSP(_DSPGenerator): - """Generates a Project file for MSVS 6.0""" - - def PrintHeader(self): - # pick a default config - confkeys = sorted(self.configs.keys()) - - name = self.name - confkey = confkeys[0] - - self.file.write(V6DSPHeader % locals()) - - for kind in confkeys: - self.file.write('!MESSAGE "%s - Win32 %s" (based on "Win32 (x86) External Target")\n' % (name, kind)) - - self.file.write('!MESSAGE \n\n') - - def PrintProject(self): - name = self.name - self.file.write('# Begin Project\n' - '# PROP AllowPerConfigDependencies 0\n' - '# PROP Scc_ProjName ""\n' - '# PROP Scc_LocalPath ""\n\n') - - first = 1 - confkeys = sorted(self.configs.keys()) - for kind in confkeys: - outdir = self.configs[kind].outdir - buildtarget = self.configs[kind].buildtarget - if first == 1: - self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind)) - first = 0 - else: - self.file.write('\n!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind)) - - env_has_buildtarget = 'MSVSBUILDTARGET' in self.env - if not env_has_buildtarget: - self.env['MSVSBUILDTARGET'] = buildtarget - - # have to write this twice, once with the BASE settings, and once without - for base in ("BASE ",""): - self.file.write('# PROP %sUse_MFC 0\n' - '# PROP %sUse_Debug_Libraries ' % (base, base)) - if kind.lower().find('debug') < 0: - self.file.write('0\n') - else: - self.file.write('1\n') - self.file.write('# PROP %sOutput_Dir "%s"\n' - '# PROP %sIntermediate_Dir "%s"\n' % (base,outdir,base,outdir)) - cmd = 'echo Starting SCons && ' + self.env.subst('$MSVSBUILDCOM', 1) - self.file.write('# PROP %sCmd_Line "%s"\n' - '# PROP %sRebuild_Opt "-c && %s"\n' - '# PROP %sTarget_File "%s"\n' - '# PROP %sBsc_Name ""\n' - '# PROP %sTarget_Dir ""\n'\ - %(base,cmd,base,cmd,base,buildtarget,base,base)) - - if not env_has_buildtarget: - del self.env['MSVSBUILDTARGET'] - - self.file.write('\n!ENDIF\n\n' - '# Begin Target\n\n') - for kind in confkeys: - self.file.write('# Name "%s - Win32 %s"\n' % (name,kind)) - self.file.write('\n') - first = 0 - for kind in confkeys: - if first == 0: - self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind)) - first = 1 - else: - self.file.write('!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind)) - self.file.write('!ENDIF \n\n') - self.PrintSourceFiles() - self.file.write('# End Target\n' - '# End Project\n') - - if self.nokeep == 0: - # now we pickle some data and add it to the file -- MSDEV will ignore it. - pdata = pickle.dumps(self.configs,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '\n') - pdata = pickle.dumps(self.sources,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '\n') - - def PrintSourceFiles(self): - categories = {'Source Files': 'cpp|c|cxx|l|y|def|odl|idl|hpj|bat', - 'Header Files': 'h|hpp|hxx|hm|inl', - 'Local Headers': 'h|hpp|hxx|hm|inl', - 'Resource Files': 'r|rc|ico|cur|bmp|dlg|rc2|rct|bin|cnt|rtf|gif|jpg|jpeg|jpe', - 'Other Files': ''} - - for kind in sorted(categories.keys(), key=lambda a: a.lower()): - if not self.sources[kind]: - continue # skip empty groups - - self.file.write('# Begin Group "' + kind + '"\n\n') - typelist = categories[kind].replace('|', ';') - self.file.write('# PROP Default_Filter "' + typelist + '"\n') - - for file in self.sources[kind]: - file = os.path.normpath(file) - self.file.write('# Begin Source File\n\n' - 'SOURCE="' + file + '"\n' - '# End Source File\n') - self.file.write('# End Group\n') - - # add the SConscript file outside of the groups - self.file.write('# Begin Source File\n\n' - 'SOURCE="' + str(self.sconscript) + '"\n' - '# End Source File\n') - - def Parse(self): - try: - dspfile = open(self.dspabs,'r') - except IOError: - return # doesn't exist yet, so can't add anything to configs. - - line = dspfile.readline() - while line: - if line.find("# End Project") > -1: - break - line = dspfile.readline() - - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.configs.update(data) - - data = None - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - # it has a "# " in front of it, so we strip that. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.sources.update(data) - - def Build(self): - try: - self.file = open(self.dspabs,'w') - except IOError, detail: - raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail)) - else: - self.PrintHeader() - self.PrintProject() - self.file.close() - -V7DSPHeader = """\ - - -""" - -V7DSPConfiguration = """\ -\t\t -\t\t\t -\t\t -""" - -V8DSPHeader = """\ - - -""" - -V8DSPConfiguration = """\ -\t\t -\t\t\t -\t\t -""" -class _GenerateV7DSP(_DSPGenerator): - """Generates a Project file for MSVS .NET""" - - def __init__(self, dspfile, source, env): - _DSPGenerator.__init__(self, dspfile, source, env) - self.version = env['MSVS_VERSION'] - self.version_num, self.suite = msvs_parse_version(self.version) - if self.version_num >= 8.0: - self.versionstr = '8.00' - self.dspheader = V8DSPHeader - self.dspconfiguration = V8DSPConfiguration - else: - if self.version_num >= 7.1: - self.versionstr = '7.10' - else: - self.versionstr = '7.00' - self.dspheader = V7DSPHeader - self.dspconfiguration = V7DSPConfiguration - self.file = None - - def PrintHeader(self): - env = self.env - versionstr = self.versionstr - name = self.name - encoding = self.env.subst('$MSVSENCODING') - scc_provider = env.get('MSVS_SCC_PROVIDER', '') - scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '') - scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '') - scc_local_path = env.get('MSVS_SCC_LOCAL_PATH', '') - project_guid = env.get('MSVS_PROJECT_GUID', '') - if self.version_num >= 8.0 and not project_guid: - project_guid = _generateGUID(self.dspfile, '') - if scc_provider != '': - scc_attrs = ('\tProjectGUID="%s"\n' - '\tSccProjectName="%s"\n' - '\tSccAuxPath="%s"\n' - '\tSccLocalPath="%s"\n' - '\tSccProvider="%s"' % (project_guid, scc_project_name, scc_aux_path, scc_local_path, scc_provider)) - else: - scc_attrs = ('\tProjectGUID="%s"\n' - '\tSccProjectName="%s"\n' - '\tSccLocalPath="%s"' % (project_guid, scc_project_name, scc_local_path)) - - self.file.write(self.dspheader % locals()) - - self.file.write('\t\n') - for platform in self.platforms: - self.file.write( - '\t\t\n' % platform) - self.file.write('\t\n') - - if self.version_num >= 8.0: - self.file.write('\t\n' - '\t\n') - - def PrintProject(self): - self.file.write('\t\n') - - confkeys = sorted(self.configs.keys()) - for kind in confkeys: - variant = self.configs[kind].variant - platform = self.configs[kind].platform - outdir = self.configs[kind].outdir - buildtarget = self.configs[kind].buildtarget - runfile = self.configs[kind].runfile - cmdargs = self.configs[kind].cmdargs - - env_has_buildtarget = 'MSVSBUILDTARGET' in self.env - if not env_has_buildtarget: - self.env['MSVSBUILDTARGET'] = buildtarget - - starting = 'echo Starting SCons && ' - if cmdargs: - cmdargs = ' ' + cmdargs - else: - cmdargs = '' - buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs) - rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs) - cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs) - - preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', [])))) - includepath = xmlify(';'.join(self.env.get('CPPPATH', []))) - - if not env_has_buildtarget: - del self.env['MSVSBUILDTARGET'] - - self.file.write(self.dspconfiguration % locals()) - - self.file.write('\t\n') - - if self.version_num >= 7.1: - self.file.write('\t\n' - '\t\n') - - self.PrintSourceFiles() - - self.file.write('\n') - - if self.nokeep == 0: - # now we pickle some data and add it to the file -- MSDEV will ignore it. - pdata = pickle.dumps(self.configs,1) - pdata = base64.encodestring(pdata) - self.file.write('\n') - - def printSources(self, hierarchy, commonprefix): - sorteditems = sorted(hierarchy.items(), key=lambda a: a[0].lower()) - - # First folders, then files - for key, value in sorteditems: - if SCons.Util.is_Dict(value): - self.file.write('\t\t\t\n' % (key)) - self.printSources(value, commonprefix) - self.file.write('\t\t\t\n') - - for key, value in sorteditems: - if SCons.Util.is_String(value): - file = value - if commonprefix: - file = os.path.join(commonprefix, value) - file = os.path.normpath(file) - self.file.write('\t\t\t\n' - '\t\t\t\n' % (file)) - - def PrintSourceFiles(self): - categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat', - 'Header Files': 'h;hpp;hxx;hm;inl', - 'Local Headers': 'h;hpp;hxx;hm;inl', - 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe', - 'Other Files': ''} - - self.file.write('\t\n') - - cats = sorted([k for k in categories.keys() if self.sources[k]], - key=lambda a: a.lower()) - for kind in cats: - if len(cats) > 1: - self.file.write('\t\t\n' % (kind, categories[kind])) - - sources = self.sources[kind] - - # First remove any common prefix - commonprefix = None - if len(sources) > 1: - s = list(map(os.path.normpath, sources)) - # take the dirname because the prefix may include parts - # of the filenames (e.g. if you have 'dir\abcd' and - # 'dir\acde' then the cp will be 'dir\a' ) - cp = os.path.dirname( os.path.commonprefix(s) ) - if cp and s[0][len(cp)] == os.sep: - # +1 because the filename starts after the separator - sources = [s[len(cp)+1:] for s in sources] - commonprefix = cp - elif len(sources) == 1: - commonprefix = os.path.dirname( sources[0] ) - sources[0] = os.path.basename( sources[0] ) - - hierarchy = makeHierarchy(sources) - self.printSources(hierarchy, commonprefix=commonprefix) - - if len(cats)>1: - self.file.write('\t\t\n') - - # add the SConscript file outside of the groups - self.file.write('\t\t\n' - '\t\t\n' % str(self.sconscript)) - - self.file.write('\t\n' - '\t\n' - '\t\n') - - def Parse(self): - try: - dspfile = open(self.dspabs,'r') - except IOError: - return # doesn't exist yet, so can't add anything to configs. - - line = dspfile.readline() - while line: - if line.find(' p2cread - # c2pread <--stdout--- c2pwrite - # errread <--stderr--- errwrite - # - # On POSIX, the child objects are file descriptors. On - # Windows, these are Windows file handles. The parent objects - # are file descriptors on both platforms. The parent objects - # are None when not using PIPEs. The child objects are None - # when not redirecting. - - (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) = self._get_handles(stdin, stdout, stderr) - - self._execute_child(args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - if p2cwrite: - self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) - if c2pread: - if universal_newlines: - self.stdout = os.fdopen(c2pread, 'rU', bufsize) - else: - self.stdout = os.fdopen(c2pread, 'rb', bufsize) - if errread: - if universal_newlines: - self.stderr = os.fdopen(errread, 'rU', bufsize) - else: - self.stderr = os.fdopen(errread, 'rb', bufsize) - - - def _translate_newlines(self, data): - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - return data - - - def __del__(self): - if not self._child_created: - # We didn't get to successfully create a child process. - return - # In case the child hasn't been waited on, check if it's done. - self.poll(_deadstate=sys.maxsize) - if self.returncode is None and _active is not None: - # Child is still running, keep us alive until we can wait on it. - _active.append(self) - - - def communicate(self, input=None): - """Interact with process: Send data to stdin. Read data from - stdout and stderr, until end-of-file is reached. Wait for - process to terminate. The optional input argument should be a - string to be sent to the child process, or None, if no data - should be sent to the child. - - communicate() returns a tuple (stdout, stderr).""" - - # Optimization: If we are only using one pipe, or no pipe at - # all, using select() or threads is unnecessary. - if [self.stdin, self.stdout, self.stderr].count(None) >= 2: - stdout = None - stderr = None - if self.stdin: - if input: - self.stdin.write(input) - self.stdin.close() - elif self.stdout: - stdout = self.stdout.read() - elif self.stderr: - stderr = self.stderr.read() - self.wait() - return (stdout, stderr) - - return self._communicate(input) - - - if mswindows: - # - # Windows methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - if stdin is None and stdout is None and stderr is None: - return (None, None, None, None, None, None) - - p2cread, p2cwrite = None, None - c2pread, c2pwrite = None, None - errread, errwrite = None, None - - if stdin is None: - p2cread = GetStdHandle(STD_INPUT_HANDLE) - elif stdin == PIPE: - p2cread, p2cwrite = CreatePipe(None, 0) - # Detach and turn into fd - p2cwrite = p2cwrite.Detach() - p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0) - elif is_int(stdin): - p2cread = msvcrt.get_osfhandle(stdin) - else: - # Assuming file-like object - p2cread = msvcrt.get_osfhandle(stdin.fileno()) - p2cread = self._make_inheritable(p2cread) - - if stdout is None: - c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE) - elif stdout == PIPE: - c2pread, c2pwrite = CreatePipe(None, 0) - # Detach and turn into fd - c2pread = c2pread.Detach() - c2pread = msvcrt.open_osfhandle(c2pread, 0) - elif is_int(stdout): - c2pwrite = msvcrt.get_osfhandle(stdout) - else: - # Assuming file-like object - c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) - c2pwrite = self._make_inheritable(c2pwrite) - - if stderr is None: - errwrite = GetStdHandle(STD_ERROR_HANDLE) - elif stderr == PIPE: - errread, errwrite = CreatePipe(None, 0) - # Detach and turn into fd - errread = errread.Detach() - errread = msvcrt.open_osfhandle(errread, 0) - elif stderr == STDOUT: - errwrite = c2pwrite - elif is_int(stderr): - errwrite = msvcrt.get_osfhandle(stderr) - else: - # Assuming file-like object - errwrite = msvcrt.get_osfhandle(stderr.fileno()) - errwrite = self._make_inheritable(errwrite) - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - def _make_inheritable(self, handle): - """Return a duplicate of handle, which is inheritable""" - return DuplicateHandle(GetCurrentProcess(), handle, - GetCurrentProcess(), 0, 1, - DUPLICATE_SAME_ACCESS) - - - def _find_w9xpopen(self): - """Find and return absolut path to w9xpopen.exe""" - w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - # Eeek - file-not-found - possibly an embedding - # situation - see if we can locate it in sys.exec_prefix - w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - raise RuntimeError("Cannot locate w9xpopen.exe, which is " - "needed for Popen to work with your " - "shell or platform.") - return w9xpopen - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite): - """Execute program (MS Windows version)""" - - if not isinstance(args, types.StringTypes): - args = list2cmdline(args) - - # Process startup details - if startupinfo is None: - startupinfo = STARTUPINFO() - if None not in (p2cread, c2pwrite, errwrite): - startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESTDHANDLES - startupinfo.hStdInput = p2cread - startupinfo.hStdOutput = c2pwrite - startupinfo.hStdError = errwrite - - if shell: - startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESHOWWINDOW - startupinfo.wShowWindow = SW_HIDE - comspec = os.environ.get("COMSPEC", "cmd.exe") - args = comspec + " /c " + args - if (GetVersion() >= 0x80000000L or - os.path.basename(comspec).lower() == "command.com"): - # Win9x, or using command.com on NT. We need to - # use the w9xpopen intermediate program. For more - # information, see KB Q150956 - # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) - w9xpopen = self._find_w9xpopen() - args = '"%s" %s' % (w9xpopen, args) - # Not passing CREATE_NEW_CONSOLE has been known to - # cause random failures on win9x. Specifically a - # dialog: "Your program accessed mem currently in - # use at xxx" and a hopeful warning about the - # stability of your system. Cost is Ctrl+C wont - # kill children. - creationflags = creationflags | CREATE_NEW_CONSOLE - - # Start the process - try: - hp, ht, pid, tid = CreateProcess(executable, args, - # no special security - None, None, - # must inherit handles to pass std - # handles - 1, - creationflags, - env, - cwd, - startupinfo) - except pywintypes.error, e: - # Translate pywintypes.error to WindowsError, which is - # a subclass of OSError. FIXME: We should really - # translate errno using _sys_errlist (or simliar), but - # how can this be done from Python? - raise WindowsError(*e.args) - - # Retain the process handle, but close the thread handle - self._child_created = True - self._handle = hp - self.pid = pid - ht.Close() - - # Child is launched. Close the parent's copy of those pipe - # handles that only the child should have open. You need - # to make sure that no handles to the write end of the - # output pipe are maintained in this process or else the - # pipe will not close when the child process exits and the - # ReadFile will hang. - if p2cread is not None: - p2cread.Close() - if c2pwrite is not None: - c2pwrite.Close() - if errwrite is not None: - errwrite.Close() - - - def poll(self, _deadstate=None): - """Check if child process has terminated. Returns returncode - attribute.""" - if self.returncode is None: - if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0: - self.returncode = GetExitCodeProcess(self._handle) - return self.returncode - - - def wait(self): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is None: - obj = WaitForSingleObject(self._handle, INFINITE) - self.returncode = GetExitCodeProcess(self._handle) - return self.returncode - - - def _readerthread(self, fh, buffer): - buffer.append(fh.read()) - - - def _communicate(self, input): - stdout = None # Return - stderr = None # Return - - if self.stdout: - stdout = [] - stdout_thread = threading.Thread(target=self._readerthread, - args=(self.stdout, stdout)) - stdout_thread.setDaemon(True) - stdout_thread.start() - if self.stderr: - stderr = [] - stderr_thread = threading.Thread(target=self._readerthread, - args=(self.stderr, stderr)) - stderr_thread.setDaemon(True) - stderr_thread.start() - - if self.stdin: - if input is not None: - self.stdin.write(input) - self.stdin.close() - - if self.stdout: - stdout_thread.join() - if self.stderr: - stderr_thread.join() - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = stdout[0] - if stderr is not None: - stderr = stderr[0] - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - self.wait() - return (stdout, stderr) - - else: - # - # POSIX methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - p2cread, p2cwrite = None, None - c2pread, c2pwrite = None, None - errread, errwrite = None, None - - if stdin is None: - pass - elif stdin == PIPE: - p2cread, p2cwrite = os.pipe() - elif is_int(stdin): - p2cread = stdin - else: - # Assuming file-like object - p2cread = stdin.fileno() - - if stdout is None: - pass - elif stdout == PIPE: - c2pread, c2pwrite = os.pipe() - elif is_int(stdout): - c2pwrite = stdout - else: - # Assuming file-like object - c2pwrite = stdout.fileno() - - if stderr is None: - pass - elif stderr == PIPE: - errread, errwrite = os.pipe() - elif stderr == STDOUT: - errwrite = c2pwrite - elif is_int(stderr): - errwrite = stderr - else: - # Assuming file-like object - errwrite = stderr.fileno() - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - def _set_cloexec_flag(self, fd): - try: - cloexec_flag = fcntl.FD_CLOEXEC - except AttributeError: - cloexec_flag = 1 - - old = fcntl.fcntl(fd, fcntl.F_GETFD) - fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) - - - def _close_fds(self, but): - for i in range(3, MAXFD): - if i == but: - continue - try: - os.close(i) - except KeyboardInterrupt: - raise # SCons: don't swallow keyboard interrupts - except: - pass - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite): - """Execute program (POSIX version)""" - - if is_string(args): - args = [args] - - if shell: - args = ["/bin/sh", "-c"] + args - - if executable is None: - executable = args[0] - - # For transferring possible exec failure from child to parent - # The first char specifies the exception type: 0 means - # OSError, 1 means some other error. - errpipe_read, errpipe_write = os.pipe() - self._set_cloexec_flag(errpipe_write) - - self.pid = os.fork() - self._child_created = True - if self.pid == 0: - # Child - try: - # Close parent's pipe ends - if p2cwrite: - os.close(p2cwrite) - if c2pread: - os.close(c2pread) - if errread: - os.close(errread) - os.close(errpipe_read) - - # Dup fds for child - if p2cread: - os.dup2(p2cread, 0) - if c2pwrite: - os.dup2(c2pwrite, 1) - if errwrite: - os.dup2(errwrite, 2) - - # Close pipe fds. Make sure we don't close the same - # fd more than once, or standard fds. - try: - set - except NameError: - # Fall-back for earlier Python versions, so epydoc - # can use this module directly to execute things. - if p2cread: - os.close(p2cread) - if c2pwrite and c2pwrite not in (p2cread,): - os.close(c2pwrite) - if errwrite and errwrite not in (p2cread, c2pwrite): - os.close(errwrite) - else: - for fd in set((p2cread, c2pwrite, errwrite))-set((0,1,2)): - if fd: os.close(fd) - - # Close all other fds, if asked for - if close_fds: - self._close_fds(but=errpipe_write) - - if cwd is not None: - os.chdir(cwd) - - if preexec_fn: - apply(preexec_fn) - - if env is None: - os.execvp(executable, args) - else: - os.execvpe(executable, args, env) - - except KeyboardInterrupt: - raise # SCons: don't swallow keyboard interrupts - - except: - exc_type, exc_value, tb = sys.exc_info() - # Save the traceback and attach it to the exception object - exc_lines = traceback.format_exception(exc_type, - exc_value, - tb) - exc_value.child_traceback = ''.join(exc_lines) - os.write(errpipe_write, pickle.dumps(exc_value)) - - # This exitcode won't be reported to applications, so it - # really doesn't matter what we return. - os._exit(255) - - # Parent - os.close(errpipe_write) - if p2cread and p2cwrite: - os.close(p2cread) - if c2pwrite and c2pread: - os.close(c2pwrite) - if errwrite and errread: - os.close(errwrite) - - # Wait for exec to fail or succeed; possibly raising exception - data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB - os.close(errpipe_read) - if data != "": - os.waitpid(self.pid, 0) - child_exception = pickle.loads(data) - raise child_exception - - - def _handle_exitstatus(self, sts): - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - elif os.WIFEXITED(sts): - self.returncode = os.WEXITSTATUS(sts) - else: - # Should never happen - raise RuntimeError("Unknown child exit status!") - - - def poll(self, _deadstate=None): - """Check if child process has terminated. Returns returncode - attribute.""" - if self.returncode is None: - try: - pid, sts = os.waitpid(self.pid, os.WNOHANG) - if pid == self.pid: - self._handle_exitstatus(sts) - except os.error: - if _deadstate is not None: - self.returncode = _deadstate - return self.returncode - - - def wait(self): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is None: - pid, sts = os.waitpid(self.pid, 0) - self._handle_exitstatus(sts) - return self.returncode - - - def _communicate(self, input): - read_set = [] - write_set = [] - stdout = None # Return - stderr = None # Return - - if self.stdin: - # Flush stdio buffer. This might block, if the user has - # been writing to .stdin in an uncontrolled fashion. - self.stdin.flush() - if input: - write_set.append(self.stdin) - else: - self.stdin.close() - if self.stdout: - read_set.append(self.stdout) - stdout = [] - if self.stderr: - read_set.append(self.stderr) - stderr = [] - - input_offset = 0 - while read_set or write_set: - rlist, wlist, xlist = select.select(read_set, write_set, []) - - if self.stdin in wlist: - # When select has indicated that the file is writable, - # we can write up to PIPE_BUF bytes without risk - # blocking. POSIX defines PIPE_BUF >= 512 - m = memoryview(input)[input_offset:input_offset+512] - bytes_written = os.write(self.stdin.fileno(), m) - input_offset = input_offset + bytes_written - if input_offset >= len(input): - self.stdin.close() - write_set.remove(self.stdin) - - if self.stdout in rlist: - data = os.read(self.stdout.fileno(), 1024) - if data == "": - self.stdout.close() - read_set.remove(self.stdout) - stdout.append(data) - - if self.stderr in rlist: - data = os.read(self.stderr.fileno(), 1024) - if data == "": - self.stderr.close() - read_set.remove(self.stderr) - stderr.append(data) - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = ''.join(stdout) - if stderr is not None: - stderr = ''.join(stderr) - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - self.wait() - return (stdout, stderr) - - -def _demo_posix(): - # - # Example 1: Simple redirection: Get process list - # - plist = Popen(["ps"], stdout=PIPE).communicate()[0] - print "Process list:" - print plist - - # - # Example 2: Change uid before executing child - # - if os.getuid() == 0: - p = Popen(["id"], preexec_fn=lambda: os.setuid(100)) - p.wait() - - # - # Example 3: Connecting several subprocesses - # - print "Looking for 'hda'..." - p1 = Popen(["dmesg"], stdout=PIPE) - p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) - print repr(p2.communicate()[0]) - - # - # Example 4: Catch execution error - # - print - print "Trying a weird file..." - try: - print Popen(["/this/path/does/not/exist"]).communicate() - except OSError, e: - if e.errno == errno.ENOENT: - print "The file didn't exist. I thought so..." - print "Child traceback:" - print e.child_traceback - else: - print "Error", e.errno - else: - sys.stderr.write( "Gosh. No error.\n" ) - - -def _demo_windows(): - # - # Example 1: Connecting several subprocesses - # - print "Looking for 'PROMPT' in set output..." - p1 = Popen("set", stdout=PIPE, shell=True) - p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE) - print repr(p2.communicate()[0]) - - # - # Example 2: Simple execution of program - # - print "Executing calc..." - p = Popen("calc") - p.wait() - - -if __name__ == "__main__": - if mswindows: - _demo_windows() - else: - _demo_posix() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/cpp.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/cpp.py deleted file mode 100644 index ef09e118d..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/cpp.py +++ /dev/null @@ -1,589 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/cpp.py 5023 2010/06/14 22:05:46 scons" - -__doc__ = """ -SCons C Pre-Processor module -""" -#TODO 2.3 and before has no sorted() -import SCons.compat - -import os -import re - -# -# First "subsystem" of regular expressions that we set up: -# -# Stuff to turn the C preprocessor directives in a file's contents into -# a list of tuples that we can process easily. -# - -# A table of regular expressions that fetch the arguments from the rest of -# a C preprocessor line. Different directives have different arguments -# that we want to fetch, using the regular expressions to which the lists -# of preprocessor directives map. -cpp_lines_dict = { - # Fetch the rest of a #if/#elif/#ifdef/#ifndef as one argument, - # separated from the keyword by white space. - ('if', 'elif', 'ifdef', 'ifndef',) - : '\s+(.+)', - - # Fetch the rest of a #import/#include/#include_next line as one - # argument, with white space optional. - ('import', 'include', 'include_next',) - : '\s*(.+)', - - # We don't care what comes after a #else or #endif line. - ('else', 'endif',) : '', - - # Fetch three arguments from a #define line: - # 1) The #defined keyword. - # 2) The optional parentheses and arguments (if it's a function-like - # macro, '' if it's not). - # 3) The expansion value. - ('define',) : '\s+([_A-Za-z][_A-Za-z0-9_]*)(\([^)]*\))?\s*(.*)', - - # Fetch the #undefed keyword from a #undef line. - ('undef',) : '\s+([_A-Za-z][A-Za-z0-9_]*)', -} - -# Create a table that maps each individual C preprocessor directive to -# the corresponding compiled regular expression that fetches the arguments -# we care about. -Table = {} -for op_list, expr in cpp_lines_dict.items(): - e = re.compile(expr) - for op in op_list: - Table[op] = e -del e -del op -del op_list - -# Create a list of the expressions we'll use to match all of the -# preprocessor directives. These are the same as the directives -# themselves *except* that we must use a negative lookahead assertion -# when matching "if" so it doesn't match the "if" in "ifdef." -override = { - 'if' : 'if(?!def)', -} -l = [override.get(x, x) for x in Table.keys()] - - -# Turn the list of expressions into one big honkin' regular expression -# that will match all the preprocessor lines at once. This will return -# a list of tuples, one for each preprocessor line. The preprocessor -# directive will be the first element in each tuple, and the rest of -# the line will be the second element. -e = '^\s*#\s*(' + '|'.join(l) + ')(.*)$' - -# And last but not least, compile the expression. -CPP_Expression = re.compile(e, re.M) - - - - -# -# Second "subsystem" of regular expressions that we set up: -# -# Stuff to translate a C preprocessor expression (as found on a #if or -# #elif line) into an equivalent Python expression that we can eval(). -# - -# A dictionary that maps the C representation of Boolean operators -# to their Python equivalents. -CPP_to_Python_Ops_Dict = { - '!' : ' not ', - '!=' : ' != ', - '&&' : ' and ', - '||' : ' or ', - '?' : ' and ', - ':' : ' or ', - '\r' : '', -} - -CPP_to_Python_Ops_Sub = lambda m: CPP_to_Python_Ops_Dict[m.group(0)] - -# We have to sort the keys by length so that longer expressions -# come *before* shorter expressions--in particular, "!=" must -# come before "!" in the alternation. Without this, the Python -# re module, as late as version 2.2.2, empirically matches the -# "!" in "!=" first, instead of finding the longest match. -# What's up with that? -l = sorted(CPP_to_Python_Ops_Dict.keys(), key=lambda a: len(a), reverse=True) - -# Turn the list of keys into one regular expression that will allow us -# to substitute all of the operators at once. -expr = '|'.join(map(re.escape, l)) - -# ...and compile the expression. -CPP_to_Python_Ops_Expression = re.compile(expr) - -# A separate list of expressions to be evaluated and substituted -# sequentially, not all at once. -CPP_to_Python_Eval_List = [ - ['defined\s+(\w+)', '"\\1" in __dict__'], - ['defined\s*\((\w+)\)', '"\\1" in __dict__'], - ['/\*.*\*/', ''], - ['/\*.*', ''], - ['//.*', ''], - ['(0x[0-9A-Fa-f]*)[UL]+', '\\1'], -] - -# Replace the string representations of the regular expressions in the -# list with compiled versions. -for l in CPP_to_Python_Eval_List: - l[0] = re.compile(l[0]) - -# Wrap up all of the above into a handy function. -def CPP_to_Python(s): - """ - Converts a C pre-processor expression into an equivalent - Python expression that can be evaluated. - """ - s = CPP_to_Python_Ops_Expression.sub(CPP_to_Python_Ops_Sub, s) - for expr, repl in CPP_to_Python_Eval_List: - s = expr.sub(repl, s) - return s - - - -del expr -del l -del override - - - -class FunctionEvaluator(object): - """ - Handles delayed evaluation of a #define function call. - """ - def __init__(self, name, args, expansion): - """ - Squirrels away the arguments and expansion value of a #define - macro function for later evaluation when we must actually expand - a value that uses it. - """ - self.name = name - self.args = function_arg_separator.split(args) - try: - expansion = expansion.split('##') - except AttributeError: - pass - self.expansion = expansion - def __call__(self, *values): - """ - Evaluates the expansion of a #define macro function called - with the specified values. - """ - if len(self.args) != len(values): - raise ValueError("Incorrect number of arguments to `%s'" % self.name) - # Create a dictionary that maps the macro arguments to the - # corresponding values in this "call." We'll use this when we - # eval() the expansion so that arguments will get expanded to - # the right values. - locals = {} - for k, v in zip(self.args, values): - locals[k] = v - - parts = [] - for s in self.expansion: - if not s in self.args: - s = repr(s) - parts.append(s) - statement = ' + '.join(parts) - - return eval(statement, globals(), locals) - - - -# Find line continuations. -line_continuations = re.compile('\\\\\r?\n') - -# Search for a "function call" macro on an expansion. Returns the -# two-tuple of the "function" name itself, and a string containing the -# arguments within the call parentheses. -function_name = re.compile('(\S+)\(([^)]*)\)') - -# Split a string containing comma-separated function call arguments into -# the separate arguments. -function_arg_separator = re.compile(',\s*') - - - -class PreProcessor(object): - """ - The main workhorse class for handling C pre-processing. - """ - def __init__(self, current=os.curdir, cpppath=(), dict={}, all=0): - global Table - - cpppath = tuple(cpppath) - - self.searchpath = { - '"' : (current,) + cpppath, - '<' : cpppath + (current,), - } - - # Initialize our C preprocessor namespace for tracking the - # values of #defined keywords. We use this namespace to look - # for keywords on #ifdef/#ifndef lines, and to eval() the - # expressions on #if/#elif lines (after massaging them from C to - # Python). - self.cpp_namespace = dict.copy() - self.cpp_namespace['__dict__'] = self.cpp_namespace - - if all: - self.do_include = self.all_include - - # For efficiency, a dispatch table maps each C preprocessor - # directive (#if, #define, etc.) to the method that should be - # called when we see it. We accomodate state changes (#if, - # #ifdef, #ifndef) by pushing the current dispatch table on a - # stack and changing what method gets called for each relevant - # directive we might see next at this level (#else, #elif). - # #endif will simply pop the stack. - d = { - 'scons_current_file' : self.scons_current_file - } - for op in Table.keys(): - d[op] = getattr(self, 'do_' + op) - self.default_table = d - - # Controlling methods. - - def tupleize(self, contents): - """ - Turns the contents of a file into a list of easily-processed - tuples describing the CPP lines in the file. - - The first element of each tuple is the line's preprocessor - directive (#if, #include, #define, etc., minus the initial '#'). - The remaining elements are specific to the type of directive, as - pulled apart by the regular expression. - """ - global CPP_Expression, Table - contents = line_continuations.sub('', contents) - cpp_tuples = CPP_Expression.findall(contents) - return [(m[0],) + Table[m[0]].match(m[1]).groups() for m in cpp_tuples] - - def __call__(self, file): - """ - Pre-processes a file. - - This is the main public entry point. - """ - self.current_file = file - return self.process_contents(self.read_file(file), file) - - def process_contents(self, contents, fname=None): - """ - Pre-processes a file contents. - - This is the main internal entry point. - """ - self.stack = [] - self.dispatch_table = self.default_table.copy() - self.current_file = fname - self.tuples = self.tupleize(contents) - - self.initialize_result(fname) - while self.tuples: - t = self.tuples.pop(0) - # Uncomment to see the list of tuples being processed (e.g., - # to validate the CPP lines are being translated correctly). - #print t - self.dispatch_table[t[0]](t) - return self.finalize_result(fname) - - # Dispatch table stack manipulation methods. - - def save(self): - """ - Pushes the current dispatch table on the stack and re-initializes - the current dispatch table to the default. - """ - self.stack.append(self.dispatch_table) - self.dispatch_table = self.default_table.copy() - - def restore(self): - """ - Pops the previous dispatch table off the stack and makes it the - current one. - """ - try: self.dispatch_table = self.stack.pop() - except IndexError: pass - - # Utility methods. - - def do_nothing(self, t): - """ - Null method for when we explicitly want the action for a - specific preprocessor directive to do nothing. - """ - pass - - def scons_current_file(self, t): - self.current_file = t[1] - - def eval_expression(self, t): - """ - Evaluates a C preprocessor expression. - - This is done by converting it to a Python equivalent and - eval()ing it in the C preprocessor namespace we use to - track #define values. - """ - t = CPP_to_Python(' '.join(t[1:])) - try: return eval(t, self.cpp_namespace) - except (NameError, TypeError): return 0 - - def initialize_result(self, fname): - self.result = [fname] - - def finalize_result(self, fname): - return self.result[1:] - - def find_include_file(self, t): - """ - Finds the #include file for a given preprocessor tuple. - """ - fname = t[2] - for d in self.searchpath[t[1]]: - if d == os.curdir: - f = fname - else: - f = os.path.join(d, fname) - if os.path.isfile(f): - return f - return None - - def read_file(self, file): - return open(file).read() - - # Start and stop processing include lines. - - def start_handling_includes(self, t=None): - """ - Causes the PreProcessor object to start processing #import, - #include and #include_next lines. - - This method will be called when a #if, #ifdef, #ifndef or #elif - evaluates True, or when we reach the #else in a #if, #ifdef, - #ifndef or #elif block where a condition already evaluated - False. - - """ - d = self.dispatch_table - d['import'] = self.do_import - d['include'] = self.do_include - d['include_next'] = self.do_include - - def stop_handling_includes(self, t=None): - """ - Causes the PreProcessor object to stop processing #import, - #include and #include_next lines. - - This method will be called when a #if, #ifdef, #ifndef or #elif - evaluates False, or when we reach the #else in a #if, #ifdef, - #ifndef or #elif block where a condition already evaluated True. - """ - d = self.dispatch_table - d['import'] = self.do_nothing - d['include'] = self.do_nothing - d['include_next'] = self.do_nothing - - # Default methods for handling all of the preprocessor directives. - # (Note that what actually gets called for a given directive at any - # point in time is really controlled by the dispatch_table.) - - def _do_if_else_condition(self, condition): - """ - Common logic for evaluating the conditions on #if, #ifdef and - #ifndef lines. - """ - self.save() - d = self.dispatch_table - if condition: - self.start_handling_includes() - d['elif'] = self.stop_handling_includes - d['else'] = self.stop_handling_includes - else: - self.stop_handling_includes() - d['elif'] = self.do_elif - d['else'] = self.start_handling_includes - - def do_ifdef(self, t): - """ - Default handling of a #ifdef line. - """ - self._do_if_else_condition(t[1] in self.cpp_namespace) - - def do_ifndef(self, t): - """ - Default handling of a #ifndef line. - """ - self._do_if_else_condition(t[1] not in self.cpp_namespace) - - def do_if(self, t): - """ - Default handling of a #if line. - """ - self._do_if_else_condition(self.eval_expression(t)) - - def do_elif(self, t): - """ - Default handling of a #elif line. - """ - d = self.dispatch_table - if self.eval_expression(t): - self.start_handling_includes() - d['elif'] = self.stop_handling_includes - d['else'] = self.stop_handling_includes - - def do_else(self, t): - """ - Default handling of a #else line. - """ - pass - - def do_endif(self, t): - """ - Default handling of a #endif line. - """ - self.restore() - - def do_define(self, t): - """ - Default handling of a #define line. - """ - _, name, args, expansion = t - try: - expansion = int(expansion) - except (TypeError, ValueError): - pass - if args: - evaluator = FunctionEvaluator(name, args[1:-1], expansion) - self.cpp_namespace[name] = evaluator - else: - self.cpp_namespace[name] = expansion - - def do_undef(self, t): - """ - Default handling of a #undef line. - """ - try: del self.cpp_namespace[t[1]] - except KeyError: pass - - def do_import(self, t): - """ - Default handling of a #import line. - """ - # XXX finish this -- maybe borrow/share logic from do_include()...? - pass - - def do_include(self, t): - """ - Default handling of a #include line. - """ - t = self.resolve_include(t) - include_file = self.find_include_file(t) - if include_file: - #print "include_file =", include_file - self.result.append(include_file) - contents = self.read_file(include_file) - new_tuples = [('scons_current_file', include_file)] + \ - self.tupleize(contents) + \ - [('scons_current_file', self.current_file)] - self.tuples[:] = new_tuples + self.tuples - - # Date: Tue, 22 Nov 2005 20:26:09 -0500 - # From: Stefan Seefeld - # - # By the way, #include_next is not the same as #include. The difference - # being that #include_next starts its search in the path following the - # path that let to the including file. In other words, if your system - # include paths are ['/foo', '/bar'], and you are looking at a header - # '/foo/baz.h', it might issue an '#include_next ' which would - # correctly resolve to '/bar/baz.h' (if that exists), but *not* see - # '/foo/baz.h' again. See http://www.delorie.com/gnu/docs/gcc/cpp_11.html - # for more reasoning. - # - # I have no idea in what context 'import' might be used. - - # XXX is #include_next really the same as #include ? - do_include_next = do_include - - # Utility methods for handling resolution of include files. - - def resolve_include(self, t): - """Resolve a tuple-ized #include line. - - This handles recursive expansion of values without "" or <> - surrounding the name until an initial " or < is found, to handle - #include FILE - where FILE is a #define somewhere else. - """ - s = t[1] - while not s[0] in '<"': - #print "s =", s - try: - s = self.cpp_namespace[s] - except KeyError: - m = function_name.search(s) - s = self.cpp_namespace[m.group(1)] - if callable(s): - args = function_arg_separator.split(m.group(2)) - s = s(*args) - if not s: - return None - return (t[0], s[0], s[1:-1]) - - def all_include(self, t): - """ - """ - self.result.append(self.resolve_include(t)) - -class DumbPreProcessor(PreProcessor): - """A preprocessor that ignores all #if/#elif/#else/#endif directives - and just reports back *all* of the #include files (like the classic - SCons scanner did). - - This is functionally equivalent to using a regular expression to - find all of the #include lines, only slower. It exists mainly as - an example of how the main PreProcessor class can be sub-classed - to tailor its behavior. - """ - def __init__(self, *args, **kw): - PreProcessor.__init__(self, *args, **kw) - d = self.default_table - for func in ['if', 'elif', 'else', 'endif', 'ifdef', 'ifndef']: - d[func] = d[func] = self.do_nothing - -del __revision__ - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/dblite.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/dblite.py deleted file mode 100644 index ea24e6a3f..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/dblite.py +++ /dev/null @@ -1,251 +0,0 @@ -# dblite.py module contributed by Ralf W. Grosse-Kunstleve. -# Extended for Unicode by Steven Knight. - -import SCons.compat - -import builtins -import os -# compat layer imports "cPickle" for us if it's available. -import pickle -import shutil -import time - -keep_all_files = 00000 -ignore_corrupt_dbfiles = 0 - -def corruption_warning(filename): - print "Warning: Discarding corrupt database:", filename - -try: unicode -except NameError: - def is_string(s): - return isinstance(s, str) -else: - def is_string(s): - return type(s) in (str, unicode) - -try: - unicode('a') -except NameError: - def unicode(s): return s - -dblite_suffix = '.dblite' -tmp_suffix = '.tmp' - -class dblite(object): - - # Squirrel away references to the functions in various modules - # that we'll use when our __del__() method calls our sync() method - # during shutdown. We might get destroyed when Python is in the midst - # of tearing down the different modules we import in an essentially - # arbitrary order, and some of the various modules's global attributes - # may already be wiped out from under us. - # - # See the discussion at: - # http://mail.python.org/pipermail/python-bugs-list/2003-March/016877.html - - _open = builtins.open - _pickle_dump = staticmethod(pickle.dump) - _os_chmod = os.chmod - try: - _os_chown = os.chown - except AttributeError: - _os_chown = None - _os_rename = os.rename - _os_unlink = os.unlink - _shutil_copyfile = shutil.copyfile - _time_time = time.time - - def __init__(self, file_base_name, flag, mode): - assert flag in (None, "r", "w", "c", "n") - if (flag is None): flag = "r" - base, ext = os.path.splitext(file_base_name) - if ext == dblite_suffix: - # There's already a suffix on the file name, don't add one. - self._file_name = file_base_name - self._tmp_name = base + tmp_suffix - else: - self._file_name = file_base_name + dblite_suffix - self._tmp_name = file_base_name + tmp_suffix - self._flag = flag - self._mode = mode - self._dict = {} - self._needs_sync = 00000 - if self._os_chown is not None and (os.geteuid()==0 or os.getuid()==0): - # running as root; chown back to current owner/group when done - try: - statinfo = os.stat(self._file_name) - self._chown_to = statinfo.st_uid - self._chgrp_to = statinfo.st_gid - except OSError, e: - # db file doesn't exist yet. - # Check os.environ for SUDO_UID, use if set - self._chown_to = int(os.environ.get('SUDO_UID', -1)) - self._chgrp_to = int(os.environ.get('SUDO_GID', -1)) - else: - self._chown_to = -1 # don't chown - self._chgrp_to = -1 # don't chgrp - if (self._flag == "n"): - self._open(self._file_name, "wb", self._mode) - else: - try: - f = self._open(self._file_name, "rb") - except IOError, e: - if (self._flag != "c"): - raise e - self._open(self._file_name, "wb", self._mode) - else: - p = f.read() - if (len(p) > 0): - try: - self._dict = pickle.loads(p) - except (pickle.UnpicklingError, EOFError): - if (ignore_corrupt_dbfiles == 0): raise - if (ignore_corrupt_dbfiles == 1): - corruption_warning(self._file_name) - - def __del__(self): - if (self._needs_sync): - self.sync() - - def sync(self): - self._check_writable() - f = self._open(self._tmp_name, "wb", self._mode) - self._pickle_dump(self._dict, f, 1) - f.close() - # Windows doesn't allow renaming if the file exists, so unlink - # it first, chmod'ing it to make sure we can do so. On UNIX, we - # may not be able to chmod the file if it's owned by someone else - # (e.g. from a previous run as root). We should still be able to - # unlink() the file if the directory's writable, though, so ignore - # any OSError exception thrown by the chmod() call. - try: self._os_chmod(self._file_name, 0777) - except OSError: pass - self._os_unlink(self._file_name) - self._os_rename(self._tmp_name, self._file_name) - if self._os_chown is not None and self._chown_to > 0: # don't chown to root or -1 - try: - self._os_chown(self._file_name, self._chown_to, self._chgrp_to) - except OSError: - pass - self._needs_sync = 00000 - if (keep_all_files): - self._shutil_copyfile( - self._file_name, - self._file_name + "_" + str(int(self._time_time()))) - - def _check_writable(self): - if (self._flag == "r"): - raise IOError("Read-only database: %s" % self._file_name) - - def __getitem__(self, key): - return self._dict[key] - - def __setitem__(self, key, value): - self._check_writable() - if (not is_string(key)): - raise TypeError("key `%s' must be a string but is %s" % (key, type(key))) - if (not is_string(value)): - raise TypeError("value `%s' must be a string but is %s" % (value, type(value))) - self._dict[key] = value - self._needs_sync = 0001 - - def keys(self): - return list(self._dict.keys()) - - def has_key(self, key): - return key in self._dict - - def __contains__(self, key): - return key in self._dict - - def iterkeys(self): - # Wrapping name in () prevents fixer from "fixing" this - return (self._dict.iterkeys)() - - __iter__ = iterkeys - - def __len__(self): - return len(self._dict) - -def open(file, flag=None, mode=0666): - return dblite(file, flag, mode) - -def _exercise(): - db = open("tmp", "n") - assert len(db) == 0 - db["foo"] = "bar" - assert db["foo"] == "bar" - db[unicode("ufoo")] = unicode("ubar") - assert db[unicode("ufoo")] == unicode("ubar") - db.sync() - db = open("tmp", "c") - assert len(db) == 2, len(db) - assert db["foo"] == "bar" - db["bar"] = "foo" - assert db["bar"] == "foo" - db[unicode("ubar")] = unicode("ufoo") - assert db[unicode("ubar")] == unicode("ufoo") - db.sync() - db = open("tmp", "r") - assert len(db) == 4, len(db) - assert db["foo"] == "bar" - assert db["bar"] == "foo" - assert db[unicode("ufoo")] == unicode("ubar") - assert db[unicode("ubar")] == unicode("ufoo") - try: - db.sync() - except IOError, e: - assert str(e) == "Read-only database: tmp.dblite" - else: - raise RuntimeError("IOError expected.") - db = open("tmp", "w") - assert len(db) == 4 - db["ping"] = "pong" - db.sync() - try: - db[(1,2)] = "tuple" - except TypeError, e: - assert str(e) == "key `(1, 2)' must be a string but is ", str(e) - else: - raise RuntimeError("TypeError exception expected") - try: - db["list"] = [1,2] - except TypeError, e: - assert str(e) == "value `[1, 2]' must be a string but is ", str(e) - else: - raise RuntimeError("TypeError exception expected") - db = open("tmp", "r") - assert len(db) == 5 - db = open("tmp", "n") - assert len(db) == 0 - dblite._open("tmp.dblite", "w") - db = open("tmp", "r") - dblite._open("tmp.dblite", "w").write("x") - try: - db = open("tmp", "r") - except pickle.UnpicklingError: - pass - else: - raise RuntimeError("pickle exception expected.") - global ignore_corrupt_dbfiles - ignore_corrupt_dbfiles = 2 - db = open("tmp", "r") - assert len(db) == 0 - os.unlink("tmp.dblite") - try: - db = open("tmp", "w") - except IOError, e: - assert str(e) == "[Errno 2] No such file or directory: 'tmp.dblite'", str(e) - else: - raise RuntimeError("IOError expected.") - print "OK" - -if (__name__ == "__main__"): - _exercise() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-local-2.0.0.final.0/SCons/exitfuncs.py b/cpp/scons/scons-local-2.0.0.final.0/SCons/exitfuncs.py deleted file mode 100644 index 0521568cc..000000000 --- a/cpp/scons/scons-local-2.0.0.final.0/SCons/exitfuncs.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.exitfuncs - -Register functions which are executed when SCons exits for any reason. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/exitfuncs.py 5023 2010/06/14 22:05:46 scons" - - - -_exithandlers = [] -def _run_exitfuncs(): - """run any registered exit functions - - _exithandlers is traversed in reverse order so functions are executed - last in, first out. - """ - - while _exithandlers: - func, targs, kargs = _exithandlers.pop() - func(*targs, **kargs) - -def register(func, *targs, **kargs): - """register a function to be executed upon normal program termination - - func - function to be called at exit - targs - optional arguments to pass to func - kargs - optional keyword arguments to pass to func - """ - _exithandlers.append((func, targs, kargs)) - -import sys - -try: - x = sys.exitfunc - - # if x isn't our own exit func executive, assume it's another - # registered exit function - append it to our list... - if x != _run_exitfuncs: - register(x) - -except AttributeError: - pass - -# make our exit function get run by python when it exits: -sys.exitfunc = _run_exitfuncs - -del sys - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons-time.py b/cpp/scons/scons-time.py deleted file mode 100755 index 36c113459..000000000 --- a/cpp/scons/scons-time.py +++ /dev/null @@ -1,1544 +0,0 @@ -#!/usr/bin/env python -# -# scons-time - run SCons timings and collect statistics -# -# A script for running a configuration through SCons with a standard -# set of invocations to collect timing and memory statistics and to -# capture the results in a consistent set of output files for display -# and analysis. -# - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -from __future__ import division -from __future__ import nested_scopes - -__revision__ = "src/script/scons-time.py 5023 2010/06/14 22:05:46 scons" - -import getopt -import glob -import os -import re -import shutil -import sys -import tempfile -import time - -try: - sorted -except NameError: - # Pre-2.4 Python has no sorted() function. - # - # The pre-2.4 Python list.sort() method does not support - # list.sort(key=) nor list.sort(reverse=) keyword arguments, so - # we must implement the functionality of those keyword arguments - # by hand instead of passing them to list.sort(). - def sorted(iterable, cmp=None, key=None, reverse=False): - if key is not None: - result = [(key(x), x) for x in iterable] - else: - result = iterable[:] - if cmp is None: - # Pre-2.3 Python does not support list.sort(None). - result.sort() - else: - result.sort(cmp) - if key is not None: - result = [t1 for t0,t1 in result] - if reverse: - result.reverse() - return result - -if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is not None: - # We can't apply the 'callable' fixer until the floor is 2.6, but the - # '-3' option to Python 2.6 and 2.7 generates almost ten thousand - # warnings. This hack allows us to run regression tests with the '-3' - # option by replacing the callable() built-in function with a hack - # that performs the same function but doesn't generate the warning. - # Note that this hack is ONLY intended to be used for regression - # testing, and should NEVER be used for real runs. - from types import ClassType - def callable(obj): - if hasattr(obj, '__call__'): return True - if isinstance(obj, (ClassType, type)): return True - return False - -def make_temp_file(**kw): - try: - result = tempfile.mktemp(**kw) - try: - result = os.path.realpath(result) - except AttributeError: - # Python 2.1 has no os.path.realpath() method. - pass - except TypeError: - try: - save_template = tempfile.template - prefix = kw['prefix'] - del kw['prefix'] - tempfile.template = prefix - result = tempfile.mktemp(**kw) - finally: - tempfile.template = save_template - return result - -def HACK_for_exec(cmd, *args): - ''' - For some reason, Python won't allow an exec() within a function - that also declares an internal function (including lambda functions). - This function is a hack that calls exec() in a function with no - internal functions. - ''' - if not args: exec(cmd) - elif len(args) == 1: exec cmd in args[0] - else: exec cmd in args[0], args[1] - -class Plotter(object): - def increment_size(self, largest): - """ - Return the size of each horizontal increment line for a specified - maximum value. This returns a value that will provide somewhere - between 5 and 9 horizontal lines on the graph, on some set of - boundaries that are multiples of 10/100/1000/etc. - """ - i = largest // 5 - if not i: - return largest - multiplier = 1 - while i >= 10: - i = i // 10 - multiplier = multiplier * 10 - return i * multiplier - - def max_graph_value(self, largest): - # Round up to next integer. - largest = int(largest) + 1 - increment = self.increment_size(largest) - return ((largest + increment - 1) // increment) * increment - -class Line(object): - def __init__(self, points, type, title, label, comment, fmt="%s %s"): - self.points = points - self.type = type - self.title = title - self.label = label - self.comment = comment - self.fmt = fmt - - def print_label(self, inx, x, y): - if self.label: - print 'set label %s "%s" at %s,%s right' % (inx, self.label, x, y) - - def plot_string(self): - if self.title: - title_string = 'title "%s"' % self.title - else: - title_string = 'notitle' - return "'-' %s with lines lt %s" % (title_string, self.type) - - def print_points(self, fmt=None): - if fmt is None: - fmt = self.fmt - if self.comment: - print '# %s' % self.comment - for x, y in self.points: - # If y is None, it usually represents some kind of break - # in the line's index number. We might want to represent - # this some way rather than just drawing the line straight - # between the two points on either side. - if not y is None: - print fmt % (x, y) - print 'e' - - def get_x_values(self): - return [ p[0] for p in self.points ] - - def get_y_values(self): - return [ p[1] for p in self.points ] - -class Gnuplotter(Plotter): - - def __init__(self, title, key_location): - self.lines = [] - self.title = title - self.key_location = key_location - - def line(self, points, type, title=None, label=None, comment=None, fmt='%s %s'): - if points: - line = Line(points, type, title, label, comment, fmt) - self.lines.append(line) - - def plot_string(self, line): - return line.plot_string() - - def vertical_bar(self, x, type, label, comment): - if self.get_min_x() <= x and x <= self.get_max_x(): - points = [(x, 0), (x, self.max_graph_value(self.get_max_y()))] - self.line(points, type, label, comment) - - def get_all_x_values(self): - result = [] - for line in self.lines: - result.extend(line.get_x_values()) - return [r for r in result if not r is None] - - def get_all_y_values(self): - result = [] - for line in self.lines: - result.extend(line.get_y_values()) - return [r for r in result if not r is None] - - def get_min_x(self): - try: - return self.min_x - except AttributeError: - try: - self.min_x = min(self.get_all_x_values()) - except ValueError: - self.min_x = 0 - return self.min_x - - def get_max_x(self): - try: - return self.max_x - except AttributeError: - try: - self.max_x = max(self.get_all_x_values()) - except ValueError: - self.max_x = 0 - return self.max_x - - def get_min_y(self): - try: - return self.min_y - except AttributeError: - try: - self.min_y = min(self.get_all_y_values()) - except ValueError: - self.min_y = 0 - return self.min_y - - def get_max_y(self): - try: - return self.max_y - except AttributeError: - try: - self.max_y = max(self.get_all_y_values()) - except ValueError: - self.max_y = 0 - return self.max_y - - def draw(self): - - if not self.lines: - return - - if self.title: - print 'set title "%s"' % self.title - print 'set key %s' % self.key_location - - min_y = self.get_min_y() - max_y = self.max_graph_value(self.get_max_y()) - incr = (max_y - min_y) / 10.0 - start = min_y + (max_y / 2.0) + (2.0 * incr) - position = [ start - (i * incr) for i in range(5) ] - - inx = 1 - for line in self.lines: - line.print_label(inx, line.points[0][0]-1, - position[(inx-1) % len(position)]) - inx += 1 - - plot_strings = [ self.plot_string(l) for l in self.lines ] - print 'plot ' + ', \\\n '.join(plot_strings) - - for line in self.lines: - line.print_points() - - - -def untar(fname): - import tarfile - tar = tarfile.open(name=fname, mode='r') - for tarinfo in tar: - tar.extract(tarinfo) - tar.close() - -def unzip(fname): - import zipfile - zf = zipfile.ZipFile(fname, 'r') - for name in zf.namelist(): - dir = os.path.dirname(name) - try: - os.makedirs(dir) - except: - pass - open(name, 'w').write(zf.read(name)) - -def read_tree(dir): - for dirpath, dirnames, filenames in os.walk(dir): - for fn in filenames: - fn = os.path.join(dirpath, fn) - if os.path.isfile(fn): - open(fn, 'rb').read() - -def redirect_to_file(command, log): - return '%s > %s 2>&1' % (command, log) - -def tee_to_file(command, log): - return '%s 2>&1 | tee %s' % (command, log) - - - -class SConsTimer(object): - """ - Usage: scons-time SUBCOMMAND [ARGUMENTS] - Type "scons-time help SUBCOMMAND" for help on a specific subcommand. - - Available subcommands: - func Extract test-run data for a function - help Provides help - mem Extract --debug=memory data from test runs - obj Extract --debug=count data from test runs - time Extract --debug=time data from test runs - run Runs a test configuration - """ - - name = 'scons-time' - name_spaces = ' '*len(name) - - def makedict(**kw): - return kw - - default_settings = makedict( - aegis = 'aegis', - aegis_project = None, - chdir = None, - config_file = None, - initial_commands = [], - key_location = 'bottom left', - orig_cwd = os.getcwd(), - outdir = None, - prefix = '', - python = '"%s"' % sys.executable, - redirect = redirect_to_file, - scons = None, - scons_flags = '--debug=count --debug=memory --debug=time --debug=memoizer', - scons_lib_dir = None, - scons_wrapper = None, - startup_targets = '--help', - subdir = None, - subversion_url = None, - svn = 'svn', - svn_co_flag = '-q', - tar = 'tar', - targets = '', - targets0 = None, - targets1 = None, - targets2 = None, - title = None, - unzip = 'unzip', - verbose = False, - vertical_bars = [], - - unpack_map = { - '.tar.gz' : (untar, '%(tar)s xzf %%s'), - '.tgz' : (untar, '%(tar)s xzf %%s'), - '.tar' : (untar, '%(tar)s xf %%s'), - '.zip' : (unzip, '%(unzip)s %%s'), - }, - ) - - run_titles = [ - 'Startup', - 'Full build', - 'Up-to-date build', - ] - - run_commands = [ - '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof0)s %(targets0)s', - '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof1)s %(targets1)s', - '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof2)s %(targets2)s', - ] - - stages = [ - 'pre-read', - 'post-read', - 'pre-build', - 'post-build', - ] - - stage_strings = { - 'pre-read' : 'Memory before reading SConscript files:', - 'post-read' : 'Memory after reading SConscript files:', - 'pre-build' : 'Memory before building targets:', - 'post-build' : 'Memory after building targets:', - } - - memory_string_all = 'Memory ' - - default_stage = stages[-1] - - time_strings = { - 'total' : 'Total build time', - 'SConscripts' : 'Total SConscript file execution time', - 'SCons' : 'Total SCons execution time', - 'commands' : 'Total command execution time', - } - - time_string_all = 'Total .* time' - - # - - def __init__(self): - self.__dict__.update(self.default_settings) - - # Functions for displaying and executing commands. - - def subst(self, x, dictionary): - try: - return x % dictionary - except TypeError: - # x isn't a string (it's probably a Python function), - # so just return it. - return x - - def subst_variables(self, command, dictionary): - """ - Substitutes (via the format operator) the values in the specified - dictionary into the specified command. - - The command can be an (action, string) tuple. In all cases, we - perform substitution on strings and don't worry if something isn't - a string. (It's probably a Python function to be executed.) - """ - try: - command + '' - except TypeError: - action = command[0] - string = command[1] - args = command[2:] - else: - action = command - string = action - args = (()) - action = self.subst(action, dictionary) - string = self.subst(string, dictionary) - return (action, string, args) - - def _do_not_display(self, msg, *args): - pass - - def display(self, msg, *args): - """ - Displays the specified message. - - Each message is prepended with a standard prefix of our name - plus the time. - """ - if callable(msg): - msg = msg(*args) - else: - msg = msg % args - if msg is None: - return - fmt = '%s[%s]: %s\n' - sys.stdout.write(fmt % (self.name, time.strftime('%H:%M:%S'), msg)) - - def _do_not_execute(self, action, *args): - pass - - def execute(self, action, *args): - """ - Executes the specified action. - - The action is called if it's a callable Python function, and - otherwise passed to os.system(). - """ - if callable(action): - action(*args) - else: - os.system(action % args) - - def run_command_list(self, commands, dict): - """ - Executes a list of commands, substituting values from the - specified dictionary. - """ - commands = [ self.subst_variables(c, dict) for c in commands ] - for action, string, args in commands: - self.display(string, *args) - sys.stdout.flush() - status = self.execute(action, *args) - if status: - sys.exit(status) - - def log_display(self, command, log): - command = self.subst(command, self.__dict__) - if log: - command = self.redirect(command, log) - return command - - def log_execute(self, command, log): - command = self.subst(command, self.__dict__) - output = os.popen(command).read() - if self.verbose: - sys.stdout.write(output) - open(log, 'wb').write(output) - - # - - def archive_splitext(self, path): - """ - Splits an archive name into a filename base and extension. - - This is like os.path.splitext() (which it calls) except that it - also looks for '.tar.gz' and treats it as an atomic extensions. - """ - if path.endswith('.tar.gz'): - return path[:-7], path[-7:] - else: - return os.path.splitext(path) - - def args_to_files(self, args, tail=None): - """ - Takes a list of arguments, expands any glob patterns, and - returns the last "tail" files from the list. - """ - files = [] - for a in args: - files.extend(sorted(glob.glob(a))) - - if tail: - files = files[-tail:] - - return files - - def ascii_table(self, files, columns, - line_function, file_function=lambda x: x, - *args, **kw): - - header_fmt = ' '.join(['%12s'] * len(columns)) - line_fmt = header_fmt + ' %s' - - print header_fmt % columns - - for file in files: - t = line_function(file, *args, **kw) - if t is None: - t = [] - diff = len(columns) - len(t) - if diff > 0: - t += [''] * diff - t.append(file_function(file)) - print line_fmt % tuple(t) - - def collect_results(self, files, function, *args, **kw): - results = {} - - for file in files: - base = os.path.splitext(file)[0] - run, index = base.split('-')[-2:] - - run = int(run) - index = int(index) - - value = function(file, *args, **kw) - - try: - r = results[index] - except KeyError: - r = [] - results[index] = r - r.append((run, value)) - - return results - - def doc_to_help(self, obj): - """ - Translates an object's __doc__ string into help text. - - This strips a consistent number of spaces from each line in the - help text, essentially "outdenting" the text to the left-most - column. - """ - doc = obj.__doc__ - if doc is None: - return '' - return self.outdent(doc) - - def find_next_run_number(self, dir, prefix): - """ - Returns the next run number in a directory for the specified prefix. - - Examines the contents the specified directory for files with the - specified prefix, extracts the run numbers from each file name, - and returns the next run number after the largest it finds. - """ - x = re.compile(re.escape(prefix) + '-([0-9]+).*') - matches = [x.match(e) for e in os.listdir(dir)] - matches = [_f for _f in matches if _f] - if not matches: - return 0 - run_numbers = [int(m.group(1)) for m in matches] - return int(max(run_numbers)) + 1 - - def gnuplot_results(self, results, fmt='%s %.3f'): - """ - Prints out a set of results in Gnuplot format. - """ - gp = Gnuplotter(self.title, self.key_location) - - for i in sorted(results.keys()): - try: - t = self.run_titles[i] - except IndexError: - t = '??? %s ???' % i - results[i].sort() - gp.line(results[i], i+1, t, None, t, fmt=fmt) - - for bar_tuple in self.vertical_bars: - try: - x, type, label, comment = bar_tuple - except ValueError: - x, type, label = bar_tuple - comment = label - gp.vertical_bar(x, type, label, comment) - - gp.draw() - - def logfile_name(self, invocation): - """ - Returns the absolute path of a log file for the specificed - invocation number. - """ - name = self.prefix_run + '-%d.log' % invocation - return os.path.join(self.outdir, name) - - def outdent(self, s): - """ - Strip as many spaces from each line as are found at the beginning - of the first line in the list. - """ - lines = s.split('\n') - if lines[0] == '': - lines = lines[1:] - spaces = re.match(' *', lines[0]).group(0) - def strip_initial_spaces(l, s=spaces): - if l.startswith(spaces): - l = l[len(spaces):] - return l - return '\n'.join([ strip_initial_spaces(l) for l in lines ]) + '\n' - - def profile_name(self, invocation): - """ - Returns the absolute path of a profile file for the specified - invocation number. - """ - name = self.prefix_run + '-%d.prof' % invocation - return os.path.join(self.outdir, name) - - def set_env(self, key, value): - os.environ[key] = value - - # - - def get_debug_times(self, file, time_string=None): - """ - Fetch times from the --debug=time strings in the specified file. - """ - if time_string is None: - search_string = self.time_string_all - else: - search_string = time_string - contents = open(file).read() - if not contents: - sys.stderr.write('file %s has no contents!\n' % repr(file)) - return None - result = re.findall(r'%s: ([\d\.]*)' % search_string, contents)[-4:] - result = [ float(r) for r in result ] - if not time_string is None: - try: - result = result[0] - except IndexError: - sys.stderr.write('file %s has no results!\n' % repr(file)) - return None - return result - - def get_function_profile(self, file, function): - """ - Returns the file, line number, function name, and cumulative time. - """ - try: - import pstats - except ImportError, e: - sys.stderr.write('%s: func: %s\n' % (self.name, e)) - sys.stderr.write('%s This version of Python is missing the profiler.\n' % self.name_spaces) - sys.stderr.write('%s Cannot use the "func" subcommand.\n' % self.name_spaces) - sys.exit(1) - statistics = pstats.Stats(file).stats - matches = [ e for e in statistics.items() if e[0][2] == function ] - r = matches[0] - return r[0][0], r[0][1], r[0][2], r[1][3] - - def get_function_time(self, file, function): - """ - Returns just the cumulative time for the specified function. - """ - return self.get_function_profile(file, function)[3] - - def get_memory(self, file, memory_string=None): - """ - Returns a list of integers of the amount of memory used. The - default behavior is to return all the stages. - """ - if memory_string is None: - search_string = self.memory_string_all - else: - search_string = memory_string - lines = open(file).readlines() - lines = [ l for l in lines if l.startswith(search_string) ][-4:] - result = [ int(l.split()[-1]) for l in lines[-4:] ] - if len(result) == 1: - result = result[0] - return result - - def get_object_counts(self, file, object_name, index=None): - """ - Returns the counts of the specified object_name. - """ - object_string = ' ' + object_name + '\n' - lines = open(file).readlines() - line = [ l for l in lines if l.endswith(object_string) ][0] - result = [ int(field) for field in line.split()[:4] ] - if index is not None: - result = result[index] - return result - - # - - command_alias = {} - - def execute_subcommand(self, argv): - """ - Executes the do_*() function for the specified subcommand (argv[0]). - """ - if not argv: - return - cmdName = self.command_alias.get(argv[0], argv[0]) - try: - func = getattr(self, 'do_' + cmdName) - except AttributeError: - return self.default(argv) - try: - return func(argv) - except TypeError, e: - sys.stderr.write("%s %s: %s\n" % (self.name, cmdName, e)) - import traceback - traceback.print_exc(file=sys.stderr) - sys.stderr.write("Try '%s help %s'\n" % (self.name, cmdName)) - - def default(self, argv): - """ - The default behavior for an unknown subcommand. Prints an - error message and exits. - """ - sys.stderr.write('%s: Unknown subcommand "%s".\n' % (self.name, argv[0])) - sys.stderr.write('Type "%s help" for usage.\n' % self.name) - sys.exit(1) - - # - - def do_help(self, argv): - """ - """ - if argv[1:]: - for arg in argv[1:]: - try: - func = getattr(self, 'do_' + arg) - except AttributeError: - sys.stderr.write('%s: No help for "%s"\n' % (self.name, arg)) - else: - try: - help = getattr(self, 'help_' + arg) - except AttributeError: - sys.stdout.write(self.doc_to_help(func)) - sys.stdout.flush() - else: - help() - else: - doc = self.doc_to_help(self.__class__) - if doc: - sys.stdout.write(doc) - sys.stdout.flush() - return None - - # - - def help_func(self): - help = """\ - Usage: scons-time func [OPTIONS] FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - --func=NAME, --function=NAME Report time for function NAME - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --title=TITLE Specify the output plot TITLE - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_func(self, argv): - """ - """ - format = 'ascii' - function_name = '_main' - tail = None - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'func=', - 'function=', - 'help', - 'prefix=', - 'tail=', - 'title=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('--func', '--function'): - function_name = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'func']) - sys.exit(0) - elif o in ('--max',): - max_time = int(a) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - - if self.config_file: - exec open(self.config_file, 'rU').read() in self.__dict__ - - if self.chdir: - os.chdir(self.chdir) - - if not args: - - pattern = '%s*.prof' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: func: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.prof files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help func" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - for file in args: - try: - f, line, func, time = \ - self.get_function_profile(file, function_name) - except ValueError, e: - sys.stderr.write("%s: func: %s: %s\n" % - (self.name, file, e)) - else: - if f.startswith(cwd_): - f = f[len(cwd_):] - print "%.3f %s:%d(%s)" % (time, f, line, func) - - elif format == 'gnuplot': - - results = self.collect_results(args, self.get_function_time, - function_name) - - self.gnuplot_results(results) - - else: - - sys.stderr.write('%s: func: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - - # - - def help_mem(self): - help = """\ - Usage: scons-time mem [OPTIONS] FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - --stage=STAGE Plot memory at the specified stage: - pre-read, post-read, pre-build, - post-build (default: post-build) - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --title=TITLE Specify the output plot TITLE - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_mem(self, argv): - - format = 'ascii' - logfile_path = lambda x: x - stage = self.default_stage - tail = None - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'help', - 'prefix=', - 'stage=', - 'tail=', - 'title=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'mem']) - sys.exit(0) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('--stage',): - if not a in self.stages: - sys.stderr.write('%s: mem: Unrecognized stage "%s".\n' % (self.name, a)) - sys.exit(1) - stage = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - - if self.config_file: - HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__) - - if self.chdir: - os.chdir(self.chdir) - logfile_path = lambda x: os.path.join(self.chdir, x) - - if not args: - - pattern = '%s*.log' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: mem: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help mem" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - self.ascii_table(args, tuple(self.stages), self.get_memory, logfile_path) - - elif format == 'gnuplot': - - results = self.collect_results(args, self.get_memory, - self.stage_strings[stage]) - - self.gnuplot_results(results) - - else: - - sys.stderr.write('%s: mem: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - - return 0 - - # - - def help_obj(self): - help = """\ - Usage: scons-time obj [OPTIONS] OBJECT FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - --stage=STAGE Plot memory at the specified stage: - pre-read, post-read, pre-build, - post-build (default: post-build) - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --title=TITLE Specify the output plot TITLE - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_obj(self, argv): - - format = 'ascii' - logfile_path = lambda x: x - stage = self.default_stage - tail = None - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'help', - 'prefix=', - 'stage=', - 'tail=', - 'title=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'obj']) - sys.exit(0) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('--stage',): - if not a in self.stages: - sys.stderr.write('%s: obj: Unrecognized stage "%s".\n' % (self.name, a)) - sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - stage = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - - if not args: - sys.stderr.write('%s: obj: Must specify an object name.\n' % self.name) - sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - object_name = args.pop(0) - - if self.config_file: - HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__) - - if self.chdir: - os.chdir(self.chdir) - logfile_path = lambda x: os.path.join(self.chdir, x) - - if not args: - - pattern = '%s*.log' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: obj: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - self.ascii_table(args, tuple(self.stages), self.get_object_counts, logfile_path, object_name) - - elif format == 'gnuplot': - - stage_index = 0 - for s in self.stages: - if stage == s: - break - stage_index = stage_index + 1 - - results = self.collect_results(args, self.get_object_counts, - object_name, stage_index) - - self.gnuplot_results(results) - - else: - - sys.stderr.write('%s: obj: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - - return 0 - - # - - def help_run(self): - help = """\ - Usage: scons-time run [OPTIONS] [FILE ...] - - --aegis=PROJECT Use SCons from the Aegis PROJECT - --chdir=DIR Name of unpacked directory for chdir - -f FILE, --file=FILE Read configuration from specified FILE - -h, --help Print this help and exit - -n, --no-exec No execute, just print command lines - --number=NUMBER Put output in files for run NUMBER - --outdir=OUTDIR Put output files in OUTDIR - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - --python=PYTHON Time using the specified PYTHON - -q, --quiet Don't print command lines - --scons=SCONS Time using the specified SCONS - --svn=URL, --subversion=URL Use SCons from Subversion URL - -v, --verbose Display output of commands - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_run(self, argv): - """ - """ - run_number_list = [None] - - short_opts = '?f:hnp:qs:v' - - long_opts = [ - 'aegis=', - 'file=', - 'help', - 'no-exec', - 'number=', - 'outdir=', - 'prefix=', - 'python=', - 'quiet', - 'scons=', - 'svn=', - 'subdir=', - 'subversion=', - 'verbose', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('--aegis',): - self.aegis_project = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'run']) - sys.exit(0) - elif o in ('-n', '--no-exec'): - self.execute = self._do_not_execute - elif o in ('--number',): - run_number_list = self.split_run_numbers(a) - elif o in ('--outdir',): - self.outdir = a - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('--python',): - self.python = a - elif o in ('-q', '--quiet'): - self.display = self._do_not_display - elif o in ('-s', '--subdir'): - self.subdir = a - elif o in ('--scons',): - self.scons = a - elif o in ('--svn', '--subversion'): - self.subversion_url = a - elif o in ('-v', '--verbose'): - self.redirect = tee_to_file - self.verbose = True - self.svn_co_flag = '' - - if not args and not self.config_file: - sys.stderr.write('%s: run: No arguments or -f config file specified.\n' % self.name) - sys.stderr.write('%s Type "%s help run" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - if self.config_file: - exec open(self.config_file, 'rU').read() in self.__dict__ - - if args: - self.archive_list = args - - archive_file_name = os.path.split(self.archive_list[0])[1] - - if not self.subdir: - self.subdir = self.archive_splitext(archive_file_name)[0] - - if not self.prefix: - self.prefix = self.archive_splitext(archive_file_name)[0] - - prepare = None - if self.subversion_url: - prepare = self.prep_subversion_run - elif self.aegis_project: - prepare = self.prep_aegis_run - - for run_number in run_number_list: - self.individual_run(run_number, self.archive_list, prepare) - - def split_run_numbers(self, s): - result = [] - for n in s.split(','): - try: - x, y = n.split('-') - except ValueError: - result.append(int(n)) - else: - result.extend(list(range(int(x), int(y)+1))) - return result - - def scons_path(self, dir): - return os.path.join(dir, 'src', 'script', 'scons.py') - - def scons_lib_dir_path(self, dir): - return os.path.join(dir, 'src', 'engine') - - def prep_aegis_run(self, commands, removals): - self.aegis_tmpdir = make_temp_file(prefix = self.name + '-aegis-') - removals.append((shutil.rmtree, 'rm -rf %%s', self.aegis_tmpdir)) - - self.aegis_parent_project = os.path.splitext(self.aegis_project)[0] - self.scons = self.scons_path(self.aegis_tmpdir) - self.scons_lib_dir = self.scons_lib_dir_path(self.aegis_tmpdir) - - commands.extend([ - 'mkdir %(aegis_tmpdir)s', - (lambda: os.chdir(self.aegis_tmpdir), 'cd %(aegis_tmpdir)s'), - '%(aegis)s -cp -ind -p %(aegis_parent_project)s .', - '%(aegis)s -cp -ind -p %(aegis_project)s -delta %(run_number)s .', - ]) - - def prep_subversion_run(self, commands, removals): - self.svn_tmpdir = make_temp_file(prefix = self.name + '-svn-') - removals.append((shutil.rmtree, 'rm -rf %%s', self.svn_tmpdir)) - - self.scons = self.scons_path(self.svn_tmpdir) - self.scons_lib_dir = self.scons_lib_dir_path(self.svn_tmpdir) - - commands.extend([ - 'mkdir %(svn_tmpdir)s', - '%(svn)s co %(svn_co_flag)s -r %(run_number)s %(subversion_url)s %(svn_tmpdir)s', - ]) - - def individual_run(self, run_number, archive_list, prepare=None): - """ - Performs an individual run of the default SCons invocations. - """ - - commands = [] - removals = [] - - if prepare: - prepare(commands, removals) - - save_scons = self.scons - save_scons_wrapper = self.scons_wrapper - save_scons_lib_dir = self.scons_lib_dir - - if self.outdir is None: - self.outdir = self.orig_cwd - elif not os.path.isabs(self.outdir): - self.outdir = os.path.join(self.orig_cwd, self.outdir) - - if self.scons is None: - self.scons = self.scons_path(self.orig_cwd) - - if self.scons_lib_dir is None: - self.scons_lib_dir = self.scons_lib_dir_path(self.orig_cwd) - - if self.scons_wrapper is None: - self.scons_wrapper = self.scons - - if not run_number: - run_number = self.find_next_run_number(self.outdir, self.prefix) - - self.run_number = str(run_number) - - self.prefix_run = self.prefix + '-%03d' % run_number - - if self.targets0 is None: - self.targets0 = self.startup_targets - if self.targets1 is None: - self.targets1 = self.targets - if self.targets2 is None: - self.targets2 = self.targets - - self.tmpdir = make_temp_file(prefix = self.name + '-') - - commands.extend([ - 'mkdir %(tmpdir)s', - - (os.chdir, 'cd %%s', self.tmpdir), - ]) - - for archive in archive_list: - if not os.path.isabs(archive): - archive = os.path.join(self.orig_cwd, archive) - if os.path.isdir(archive): - dest = os.path.split(archive)[1] - commands.append((shutil.copytree, 'cp -r %%s %%s', archive, dest)) - else: - suffix = self.archive_splitext(archive)[1] - unpack_command = self.unpack_map.get(suffix) - if not unpack_command: - dest = os.path.split(archive)[1] - commands.append((shutil.copyfile, 'cp %%s %%s', archive, dest)) - else: - commands.append(unpack_command + (archive,)) - - commands.extend([ - (os.chdir, 'cd %%s', self.subdir), - ]) - - commands.extend(self.initial_commands) - - commands.extend([ - (lambda: read_tree('.'), - 'find * -type f | xargs cat > /dev/null'), - - (self.set_env, 'export %%s=%%s', - 'SCONS_LIB_DIR', self.scons_lib_dir), - - '%(python)s %(scons_wrapper)s --version', - ]) - - index = 0 - for run_command in self.run_commands: - setattr(self, 'prof%d' % index, self.profile_name(index)) - c = ( - self.log_execute, - self.log_display, - run_command, - self.logfile_name(index), - ) - commands.append(c) - index = index + 1 - - commands.extend([ - (os.chdir, 'cd %%s', self.orig_cwd), - ]) - - if not os.environ.get('PRESERVE'): - commands.extend(removals) - - commands.append((shutil.rmtree, 'rm -rf %%s', self.tmpdir)) - - self.run_command_list(commands, self.__dict__) - - self.scons = save_scons - self.scons_lib_dir = save_scons_lib_dir - self.scons_wrapper = save_scons_wrapper - - # - - def help_time(self): - help = """\ - Usage: scons-time time [OPTIONS] FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --which=TIMER Plot timings for TIMER: total, - SConscripts, SCons, commands. - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_time(self, argv): - - format = 'ascii' - logfile_path = lambda x: x - tail = None - which = 'total' - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'help', - 'prefix=', - 'tail=', - 'title=', - 'which=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'time']) - sys.exit(0) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - elif o in ('--which',): - if not a in self.time_strings.keys(): - sys.stderr.write('%s: time: Unrecognized timer "%s".\n' % (self.name, a)) - sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - which = a - - if self.config_file: - HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__) - - if self.chdir: - os.chdir(self.chdir) - logfile_path = lambda x: os.path.join(self.chdir, x) - - if not args: - - pattern = '%s*.log' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: time: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - columns = ("Total", "SConscripts", "SCons", "commands") - self.ascii_table(args, columns, self.get_debug_times, logfile_path) - - elif format == 'gnuplot': - - results = self.collect_results(args, self.get_debug_times, - self.time_strings[which]) - - self.gnuplot_results(results, fmt='%s %.6f') - - else: - - sys.stderr.write('%s: time: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - -if __name__ == '__main__': - opts, args = getopt.getopt(sys.argv[1:], 'h?V', ['help', 'version']) - - ST = SConsTimer() - - for o, a in opts: - if o in ('-?', '-h', '--help'): - ST.do_help(['help']) - sys.exit(0) - elif o in ('-V', '--version'): - sys.stdout.write('scons-time version\n') - sys.exit(0) - - if not args: - sys.stderr.write('Type "%s help" for usage.\n' % ST.name) - sys.exit(1) - - ST.execute_subcommand(args) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/scons.py b/cpp/scons/scons.py deleted file mode 100755 index c95bfac27..000000000 --- a/cpp/scons/scons.py +++ /dev/null @@ -1,196 +0,0 @@ -#! /usr/bin/env python -# -# SCons - a Software Constructor -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/script/scons.py 5023 2010/06/14 22:05:46 scons" - -__version__ = "2.0.0.final.0" - -__build__ = "r5023" - -__buildsys__ = "scons-dev" - -__date__ = "2010/06/14 22:05:46" - -__developer__ = "scons" - -import os -import os.path -import sys - -############################################################################## -# BEGIN STANDARD SCons SCRIPT HEADER -# -# This is the cut-and-paste logic so that a self-contained script can -# interoperate correctly with different SCons versions and installation -# locations for the engine. If you modify anything in this section, you -# should also change other scripts that use this same header. -############################################################################## - -# Strip the script directory from sys.path() so on case-insensitive -# (WIN32) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own library directories -# (version-specific first, in case they installed by hand there, -# followed by generic) so we pick up the right version of the build -# engine modules if they're in either directory. - - -# Check to see if the python version is > 3.0 which is currently unsupported -# If so exit with error message -try: - if sys.version_info >= (3,0,0): - msg = "scons: *** SCons version %s does not run under Python version %s.\n" - sys.stderr.write(msg % (__version__, sys.version.split()[0])) - sys.exit(1) -except AttributeError: - # Pre-1.6 Python has no sys.version_info - # No need to check version as we then know the version is < 3.0.0 and supported - pass - -script_dir = sys.path[0] - -if script_dir in sys.path: - sys.path.remove(script_dir) - -libs = [] - -if "SCONS_LIB_DIR" in os.environ: - libs.append(os.environ["SCONS_LIB_DIR"]) - -local_version = 'scons-local-' + __version__ -local = 'scons-local' -if script_dir: - local_version = os.path.join(script_dir, local_version) - local = os.path.join(script_dir, local) -libs.append(os.path.abspath(local_version)) -libs.append(os.path.abspath(local)) - -scons_version = 'scons-%s' % __version__ - -prefs = [] - -if sys.platform == 'win32': - # sys.prefix is (likely) C:\Python*; - # check only C:\Python*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages')) -else: - # On other (POSIX) platforms, things are more complicated due to - # the variety of path names and library locations. Try to be smart - # about it. - if script_dir == 'bin': - # script_dir is `pwd`/bin; - # check `pwd`/lib/scons*. - prefs.append(os.getcwd()) - else: - if script_dir == '.' or script_dir == '': - script_dir = os.getcwd() - head, tail = os.path.split(script_dir) - if tail == "bin": - # script_dir is /foo/bin; - # check /foo/lib/scons*. - prefs.append(head) - - head, tail = os.path.split(sys.prefix) - if tail == "usr": - # sys.prefix is /foo/usr; - # check /foo/usr/lib/scons* first, - # then /foo/usr/local/lib/scons*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, "local")) - elif tail == "local": - h, t = os.path.split(head) - if t == "usr": - # sys.prefix is /foo/usr/local; - # check /foo/usr/local/lib/scons* first, - # then /foo/usr/lib/scons*. - prefs.append(sys.prefix) - prefs.append(head) - else: - # sys.prefix is /foo/local; - # check only /foo/local/lib/scons*. - prefs.append(sys.prefix) - else: - # sys.prefix is /foo (ends in neither /usr or /local); - # check only /foo/lib/scons*. - prefs.append(sys.prefix) - - temp = [os.path.join(x, 'lib') for x in prefs] - temp.extend([os.path.join(x, - 'lib', - 'python' + sys.version[:3], - 'site-packages') for x in prefs]) - prefs = temp - - # Add the parent directory of the current python's library to the - # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64, - # not /usr/lib. - try: - libpath = os.__file__ - except AttributeError: - pass - else: - # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*. - libpath, tail = os.path.split(libpath) - # Split /usr/libfoo/python* to /usr/libfoo - libpath, tail = os.path.split(libpath) - # Check /usr/libfoo/scons*. - prefs.append(libpath) - - try: - import pkg_resources - except ImportError: - pass - else: - # when running from an egg add the egg's directory - try: - d = pkg_resources.get_distribution('scons') - except pkg_resources.DistributionNotFound: - pass - else: - prefs.append(d.location) - -# Look first for 'scons-__version__' in all of our preference libs, -# then for 'scons'. -libs.extend([os.path.join(x, scons_version) for x in prefs]) -libs.extend([os.path.join(x, 'scons') for x in prefs]) - -sys.path = libs + sys.path - -############################################################################## -# END STANDARD SCons SCRIPT HEADER -############################################################################## - -if __name__ == "__main__": - import SCons.Script - # this does all the work, and calls sys.exit - # with the proper exit status when done. - SCons.Script.main() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/scons/sconsign.py b/cpp/scons/sconsign.py deleted file mode 100755 index c1f963260..000000000 --- a/cpp/scons/sconsign.py +++ /dev/null @@ -1,513 +0,0 @@ -#! /usr/bin/env python -# -# SCons - a Software Constructor -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/script/sconsign.py 5023 2010/06/14 22:05:46 scons" - -__version__ = "2.0.0.final.0" - -__build__ = "r5023" - -__buildsys__ = "scons-dev" - -__date__ = "2010/06/14 22:05:46" - -__developer__ = "scons" - -import os -import sys -import time - -############################################################################## -# BEGIN STANDARD SCons SCRIPT HEADER -# -# This is the cut-and-paste logic so that a self-contained script can -# interoperate correctly with different SCons versions and installation -# locations for the engine. If you modify anything in this section, you -# should also change other scripts that use this same header. -############################################################################## - -# Strip the script directory from sys.path() so on case-insensitive -# (WIN32) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own library directories -# (version-specific first, in case they installed by hand there, -# followed by generic) so we pick up the right version of the build -# engine modules if they're in either directory. - -script_dir = sys.path[0] - -if script_dir in sys.path: - sys.path.remove(script_dir) - -libs = [] - -if "SCONS_LIB_DIR" in os.environ: - libs.append(os.environ["SCONS_LIB_DIR"]) - -local_version = 'scons-local-' + __version__ -local = 'scons-local' -if script_dir: - local_version = os.path.join(script_dir, local_version) - local = os.path.join(script_dir, local) -libs.append(os.path.abspath(local_version)) -libs.append(os.path.abspath(local)) - -scons_version = 'scons-%s' % __version__ - -prefs = [] - -if sys.platform == 'win32': - # sys.prefix is (likely) C:\Python*; - # check only C:\Python*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages')) -else: - # On other (POSIX) platforms, things are more complicated due to - # the variety of path names and library locations. Try to be smart - # about it. - if script_dir == 'bin': - # script_dir is `pwd`/bin; - # check `pwd`/lib/scons*. - prefs.append(os.getcwd()) - else: - if script_dir == '.' or script_dir == '': - script_dir = os.getcwd() - head, tail = os.path.split(script_dir) - if tail == "bin": - # script_dir is /foo/bin; - # check /foo/lib/scons*. - prefs.append(head) - - head, tail = os.path.split(sys.prefix) - if tail == "usr": - # sys.prefix is /foo/usr; - # check /foo/usr/lib/scons* first, - # then /foo/usr/local/lib/scons*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, "local")) - elif tail == "local": - h, t = os.path.split(head) - if t == "usr": - # sys.prefix is /foo/usr/local; - # check /foo/usr/local/lib/scons* first, - # then /foo/usr/lib/scons*. - prefs.append(sys.prefix) - prefs.append(head) - else: - # sys.prefix is /foo/local; - # check only /foo/local/lib/scons*. - prefs.append(sys.prefix) - else: - # sys.prefix is /foo (ends in neither /usr or /local); - # check only /foo/lib/scons*. - prefs.append(sys.prefix) - - temp = [os.path.join(x, 'lib') for x in prefs] - temp.extend([os.path.join(x, - 'lib', - 'python' + sys.version[:3], - 'site-packages') for x in prefs]) - prefs = temp - - # Add the parent directory of the current python's library to the - # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64, - # not /usr/lib. - try: - libpath = os.__file__ - except AttributeError: - pass - else: - # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*. - libpath, tail = os.path.split(libpath) - # Split /usr/libfoo/python* to /usr/libfoo - libpath, tail = os.path.split(libpath) - # Check /usr/libfoo/scons*. - prefs.append(libpath) - - try: - import pkg_resources - except ImportError: - pass - else: - # when running from an egg add the egg's directory - try: - d = pkg_resources.get_distribution('scons') - except pkg_resources.DistributionNotFound: - pass - else: - prefs.append(d.location) - -# Look first for 'scons-__version__' in all of our preference libs, -# then for 'scons'. -libs.extend([os.path.join(x, scons_version) for x in prefs]) -libs.extend([os.path.join(x, 'scons') for x in prefs]) - -sys.path = libs + sys.path - -############################################################################## -# END STANDARD SCons SCRIPT HEADER -############################################################################## - -import SCons.compat # so pickle will import cPickle instead - -import whichdb -import pickle -import imp - -import SCons.SConsign - -def my_whichdb(filename): - if filename[-7:] == ".dblite": - return "SCons.dblite" - try: - f = open(filename + ".dblite", "rb") - f.close() - return "SCons.dblite" - except IOError: - pass - return _orig_whichdb(filename) - -_orig_whichdb = whichdb.whichdb -whichdb.whichdb = my_whichdb - -def my_import(mname): - if '.' in mname: - i = mname.rfind('.') - parent = my_import(mname[:i]) - fp, pathname, description = imp.find_module(mname[i+1:], - parent.__path__) - else: - fp, pathname, description = imp.find_module(mname) - return imp.load_module(mname, fp, pathname, description) - -class Flagger(object): - default_value = 1 - def __setitem__(self, item, value): - self.__dict__[item] = value - self.default_value = 0 - def __getitem__(self, item): - return self.__dict__.get(item, self.default_value) - -Do_Call = None -Print_Directories = [] -Print_Entries = [] -Print_Flags = Flagger() -Verbose = 0 -Readable = 0 - -def default_mapper(entry, name): - try: - val = eval("entry."+name) - except: - val = None - return str(val) - -def map_action(entry, name): - try: - bact = entry.bact - bactsig = entry.bactsig - except AttributeError: - return None - return '%s [%s]' % (bactsig, bact) - -def map_timestamp(entry, name): - try: - timestamp = entry.timestamp - except AttributeError: - timestamp = None - if Readable and timestamp: - return "'" + time.ctime(timestamp) + "'" - else: - return str(timestamp) - -def map_bkids(entry, name): - try: - bkids = entry.bsources + entry.bdepends + entry.bimplicit - bkidsigs = entry.bsourcesigs + entry.bdependsigs + entry.bimplicitsigs - except AttributeError: - return None - result = [] - for i in range(len(bkids)): - result.append(nodeinfo_string(bkids[i], bkidsigs[i], " ")) - if result == []: - return None - return "\n ".join(result) - -map_field = { - 'action' : map_action, - 'timestamp' : map_timestamp, - 'bkids' : map_bkids, -} - -map_name = { - 'implicit' : 'bkids', -} - -def field(name, entry, verbose=Verbose): - if not Print_Flags[name]: - return None - fieldname = map_name.get(name, name) - mapper = map_field.get(fieldname, default_mapper) - val = mapper(entry, name) - if verbose: - val = name + ": " + val - return val - -def nodeinfo_raw(name, ninfo, prefix=""): - # This just formats the dictionary, which we would normally use str() - # to do, except that we want the keys sorted for deterministic output. - d = ninfo.__dict__ - try: - keys = ninfo.field_list + ['_version_id'] - except AttributeError: - keys = sorted(d.keys()) - l = [] - for k in keys: - l.append('%s: %s' % (repr(k), repr(d.get(k)))) - if '\n' in name: - name = repr(name) - return name + ': {' + ', '.join(l) + '}' - -def nodeinfo_cooked(name, ninfo, prefix=""): - try: - field_list = ninfo.field_list - except AttributeError: - field_list = [] - if '\n' in name: - name = repr(name) - outlist = [name+':'] + [_f for _f in [field(x, ninfo, Verbose) for x in field_list] if _f] - if Verbose: - sep = '\n ' + prefix - else: - sep = ' ' - return sep.join(outlist) - -nodeinfo_string = nodeinfo_cooked - -def printfield(name, entry, prefix=""): - outlist = field("implicit", entry, 0) - if outlist: - if Verbose: - print " implicit:" - print " " + outlist - outact = field("action", entry, 0) - if outact: - if Verbose: - print " action: " + outact - else: - print " " + outact - -def printentries(entries, location): - if Print_Entries: - for name in Print_Entries: - try: - entry = entries[name] - except KeyError: - sys.stderr.write("sconsign: no entry `%s' in `%s'\n" % (name, location)) - else: - try: - ninfo = entry.ninfo - except AttributeError: - print name + ":" - else: - print nodeinfo_string(name, entry.ninfo) - printfield(name, entry.binfo) - else: - for name in sorted(entries.keys()): - entry = entries[name] - try: - ninfo = entry.ninfo - except AttributeError: - print name + ":" - else: - print nodeinfo_string(name, entry.ninfo) - printfield(name, entry.binfo) - -class Do_SConsignDB(object): - def __init__(self, dbm_name, dbm): - self.dbm_name = dbm_name - self.dbm = dbm - - def __call__(self, fname): - # The *dbm modules stick their own file suffixes on the names - # that are passed in. This is causes us to jump through some - # hoops here to be able to allow the user - try: - # Try opening the specified file name. Example: - # SPECIFIED OPENED BY self.dbm.open() - # --------- ------------------------- - # .sconsign => .sconsign.dblite - # .sconsign.dblite => .sconsign.dblite.dblite - db = self.dbm.open(fname, "r") - except (IOError, OSError), e: - print_e = e - try: - # That didn't work, so try opening the base name, - # so that if the actually passed in 'sconsign.dblite' - # (for example), the dbm module will put the suffix back - # on for us and open it anyway. - db = self.dbm.open(os.path.splitext(fname)[0], "r") - except (IOError, OSError): - # That didn't work either. See if the file name - # they specified just exists (independent of the dbm - # suffix-mangling). - try: - open(fname, "r") - except (IOError, OSError), e: - # Nope, that file doesn't even exist, so report that - # fact back. - print_e = e - sys.stderr.write("sconsign: %s\n" % (print_e)) - return - except KeyboardInterrupt: - raise - except pickle.UnpicklingError: - sys.stderr.write("sconsign: ignoring invalid `%s' file `%s'\n" % (self.dbm_name, fname)) - return - except Exception, e: - sys.stderr.write("sconsign: ignoring invalid `%s' file `%s': %s\n" % (self.dbm_name, fname, e)) - return - - if Print_Directories: - for dir in Print_Directories: - try: - val = db[dir] - except KeyError: - sys.stderr.write("sconsign: no dir `%s' in `%s'\n" % (dir, args[0])) - else: - self.printentries(dir, val) - else: - for dir in sorted(db.keys()): - self.printentries(dir, db[dir]) - - def printentries(self, dir, val): - print '=== ' + dir + ':' - printentries(pickle.loads(val), dir) - -def Do_SConsignDir(name): - try: - fp = open(name, 'rb') - except (IOError, OSError), e: - sys.stderr.write("sconsign: %s\n" % (e)) - return - try: - sconsign = SCons.SConsign.Dir(fp) - except KeyboardInterrupt: - raise - except pickle.UnpicklingError: - sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s'\n" % (name)) - return - except Exception, e: - sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s': %s\n" % (name, e)) - return - printentries(sconsign.entries, args[0]) - -############################################################################## - -import getopt - -helpstr = """\ -Usage: sconsign [OPTIONS] FILE [...] -Options: - -a, --act, --action Print build action information. - -c, --csig Print content signature information. - -d DIR, --dir=DIR Print only info about DIR. - -e ENTRY, --entry=ENTRY Print only info about ENTRY. - -f FORMAT, --format=FORMAT FILE is in the specified FORMAT. - -h, --help Print this message and exit. - -i, --implicit Print implicit dependency information. - -r, --readable Print timestamps in human-readable form. - --raw Print raw Python object representations. - -s, --size Print file sizes. - -t, --timestamp Print timestamp information. - -v, --verbose Verbose, describe each field. -""" - -opts, args = getopt.getopt(sys.argv[1:], "acd:e:f:hirstv", - ['act', 'action', - 'csig', 'dir=', 'entry=', - 'format=', 'help', 'implicit', - 'raw', 'readable', - 'size', 'timestamp', 'verbose']) - - -for o, a in opts: - if o in ('-a', '--act', '--action'): - Print_Flags['action'] = 1 - elif o in ('-c', '--csig'): - Print_Flags['csig'] = 1 - elif o in ('-d', '--dir'): - Print_Directories.append(a) - elif o in ('-e', '--entry'): - Print_Entries.append(a) - elif o in ('-f', '--format'): - Module_Map = {'dblite' : 'SCons.dblite', - 'sconsign' : None} - dbm_name = Module_Map.get(a, a) - if dbm_name: - try: - dbm = my_import(dbm_name) - except: - sys.stderr.write("sconsign: illegal file format `%s'\n" % a) - print helpstr - sys.exit(2) - Do_Call = Do_SConsignDB(a, dbm) - else: - Do_Call = Do_SConsignDir - elif o in ('-h', '--help'): - print helpstr - sys.exit(0) - elif o in ('-i', '--implicit'): - Print_Flags['implicit'] = 1 - elif o in ('--raw',): - nodeinfo_string = nodeinfo_raw - elif o in ('-r', '--readable'): - Readable = 1 - elif o in ('-s', '--size'): - Print_Flags['size'] = 1 - elif o in ('-t', '--timestamp'): - Print_Flags['timestamp'] = 1 - elif o in ('-v', '--verbose'): - Verbose = 1 - -if Do_Call: - for a in args: - Do_Call(a) -else: - for a in args: - dbm_name = whichdb.whichdb(a) - if dbm_name: - Map_Module = {'SCons.dblite' : 'dblite'} - dbm = my_import(dbm_name) - Do_SConsignDB(Map_Module.get(dbm_name, dbm_name), dbm)(a) - else: - Do_SConsignDir(a) - -sys.exit(0) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/cpp/zxing-cpp.xcodeproj/project.pbxproj b/cpp/zxing-cpp.xcodeproj/project.pbxproj deleted file mode 100644 index 04d867997..000000000 --- a/cpp/zxing-cpp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1250 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B5A492F17091807004E112F /* ChecksumException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5A492D17091807004E112F /* ChecksumException.cpp */; }; - 3B5A493017091807004E112F /* ChecksumException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5A492E17091807004E112F /* ChecksumException.h */; }; - 3B5A493517091826004E112F /* CodaBarReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5A493117091826004E112F /* CodaBarReader.cpp */; }; - 3B5A493617091826004E112F /* CodaBarReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5A493217091826004E112F /* CodaBarReader.h */; }; - 3B5A493717091826004E112F /* Code93Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B5A493317091826004E112F /* Code93Reader.cpp */; }; - 3B5A493817091826004E112F /* Code93Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B5A493417091826004E112F /* Code93Reader.h */; }; - 3B6AA6711710C83200DF84C0 /* InvertedLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B6AA6701710C83200DF84C0 /* InvertedLuminanceSource.cpp */; }; - 3B83E992158E66C600A3B31F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B83E991158E66C600A3B31F /* Foundation.framework */; }; - 3B83EA63158E679000A3B31F /* AztecDetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9A4158E679000A3B31F /* AztecDetectorResult.cpp */; }; - 3B83EA64158E679000A3B31F /* AztecDetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9A5158E679000A3B31F /* AztecDetectorResult.h */; }; - 3B83EA65158E679000A3B31F /* AztecReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9A6158E679000A3B31F /* AztecReader.cpp */; }; - 3B83EA66158E679000A3B31F /* AztecReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9A7158E679000A3B31F /* AztecReader.h */; }; - 3B83EA67158E679000A3B31F /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9A9158E679000A3B31F /* Decoder.cpp */; }; - 3B83EA68158E679000A3B31F /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9AA158E679000A3B31F /* Decoder.h */; }; - 3B83EA69158E679000A3B31F /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9AC158E679000A3B31F /* Detector.cpp */; }; - 3B83EA6A158E679000A3B31F /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9AD158E679000A3B31F /* Detector.h */; }; - 3B83EA6B158E679000A3B31F /* BarcodeFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9AE158E679000A3B31F /* BarcodeFormat.cpp */; }; - 3B83EA6C158E679000A3B31F /* BarcodeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9AF158E679000A3B31F /* BarcodeFormat.h */; }; - 3B83EA6D158E679000A3B31F /* Binarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9B0158E679000A3B31F /* Binarizer.cpp */; }; - 3B83EA6E158E679000A3B31F /* Binarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9B1158E679000A3B31F /* Binarizer.h */; }; - 3B83EA6F158E679000A3B31F /* BinaryBitmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9B2158E679000A3B31F /* BinaryBitmap.cpp */; }; - 3B83EA70158E679000A3B31F /* BinaryBitmap.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9B3158E679000A3B31F /* BinaryBitmap.h */; }; - 3B83EA72158E679000A3B31F /* Array.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9B6158E679000A3B31F /* Array.h */; }; - 3B83EA73158E679000A3B31F /* BitArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9B7158E679000A3B31F /* BitArray.cpp */; }; - 3B83EA74158E679000A3B31F /* BitArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9B8158E679000A3B31F /* BitArray.h */; }; - 3B83EA75158E679000A3B31F /* BitMatrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9B9158E679000A3B31F /* BitMatrix.cpp */; }; - 3B83EA76158E679000A3B31F /* BitMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9BA158E679000A3B31F /* BitMatrix.h */; }; - 3B83EA77158E679000A3B31F /* BitSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9BB158E679000A3B31F /* BitSource.cpp */; }; - 3B83EA78158E679000A3B31F /* BitSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9BC158E679000A3B31F /* BitSource.h */; }; - 3B83EA79158E679000A3B31F /* CharacterSetECI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9BD158E679000A3B31F /* CharacterSetECI.cpp */; }; - 3B83EA7A158E679000A3B31F /* CharacterSetECI.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9BE158E679000A3B31F /* CharacterSetECI.h */; }; - 3B83EA7C158E679000A3B31F /* Counted.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9C0158E679000A3B31F /* Counted.h */; }; - 3B83EA7D158E679000A3B31F /* DecoderResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9C1158E679000A3B31F /* DecoderResult.cpp */; }; - 3B83EA7E158E679000A3B31F /* DecoderResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9C2158E679000A3B31F /* DecoderResult.h */; }; - 3B83EA7F158E679000A3B31F /* MonochromeRectangleDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9C4158E679000A3B31F /* MonochromeRectangleDetector.cpp */; }; - 3B83EA80158E679000A3B31F /* MonochromeRectangleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9C5158E679000A3B31F /* MonochromeRectangleDetector.h */; }; - 3B83EA81158E679000A3B31F /* WhiteRectangleDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9C6158E679000A3B31F /* WhiteRectangleDetector.cpp */; }; - 3B83EA82158E679000A3B31F /* WhiteRectangleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9C7158E679000A3B31F /* WhiteRectangleDetector.h */; }; - 3B83EA83158E679000A3B31F /* DetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9C8158E679000A3B31F /* DetectorResult.cpp */; }; - 3B83EA84158E679000A3B31F /* DetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9C9158E679000A3B31F /* DetectorResult.h */; }; - 3B83EA87158E679000A3B31F /* GlobalHistogramBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9CC158E679000A3B31F /* GlobalHistogramBinarizer.cpp */; }; - 3B83EA88158E679000A3B31F /* GlobalHistogramBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9CD158E679000A3B31F /* GlobalHistogramBinarizer.h */; }; - 3B83EA89158E679000A3B31F /* GreyscaleLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9CE158E679000A3B31F /* GreyscaleLuminanceSource.cpp */; }; - 3B83EA8A158E679000A3B31F /* GreyscaleLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9CF158E679000A3B31F /* GreyscaleLuminanceSource.h */; }; - 3B83EA8B158E679000A3B31F /* GreyscaleRotatedLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9D0158E679000A3B31F /* GreyscaleRotatedLuminanceSource.cpp */; }; - 3B83EA8C158E679000A3B31F /* GreyscaleRotatedLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9D1158E679000A3B31F /* GreyscaleRotatedLuminanceSource.h */; }; - 3B83EA8D158E679000A3B31F /* GridSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9D2158E679000A3B31F /* GridSampler.cpp */; }; - 3B83EA8E158E679000A3B31F /* GridSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9D3158E679000A3B31F /* GridSampler.h */; }; - 3B83EA8F158E679000A3B31F /* HybridBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9D4158E679000A3B31F /* HybridBinarizer.cpp */; }; - 3B83EA90158E679000A3B31F /* HybridBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9D5158E679000A3B31F /* HybridBinarizer.h */; }; - 3B83EA91158E679000A3B31F /* IllegalArgumentException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9D6158E679000A3B31F /* IllegalArgumentException.cpp */; }; - 3B83EA92158E679000A3B31F /* IllegalArgumentException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9D7158E679000A3B31F /* IllegalArgumentException.h */; }; - 3B83EA93158E679000A3B31F /* PerspectiveTransform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9D8158E679000A3B31F /* PerspectiveTransform.cpp */; }; - 3B83EA94158E679000A3B31F /* PerspectiveTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9D9158E679000A3B31F /* PerspectiveTransform.h */; }; - 3B83EA95158E679000A3B31F /* Point.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9DA158E679000A3B31F /* Point.h */; }; - 3B83EA96158E679000A3B31F /* GenericGF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9DC158E679000A3B31F /* GenericGF.cpp */; }; - 3B83EA97158E679000A3B31F /* GenericGF.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9DD158E679000A3B31F /* GenericGF.h */; }; - 3B83EA98158E679000A3B31F /* GenericGFPoly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9DE158E679000A3B31F /* GenericGFPoly.cpp */; }; - 3B83EA99158E679000A3B31F /* GenericGFPoly.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9DF158E679000A3B31F /* GenericGFPoly.h */; }; - 3B83EA9A158E679000A3B31F /* ReedSolomonDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9E0158E679000A3B31F /* ReedSolomonDecoder.cpp */; }; - 3B83EA9B158E679000A3B31F /* ReedSolomonDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9E1158E679000A3B31F /* ReedSolomonDecoder.h */; }; - 3B83EA9C158E679000A3B31F /* ReedSolomonException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9E2158E679000A3B31F /* ReedSolomonException.cpp */; }; - 3B83EA9D158E679000A3B31F /* ReedSolomonException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9E3158E679000A3B31F /* ReedSolomonException.h */; }; - 3B83EA9E158E679000A3B31F /* Str.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9E4158E679000A3B31F /* Str.cpp */; }; - 3B83EA9F158E679000A3B31F /* Str.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9E5158E679000A3B31F /* Str.h */; }; - 3B83EAA0158E679000A3B31F /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9E6158E679000A3B31F /* StringUtils.cpp */; }; - 3B83EAA1158E679000A3B31F /* StringUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9E7158E679000A3B31F /* StringUtils.h */; }; - 3B83EAA2158E679000A3B31F /* DataMatrixReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9E9158E679000A3B31F /* DataMatrixReader.cpp */; }; - 3B83EAA3158E679000A3B31F /* DataMatrixReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9EA158E679000A3B31F /* DataMatrixReader.h */; }; - 3B83EAA4158E679000A3B31F /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9EC158E679000A3B31F /* BitMatrixParser.cpp */; }; - 3B83EAA5158E679000A3B31F /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9ED158E679000A3B31F /* BitMatrixParser.h */; }; - 3B83EAA6158E679000A3B31F /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9EE158E679000A3B31F /* DataBlock.cpp */; }; - 3B83EAA7158E679000A3B31F /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9EF158E679000A3B31F /* DataBlock.h */; }; - 3B83EAA8158E679000A3B31F /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9F0158E679000A3B31F /* DecodedBitStreamParser.cpp */; }; - 3B83EAA9158E679000A3B31F /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9F1158E679000A3B31F /* DecodedBitStreamParser.h */; }; - 3B83EAAA158E679000A3B31F /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9F2158E679000A3B31F /* Decoder.cpp */; }; - 3B83EAAB158E679000A3B31F /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9F3158E679000A3B31F /* Decoder.h */; }; - 3B83EAAC158E679000A3B31F /* CornerPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9F5158E679000A3B31F /* CornerPoint.cpp */; }; - 3B83EAAD158E679000A3B31F /* CornerPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9F6158E679000A3B31F /* CornerPoint.h */; }; - 3B83EAAE158E679000A3B31F /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9F7158E679000A3B31F /* Detector.cpp */; }; - 3B83EAAF158E679000A3B31F /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9F8158E679000A3B31F /* Detector.h */; }; - 3B83EAB0158E679000A3B31F /* DetectorException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9F9158E679000A3B31F /* DetectorException.cpp */; }; - 3B83EAB1158E679000A3B31F /* DetectorException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9FA158E679000A3B31F /* DetectorException.h */; }; - 3B83EAB4158E679000A3B31F /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9FD158E679000A3B31F /* Version.cpp */; }; - 3B83EAB5158E679000A3B31F /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83E9FE158E679000A3B31F /* Version.h */; }; - 3B83EAB6158E679000A3B31F /* DecodeHints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83E9FF158E679000A3B31F /* DecodeHints.cpp */; }; - 3B83EAB7158E679000A3B31F /* DecodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA00158E679000A3B31F /* DecodeHints.h */; }; - 3B83EAB8158E679000A3B31F /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA01158E679000A3B31F /* Exception.cpp */; }; - 3B83EAB9158E679000A3B31F /* Exception.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA02158E679000A3B31F /* Exception.h */; }; - 3B83EABA158E679000A3B31F /* FormatException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA03158E679000A3B31F /* FormatException.cpp */; }; - 3B83EABB158E679000A3B31F /* FormatException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA04158E679000A3B31F /* FormatException.h */; }; - 3B83EABC158E679000A3B31F /* LuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA05158E679000A3B31F /* LuminanceSource.cpp */; }; - 3B83EABD158E679000A3B31F /* LuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA06158E679000A3B31F /* LuminanceSource.h */; }; - 3B83EABE158E679000A3B31F /* ByQuadrantReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA08158E679000A3B31F /* ByQuadrantReader.cpp */; }; - 3B83EABF158E679000A3B31F /* ByQuadrantReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA09158E679000A3B31F /* ByQuadrantReader.h */; }; - 3B83EAC0158E679000A3B31F /* GenericMultipleBarcodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA0A158E679000A3B31F /* GenericMultipleBarcodeReader.cpp */; }; - 3B83EAC1158E679000A3B31F /* GenericMultipleBarcodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA0B158E679000A3B31F /* GenericMultipleBarcodeReader.h */; }; - 3B83EAC2158E679000A3B31F /* MultipleBarcodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA0C158E679000A3B31F /* MultipleBarcodeReader.cpp */; }; - 3B83EAC3158E679000A3B31F /* MultipleBarcodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA0D158E679000A3B31F /* MultipleBarcodeReader.h */; }; - 3B83EAC4158E679000A3B31F /* MultiDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA10158E679000A3B31F /* MultiDetector.cpp */; }; - 3B83EAC5158E679000A3B31F /* MultiDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA11158E679000A3B31F /* MultiDetector.h */; }; - 3B83EAC6158E679000A3B31F /* MultiFinderPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA12158E679000A3B31F /* MultiFinderPatternFinder.cpp */; }; - 3B83EAC7158E679000A3B31F /* MultiFinderPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA13158E679000A3B31F /* MultiFinderPatternFinder.h */; }; - 3B83EAC8158E679000A3B31F /* QRCodeMultiReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA14158E679000A3B31F /* QRCodeMultiReader.cpp */; }; - 3B83EAC9158E679000A3B31F /* QRCodeMultiReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA15158E679000A3B31F /* QRCodeMultiReader.h */; }; - 3B83EACA158E679000A3B31F /* MultiFormatReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA16158E679000A3B31F /* MultiFormatReader.cpp */; }; - 3B83EACB158E679000A3B31F /* MultiFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA17158E679000A3B31F /* MultiFormatReader.h */; }; - 3B83EACD158E679000A3B31F /* NotFoundException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA19158E679000A3B31F /* NotFoundException.h */; }; - 3B83EACE158E679000A3B31F /* Code128Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA1B158E679000A3B31F /* Code128Reader.cpp */; }; - 3B83EACF158E679000A3B31F /* Code128Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA1C158E679000A3B31F /* Code128Reader.h */; }; - 3B83EAD0158E679000A3B31F /* Code39Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA1D158E679000A3B31F /* Code39Reader.cpp */; }; - 3B83EAD1158E679000A3B31F /* Code39Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA1E158E679000A3B31F /* Code39Reader.h */; }; - 3B83EAD2158E679000A3B31F /* EAN13Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA1F158E679000A3B31F /* EAN13Reader.cpp */; }; - 3B83EAD3158E679000A3B31F /* EAN13Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA20158E679000A3B31F /* EAN13Reader.h */; }; - 3B83EAD4158E679000A3B31F /* EAN8Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA21158E679000A3B31F /* EAN8Reader.cpp */; }; - 3B83EAD5158E679000A3B31F /* EAN8Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA22158E679000A3B31F /* EAN8Reader.h */; }; - 3B83EAD6158E679000A3B31F /* ITFReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA23158E679000A3B31F /* ITFReader.cpp */; }; - 3B83EAD7158E679000A3B31F /* ITFReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA24158E679000A3B31F /* ITFReader.h */; }; - 3B83EAD8158E679000A3B31F /* MultiFormatOneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA25158E679000A3B31F /* MultiFormatOneDReader.cpp */; }; - 3B83EAD9158E679000A3B31F /* MultiFormatOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA26158E679000A3B31F /* MultiFormatOneDReader.h */; }; - 3B83EADA158E679000A3B31F /* MultiFormatUPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA27158E679000A3B31F /* MultiFormatUPCEANReader.cpp */; }; - 3B83EADB158E679000A3B31F /* MultiFormatUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA28158E679000A3B31F /* MultiFormatUPCEANReader.h */; }; - 3B83EADC158E679000A3B31F /* OneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA29158E679000A3B31F /* OneDReader.cpp */; }; - 3B83EADD158E679000A3B31F /* OneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA2A158E679000A3B31F /* OneDReader.h */; }; - 3B83EADE158E679000A3B31F /* OneDResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA2B158E679000A3B31F /* OneDResultPoint.cpp */; }; - 3B83EADF158E679000A3B31F /* OneDResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA2C158E679000A3B31F /* OneDResultPoint.h */; }; - 3B83EAE0158E679000A3B31F /* UPCAReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA2D158E679000A3B31F /* UPCAReader.cpp */; }; - 3B83EAE1158E679000A3B31F /* UPCAReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA2E158E679000A3B31F /* UPCAReader.h */; }; - 3B83EAE2158E679000A3B31F /* UPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA2F158E679000A3B31F /* UPCEANReader.cpp */; }; - 3B83EAE3158E679000A3B31F /* UPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA30158E679000A3B31F /* UPCEANReader.h */; }; - 3B83EAE4158E679000A3B31F /* UPCEReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA31158E679000A3B31F /* UPCEReader.cpp */; }; - 3B83EAE5158E679000A3B31F /* UPCEReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA32158E679000A3B31F /* UPCEReader.h */; }; - 3B83EAE6158E679000A3B31F /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA35158E679000A3B31F /* BitMatrixParser.cpp */; }; - 3B83EAE7158E679000A3B31F /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA36158E679000A3B31F /* BitMatrixParser.h */; }; - 3B83EAE8158E679000A3B31F /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA37158E679000A3B31F /* DataBlock.cpp */; }; - 3B83EAE9158E679000A3B31F /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA38158E679000A3B31F /* DataBlock.h */; }; - 3B83EAEA158E679000A3B31F /* DataMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA39158E679000A3B31F /* DataMask.cpp */; }; - 3B83EAEB158E679000A3B31F /* DataMask.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA3A158E679000A3B31F /* DataMask.h */; }; - 3B83EAEC158E679000A3B31F /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA3B158E679000A3B31F /* DecodedBitStreamParser.cpp */; }; - 3B83EAED158E679000A3B31F /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA3C158E679000A3B31F /* DecodedBitStreamParser.h */; }; - 3B83EAEE158E679000A3B31F /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA3D158E679000A3B31F /* Decoder.cpp */; }; - 3B83EAEF158E679000A3B31F /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA3E158E679000A3B31F /* Decoder.h */; }; - 3B83EAF0158E679000A3B31F /* Mode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA3F158E679000A3B31F /* Mode.cpp */; }; - 3B83EAF1158E679000A3B31F /* Mode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA40158E679000A3B31F /* Mode.h */; }; - 3B83EAF2158E679000A3B31F /* AlignmentPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA42158E679000A3B31F /* AlignmentPattern.cpp */; }; - 3B83EAF3158E679000A3B31F /* AlignmentPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA43158E679000A3B31F /* AlignmentPattern.h */; }; - 3B83EAF4158E679000A3B31F /* AlignmentPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA44158E679000A3B31F /* AlignmentPatternFinder.cpp */; }; - 3B83EAF5158E679000A3B31F /* AlignmentPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA45158E679000A3B31F /* AlignmentPatternFinder.h */; }; - 3B83EAF6158E679000A3B31F /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA46158E679000A3B31F /* Detector.cpp */; }; - 3B83EAF7158E679000A3B31F /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA47158E679000A3B31F /* Detector.h */; }; - 3B83EAF8158E679000A3B31F /* FinderPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA48158E679000A3B31F /* FinderPattern.cpp */; }; - 3B83EAF9158E679000A3B31F /* FinderPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA49158E679000A3B31F /* FinderPattern.h */; }; - 3B83EAFA158E679000A3B31F /* FinderPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA4A158E679000A3B31F /* FinderPatternFinder.cpp */; }; - 3B83EAFB158E679000A3B31F /* FinderPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA4C158E679000A3B31F /* FinderPatternFinder.h */; }; - 3B83EAFC158E679000A3B31F /* FinderPatternInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA4D158E679000A3B31F /* FinderPatternInfo.cpp */; }; - 3B83EAFD158E679000A3B31F /* FinderPatternInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA4E158E679000A3B31F /* FinderPatternInfo.h */; }; - 3B83EB00158E679000A3B31F /* ErrorCorrectionLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA51158E679000A3B31F /* ErrorCorrectionLevel.cpp */; }; - 3B83EB01158E679000A3B31F /* ErrorCorrectionLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA52158E679000A3B31F /* ErrorCorrectionLevel.h */; }; - 3B83EB02158E679000A3B31F /* FormatInformation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA53158E679000A3B31F /* FormatInformation.cpp */; }; - 3B83EB03158E679000A3B31F /* FormatInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA54158E679000A3B31F /* FormatInformation.h */; }; - 3B83EB04158E679000A3B31F /* QRCodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA55158E679000A3B31F /* QRCodeReader.cpp */; }; - 3B83EB05158E679000A3B31F /* QRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA56158E679000A3B31F /* QRCodeReader.h */; }; - 3B83EB06158E679000A3B31F /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA57158E679000A3B31F /* Version.cpp */; }; - 3B83EB07158E679000A3B31F /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA58158E679000A3B31F /* Version.h */; }; - 3B83EB08158E679000A3B31F /* Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA59158E679000A3B31F /* Reader.cpp */; }; - 3B83EB09158E679000A3B31F /* Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA5A158E679000A3B31F /* Reader.h */; }; - 3B83EB0B158E679000A3B31F /* ReaderException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA5C158E679000A3B31F /* ReaderException.h */; }; - 3B83EB0C158E679000A3B31F /* Result.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA5D158E679000A3B31F /* Result.cpp */; }; - 3B83EB0D158E679000A3B31F /* Result.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA5E158E679000A3B31F /* Result.h */; }; - 3B83EB0E158E679000A3B31F /* ResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA5F158E679000A3B31F /* ResultPoint.cpp */; }; - 3B83EB0F158E679000A3B31F /* ResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA60158E679000A3B31F /* ResultPoint.h */; }; - 3B83EB10158E679000A3B31F /* ResultPointCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EA61158E679000A3B31F /* ResultPointCallback.cpp */; }; - 3B83EB11158E679000A3B31F /* ResultPointCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EA62158E679000A3B31F /* ResultPointCallback.h */; }; - 3BAC3A0D172430F000473974 /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39F9172430F000473974 /* BitMatrixParser.cpp */; }; - 3BAC3A0E172430F000473974 /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39FA172430F000473974 /* BitMatrixParser.h */; }; - 3BAC3A0F172430F000473974 /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39FB172430F000473974 /* DecodedBitStreamParser.cpp */; }; - 3BAC3A10172430F000473974 /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39FC172430F000473974 /* DecodedBitStreamParser.h */; }; - 3BAC3A11172430F000473974 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39FD172430F000473974 /* Decoder.cpp */; }; - 3BAC3A12172430F000473974 /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39FE172430F000473974 /* Decoder.h */; }; - 3BAC3A13172430F000473974 /* ErrorCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A00172430F000473974 /* ErrorCorrection.cpp */; }; - 3BAC3A14172430F000473974 /* ErrorCorrection.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A01172430F000473974 /* ErrorCorrection.h */; }; - 3BAC3A15172430F000473974 /* ModulusGF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A02172430F000473974 /* ModulusGF.cpp */; }; - 3BAC3A16172430F000473974 /* ModulusGF.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A03172430F000473974 /* ModulusGF.h */; }; - 3BAC3A17172430F000473974 /* ModulusPoly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A04172430F000473974 /* ModulusPoly.cpp */; }; - 3BAC3A18172430F000473974 /* ModulusPoly.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A05172430F000473974 /* ModulusPoly.h */; }; - 3BAC3A19172430F000473974 /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A07172430F000473974 /* Detector.cpp */; }; - 3BAC3A1A172430F000473974 /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A08172430F000473974 /* Detector.h */; }; - 3BAC3A1B172430F000473974 /* LinesSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A09172430F000473974 /* LinesSampler.cpp */; }; - 3BAC3A1C172430F000473974 /* LinesSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A0A172430F000473974 /* LinesSampler.h */; }; - 3BAC3A1D172430F000473974 /* PDF417Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A0B172430F000473974 /* PDF417Reader.cpp */; }; - 3BAC3A1E172430F000473974 /* PDF417Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A0C172430F000473974 /* PDF417Reader.h */; }; - 3BAC3A301724313500473974 /* BigInteger.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A211724313500473974 /* BigInteger.cc */; }; - 3BAC3A311724313500473974 /* BigInteger.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A221724313500473974 /* BigInteger.hh */; }; - 3BAC3A321724313500473974 /* BigIntegerAlgorithms.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A231724313500473974 /* BigIntegerAlgorithms.cc */; }; - 3BAC3A331724313500473974 /* BigIntegerAlgorithms.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A241724313500473974 /* BigIntegerAlgorithms.hh */; }; - 3BAC3A341724313500473974 /* BigIntegerLibrary.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A251724313500473974 /* BigIntegerLibrary.hh */; }; - 3BAC3A351724313500473974 /* BigIntegerUtils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A261724313500473974 /* BigIntegerUtils.cc */; }; - 3BAC3A361724313500473974 /* BigIntegerUtils.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A271724313500473974 /* BigIntegerUtils.hh */; }; - 3BAC3A371724313500473974 /* BigUnsigned.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A281724313500473974 /* BigUnsigned.cc */; }; - 3BAC3A381724313500473974 /* BigUnsigned.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A291724313500473974 /* BigUnsigned.hh */; }; - 3BAC3A391724313500473974 /* BigUnsignedInABase.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC3A2A1724313500473974 /* BigUnsignedInABase.cc */; }; - 3BAC3A3A1724313500473974 /* BigUnsignedInABase.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A2B1724313500473974 /* BigUnsignedInABase.hh */; }; - 3BAC3A3C1724313500473974 /* NumberlikeArray.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC3A2E1724313500473974 /* NumberlikeArray.hh */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 3B5A492D17091807004E112F /* ChecksumException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChecksumException.cpp; sourceTree = ""; }; - 3B5A492E17091807004E112F /* ChecksumException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChecksumException.h; sourceTree = ""; }; - 3B5A493117091826004E112F /* CodaBarReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodaBarReader.cpp; sourceTree = ""; }; - 3B5A493217091826004E112F /* CodaBarReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodaBarReader.h; sourceTree = ""; }; - 3B5A493317091826004E112F /* Code93Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code93Reader.cpp; sourceTree = ""; }; - 3B5A493417091826004E112F /* Code93Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code93Reader.h; sourceTree = ""; }; - 3B6AA6701710C83200DF84C0 /* InvertedLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InvertedLuminanceSource.cpp; sourceTree = ""; }; - 3B83E98E158E66C600A3B31F /* libzxing-cpp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libzxing-cpp.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B83E991158E66C600A3B31F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 3B83E9A4158E679000A3B31F /* AztecDetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AztecDetectorResult.cpp; sourceTree = ""; }; - 3B83E9A5158E679000A3B31F /* AztecDetectorResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AztecDetectorResult.h; sourceTree = ""; }; - 3B83E9A6158E679000A3B31F /* AztecReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AztecReader.cpp; sourceTree = ""; }; - 3B83E9A7158E679000A3B31F /* AztecReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AztecReader.h; sourceTree = ""; }; - 3B83E9A9158E679000A3B31F /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3B83E9AA158E679000A3B31F /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3B83E9AC158E679000A3B31F /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3B83E9AD158E679000A3B31F /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3B83E9AE158E679000A3B31F /* BarcodeFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BarcodeFormat.cpp; sourceTree = ""; }; - 3B83E9AF158E679000A3B31F /* BarcodeFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BarcodeFormat.h; sourceTree = ""; }; - 3B83E9B0158E679000A3B31F /* Binarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Binarizer.cpp; sourceTree = ""; }; - 3B83E9B1158E679000A3B31F /* Binarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Binarizer.h; sourceTree = ""; }; - 3B83E9B2158E679000A3B31F /* BinaryBitmap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BinaryBitmap.cpp; sourceTree = ""; }; - 3B83E9B3158E679000A3B31F /* BinaryBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BinaryBitmap.h; sourceTree = ""; }; - 3B83E9B6158E679000A3B31F /* Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Array.h; sourceTree = ""; }; - 3B83E9B7158E679000A3B31F /* BitArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitArray.cpp; sourceTree = ""; }; - 3B83E9B8158E679000A3B31F /* BitArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitArray.h; sourceTree = ""; }; - 3B83E9B9158E679000A3B31F /* BitMatrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrix.cpp; sourceTree = ""; }; - 3B83E9BA158E679000A3B31F /* BitMatrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrix.h; sourceTree = ""; }; - 3B83E9BB158E679000A3B31F /* BitSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitSource.cpp; sourceTree = ""; }; - 3B83E9BC158E679000A3B31F /* BitSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitSource.h; sourceTree = ""; }; - 3B83E9BD158E679000A3B31F /* CharacterSetECI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CharacterSetECI.cpp; sourceTree = ""; }; - 3B83E9BE158E679000A3B31F /* CharacterSetECI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharacterSetECI.h; sourceTree = ""; }; - 3B83E9C0158E679000A3B31F /* Counted.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Counted.h; sourceTree = ""; }; - 3B83E9C1158E679000A3B31F /* DecoderResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecoderResult.cpp; sourceTree = ""; }; - 3B83E9C2158E679000A3B31F /* DecoderResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecoderResult.h; sourceTree = ""; }; - 3B83E9C4158E679000A3B31F /* MonochromeRectangleDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MonochromeRectangleDetector.cpp; sourceTree = ""; }; - 3B83E9C5158E679000A3B31F /* MonochromeRectangleDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MonochromeRectangleDetector.h; sourceTree = ""; }; - 3B83E9C6158E679000A3B31F /* WhiteRectangleDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WhiteRectangleDetector.cpp; sourceTree = ""; }; - 3B83E9C7158E679000A3B31F /* WhiteRectangleDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WhiteRectangleDetector.h; sourceTree = ""; }; - 3B83E9C8158E679000A3B31F /* DetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DetectorResult.cpp; sourceTree = ""; }; - 3B83E9C9158E679000A3B31F /* DetectorResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetectorResult.h; sourceTree = ""; }; - 3B83E9CC158E679000A3B31F /* GlobalHistogramBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GlobalHistogramBinarizer.cpp; sourceTree = ""; }; - 3B83E9CD158E679000A3B31F /* GlobalHistogramBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlobalHistogramBinarizer.h; sourceTree = ""; }; - 3B83E9CE158E679000A3B31F /* GreyscaleLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleLuminanceSource.cpp; sourceTree = ""; }; - 3B83E9CF158E679000A3B31F /* GreyscaleLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleLuminanceSource.h; sourceTree = ""; }; - 3B83E9D0158E679000A3B31F /* GreyscaleRotatedLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleRotatedLuminanceSource.cpp; sourceTree = ""; }; - 3B83E9D1158E679000A3B31F /* GreyscaleRotatedLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleRotatedLuminanceSource.h; sourceTree = ""; }; - 3B83E9D2158E679000A3B31F /* GridSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridSampler.cpp; sourceTree = ""; }; - 3B83E9D3158E679000A3B31F /* GridSampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridSampler.h; sourceTree = ""; }; - 3B83E9D4158E679000A3B31F /* HybridBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridBinarizer.cpp; sourceTree = ""; }; - 3B83E9D5158E679000A3B31F /* HybridBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HybridBinarizer.h; sourceTree = ""; }; - 3B83E9D6158E679000A3B31F /* IllegalArgumentException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IllegalArgumentException.cpp; sourceTree = ""; }; - 3B83E9D7158E679000A3B31F /* IllegalArgumentException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IllegalArgumentException.h; sourceTree = ""; }; - 3B83E9D8158E679000A3B31F /* PerspectiveTransform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerspectiveTransform.cpp; sourceTree = ""; }; - 3B83E9D9158E679000A3B31F /* PerspectiveTransform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerspectiveTransform.h; sourceTree = ""; }; - 3B83E9DA158E679000A3B31F /* Point.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Point.h; sourceTree = ""; }; - 3B83E9DC158E679000A3B31F /* GenericGF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericGF.cpp; sourceTree = ""; }; - 3B83E9DD158E679000A3B31F /* GenericGF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericGF.h; sourceTree = ""; }; - 3B83E9DE158E679000A3B31F /* GenericGFPoly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericGFPoly.cpp; sourceTree = ""; }; - 3B83E9DF158E679000A3B31F /* GenericGFPoly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericGFPoly.h; sourceTree = ""; }; - 3B83E9E0158E679000A3B31F /* ReedSolomonDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonDecoder.cpp; sourceTree = ""; }; - 3B83E9E1158E679000A3B31F /* ReedSolomonDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonDecoder.h; sourceTree = ""; }; - 3B83E9E2158E679000A3B31F /* ReedSolomonException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonException.cpp; sourceTree = ""; }; - 3B83E9E3158E679000A3B31F /* ReedSolomonException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonException.h; sourceTree = ""; }; - 3B83E9E4158E679000A3B31F /* Str.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Str.cpp; sourceTree = ""; }; - 3B83E9E5158E679000A3B31F /* Str.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Str.h; sourceTree = ""; }; - 3B83E9E6158E679000A3B31F /* StringUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringUtils.cpp; sourceTree = ""; }; - 3B83E9E7158E679000A3B31F /* StringUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringUtils.h; sourceTree = ""; }; - 3B83E9E9158E679000A3B31F /* DataMatrixReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMatrixReader.cpp; sourceTree = ""; }; - 3B83E9EA158E679000A3B31F /* DataMatrixReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMatrixReader.h; sourceTree = ""; }; - 3B83E9EC158E679000A3B31F /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - 3B83E9ED158E679000A3B31F /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - 3B83E9EE158E679000A3B31F /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; }; - 3B83E9EF158E679000A3B31F /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; }; - 3B83E9F0158E679000A3B31F /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - 3B83E9F1158E679000A3B31F /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - 3B83E9F2158E679000A3B31F /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3B83E9F3158E679000A3B31F /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3B83E9F5158E679000A3B31F /* CornerPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CornerPoint.cpp; sourceTree = ""; }; - 3B83E9F6158E679000A3B31F /* CornerPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CornerPoint.h; sourceTree = ""; }; - 3B83E9F7158E679000A3B31F /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3B83E9F8158E679000A3B31F /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3B83E9F9158E679000A3B31F /* DetectorException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DetectorException.cpp; sourceTree = ""; }; - 3B83E9FA158E679000A3B31F /* DetectorException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetectorException.h; sourceTree = ""; }; - 3B83E9FD158E679000A3B31F /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; }; - 3B83E9FE158E679000A3B31F /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; - 3B83E9FF158E679000A3B31F /* DecodeHints.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodeHints.cpp; sourceTree = ""; }; - 3B83EA00158E679000A3B31F /* DecodeHints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodeHints.h; sourceTree = ""; }; - 3B83EA01158E679000A3B31F /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Exception.cpp; sourceTree = ""; }; - 3B83EA02158E679000A3B31F /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = ""; }; - 3B83EA03158E679000A3B31F /* FormatException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatException.cpp; sourceTree = ""; }; - 3B83EA04158E679000A3B31F /* FormatException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatException.h; sourceTree = ""; }; - 3B83EA05158E679000A3B31F /* LuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LuminanceSource.cpp; sourceTree = ""; }; - 3B83EA06158E679000A3B31F /* LuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LuminanceSource.h; sourceTree = ""; }; - 3B83EA08158E679000A3B31F /* ByQuadrantReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ByQuadrantReader.cpp; sourceTree = ""; }; - 3B83EA09158E679000A3B31F /* ByQuadrantReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ByQuadrantReader.h; sourceTree = ""; }; - 3B83EA0A158E679000A3B31F /* GenericMultipleBarcodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericMultipleBarcodeReader.cpp; sourceTree = ""; }; - 3B83EA0B158E679000A3B31F /* GenericMultipleBarcodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericMultipleBarcodeReader.h; sourceTree = ""; }; - 3B83EA0C158E679000A3B31F /* MultipleBarcodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultipleBarcodeReader.cpp; sourceTree = ""; }; - 3B83EA0D158E679000A3B31F /* MultipleBarcodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultipleBarcodeReader.h; sourceTree = ""; }; - 3B83EA10158E679000A3B31F /* MultiDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiDetector.cpp; sourceTree = ""; }; - 3B83EA11158E679000A3B31F /* MultiDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiDetector.h; sourceTree = ""; }; - 3B83EA12158E679000A3B31F /* MultiFinderPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFinderPatternFinder.cpp; sourceTree = ""; }; - 3B83EA13158E679000A3B31F /* MultiFinderPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFinderPatternFinder.h; sourceTree = ""; }; - 3B83EA14158E679000A3B31F /* QRCodeMultiReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QRCodeMultiReader.cpp; sourceTree = ""; }; - 3B83EA15158E679000A3B31F /* QRCodeMultiReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QRCodeMultiReader.h; sourceTree = ""; }; - 3B83EA16158E679000A3B31F /* MultiFormatReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatReader.cpp; sourceTree = ""; }; - 3B83EA17158E679000A3B31F /* MultiFormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatReader.h; sourceTree = ""; }; - 3B83EA19158E679000A3B31F /* NotFoundException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotFoundException.h; sourceTree = ""; }; - 3B83EA1B158E679000A3B31F /* Code128Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code128Reader.cpp; sourceTree = ""; }; - 3B83EA1C158E679000A3B31F /* Code128Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code128Reader.h; sourceTree = ""; }; - 3B83EA1D158E679000A3B31F /* Code39Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code39Reader.cpp; sourceTree = ""; }; - 3B83EA1E158E679000A3B31F /* Code39Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code39Reader.h; sourceTree = ""; }; - 3B83EA1F158E679000A3B31F /* EAN13Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN13Reader.cpp; sourceTree = ""; }; - 3B83EA20158E679000A3B31F /* EAN13Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN13Reader.h; sourceTree = ""; }; - 3B83EA21158E679000A3B31F /* EAN8Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN8Reader.cpp; sourceTree = ""; }; - 3B83EA22158E679000A3B31F /* EAN8Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN8Reader.h; sourceTree = ""; }; - 3B83EA23158E679000A3B31F /* ITFReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ITFReader.cpp; sourceTree = ""; }; - 3B83EA24158E679000A3B31F /* ITFReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITFReader.h; sourceTree = ""; }; - 3B83EA25158E679000A3B31F /* MultiFormatOneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatOneDReader.cpp; sourceTree = ""; }; - 3B83EA26158E679000A3B31F /* MultiFormatOneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatOneDReader.h; sourceTree = ""; }; - 3B83EA27158E679000A3B31F /* MultiFormatUPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatUPCEANReader.cpp; sourceTree = ""; }; - 3B83EA28158E679000A3B31F /* MultiFormatUPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatUPCEANReader.h; sourceTree = ""; }; - 3B83EA29158E679000A3B31F /* OneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDReader.cpp; sourceTree = ""; }; - 3B83EA2A158E679000A3B31F /* OneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDReader.h; sourceTree = ""; }; - 3B83EA2B158E679000A3B31F /* OneDResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDResultPoint.cpp; sourceTree = ""; }; - 3B83EA2C158E679000A3B31F /* OneDResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDResultPoint.h; sourceTree = ""; }; - 3B83EA2D158E679000A3B31F /* UPCAReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCAReader.cpp; sourceTree = ""; }; - 3B83EA2E158E679000A3B31F /* UPCAReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCAReader.h; sourceTree = ""; }; - 3B83EA2F158E679000A3B31F /* UPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEANReader.cpp; sourceTree = ""; }; - 3B83EA30158E679000A3B31F /* UPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEANReader.h; sourceTree = ""; }; - 3B83EA31158E679000A3B31F /* UPCEReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEReader.cpp; sourceTree = ""; }; - 3B83EA32158E679000A3B31F /* UPCEReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEReader.h; sourceTree = ""; }; - 3B83EA35158E679000A3B31F /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - 3B83EA36158E679000A3B31F /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - 3B83EA37158E679000A3B31F /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; }; - 3B83EA38158E679000A3B31F /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; }; - 3B83EA39158E679000A3B31F /* DataMask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMask.cpp; sourceTree = ""; }; - 3B83EA3A158E679000A3B31F /* DataMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMask.h; sourceTree = ""; }; - 3B83EA3B158E679000A3B31F /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - 3B83EA3C158E679000A3B31F /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - 3B83EA3D158E679000A3B31F /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3B83EA3E158E679000A3B31F /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3B83EA3F158E679000A3B31F /* Mode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode.cpp; sourceTree = ""; }; - 3B83EA40158E679000A3B31F /* Mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mode.h; sourceTree = ""; }; - 3B83EA42158E679000A3B31F /* AlignmentPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPattern.cpp; sourceTree = ""; }; - 3B83EA43158E679000A3B31F /* AlignmentPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPattern.h; sourceTree = ""; }; - 3B83EA44158E679000A3B31F /* AlignmentPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPatternFinder.cpp; sourceTree = ""; }; - 3B83EA45158E679000A3B31F /* AlignmentPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPatternFinder.h; sourceTree = ""; }; - 3B83EA46158E679000A3B31F /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3B83EA47158E679000A3B31F /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3B83EA48158E679000A3B31F /* FinderPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPattern.cpp; sourceTree = ""; }; - 3B83EA49158E679000A3B31F /* FinderPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPattern.h; sourceTree = ""; }; - 3B83EA4A158E679000A3B31F /* FinderPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternFinder.cpp; sourceTree = ""; }; - 3B83EA4B158E679000A3B31F /* FinderPatternFinder.cpp.smp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = FinderPatternFinder.cpp.smp; sourceTree = ""; }; - 3B83EA4C158E679000A3B31F /* FinderPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternFinder.h; sourceTree = ""; }; - 3B83EA4D158E679000A3B31F /* FinderPatternInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternInfo.cpp; sourceTree = ""; }; - 3B83EA4E158E679000A3B31F /* FinderPatternInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternInfo.h; sourceTree = ""; }; - 3B83EA51158E679000A3B31F /* ErrorCorrectionLevel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorCorrectionLevel.cpp; sourceTree = ""; }; - 3B83EA52158E679000A3B31F /* ErrorCorrectionLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorCorrectionLevel.h; sourceTree = ""; }; - 3B83EA53158E679000A3B31F /* FormatInformation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatInformation.cpp; sourceTree = ""; }; - 3B83EA54158E679000A3B31F /* FormatInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatInformation.h; sourceTree = ""; }; - 3B83EA55158E679000A3B31F /* QRCodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QRCodeReader.cpp; sourceTree = ""; }; - 3B83EA56158E679000A3B31F /* QRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QRCodeReader.h; sourceTree = ""; }; - 3B83EA57158E679000A3B31F /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; }; - 3B83EA58158E679000A3B31F /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; - 3B83EA59158E679000A3B31F /* Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reader.cpp; sourceTree = ""; }; - 3B83EA5A158E679000A3B31F /* Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reader.h; sourceTree = ""; }; - 3B83EA5C158E679000A3B31F /* ReaderException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderException.h; sourceTree = ""; }; - 3B83EA5D158E679000A3B31F /* Result.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Result.cpp; sourceTree = ""; }; - 3B83EA5E158E679000A3B31F /* Result.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Result.h; sourceTree = ""; }; - 3B83EA5F158E679000A3B31F /* ResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPoint.cpp; sourceTree = ""; }; - 3B83EA60158E679000A3B31F /* ResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPoint.h; sourceTree = ""; }; - 3B83EA61158E679000A3B31F /* ResultPointCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPointCallback.cpp; sourceTree = ""; }; - 3B83EA62158E679000A3B31F /* ResultPointCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPointCallback.h; sourceTree = ""; }; - 3BAC39F9172430F000473974 /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - 3BAC39FA172430F000473974 /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - 3BAC39FB172430F000473974 /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - 3BAC39FC172430F000473974 /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - 3BAC39FD172430F000473974 /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3BAC39FE172430F000473974 /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3BAC3A00172430F000473974 /* ErrorCorrection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorCorrection.cpp; sourceTree = ""; }; - 3BAC3A01172430F000473974 /* ErrorCorrection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorCorrection.h; sourceTree = ""; }; - 3BAC3A02172430F000473974 /* ModulusGF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModulusGF.cpp; sourceTree = ""; }; - 3BAC3A03172430F000473974 /* ModulusGF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModulusGF.h; sourceTree = ""; }; - 3BAC3A04172430F000473974 /* ModulusPoly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModulusPoly.cpp; sourceTree = ""; }; - 3BAC3A05172430F000473974 /* ModulusPoly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModulusPoly.h; sourceTree = ""; }; - 3BAC3A07172430F000473974 /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3BAC3A08172430F000473974 /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3BAC3A09172430F000473974 /* LinesSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LinesSampler.cpp; sourceTree = ""; }; - 3BAC3A0A172430F000473974 /* LinesSampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinesSampler.h; sourceTree = ""; }; - 3BAC3A0B172430F000473974 /* PDF417Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PDF417Reader.cpp; sourceTree = ""; }; - 3BAC3A0C172430F000473974 /* PDF417Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PDF417Reader.h; sourceTree = ""; }; - 3BAC3A211724313500473974 /* BigInteger.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigInteger.cc; sourceTree = ""; }; - 3BAC3A221724313500473974 /* BigInteger.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigInteger.hh; sourceTree = ""; }; - 3BAC3A231724313500473974 /* BigIntegerAlgorithms.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigIntegerAlgorithms.cc; sourceTree = ""; }; - 3BAC3A241724313500473974 /* BigIntegerAlgorithms.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigIntegerAlgorithms.hh; sourceTree = ""; }; - 3BAC3A251724313500473974 /* BigIntegerLibrary.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigIntegerLibrary.hh; sourceTree = ""; }; - 3BAC3A261724313500473974 /* BigIntegerUtils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigIntegerUtils.cc; sourceTree = ""; }; - 3BAC3A271724313500473974 /* BigIntegerUtils.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigIntegerUtils.hh; sourceTree = ""; }; - 3BAC3A281724313500473974 /* BigUnsigned.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigUnsigned.cc; sourceTree = ""; }; - 3BAC3A291724313500473974 /* BigUnsigned.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigUnsigned.hh; sourceTree = ""; }; - 3BAC3A2A1724313500473974 /* BigUnsignedInABase.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigUnsignedInABase.cc; sourceTree = ""; }; - 3BAC3A2B1724313500473974 /* BigUnsignedInABase.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigUnsignedInABase.hh; sourceTree = ""; }; - 3BAC3A2E1724313500473974 /* NumberlikeArray.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = NumberlikeArray.hh; sourceTree = ""; }; - 3BC3D6A6158E8F790037CE30 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; - 3BC3D6A9158E8F790037CE30 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - 3BC3D6AB158E8F790037CE30 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3B83E98B158E66C600A3B31F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B83E992158E66C600A3B31F /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3B83E983158E66C600A3B31F = { - isa = PBXGroup; - children = ( - 3BAC3A1F1724313500473974 /* bigint */, - 3B83E9A2158E679000A3B31F /* zxing */, - 3B83E990158E66C600A3B31F /* Frameworks */, - 3B83E98F158E66C600A3B31F /* Products */, - ); - sourceTree = ""; - }; - 3B83E98F158E66C600A3B31F /* Products */ = { - isa = PBXGroup; - children = ( - 3B83E98E158E66C600A3B31F /* libzxing-cpp.a */, - ); - name = Products; - sourceTree = ""; - }; - 3B83E990158E66C600A3B31F /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3B83E991158E66C600A3B31F /* Foundation.framework */, - 3BC3D6A6158E8F790037CE30 /* Cocoa.framework */, - 3BC3D6A8158E8F790037CE30 /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3B83E9A2158E679000A3B31F /* zxing */ = { - isa = PBXGroup; - children = ( - 3BAC39F7172430F000473974 /* pdf417 */, - 3B6AA6701710C83200DF84C0 /* InvertedLuminanceSource.cpp */, - 3B5A492D17091807004E112F /* ChecksumException.cpp */, - 3B5A492E17091807004E112F /* ChecksumException.h */, - 3B83E9A3158E679000A3B31F /* aztec */, - 3B83E9AE158E679000A3B31F /* BarcodeFormat.cpp */, - 3B83E9AF158E679000A3B31F /* BarcodeFormat.h */, - 3B83E9B0158E679000A3B31F /* Binarizer.cpp */, - 3B83E9B1158E679000A3B31F /* Binarizer.h */, - 3B83E9B2158E679000A3B31F /* BinaryBitmap.cpp */, - 3B83E9B3158E679000A3B31F /* BinaryBitmap.h */, - 3B83E9B4158E679000A3B31F /* common */, - 3B83E9E8158E679000A3B31F /* datamatrix */, - 3B83E9FF158E679000A3B31F /* DecodeHints.cpp */, - 3B83EA00158E679000A3B31F /* DecodeHints.h */, - 3B83EA01158E679000A3B31F /* Exception.cpp */, - 3B83EA02158E679000A3B31F /* Exception.h */, - 3B83EA03158E679000A3B31F /* FormatException.cpp */, - 3B83EA04158E679000A3B31F /* FormatException.h */, - 3B83EA05158E679000A3B31F /* LuminanceSource.cpp */, - 3B83EA06158E679000A3B31F /* LuminanceSource.h */, - 3B83EA07158E679000A3B31F /* multi */, - 3B83EA16158E679000A3B31F /* MultiFormatReader.cpp */, - 3B83EA17158E679000A3B31F /* MultiFormatReader.h */, - 3B83EA19158E679000A3B31F /* NotFoundException.h */, - 3B83EA1A158E679000A3B31F /* oned */, - 3B83EA33158E679000A3B31F /* qrcode */, - 3B83EA59158E679000A3B31F /* Reader.cpp */, - 3B83EA5A158E679000A3B31F /* Reader.h */, - 3B83EA5C158E679000A3B31F /* ReaderException.h */, - 3B83EA5D158E679000A3B31F /* Result.cpp */, - 3B83EA5E158E679000A3B31F /* Result.h */, - 3B83EA5F158E679000A3B31F /* ResultPoint.cpp */, - 3B83EA60158E679000A3B31F /* ResultPoint.h */, - 3B83EA61158E679000A3B31F /* ResultPointCallback.cpp */, - 3B83EA62158E679000A3B31F /* ResultPointCallback.h */, - ); - name = zxing; - path = core/src/zxing; - sourceTree = ""; - }; - 3B83E9A3158E679000A3B31F /* aztec */ = { - isa = PBXGroup; - children = ( - 3B83E9A4158E679000A3B31F /* AztecDetectorResult.cpp */, - 3B83E9A5158E679000A3B31F /* AztecDetectorResult.h */, - 3B83E9A6158E679000A3B31F /* AztecReader.cpp */, - 3B83E9A7158E679000A3B31F /* AztecReader.h */, - 3B83E9A8158E679000A3B31F /* decoder */, - 3B83E9AB158E679000A3B31F /* detector */, - ); - path = aztec; - sourceTree = ""; - }; - 3B83E9A8158E679000A3B31F /* decoder */ = { - isa = PBXGroup; - children = ( - 3B83E9A9158E679000A3B31F /* Decoder.cpp */, - 3B83E9AA158E679000A3B31F /* Decoder.h */, - ); - path = decoder; - sourceTree = ""; - }; - 3B83E9AB158E679000A3B31F /* detector */ = { - isa = PBXGroup; - children = ( - 3B83E9AC158E679000A3B31F /* Detector.cpp */, - 3B83E9AD158E679000A3B31F /* Detector.h */, - ); - path = detector; - sourceTree = ""; - }; - 3B83E9B4158E679000A3B31F /* common */ = { - isa = PBXGroup; - children = ( - 3B83E9B6158E679000A3B31F /* Array.h */, - 3B83E9B7158E679000A3B31F /* BitArray.cpp */, - 3B83E9B8158E679000A3B31F /* BitArray.h */, - 3B83E9B9158E679000A3B31F /* BitMatrix.cpp */, - 3B83E9BA158E679000A3B31F /* BitMatrix.h */, - 3B83E9BB158E679000A3B31F /* BitSource.cpp */, - 3B83E9BC158E679000A3B31F /* BitSource.h */, - 3B83E9BD158E679000A3B31F /* CharacterSetECI.cpp */, - 3B83E9BE158E679000A3B31F /* CharacterSetECI.h */, - 3B83E9C0158E679000A3B31F /* Counted.h */, - 3B83E9C1158E679000A3B31F /* DecoderResult.cpp */, - 3B83E9C2158E679000A3B31F /* DecoderResult.h */, - 3B83E9C3158E679000A3B31F /* detector */, - 3B83E9C8158E679000A3B31F /* DetectorResult.cpp */, - 3B83E9C9158E679000A3B31F /* DetectorResult.h */, - 3B83E9CC158E679000A3B31F /* GlobalHistogramBinarizer.cpp */, - 3B83E9CD158E679000A3B31F /* GlobalHistogramBinarizer.h */, - 3B83E9CE158E679000A3B31F /* GreyscaleLuminanceSource.cpp */, - 3B83E9CF158E679000A3B31F /* GreyscaleLuminanceSource.h */, - 3B83E9D0158E679000A3B31F /* GreyscaleRotatedLuminanceSource.cpp */, - 3B83E9D1158E679000A3B31F /* GreyscaleRotatedLuminanceSource.h */, - 3B83E9D2158E679000A3B31F /* GridSampler.cpp */, - 3B83E9D3158E679000A3B31F /* GridSampler.h */, - 3B83E9D4158E679000A3B31F /* HybridBinarizer.cpp */, - 3B83E9D5158E679000A3B31F /* HybridBinarizer.h */, - 3B83E9D6158E679000A3B31F /* IllegalArgumentException.cpp */, - 3B83E9D7158E679000A3B31F /* IllegalArgumentException.h */, - 3B83E9D8158E679000A3B31F /* PerspectiveTransform.cpp */, - 3B83E9D9158E679000A3B31F /* PerspectiveTransform.h */, - 3B83E9DA158E679000A3B31F /* Point.h */, - 3B83E9DB158E679000A3B31F /* reedsolomon */, - 3B83E9E4158E679000A3B31F /* Str.cpp */, - 3B83E9E5158E679000A3B31F /* Str.h */, - 3B83E9E6158E679000A3B31F /* StringUtils.cpp */, - 3B83E9E7158E679000A3B31F /* StringUtils.h */, - ); - path = common; - sourceTree = ""; - }; - 3B83E9C3158E679000A3B31F /* detector */ = { - isa = PBXGroup; - children = ( - 3B83E9C4158E679000A3B31F /* MonochromeRectangleDetector.cpp */, - 3B83E9C5158E679000A3B31F /* MonochromeRectangleDetector.h */, - 3B83E9C6158E679000A3B31F /* WhiteRectangleDetector.cpp */, - 3B83E9C7158E679000A3B31F /* WhiteRectangleDetector.h */, - ); - path = detector; - sourceTree = ""; - }; - 3B83E9DB158E679000A3B31F /* reedsolomon */ = { - isa = PBXGroup; - children = ( - 3B83E9DC158E679000A3B31F /* GenericGF.cpp */, - 3B83E9DD158E679000A3B31F /* GenericGF.h */, - 3B83E9DE158E679000A3B31F /* GenericGFPoly.cpp */, - 3B83E9DF158E679000A3B31F /* GenericGFPoly.h */, - 3B83E9E0158E679000A3B31F /* ReedSolomonDecoder.cpp */, - 3B83E9E1158E679000A3B31F /* ReedSolomonDecoder.h */, - 3B83E9E2158E679000A3B31F /* ReedSolomonException.cpp */, - 3B83E9E3158E679000A3B31F /* ReedSolomonException.h */, - ); - path = reedsolomon; - sourceTree = ""; - }; - 3B83E9E8158E679000A3B31F /* datamatrix */ = { - isa = PBXGroup; - children = ( - 3B83E9E9158E679000A3B31F /* DataMatrixReader.cpp */, - 3B83E9EA158E679000A3B31F /* DataMatrixReader.h */, - 3B83E9EB158E679000A3B31F /* decoder */, - 3B83E9F4158E679000A3B31F /* detector */, - 3B83E9FD158E679000A3B31F /* Version.cpp */, - 3B83E9FE158E679000A3B31F /* Version.h */, - ); - path = datamatrix; - sourceTree = ""; - }; - 3B83E9EB158E679000A3B31F /* decoder */ = { - isa = PBXGroup; - children = ( - 3B83E9EC158E679000A3B31F /* BitMatrixParser.cpp */, - 3B83E9ED158E679000A3B31F /* BitMatrixParser.h */, - 3B83E9EE158E679000A3B31F /* DataBlock.cpp */, - 3B83E9EF158E679000A3B31F /* DataBlock.h */, - 3B83E9F0158E679000A3B31F /* DecodedBitStreamParser.cpp */, - 3B83E9F1158E679000A3B31F /* DecodedBitStreamParser.h */, - 3B83E9F2158E679000A3B31F /* Decoder.cpp */, - 3B83E9F3158E679000A3B31F /* Decoder.h */, - ); - path = decoder; - sourceTree = ""; - }; - 3B83E9F4158E679000A3B31F /* detector */ = { - isa = PBXGroup; - children = ( - 3B83E9F5158E679000A3B31F /* CornerPoint.cpp */, - 3B83E9F6158E679000A3B31F /* CornerPoint.h */, - 3B83E9F7158E679000A3B31F /* Detector.cpp */, - 3B83E9F8158E679000A3B31F /* Detector.h */, - 3B83E9F9158E679000A3B31F /* DetectorException.cpp */, - 3B83E9FA158E679000A3B31F /* DetectorException.h */, - ); - path = detector; - sourceTree = ""; - }; - 3B83EA07158E679000A3B31F /* multi */ = { - isa = PBXGroup; - children = ( - 3B83EA08158E679000A3B31F /* ByQuadrantReader.cpp */, - 3B83EA09158E679000A3B31F /* ByQuadrantReader.h */, - 3B83EA0A158E679000A3B31F /* GenericMultipleBarcodeReader.cpp */, - 3B83EA0B158E679000A3B31F /* GenericMultipleBarcodeReader.h */, - 3B83EA0C158E679000A3B31F /* MultipleBarcodeReader.cpp */, - 3B83EA0D158E679000A3B31F /* MultipleBarcodeReader.h */, - 3B83EA0E158E679000A3B31F /* qrcode */, - ); - path = multi; - sourceTree = ""; - }; - 3B83EA0E158E679000A3B31F /* qrcode */ = { - isa = PBXGroup; - children = ( - 3B83EA0F158E679000A3B31F /* detector */, - 3B83EA14158E679000A3B31F /* QRCodeMultiReader.cpp */, - 3B83EA15158E679000A3B31F /* QRCodeMultiReader.h */, - ); - path = qrcode; - sourceTree = ""; - }; - 3B83EA0F158E679000A3B31F /* detector */ = { - isa = PBXGroup; - children = ( - 3B83EA10158E679000A3B31F /* MultiDetector.cpp */, - 3B83EA11158E679000A3B31F /* MultiDetector.h */, - 3B83EA12158E679000A3B31F /* MultiFinderPatternFinder.cpp */, - 3B83EA13158E679000A3B31F /* MultiFinderPatternFinder.h */, - ); - path = detector; - sourceTree = ""; - }; - 3B83EA1A158E679000A3B31F /* oned */ = { - isa = PBXGroup; - children = ( - 3B5A493117091826004E112F /* CodaBarReader.cpp */, - 3B5A493217091826004E112F /* CodaBarReader.h */, - 3B5A493317091826004E112F /* Code93Reader.cpp */, - 3B5A493417091826004E112F /* Code93Reader.h */, - 3B83EA1B158E679000A3B31F /* Code128Reader.cpp */, - 3B83EA1C158E679000A3B31F /* Code128Reader.h */, - 3B83EA1D158E679000A3B31F /* Code39Reader.cpp */, - 3B83EA1E158E679000A3B31F /* Code39Reader.h */, - 3B83EA1F158E679000A3B31F /* EAN13Reader.cpp */, - 3B83EA20158E679000A3B31F /* EAN13Reader.h */, - 3B83EA21158E679000A3B31F /* EAN8Reader.cpp */, - 3B83EA22158E679000A3B31F /* EAN8Reader.h */, - 3B83EA23158E679000A3B31F /* ITFReader.cpp */, - 3B83EA24158E679000A3B31F /* ITFReader.h */, - 3B83EA25158E679000A3B31F /* MultiFormatOneDReader.cpp */, - 3B83EA26158E679000A3B31F /* MultiFormatOneDReader.h */, - 3B83EA27158E679000A3B31F /* MultiFormatUPCEANReader.cpp */, - 3B83EA28158E679000A3B31F /* MultiFormatUPCEANReader.h */, - 3B83EA29158E679000A3B31F /* OneDReader.cpp */, - 3B83EA2A158E679000A3B31F /* OneDReader.h */, - 3B83EA2B158E679000A3B31F /* OneDResultPoint.cpp */, - 3B83EA2C158E679000A3B31F /* OneDResultPoint.h */, - 3B83EA2D158E679000A3B31F /* UPCAReader.cpp */, - 3B83EA2E158E679000A3B31F /* UPCAReader.h */, - 3B83EA2F158E679000A3B31F /* UPCEANReader.cpp */, - 3B83EA30158E679000A3B31F /* UPCEANReader.h */, - 3B83EA31158E679000A3B31F /* UPCEReader.cpp */, - 3B83EA32158E679000A3B31F /* UPCEReader.h */, - ); - path = oned; - sourceTree = ""; - }; - 3B83EA33158E679000A3B31F /* qrcode */ = { - isa = PBXGroup; - children = ( - 3B83EA34158E679000A3B31F /* decoder */, - 3B83EA41158E679000A3B31F /* detector */, - 3B83EA51158E679000A3B31F /* ErrorCorrectionLevel.cpp */, - 3B83EA52158E679000A3B31F /* ErrorCorrectionLevel.h */, - 3B83EA53158E679000A3B31F /* FormatInformation.cpp */, - 3B83EA54158E679000A3B31F /* FormatInformation.h */, - 3B83EA55158E679000A3B31F /* QRCodeReader.cpp */, - 3B83EA56158E679000A3B31F /* QRCodeReader.h */, - 3B83EA57158E679000A3B31F /* Version.cpp */, - 3B83EA58158E679000A3B31F /* Version.h */, - ); - path = qrcode; - sourceTree = ""; - }; - 3B83EA34158E679000A3B31F /* decoder */ = { - isa = PBXGroup; - children = ( - 3B83EA35158E679000A3B31F /* BitMatrixParser.cpp */, - 3B83EA36158E679000A3B31F /* BitMatrixParser.h */, - 3B83EA37158E679000A3B31F /* DataBlock.cpp */, - 3B83EA38158E679000A3B31F /* DataBlock.h */, - 3B83EA39158E679000A3B31F /* DataMask.cpp */, - 3B83EA3A158E679000A3B31F /* DataMask.h */, - 3B83EA3B158E679000A3B31F /* DecodedBitStreamParser.cpp */, - 3B83EA3C158E679000A3B31F /* DecodedBitStreamParser.h */, - 3B83EA3D158E679000A3B31F /* Decoder.cpp */, - 3B83EA3E158E679000A3B31F /* Decoder.h */, - 3B83EA3F158E679000A3B31F /* Mode.cpp */, - 3B83EA40158E679000A3B31F /* Mode.h */, - ); - path = decoder; - sourceTree = ""; - }; - 3B83EA41158E679000A3B31F /* detector */ = { - isa = PBXGroup; - children = ( - 3B83EA42158E679000A3B31F /* AlignmentPattern.cpp */, - 3B83EA43158E679000A3B31F /* AlignmentPattern.h */, - 3B83EA44158E679000A3B31F /* AlignmentPatternFinder.cpp */, - 3B83EA45158E679000A3B31F /* AlignmentPatternFinder.h */, - 3B83EA46158E679000A3B31F /* Detector.cpp */, - 3B83EA47158E679000A3B31F /* Detector.h */, - 3B83EA48158E679000A3B31F /* FinderPattern.cpp */, - 3B83EA49158E679000A3B31F /* FinderPattern.h */, - 3B83EA4A158E679000A3B31F /* FinderPatternFinder.cpp */, - 3B83EA4B158E679000A3B31F /* FinderPatternFinder.cpp.smp */, - 3B83EA4C158E679000A3B31F /* FinderPatternFinder.h */, - 3B83EA4D158E679000A3B31F /* FinderPatternInfo.cpp */, - 3B83EA4E158E679000A3B31F /* FinderPatternInfo.h */, - ); - path = detector; - sourceTree = ""; - }; - 3BAC39F7172430F000473974 /* pdf417 */ = { - isa = PBXGroup; - children = ( - 3BAC39F8172430F000473974 /* decoder */, - 3BAC3A06172430F000473974 /* detector */, - 3BAC3A0B172430F000473974 /* PDF417Reader.cpp */, - 3BAC3A0C172430F000473974 /* PDF417Reader.h */, - ); - path = pdf417; - sourceTree = ""; - }; - 3BAC39F8172430F000473974 /* decoder */ = { - isa = PBXGroup; - children = ( - 3BAC39F9172430F000473974 /* BitMatrixParser.cpp */, - 3BAC39FA172430F000473974 /* BitMatrixParser.h */, - 3BAC39FB172430F000473974 /* DecodedBitStreamParser.cpp */, - 3BAC39FC172430F000473974 /* DecodedBitStreamParser.h */, - 3BAC39FD172430F000473974 /* Decoder.cpp */, - 3BAC39FE172430F000473974 /* Decoder.h */, - 3BAC39FF172430F000473974 /* ec */, - ); - path = decoder; - sourceTree = ""; - }; - 3BAC39FF172430F000473974 /* ec */ = { - isa = PBXGroup; - children = ( - 3BAC3A00172430F000473974 /* ErrorCorrection.cpp */, - 3BAC3A01172430F000473974 /* ErrorCorrection.h */, - 3BAC3A02172430F000473974 /* ModulusGF.cpp */, - 3BAC3A03172430F000473974 /* ModulusGF.h */, - 3BAC3A04172430F000473974 /* ModulusPoly.cpp */, - 3BAC3A05172430F000473974 /* ModulusPoly.h */, - ); - path = ec; - sourceTree = ""; - }; - 3BAC3A06172430F000473974 /* detector */ = { - isa = PBXGroup; - children = ( - 3BAC3A07172430F000473974 /* Detector.cpp */, - 3BAC3A08172430F000473974 /* Detector.h */, - 3BAC3A09172430F000473974 /* LinesSampler.cpp */, - 3BAC3A0A172430F000473974 /* LinesSampler.h */, - ); - path = detector; - sourceTree = ""; - }; - 3BAC3A1F1724313500473974 /* bigint */ = { - isa = PBXGroup; - children = ( - 3BAC3A211724313500473974 /* BigInteger.cc */, - 3BAC3A221724313500473974 /* BigInteger.hh */, - 3BAC3A231724313500473974 /* BigIntegerAlgorithms.cc */, - 3BAC3A241724313500473974 /* BigIntegerAlgorithms.hh */, - 3BAC3A251724313500473974 /* BigIntegerLibrary.hh */, - 3BAC3A261724313500473974 /* BigIntegerUtils.cc */, - 3BAC3A271724313500473974 /* BigIntegerUtils.hh */, - 3BAC3A281724313500473974 /* BigUnsigned.cc */, - 3BAC3A291724313500473974 /* BigUnsigned.hh */, - 3BAC3A2A1724313500473974 /* BigUnsignedInABase.cc */, - 3BAC3A2B1724313500473974 /* BigUnsignedInABase.hh */, - 3BAC3A2E1724313500473974 /* NumberlikeArray.hh */, - ); - name = bigint; - path = core/src/bigint; - sourceTree = ""; - }; - 3BC3D6A8158E8F790037CE30 /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 3BC3D6A9158E8F790037CE30 /* AppKit.framework */, - 3BC3D6AB158E8F790037CE30 /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 3B83E98C158E66C600A3B31F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B83EA64158E679000A3B31F /* AztecDetectorResult.h in Headers */, - 3B83EA66158E679000A3B31F /* AztecReader.h in Headers */, - 3B83EA68158E679000A3B31F /* Decoder.h in Headers */, - 3B83EA6A158E679000A3B31F /* Detector.h in Headers */, - 3B83EA6C158E679000A3B31F /* BarcodeFormat.h in Headers */, - 3B83EA6E158E679000A3B31F /* Binarizer.h in Headers */, - 3B83EA70158E679000A3B31F /* BinaryBitmap.h in Headers */, - 3B83EA72158E679000A3B31F /* Array.h in Headers */, - 3B83EA74158E679000A3B31F /* BitArray.h in Headers */, - 3B83EA76158E679000A3B31F /* BitMatrix.h in Headers */, - 3B83EA78158E679000A3B31F /* BitSource.h in Headers */, - 3B83EA7A158E679000A3B31F /* CharacterSetECI.h in Headers */, - 3B83EA7C158E679000A3B31F /* Counted.h in Headers */, - 3B83EA7E158E679000A3B31F /* DecoderResult.h in Headers */, - 3B83EA80158E679000A3B31F /* MonochromeRectangleDetector.h in Headers */, - 3B83EA82158E679000A3B31F /* WhiteRectangleDetector.h in Headers */, - 3B83EA84158E679000A3B31F /* DetectorResult.h in Headers */, - 3B83EA88158E679000A3B31F /* GlobalHistogramBinarizer.h in Headers */, - 3B83EA8A158E679000A3B31F /* GreyscaleLuminanceSource.h in Headers */, - 3B83EA8C158E679000A3B31F /* GreyscaleRotatedLuminanceSource.h in Headers */, - 3B83EA8E158E679000A3B31F /* GridSampler.h in Headers */, - 3B83EA90158E679000A3B31F /* HybridBinarizer.h in Headers */, - 3B83EA92158E679000A3B31F /* IllegalArgumentException.h in Headers */, - 3B83EA94158E679000A3B31F /* PerspectiveTransform.h in Headers */, - 3B83EA95158E679000A3B31F /* Point.h in Headers */, - 3B83EA97158E679000A3B31F /* GenericGF.h in Headers */, - 3B83EA99158E679000A3B31F /* GenericGFPoly.h in Headers */, - 3B83EA9B158E679000A3B31F /* ReedSolomonDecoder.h in Headers */, - 3B83EA9D158E679000A3B31F /* ReedSolomonException.h in Headers */, - 3B83EA9F158E679000A3B31F /* Str.h in Headers */, - 3B83EAA1158E679000A3B31F /* StringUtils.h in Headers */, - 3B83EAA3158E679000A3B31F /* DataMatrixReader.h in Headers */, - 3B83EAA5158E679000A3B31F /* BitMatrixParser.h in Headers */, - 3B83EAA7158E679000A3B31F /* DataBlock.h in Headers */, - 3B83EAA9158E679000A3B31F /* DecodedBitStreamParser.h in Headers */, - 3B83EAAB158E679000A3B31F /* Decoder.h in Headers */, - 3B83EAAD158E679000A3B31F /* CornerPoint.h in Headers */, - 3B83EAAF158E679000A3B31F /* Detector.h in Headers */, - 3B83EAB1158E679000A3B31F /* DetectorException.h in Headers */, - 3B83EAB5158E679000A3B31F /* Version.h in Headers */, - 3B83EAB7158E679000A3B31F /* DecodeHints.h in Headers */, - 3B83EAB9158E679000A3B31F /* Exception.h in Headers */, - 3B83EABB158E679000A3B31F /* FormatException.h in Headers */, - 3B83EABD158E679000A3B31F /* LuminanceSource.h in Headers */, - 3B83EABF158E679000A3B31F /* ByQuadrantReader.h in Headers */, - 3B83EAC1158E679000A3B31F /* GenericMultipleBarcodeReader.h in Headers */, - 3B83EAC3158E679000A3B31F /* MultipleBarcodeReader.h in Headers */, - 3B83EAC5158E679000A3B31F /* MultiDetector.h in Headers */, - 3B83EAC7158E679000A3B31F /* MultiFinderPatternFinder.h in Headers */, - 3B83EAC9158E679000A3B31F /* QRCodeMultiReader.h in Headers */, - 3B83EACB158E679000A3B31F /* MultiFormatReader.h in Headers */, - 3B83EACD158E679000A3B31F /* NotFoundException.h in Headers */, - 3B83EACF158E679000A3B31F /* Code128Reader.h in Headers */, - 3B83EAD1158E679000A3B31F /* Code39Reader.h in Headers */, - 3B83EAD3158E679000A3B31F /* EAN13Reader.h in Headers */, - 3B83EAD5158E679000A3B31F /* EAN8Reader.h in Headers */, - 3B83EAD7158E679000A3B31F /* ITFReader.h in Headers */, - 3B83EAD9158E679000A3B31F /* MultiFormatOneDReader.h in Headers */, - 3B83EADB158E679000A3B31F /* MultiFormatUPCEANReader.h in Headers */, - 3B83EADD158E679000A3B31F /* OneDReader.h in Headers */, - 3B83EADF158E679000A3B31F /* OneDResultPoint.h in Headers */, - 3B83EAE1158E679000A3B31F /* UPCAReader.h in Headers */, - 3B83EAE3158E679000A3B31F /* UPCEANReader.h in Headers */, - 3B83EAE5158E679000A3B31F /* UPCEReader.h in Headers */, - 3B83EAE7158E679000A3B31F /* BitMatrixParser.h in Headers */, - 3B83EAE9158E679000A3B31F /* DataBlock.h in Headers */, - 3B83EAEB158E679000A3B31F /* DataMask.h in Headers */, - 3B83EAED158E679000A3B31F /* DecodedBitStreamParser.h in Headers */, - 3B83EAEF158E679000A3B31F /* Decoder.h in Headers */, - 3B83EAF1158E679000A3B31F /* Mode.h in Headers */, - 3B83EAF3158E679000A3B31F /* AlignmentPattern.h in Headers */, - 3B83EAF5158E679000A3B31F /* AlignmentPatternFinder.h in Headers */, - 3B83EAF7158E679000A3B31F /* Detector.h in Headers */, - 3B83EAF9158E679000A3B31F /* FinderPattern.h in Headers */, - 3B83EAFB158E679000A3B31F /* FinderPatternFinder.h in Headers */, - 3B83EAFD158E679000A3B31F /* FinderPatternInfo.h in Headers */, - 3B83EB01158E679000A3B31F /* ErrorCorrectionLevel.h in Headers */, - 3B83EB03158E679000A3B31F /* FormatInformation.h in Headers */, - 3B83EB05158E679000A3B31F /* QRCodeReader.h in Headers */, - 3B83EB07158E679000A3B31F /* Version.h in Headers */, - 3B83EB09158E679000A3B31F /* Reader.h in Headers */, - 3B83EB0B158E679000A3B31F /* ReaderException.h in Headers */, - 3B83EB0D158E679000A3B31F /* Result.h in Headers */, - 3B83EB0F158E679000A3B31F /* ResultPoint.h in Headers */, - 3B83EB11158E679000A3B31F /* ResultPointCallback.h in Headers */, - 3B5A493017091807004E112F /* ChecksumException.h in Headers */, - 3B5A493617091826004E112F /* CodaBarReader.h in Headers */, - 3B5A493817091826004E112F /* Code93Reader.h in Headers */, - 3BAC3A0E172430F000473974 /* BitMatrixParser.h in Headers */, - 3BAC3A10172430F000473974 /* DecodedBitStreamParser.h in Headers */, - 3BAC3A12172430F000473974 /* Decoder.h in Headers */, - 3BAC3A14172430F000473974 /* ErrorCorrection.h in Headers */, - 3BAC3A16172430F000473974 /* ModulusGF.h in Headers */, - 3BAC3A18172430F000473974 /* ModulusPoly.h in Headers */, - 3BAC3A1A172430F000473974 /* Detector.h in Headers */, - 3BAC3A1C172430F000473974 /* LinesSampler.h in Headers */, - 3BAC3A1E172430F000473974 /* PDF417Reader.h in Headers */, - 3BAC3A311724313500473974 /* BigInteger.hh in Headers */, - 3BAC3A331724313500473974 /* BigIntegerAlgorithms.hh in Headers */, - 3BAC3A341724313500473974 /* BigIntegerLibrary.hh in Headers */, - 3BAC3A361724313500473974 /* BigIntegerUtils.hh in Headers */, - 3BAC3A381724313500473974 /* BigUnsigned.hh in Headers */, - 3BAC3A3A1724313500473974 /* BigUnsignedInABase.hh in Headers */, - 3BAC3A3C1724313500473974 /* NumberlikeArray.hh in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 3B83E98D158E66C600A3B31F /* zxing-cpp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3B83E99B158E66C600A3B31F /* Build configuration list for PBXNativeTarget "zxing-cpp" */; - buildPhases = ( - 3B83E98A158E66C600A3B31F /* Sources */, - 3B83E98B158E66C600A3B31F /* Frameworks */, - 3B83E98C158E66C600A3B31F /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "zxing-cpp"; - productName = "zxing-cpp"; - productReference = 3B83E98E158E66C600A3B31F /* libzxing-cpp.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3B83E985158E66C600A3B31F /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - }; - buildConfigurationList = 3B83E988158E66C600A3B31F /* Build configuration list for PBXProject "zxing-cpp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 3B83E983158E66C600A3B31F; - productRefGroup = 3B83E98F158E66C600A3B31F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 3B83E98D158E66C600A3B31F /* zxing-cpp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 3B83E98A158E66C600A3B31F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B83EA63158E679000A3B31F /* AztecDetectorResult.cpp in Sources */, - 3B83EA65158E679000A3B31F /* AztecReader.cpp in Sources */, - 3B83EA67158E679000A3B31F /* Decoder.cpp in Sources */, - 3B83EA69158E679000A3B31F /* Detector.cpp in Sources */, - 3B83EA6B158E679000A3B31F /* BarcodeFormat.cpp in Sources */, - 3B83EA6D158E679000A3B31F /* Binarizer.cpp in Sources */, - 3B83EA6F158E679000A3B31F /* BinaryBitmap.cpp in Sources */, - 3B83EA73158E679000A3B31F /* BitArray.cpp in Sources */, - 3B83EA75158E679000A3B31F /* BitMatrix.cpp in Sources */, - 3B83EA77158E679000A3B31F /* BitSource.cpp in Sources */, - 3B83EA79158E679000A3B31F /* CharacterSetECI.cpp in Sources */, - 3B83EA7D158E679000A3B31F /* DecoderResult.cpp in Sources */, - 3B83EA7F158E679000A3B31F /* MonochromeRectangleDetector.cpp in Sources */, - 3B83EA81158E679000A3B31F /* WhiteRectangleDetector.cpp in Sources */, - 3B83EA83158E679000A3B31F /* DetectorResult.cpp in Sources */, - 3B83EA87158E679000A3B31F /* GlobalHistogramBinarizer.cpp in Sources */, - 3B83EA89158E679000A3B31F /* GreyscaleLuminanceSource.cpp in Sources */, - 3B83EA8B158E679000A3B31F /* GreyscaleRotatedLuminanceSource.cpp in Sources */, - 3B83EA8D158E679000A3B31F /* GridSampler.cpp in Sources */, - 3B83EA8F158E679000A3B31F /* HybridBinarizer.cpp in Sources */, - 3B83EA91158E679000A3B31F /* IllegalArgumentException.cpp in Sources */, - 3B83EA93158E679000A3B31F /* PerspectiveTransform.cpp in Sources */, - 3B83EA96158E679000A3B31F /* GenericGF.cpp in Sources */, - 3B83EA98158E679000A3B31F /* GenericGFPoly.cpp in Sources */, - 3B83EA9A158E679000A3B31F /* ReedSolomonDecoder.cpp in Sources */, - 3B83EA9C158E679000A3B31F /* ReedSolomonException.cpp in Sources */, - 3B83EA9E158E679000A3B31F /* Str.cpp in Sources */, - 3B83EAA0158E679000A3B31F /* StringUtils.cpp in Sources */, - 3B83EAA2158E679000A3B31F /* DataMatrixReader.cpp in Sources */, - 3B83EAA4158E679000A3B31F /* BitMatrixParser.cpp in Sources */, - 3B83EAA6158E679000A3B31F /* DataBlock.cpp in Sources */, - 3B83EAA8158E679000A3B31F /* DecodedBitStreamParser.cpp in Sources */, - 3B83EAAA158E679000A3B31F /* Decoder.cpp in Sources */, - 3B83EAAC158E679000A3B31F /* CornerPoint.cpp in Sources */, - 3B83EAAE158E679000A3B31F /* Detector.cpp in Sources */, - 3B83EAB0158E679000A3B31F /* DetectorException.cpp in Sources */, - 3B83EAB4158E679000A3B31F /* Version.cpp in Sources */, - 3B83EAB6158E679000A3B31F /* DecodeHints.cpp in Sources */, - 3B83EAB8158E679000A3B31F /* Exception.cpp in Sources */, - 3B83EABA158E679000A3B31F /* FormatException.cpp in Sources */, - 3B83EABC158E679000A3B31F /* LuminanceSource.cpp in Sources */, - 3B83EABE158E679000A3B31F /* ByQuadrantReader.cpp in Sources */, - 3B83EAC0158E679000A3B31F /* GenericMultipleBarcodeReader.cpp in Sources */, - 3B83EAC2158E679000A3B31F /* MultipleBarcodeReader.cpp in Sources */, - 3B83EAC4158E679000A3B31F /* MultiDetector.cpp in Sources */, - 3B83EAC6158E679000A3B31F /* MultiFinderPatternFinder.cpp in Sources */, - 3B83EAC8158E679000A3B31F /* QRCodeMultiReader.cpp in Sources */, - 3B83EACA158E679000A3B31F /* MultiFormatReader.cpp in Sources */, - 3B83EACE158E679000A3B31F /* Code128Reader.cpp in Sources */, - 3B83EAD0158E679000A3B31F /* Code39Reader.cpp in Sources */, - 3B83EAD2158E679000A3B31F /* EAN13Reader.cpp in Sources */, - 3B83EAD4158E679000A3B31F /* EAN8Reader.cpp in Sources */, - 3B83EAD6158E679000A3B31F /* ITFReader.cpp in Sources */, - 3B83EAD8158E679000A3B31F /* MultiFormatOneDReader.cpp in Sources */, - 3B83EADA158E679000A3B31F /* MultiFormatUPCEANReader.cpp in Sources */, - 3B83EADC158E679000A3B31F /* OneDReader.cpp in Sources */, - 3B83EADE158E679000A3B31F /* OneDResultPoint.cpp in Sources */, - 3B83EAE0158E679000A3B31F /* UPCAReader.cpp in Sources */, - 3B83EAE2158E679000A3B31F /* UPCEANReader.cpp in Sources */, - 3B83EAE4158E679000A3B31F /* UPCEReader.cpp in Sources */, - 3B83EAE6158E679000A3B31F /* BitMatrixParser.cpp in Sources */, - 3B83EAE8158E679000A3B31F /* DataBlock.cpp in Sources */, - 3B83EAEA158E679000A3B31F /* DataMask.cpp in Sources */, - 3B83EAEC158E679000A3B31F /* DecodedBitStreamParser.cpp in Sources */, - 3B83EAEE158E679000A3B31F /* Decoder.cpp in Sources */, - 3B83EAF0158E679000A3B31F /* Mode.cpp in Sources */, - 3B83EAF2158E679000A3B31F /* AlignmentPattern.cpp in Sources */, - 3B83EAF4158E679000A3B31F /* AlignmentPatternFinder.cpp in Sources */, - 3B83EAF6158E679000A3B31F /* Detector.cpp in Sources */, - 3B83EAF8158E679000A3B31F /* FinderPattern.cpp in Sources */, - 3B83EAFA158E679000A3B31F /* FinderPatternFinder.cpp in Sources */, - 3B83EAFC158E679000A3B31F /* FinderPatternInfo.cpp in Sources */, - 3B83EB00158E679000A3B31F /* ErrorCorrectionLevel.cpp in Sources */, - 3B83EB02158E679000A3B31F /* FormatInformation.cpp in Sources */, - 3B83EB04158E679000A3B31F /* QRCodeReader.cpp in Sources */, - 3B83EB06158E679000A3B31F /* Version.cpp in Sources */, - 3B83EB08158E679000A3B31F /* Reader.cpp in Sources */, - 3B83EB0C158E679000A3B31F /* Result.cpp in Sources */, - 3B83EB0E158E679000A3B31F /* ResultPoint.cpp in Sources */, - 3B83EB10158E679000A3B31F /* ResultPointCallback.cpp in Sources */, - 3B5A492F17091807004E112F /* ChecksumException.cpp in Sources */, - 3B5A493517091826004E112F /* CodaBarReader.cpp in Sources */, - 3B5A493717091826004E112F /* Code93Reader.cpp in Sources */, - 3B6AA6711710C83200DF84C0 /* InvertedLuminanceSource.cpp in Sources */, - 3BAC3A0D172430F000473974 /* BitMatrixParser.cpp in Sources */, - 3BAC3A0F172430F000473974 /* DecodedBitStreamParser.cpp in Sources */, - 3BAC3A11172430F000473974 /* Decoder.cpp in Sources */, - 3BAC3A13172430F000473974 /* ErrorCorrection.cpp in Sources */, - 3BAC3A15172430F000473974 /* ModulusGF.cpp in Sources */, - 3BAC3A17172430F000473974 /* ModulusPoly.cpp in Sources */, - 3BAC3A19172430F000473974 /* Detector.cpp in Sources */, - 3BAC3A1B172430F000473974 /* LinesSampler.cpp in Sources */, - 3BAC3A1D172430F000473974 /* PDF417Reader.cpp in Sources */, - 3BAC3A301724313500473974 /* BigInteger.cc in Sources */, - 3BAC3A321724313500473974 /* BigIntegerAlgorithms.cc in Sources */, - 3BAC3A351724313500473974 /* BigIntegerUtils.cc in Sources */, - 3BAC3A371724313500473974 /* BigUnsigned.cc in Sources */, - 3BAC3A391724313500473974 /* BigUnsignedInABase.cc in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 3B83E999158E66C600A3B31F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - x86_64, - i386, - armv7s, - armv7, - ); - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "_DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THUMB_SUPPORT = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; - VALID_ARCHS = "armv7 armv7s i386 x86_64"; - "VALID_ARCHS[sdk=iphoneos*]" = "armv7 armv7s"; - "VALID_ARCHS[sdk=iphonesimulator*]" = i386; - "VALID_ARCHS[sdk=macosx*]" = "i386 x86_64"; - WARNING_CFLAGS = "-Wall"; - }; - name = Debug; - }; - 3B83E99A158E66C600A3B31F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - x86_64, - i386, - armv7s, - armv7, - ); - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_THUMB_SUPPORT = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = core/src; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "armv7 armv7s i386 x86_64"; - "VALID_ARCHS[sdk=iphoneos*]" = "armv7 armv7s"; - "VALID_ARCHS[sdk=iphonesimulator*]" = i386; - "VALID_ARCHS[sdk=macosx*]" = "i386 x86_64"; - WARNING_CFLAGS = "-Wall"; - }; - name = Release; - }; - 3B83E99C158E66C600A3B31F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALTERNATE_PERMISSIONS_FILES = ""; - DSTROOT = /tmp/zxing_cpp.dst; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - GCC_THUMB_SUPPORT = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 3B83E99D158E66C600A3B31F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALTERNATE_PERMISSIONS_FILES = ""; - DSTROOT = /tmp/zxing_cpp.dst; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - GCC_THUMB_SUPPORT = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3B83E988158E66C600A3B31F /* Build configuration list for PBXProject "zxing-cpp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B83E999158E66C600A3B31F /* Debug */, - 3B83E99A158E66C600A3B31F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3B83E99B158E66C600A3B31F /* Build configuration list for PBXNativeTarget "zxing-cpp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B83E99C158E66C600A3B31F /* Debug */, - 3B83E99D158E66C600A3B31F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3B83E985158E66C600A3B31F /* Project object */; -} diff --git a/csharp/README.txt b/csharp/README.txt deleted file mode 100644 index d9b25db97..000000000 --- a/csharp/README.txt +++ /dev/null @@ -1 +0,0 @@ -For a port to C#, .NET and related Windows frameworks, see ZXing .NET at http://zxingnet.codeplex.com/ \ No newline at end of file diff --git a/iphone/.gitignore b/iphone/.gitignore deleted file mode 100644 index 0a9456fae..000000000 --- a/iphone/.gitignore +++ /dev/null @@ -1 +0,0 @@ -contents.xcworkspacedata \ No newline at end of file diff --git a/iphone/Barcodes/.gitignore b/iphone/Barcodes/.gitignore deleted file mode 100644 index 1e88431d1..000000000 --- a/iphone/Barcodes/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -xcuserdata -contents.xcworkspacedata \ No newline at end of file diff --git a/iphone/Barcodes/Barcodes-Info.plist b/iphone/Barcodes/Barcodes-Info.plist deleted file mode 100644 index ba1ddcced..000000000 --- a/iphone/Barcodes/Barcodes-Info.plist +++ /dev/null @@ -1,55 +0,0 @@ - - - - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - icon.png - CFBundleIdentifier - com.rpechayr.barcodes - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Viewer - CFBundleURLIconFile - icon@2x - CFBundleURLName - com.rpechayr.zxing - CFBundleURLSchemes - - zxing - - - - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - MainWindow - UIRequiredDeviceCapabilities - - still-camera - - UIStatusBarHidden - - - diff --git a/iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj b/iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj deleted file mode 100755 index 6cb0081db..000000000 --- a/iphone/Barcodes/Barcodes.xcodeproj/project.pbxproj +++ /dev/null @@ -1,766 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1D3623260D0F684500981E51 /* BarcodesAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* BarcodesAppDelegate.m */; }; - 1D60589B0D05DD56006BFB54 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.mm */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 1F91E0BF1292BAC9003A0BFD /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F91E0BE1292BAC9003A0BFD /* Default@2x.png */; }; - 1F91E0C11292BAD5003A0BFD /* LatestResultBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F91E0C01292BAD5003A0BFD /* LatestResultBackground.png */; }; - 1F91E0D71292CA8C003A0BFD /* LatestResultBackground@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F91E0D61292CA8C003A0BFD /* LatestResultBackground@2x.png */; }; - 1F91E0E31292D1DC003A0BFD /* clickHere.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F91E0E21292D1DC003A0BFD /* clickHere.png */; }; - 1F91E1081292E397003A0BFD /* ZxingLarge@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F91E1071292E397003A0BFD /* ZxingLarge@2x.png */; }; - 1FB4301D128FFDCF002D63E8 /* libZXingWidget.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB4301C128FFDCD002D63E8 /* libZXingWidget.a */; }; - 1FB43030128FFF56002D63E8 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4302E128FFF56002D63E8 /* icon.png */; }; - 1FB43031128FFF56002D63E8 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4302F128FFF56002D63E8 /* icon@2x.png */; }; - 1FB430371290002C002D63E8 /* ZXMainViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FB430351290002C002D63E8 /* ZXMainViewController.mm */; }; - 1FB4303B129000B4002D63E8 /* ZxingLarge.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4303A129000B4002D63E8 /* ZxingLarge.png */; }; - 1FB43083129006DC002D63E8 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB43082129006DC002D63E8 /* AudioToolbox.framework */; }; - 1FB43087129006E6002D63E8 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB43086129006E6002D63E8 /* libiconv.dylib */; }; - 1FB430AE12900742002D63E8 /* beep-beep.aiff in Resources */ = {isa = PBXBuildFile; fileRef = 1FB430AD12900742002D63E8 /* beep-beep.aiff */; }; - 1FB430F612900879002D63E8 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB430F512900879002D63E8 /* AVFoundation.framework */; }; - 1FB430FC129008A2002D63E8 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB430FB129008A2002D63E8 /* CoreVideo.framework */; }; - 1FB43100129008B9002D63E8 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB430FF129008B9002D63E8 /* CoreMedia.framework */; }; - 1FB431AB12901D7D002D63E8 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB431AA12901D7D002D63E8 /* AddressBook.framework */; }; - 1FB431B112901D8C002D63E8 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB431B012901D8C002D63E8 /* AddressBookUI.framework */; }; - 1FB432831290295C002D63E8 /* About.html in Resources */ = {isa = PBXBuildFile; fileRef = 1FB432751290295C002D63E8 /* About.html */; }; - 1FB432841290295C002D63E8 /* DecoderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FB432771290295C002D63E8 /* DecoderView.xib */; }; - 1FB432851290295C002D63E8 /* Hints.html in Resources */ = {isa = PBXBuildFile; fileRef = 1FB432791290295C002D63E8 /* Hints.html */; }; - 1FB432861290295C002D63E8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4327B1290295C002D63E8 /* InfoPlist.strings */; }; - 1FB432871290295C002D63E8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4327D1290295C002D63E8 /* Localizable.strings */; }; - 1FB432881290295C002D63E8 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4327F1290295C002D63E8 /* MainWindow.xib */; }; - 1FB432891290295C002D63E8 /* Message.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FB432811290295C002D63E8 /* Message.xib */; }; - 1FB4352E12904F56002D63E8 /* MessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4352D12904F56002D63E8 /* MessageViewController.m */; }; - 1FB4365712918DA9002D63E8 /* ArchiveController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4365412918DA9002D63E8 /* ArchiveController.m */; }; - 1FB4365812918DA9002D63E8 /* Database.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4365612918DA9002D63E8 /* Database.m */; }; - 1FB4366512918E90002D63E8 /* business-card.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365A12918E90002D63E8 /* business-card.png */; }; - 1FB4366612918E90002D63E8 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365B12918E90002D63E8 /* Default.png */; }; - 1FB4366712918E90002D63E8 /* email.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365C12918E90002D63E8 /* email.png */; }; - 1FB4366812918E90002D63E8 /* filmroll-2.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365D12918E90002D63E8 /* filmroll-2.png */; }; - 1FB4366912918E90002D63E8 /* link1.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365E12918E90002D63E8 /* link1.png */; }; - 1FB4366A12918E90002D63E8 /* link2.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4365F12918E90002D63E8 /* link2.png */; }; - 1FB4366B12918E90002D63E8 /* map-pin.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366012918E90002D63E8 /* map-pin.png */; }; - 1FB4366C12918E90002D63E8 /* phone.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366112918E90002D63E8 /* phone.png */; }; - 1FB4366D12918E90002D63E8 /* photolib.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366212918E90002D63E8 /* photolib.png */; }; - 1FB4366E12918E90002D63E8 /* sms.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366312918E90002D63E8 /* sms.png */; }; - 1FB4366F12918E90002D63E8 /* text.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FB4366412918E90002D63E8 /* text.png */; }; - 1FB4367512918F63002D63E8 /* Scan.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4367412918F63002D63E8 /* Scan.m */; }; - 1FB4367D12918FAF002D63E8 /* ScanCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4367C12918FAF002D63E8 /* ScanCell.m */; }; - 1FB4369612918FF0002D63E8 /* ScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4369512918FF0002D63E8 /* ScanViewController.m */; }; - 1FB4369A12919014002D63E8 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FB4369912919014002D63E8 /* libsqlite3.dylib */; }; - 1FB436DF129194E7002D63E8 /* scans.db in Resources */ = {isa = PBXBuildFile; fileRef = 1FB436DE129194E7002D63E8 /* scans.db */; }; - 1FCC10A912C15F68009040CF /* Scanning.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FCC10A712C15F68009040CF /* Scanning.png */; }; - 1FCC10AA12C15F68009040CF /* Scanning@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1FCC10A812C15F68009040CF /* Scanning@2x.png */; }; - 1FF80D1012A3AE5400FE297C /* ZXMainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FF80D0F12A3AE5400FE297C /* ZXMainViewController.xib */; }; - 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; - 3B331CFA161BB7FF007313B6 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B331CF9161BB7FF007313B6 /* Default-568h@2x.png */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1FB4301B128FFDCD002D63E8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1FB43017128FFDCD002D63E8 /* ZXingWidget.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = ZXingWidget; - }; - 1FB43025128FFEF9002D63E8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1FB43017128FFDCD002D63E8 /* ZXingWidget.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = ZXingWidget; - }; - 3BA9170D1444A22D00E067C5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1FB43017128FFDCD002D63E8 /* ZXingWidget.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1D60398D13DF7CAD006F4B51; - remoteInfo = ZXingTests; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* BarcodesAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BarcodesAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* BarcodesAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BarcodesAppDelegate.m; sourceTree = ""; }; - 1D6058910D05DD3D006BFB54 /* Barcodes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Barcodes.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 1F91E0BE1292BAC9003A0BFD /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "images/Default@2x.png"; sourceTree = ""; }; - 1F91E0C01292BAD5003A0BFD /* LatestResultBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = LatestResultBackground.png; path = images/LatestResultBackground.png; sourceTree = ""; }; - 1F91E0D61292CA8C003A0BFD /* LatestResultBackground@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "LatestResultBackground@2x.png"; path = "images/LatestResultBackground@2x.png"; sourceTree = ""; }; - 1F91E0E21292D1DC003A0BFD /* clickHere.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = clickHere.png; path = images/clickHere.png; sourceTree = ""; }; - 1F91E1071292E397003A0BFD /* ZxingLarge@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ZxingLarge@2x.png"; path = "images/ZxingLarge@2x.png"; sourceTree = ""; }; - 1FB43017128FFDCD002D63E8 /* ZXingWidget.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ZXingWidget.xcodeproj; path = ../ZXingWidget/ZXingWidget.xcodeproj; sourceTree = SOURCE_ROOT; }; - 1FB4302E128FFF56002D63E8 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = images/icon.png; sourceTree = ""; }; - 1FB4302F128FFF56002D63E8 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "images/icon@2x.png"; sourceTree = ""; }; - 1FB430341290002C002D63E8 /* ZXMainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXMainViewController.h; sourceTree = ""; }; - 1FB430351290002C002D63E8 /* ZXMainViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXMainViewController.mm; sourceTree = ""; }; - 1FB4303A129000B4002D63E8 /* ZxingLarge.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ZxingLarge.png; path = images/ZxingLarge.png; sourceTree = ""; }; - 1FB43082129006DC002D63E8 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 1FB43086129006E6002D63E8 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; - 1FB430AD12900742002D63E8 /* beep-beep.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = "beep-beep.aiff"; sourceTree = ""; }; - 1FB430F512900879002D63E8 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 1FB430FB129008A2002D63E8 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 1FB430FF129008B9002D63E8 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 1FB431AA12901D7D002D63E8 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 1FB431B012901D8C002D63E8 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 1FB432761290295C002D63E8 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = de; path = de.lproj/About.html; sourceTree = ""; }; - 1FB432781290295C002D63E8 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/DecoderView.xib; sourceTree = ""; }; - 1FB4327A1290295C002D63E8 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = de; path = de.lproj/Hints.html; sourceTree = ""; }; - 1FB4327C1290295C002D63E8 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; - 1FB4327E1290295C002D63E8 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; - 1FB432801290295C002D63E8 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/MainWindow.xib; sourceTree = ""; }; - 1FB432821290295C002D63E8 /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/Message.xib; sourceTree = ""; }; - 1FB4328A12902968002D63E8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/About.html; sourceTree = ""; }; - 1FB4328B12902968002D63E8 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/DecoderView.xib; sourceTree = ""; }; - 1FB4328C12902968002D63E8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/Hints.html; sourceTree = ""; }; - 1FB4328D12902968002D63E8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 1FB4328E12902968002D63E8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - 1FB4328F12902968002D63E8 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = ""; }; - 1FB4329012902968002D63E8 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Message.xib; sourceTree = ""; }; - 1FB4329112902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = sv; path = sv.lproj/About.html; sourceTree = ""; }; - 1FB4329212902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/DecoderView.xib; sourceTree = ""; }; - 1FB4329312902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = sv; path = sv.lproj/Hints.html; sourceTree = ""; }; - 1FB4329412902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = ""; }; - 1FB4329512902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; - 1FB4329612902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/MainWindow.xib; sourceTree = ""; }; - 1FB4329712902973002D63E8 /* sv */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = sv; path = sv.lproj/Message.xib; sourceTree = ""; }; - 1FB4352C12904F56002D63E8 /* MessageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageViewController.h; sourceTree = ""; }; - 1FB4352D12904F56002D63E8 /* MessageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessageViewController.m; sourceTree = ""; }; - 1FB4365312918DA9002D63E8 /* ArchiveController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArchiveController.h; sourceTree = ""; }; - 1FB4365412918DA9002D63E8 /* ArchiveController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ArchiveController.m; sourceTree = ""; }; - 1FB4365512918DA9002D63E8 /* Database.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Database.h; sourceTree = ""; }; - 1FB4365612918DA9002D63E8 /* Database.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Database.m; sourceTree = ""; }; - 1FB4365A12918E90002D63E8 /* business-card.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "business-card.png"; path = "images/business-card.png"; sourceTree = ""; }; - 1FB4365B12918E90002D63E8 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = images/Default.png; sourceTree = ""; }; - 1FB4365C12918E90002D63E8 /* email.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = email.png; path = images/email.png; sourceTree = ""; }; - 1FB4365D12918E90002D63E8 /* filmroll-2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "filmroll-2.png"; path = "images/filmroll-2.png"; sourceTree = ""; }; - 1FB4365E12918E90002D63E8 /* link1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = link1.png; path = images/link1.png; sourceTree = ""; }; - 1FB4365F12918E90002D63E8 /* link2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = link2.png; path = images/link2.png; sourceTree = ""; }; - 1FB4366012918E90002D63E8 /* map-pin.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "map-pin.png"; path = "images/map-pin.png"; sourceTree = ""; }; - 1FB4366112918E90002D63E8 /* phone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = phone.png; path = images/phone.png; sourceTree = ""; }; - 1FB4366212918E90002D63E8 /* photolib.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = photolib.png; path = images/photolib.png; sourceTree = ""; }; - 1FB4366312918E90002D63E8 /* sms.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = sms.png; path = images/sms.png; sourceTree = ""; }; - 1FB4366412918E90002D63E8 /* text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = text.png; path = images/text.png; sourceTree = ""; }; - 1FB4367312918F63002D63E8 /* Scan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scan.h; sourceTree = ""; }; - 1FB4367412918F63002D63E8 /* Scan.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Scan.m; sourceTree = ""; }; - 1FB4367B12918FAF002D63E8 /* ScanCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanCell.h; sourceTree = ""; }; - 1FB4367C12918FAF002D63E8 /* ScanCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScanCell.m; sourceTree = ""; }; - 1FB4369412918FF0002D63E8 /* ScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanViewController.h; sourceTree = ""; }; - 1FB4369512918FF0002D63E8 /* ScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScanViewController.m; sourceTree = ""; }; - 1FB4369912919014002D63E8 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; - 1FB436DE129194E7002D63E8 /* scans.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = scans.db; sourceTree = ""; }; - 1FB437B612928EDA002D63E8 /* ModalViewControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModalViewControllerDelegate.h; sourceTree = ""; }; - 1FCC10A712C15F68009040CF /* Scanning.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Scanning.png; path = images/Scanning.png; sourceTree = ""; }; - 1FCC10A812C15F68009040CF /* Scanning@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Scanning@2x.png"; path = "images/Scanning@2x.png"; sourceTree = ""; }; - 1FF80CD712A3AB1B00FE297C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = fr; path = fr.lproj/About.html; sourceTree = ""; }; - 1FF80CD812A3AB1B00FE297C /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/DecoderView.xib; sourceTree = ""; }; - 1FF80CD912A3AB1B00FE297C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = fr; path = fr.lproj/Hints.html; sourceTree = ""; }; - 1FF80CDA12A3AB1B00FE297C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; - 1FF80CDB12A3AB1B00FE297C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; - 1FF80CDC12A3AB1B00FE297C /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/MainWindow.xib; sourceTree = ""; }; - 1FF80CDD12A3AB1B00FE297C /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/Message.xib; sourceTree = ""; }; - 1FF80D0F12A3AE5400FE297C /* ZXMainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ZXMainViewController.xib; sourceTree = ""; }; - 288765FC0DF74451002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* Barcodes_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Barcodes_Prefix.pch; sourceTree = ""; }; - 3B331CF9161BB7FF007313B6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Barcodes-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Barcodes-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */, - 1FB4301D128FFDCF002D63E8 /* libZXingWidget.a in Frameworks */, - 1FB43083129006DC002D63E8 /* AudioToolbox.framework in Frameworks */, - 1FB43087129006E6002D63E8 /* libiconv.dylib in Frameworks */, - 1FB430F612900879002D63E8 /* AVFoundation.framework in Frameworks */, - 1FB430FC129008A2002D63E8 /* CoreVideo.framework in Frameworks */, - 1FB43100129008B9002D63E8 /* CoreMedia.framework in Frameworks */, - 1FB431AB12901D7D002D63E8 /* AddressBook.framework in Frameworks */, - 1FB431B112901D8C002D63E8 /* AddressBookUI.framework in Frameworks */, - 1FB4369A12919014002D63E8 /* libsqlite3.dylib in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 1FB4369412918FF0002D63E8 /* ScanViewController.h */, - 1FB4369512918FF0002D63E8 /* ScanViewController.m */, - 1FB4367B12918FAF002D63E8 /* ScanCell.h */, - 1FB4367C12918FAF002D63E8 /* ScanCell.m */, - 1FB4367312918F63002D63E8 /* Scan.h */, - 1FB4367412918F63002D63E8 /* Scan.m */, - 1FB4365312918DA9002D63E8 /* ArchiveController.h */, - 1FB4365412918DA9002D63E8 /* ArchiveController.m */, - 1FB4365512918DA9002D63E8 /* Database.h */, - 1FB4365612918DA9002D63E8 /* Database.m */, - 1FB4352C12904F56002D63E8 /* MessageViewController.h */, - 1FB4352D12904F56002D63E8 /* MessageViewController.m */, - 1D3623240D0F684500981E51 /* BarcodesAppDelegate.h */, - 1D3623250D0F684500981E51 /* BarcodesAppDelegate.m */, - 1FB430341290002C002D63E8 /* ZXMainViewController.h */, - 1FB430351290002C002D63E8 /* ZXMainViewController.mm */, - 1FB437B612928EDA002D63E8 /* ModalViewControllerDelegate.h */, - ); - path = Classes; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Barcodes.app */, - ); - name = Products; - sourceTree = ""; - }; - 1FB43018128FFDCD002D63E8 /* Products */ = { - isa = PBXGroup; - children = ( - 1FB4301C128FFDCD002D63E8 /* libZXingWidget.a */, - 3BA9170E1444A22D00E067C5 /* ZXingTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - 1FB4302D128FFF46002D63E8 /* images */ = { - isa = PBXGroup; - children = ( - 1FCC10A712C15F68009040CF /* Scanning.png */, - 1FCC10A812C15F68009040CF /* Scanning@2x.png */, - 1F91E1071292E397003A0BFD /* ZxingLarge@2x.png */, - 1F91E0E21292D1DC003A0BFD /* clickHere.png */, - 1F91E0D61292CA8C003A0BFD /* LatestResultBackground@2x.png */, - 1F91E0C01292BAD5003A0BFD /* LatestResultBackground.png */, - 1F91E0BE1292BAC9003A0BFD /* Default@2x.png */, - 1FB4365A12918E90002D63E8 /* business-card.png */, - 1FB4365B12918E90002D63E8 /* Default.png */, - 1FB4365C12918E90002D63E8 /* email.png */, - 1FB4365D12918E90002D63E8 /* filmroll-2.png */, - 1FB4365E12918E90002D63E8 /* link1.png */, - 1FB4365F12918E90002D63E8 /* link2.png */, - 1FB4366012918E90002D63E8 /* map-pin.png */, - 1FB4366112918E90002D63E8 /* phone.png */, - 1FB4366212918E90002D63E8 /* photolib.png */, - 1FB4366312918E90002D63E8 /* sms.png */, - 1FB4366412918E90002D63E8 /* text.png */, - 1FB4303A129000B4002D63E8 /* ZxingLarge.png */, - 1FB4302E128FFF56002D63E8 /* icon.png */, - 1FB4302F128FFF56002D63E8 /* icon@2x.png */, - ); - name = images; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - 3B331CF9161BB7FF007313B6 /* Default-568h@2x.png */, - 1FB43017128FFDCD002D63E8 /* ZXingWidget.xcodeproj */, - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 32CA4F630368D1EE00C91783 /* Barcodes_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.mm */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 1FF80D0F12A3AE5400FE297C /* ZXMainViewController.xib */, - 1FB436DE129194E7002D63E8 /* scans.db */, - 1FB432751290295C002D63E8 /* About.html */, - 1FB432771290295C002D63E8 /* DecoderView.xib */, - 1FB432791290295C002D63E8 /* Hints.html */, - 1FB4327B1290295C002D63E8 /* InfoPlist.strings */, - 1FB4327D1290295C002D63E8 /* Localizable.strings */, - 1FB4327F1290295C002D63E8 /* MainWindow.xib */, - 1FB432811290295C002D63E8 /* Message.xib */, - 1FB430AD12900742002D63E8 /* beep-beep.aiff */, - 1FB4302D128FFF46002D63E8 /* images */, - 28AD733E0D9D9553002E5188 /* MainWindow.xib */, - 8D1107310486CEB800E47090 /* Barcodes-Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 288765FC0DF74451002DB57D /* CoreGraphics.framework */, - 1FB43082129006DC002D63E8 /* AudioToolbox.framework */, - 1FB43086129006E6002D63E8 /* libiconv.dylib */, - 1FB430F512900879002D63E8 /* AVFoundation.framework */, - 1FB430FB129008A2002D63E8 /* CoreVideo.framework */, - 1FB430FF129008B9002D63E8 /* CoreMedia.framework */, - 1FB431AA12901D7D002D63E8 /* AddressBook.framework */, - 1FB431B012901D8C002D63E8 /* AddressBookUI.framework */, - 1FB4369912919014002D63E8 /* libsqlite3.dylib */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* Barcodes */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Barcodes" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 1FB43026128FFEF9002D63E8 /* PBXTargetDependency */, - ); - name = Barcodes; - productName = Barcodes; - productReference = 1D6058910D05DD3D006BFB54 /* Barcodes.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Barcodes" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - de, - en, - sv, - fr, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 1FB43018128FFDCD002D63E8 /* Products */; - ProjectRef = 1FB43017128FFDCD002D63E8 /* ZXingWidget.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Barcodes */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 1FB4301C128FFDCD002D63E8 /* libZXingWidget.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libZXingWidget.a; - remoteRef = 1FB4301B128FFDCD002D63E8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3BA9170E1444A22D00E067C5 /* ZXingTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = ZXingTests.octest; - remoteRef = 3BA9170D1444A22D00E067C5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, - 1FB43030128FFF56002D63E8 /* icon.png in Resources */, - 1FB43031128FFF56002D63E8 /* icon@2x.png in Resources */, - 1FB4303B129000B4002D63E8 /* ZxingLarge.png in Resources */, - 1FB430AE12900742002D63E8 /* beep-beep.aiff in Resources */, - 1FB432831290295C002D63E8 /* About.html in Resources */, - 1FB432841290295C002D63E8 /* DecoderView.xib in Resources */, - 1FB432851290295C002D63E8 /* Hints.html in Resources */, - 1FB432861290295C002D63E8 /* InfoPlist.strings in Resources */, - 1FB432871290295C002D63E8 /* Localizable.strings in Resources */, - 1FB432881290295C002D63E8 /* MainWindow.xib in Resources */, - 1FB432891290295C002D63E8 /* Message.xib in Resources */, - 1FB4366512918E90002D63E8 /* business-card.png in Resources */, - 1FB4366612918E90002D63E8 /* Default.png in Resources */, - 1FB4366712918E90002D63E8 /* email.png in Resources */, - 1FB4366812918E90002D63E8 /* filmroll-2.png in Resources */, - 1FB4366912918E90002D63E8 /* link1.png in Resources */, - 1FB4366A12918E90002D63E8 /* link2.png in Resources */, - 1FB4366B12918E90002D63E8 /* map-pin.png in Resources */, - 1FB4366C12918E90002D63E8 /* phone.png in Resources */, - 1FB4366D12918E90002D63E8 /* photolib.png in Resources */, - 1FB4366E12918E90002D63E8 /* sms.png in Resources */, - 1FB4366F12918E90002D63E8 /* text.png in Resources */, - 1FB436DF129194E7002D63E8 /* scans.db in Resources */, - 1F91E0BF1292BAC9003A0BFD /* Default@2x.png in Resources */, - 1F91E0C11292BAD5003A0BFD /* LatestResultBackground.png in Resources */, - 1F91E0D71292CA8C003A0BFD /* LatestResultBackground@2x.png in Resources */, - 1F91E0E31292D1DC003A0BFD /* clickHere.png in Resources */, - 1F91E1081292E397003A0BFD /* ZxingLarge@2x.png in Resources */, - 1FF80D1012A3AE5400FE297C /* ZXMainViewController.xib in Resources */, - 1FCC10A912C15F68009040CF /* Scanning.png in Resources */, - 1FCC10AA12C15F68009040CF /* Scanning@2x.png in Resources */, - 3B331CFA161BB7FF007313B6 /* Default-568h@2x.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589B0D05DD56006BFB54 /* main.mm in Sources */, - 1D3623260D0F684500981E51 /* BarcodesAppDelegate.m in Sources */, - 1FB430371290002C002D63E8 /* ZXMainViewController.mm in Sources */, - 1FB4352E12904F56002D63E8 /* MessageViewController.m in Sources */, - 1FB4365712918DA9002D63E8 /* ArchiveController.m in Sources */, - 1FB4365812918DA9002D63E8 /* Database.m in Sources */, - 1FB4367512918F63002D63E8 /* Scan.m in Sources */, - 1FB4367D12918FAF002D63E8 /* ScanCell.m in Sources */, - 1FB4369612918FF0002D63E8 /* ScanViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1FB43026128FFEF9002D63E8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ZXingWidget; - targetProxy = 1FB43025128FFEF9002D63E8 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 1FB432751290295C002D63E8 /* About.html */ = { - isa = PBXVariantGroup; - children = ( - 1FB432761290295C002D63E8 /* de */, - 1FB4328A12902968002D63E8 /* en */, - 1FB4329112902973002D63E8 /* sv */, - 1FF80CD712A3AB1B00FE297C /* fr */, - ); - name = About.html; - sourceTree = ""; - }; - 1FB432771290295C002D63E8 /* DecoderView.xib */ = { - isa = PBXVariantGroup; - children = ( - 1FB432781290295C002D63E8 /* de */, - 1FB4328B12902968002D63E8 /* en */, - 1FB4329212902973002D63E8 /* sv */, - 1FF80CD812A3AB1B00FE297C /* fr */, - ); - name = DecoderView.xib; - sourceTree = ""; - }; - 1FB432791290295C002D63E8 /* Hints.html */ = { - isa = PBXVariantGroup; - children = ( - 1FB4327A1290295C002D63E8 /* de */, - 1FB4328C12902968002D63E8 /* en */, - 1FB4329312902973002D63E8 /* sv */, - 1FF80CD912A3AB1B00FE297C /* fr */, - ); - name = Hints.html; - sourceTree = ""; - }; - 1FB4327B1290295C002D63E8 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 1FB4327C1290295C002D63E8 /* de */, - 1FB4328D12902968002D63E8 /* en */, - 1FB4329412902973002D63E8 /* sv */, - 1FF80CDA12A3AB1B00FE297C /* fr */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 1FB4327D1290295C002D63E8 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 1FF80CDB12A3AB1B00FE297C /* fr */, - 1FB4327E1290295C002D63E8 /* de */, - 1FB4328E12902968002D63E8 /* en */, - 1FB4329512902973002D63E8 /* sv */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 1FB4327F1290295C002D63E8 /* MainWindow.xib */ = { - isa = PBXVariantGroup; - children = ( - 1FB432801290295C002D63E8 /* de */, - 1FB4328F12902968002D63E8 /* en */, - 1FB4329612902973002D63E8 /* sv */, - 1FF80CDC12A3AB1B00FE297C /* fr */, - ); - name = MainWindow.xib; - sourceTree = ""; - }; - 1FB432811290295C002D63E8 /* Message.xib */ = { - isa = PBXVariantGroup; - children = ( - 1FB432821290295C002D63E8 /* de */, - 1FB4329012902968002D63E8 /* en */, - 1FB4329712902973002D63E8 /* sv */, - 1FF80CDD12A3AB1B00FE297C /* fr */, - ); - name = Message.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - i386, - armv7s, - armv7, - ); - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Barcodes_Prefix.pch; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - INFOPLIST_FILE = "Barcodes-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ( - "-all_load", - "-Objc", - ); - PRODUCT_NAME = Barcodes; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "armv7 armv7s"; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - i386, - armv7s, - armv7, - ); - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Barcodes_Prefix.pch; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - INFOPLIST_FILE = "Barcodes-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ( - "-all_load", - "-Objc", - ); - PRODUCT_NAME = Barcodes; - PROVISIONING_PROFILE = ""; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "armv7 armv7s"; - }; - name = Release; - }; - 1F81B3E012F1E42200659778 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - i386, - armv6, - armv7, - ); - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_THUMB_SUPPORT = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../../cpp/core/src, - "../ZXingWidget/Classes/**", - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - VALID_ARCHS = "armv7 armv6"; - WARNING_CFLAGS = ( - "-Wall", - "-Wextra", - "-Werror", - "-Wno-unused-parameter", - ); - }; - name = Distribution; - }; - 1F81B3E112F1E42200659778 /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - i386, - armv7s, - armv7, - ); - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Barcodes_Prefix.pch; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - INFOPLIST_FILE = "Barcodes-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ( - "-all_load", - "-Objc", - ); - PRODUCT_NAME = Barcodes; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "armv7 armv7s"; - }; - name = Distribution; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - i386, - armv6, - armv7, - ); - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_THUMB_SUPPORT = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../../cpp/core/src, - "../ZXingWidget/Classes/**", - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - VALID_ARCHS = "armv7 armv6"; - WARNING_CFLAGS = ( - "-Wall", - "-Wextra", - "-Werror", - "-Wno-unused-parameter", - ); - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - i386, - armv6, - armv7, - ); - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_THUMB_SUPPORT = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../../cpp/core/src, - "../ZXingWidget/Classes/**", - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - VALID_ARCHS = "armv7 armv6"; - WARNING_CFLAGS = ( - "-Wall", - "-Wextra", - "-Werror", - "-Wno-unused-parameter", - ); - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Barcodes" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, - 1F81B3E112F1E42200659778 /* Distribution */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Barcodes" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - 1F81B3E012F1E42200659778 /* Distribution */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/iphone/Barcodes/Barcodes_Prefix.pch b/iphone/Barcodes/Barcodes_Prefix.pch deleted file mode 100644 index bb34b4f86..000000000 --- a/iphone/Barcodes/Barcodes_Prefix.pch +++ /dev/null @@ -1,8 +0,0 @@ -// -// Prefix header for all source files of the 'Barcodes' target in the 'Barcodes' project -// - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/iphone/Barcodes/Classes/ArchiveController.h b/iphone/Barcodes/Classes/ArchiveController.h deleted file mode 100644 index b31bba8ad..000000000 --- a/iphone/Barcodes/Classes/ArchiveController.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// ArchiveController.h -// UIShowcase -// -// Created by Christian Brunschen on 29/05/2008. -// Modified by Romain Pechayre on 16/11/2010 -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ModalViewControllerDelegate.h" - -@interface ArchiveController : UITableViewController { - NSMutableArray *scans; - NSMutableArray *results; - NSDateFormatter *dateFormatter; - id delegate; -} - -@property (nonatomic, retain) NSMutableArray *scans; -@property (nonatomic, retain) NSMutableArray *results; -@property (nonatomic, assign) id delegate; -@property (nonatomic, retain) NSDateFormatter *dateFormatter; - -- (NSInteger)scanIndexForRow:(NSInteger)row; - -@end diff --git a/iphone/Barcodes/Classes/ArchiveController.m b/iphone/Barcodes/Classes/ArchiveController.m deleted file mode 100644 index ba3d13491..000000000 --- a/iphone/Barcodes/Classes/ArchiveController.m +++ /dev/null @@ -1,176 +0,0 @@ -// -// ArchiveController.m -// UIShowcase -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ArchiveController.h" -#import "Database.h" -#import "Scan.h" -#import "UniversalResultParser.h" -#import "ParsedResult.h" -#import "ScanViewController.h" -#import "ScanCell.h" - -@implementation ArchiveController - -@synthesize scans; -@synthesize results; -@synthesize delegate; -@synthesize dateFormatter; - - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [scans count]; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - return 44.0; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *ScanIdentifier = @"ScanIdentifier"; - - ScanCell *cell = (ScanCell *)[tableView dequeueReusableCellWithIdentifier:ScanIdentifier]; - if (cell == nil) { - cell = [[[ScanCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ScanIdentifier] autorelease]; - } - - // Configure the cell - int idx = [self scanIndexForRow:indexPath.row]; - Scan *scan = [scans objectAtIndex:idx]; - [cell setScan:scan]; - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - //[decoderViewController showScan:[scans objectAtIndex:[self scanIndexForRow:indexPath.row]]]; - int idx = [self scanIndexForRow:indexPath.row]; - Scan *scan = [scans objectAtIndex:idx]; - ParsedResult *result = [results objectAtIndex:idx]; - ScanViewController *scanViewController = [[ScanViewController alloc] initWithResult:result forScan:scan]; - [self.navigationController pushViewController:scanViewController animated:YES]; - [scanViewController release]; -} - -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - int idx = [self scanIndexForRow:indexPath.row]; - Scan *scan = [self.scans objectAtIndex:idx]; - // delete the scan from the database ... - [[Database sharedDatabase] deleteScan:scan]; - // ... delete the scan from our in-memory cache of the database ... - [scans removeObjectAtIndex:idx]; - // ... delete the corresponding result from our in-memory cache ... - [results removeObjectAtIndex:idx]; - // ... and remove the row from the table view. - [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; - // [tableView reloadData]; - } else if (editingStyle == UITableViewCellEditingStyleInsert) { - // no insertions! - } -} - -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { - return YES; -} - -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { -} - -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { - return NO; -} - - -- (void)dealloc { - [scans release]; - [results release]; - delegate = nil; - [dateFormatter release]; - [super dealloc]; -} - - -- (void)viewDidLoad { - [super viewDidLoad]; - NSMutableArray *theScans = [[NSMutableArray alloc] init]; - self.scans = theScans; - [theScans release]; - - NSMutableArray *theResults = [[NSMutableArray alloc] init]; - self.results = theResults; - [theResults release]; - - NSDateFormatter *theDateFormatter = [[NSDateFormatter alloc] init]; - self.dateFormatter = theDateFormatter; - [theDateFormatter release]; - - self.title = NSLocalizedString(@"ScanArchiveTitle", @"Scan Archive"); - self.navigationItem.rightBarButtonItem = [self editButtonItem]; - //self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Back",@"Back") style:UIBarButtonItemStyleDone target:self action:@selector(done:)] autorelease]; - - self.scans = [NSMutableArray arrayWithArray:[[Database sharedDatabase] scans]]; - self.results = [NSMutableArray arrayWithCapacity:self.scans.count]; - for (Scan *scan in scans) { - ParsedResult *res = [UniversalResultParser parsedResultForString:scan.text]; - [results addObject:res]; - } -} - --(void)done:(id)sender { - [delegate modalViewControllerWantsToBeDismissed:self]; -} - - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - self.scans = [NSMutableArray arrayWithArray:[[Database sharedDatabase] scans]]; - self.results = [NSMutableArray arrayWithCapacity:self.scans.count]; - for (Scan *scan in scans) { - [results addObject:[UniversalResultParser parsedResultForString:scan.text]]; - } - [self.tableView reloadData]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; -} - -- (void)viewWillDisappear:(BOOL)animated { - self.scans = nil; - self.results = nil; -} - -- (void)viewDidDisappear:(BOOL)animated { -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; -} - -- (NSInteger)scanIndexForRow:(NSInteger)row { - return scans.count - 1 - row; -} - -@end - diff --git a/iphone/Barcodes/Classes/BarcodesAppDelegate.h b/iphone/Barcodes/Classes/BarcodesAppDelegate.h deleted file mode 100644 index bb6cddaa8..000000000 --- a/iphone/Barcodes/Classes/BarcodesAppDelegate.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// BarcodesAppDelegate.h -// Barcodes -// -// Created by Romain Pechayre on 11/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "ZXMainViewController.h" - -@interface BarcodesAppDelegate : NSObject { - UIWindow *window; - UITabBarController *tabBarController; - ZXMainViewController *viewController; - -} - -@property (nonatomic, retain) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; -@property (nonatomic, retain) IBOutlet ZXMainViewController *viewController; - -- (void)registerView:(ZXMainViewController*)controller; - -@end - diff --git a/iphone/Barcodes/Classes/BarcodesAppDelegate.m b/iphone/Barcodes/Classes/BarcodesAppDelegate.m deleted file mode 100644 index 6b25ec19f..000000000 --- a/iphone/Barcodes/Classes/BarcodesAppDelegate.m +++ /dev/null @@ -1,149 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/** - * Copyright 2010-2012 ZXing authors All rights reserved. - * - * 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. - */ - -#import "BarcodesAppDelegate.h" - -@implementation BarcodesAppDelegate - -@synthesize window; -@synthesize tabBarController; -@synthesize viewController; - -#pragma mark - -#pragma mark Application lifecycle - -- (BOOL)myOpenURL:(NSURL*)url { - if (!url) return NO; - if ([[url scheme] isEqualToString:@"zxing"]) { - if ([[url host] isEqualToString:@"scan"]) { - NSArray *pairs = [[url query] componentsSeparatedByString:@"&"]; - - for (NSString *pair in pairs) { - NSArray *elements = [pair componentsSeparatedByString:@"="]; - NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - NSString *val = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - // NSLog(@"%@ => %@\n", key, val); - - if ([key isEqualToString:@"ret"]) { - [[NSUserDefaults standardUserDefaults] setObject:val forKey:@"returnURL"]; - [[NSUserDefaults standardUserDefaults] synchronize]; - [[self viewController] scan:nil]; - } - if ([key isEqualToString:@"SCAN_FORMATS"]) { - // Storing these, but they effect nothing yet. - NSArray *formats = [val componentsSeparatedByString:@","]; - [[NSUserDefaults standardUserDefaults] setObject:formats forKey:@"scanFormats"]; - [[NSUserDefaults standardUserDefaults] synchronize]; - } - } - } - return YES; - } else { - return NO; - } -} - -- (void)registerView:(ZXMainViewController*)controller { - [self setViewController:controller]; -} - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - - // Check if launching from URL - NSURL *url = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey]; - if ([url isMemberOfClass: [NSURL class]]) { - return [self myOpenURL: url]; - } else { - // Clear the return URL so the application goes back to working as normal... - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"returnURL"]; - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"scanFormats"]; - [[NSUserDefaults standardUserDefaults] synchronize]; - } - - // Override point for customization after application launch. - window.rootViewController = tabBarController; - [self.window makeKeyAndVisible]; - - return YES; -} - -- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url -{ - return [self myOpenURL: url]; -} - -- (void)applicationWillResignActive:(UIApplication *)application { - /* - Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - */ -} - - -- (void)applicationDidEnterBackground:(UIApplication *)application { - /* - Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - If your application supports background execution, called instead of applicationWillTerminate: when the user quits. - */ - - // Clear the return URL so the application goes back to working as normal... - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"returnURL"]; - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"scanFormats"]; - [[NSUserDefaults standardUserDefaults] synchronize]; -} - - -- (void)applicationWillEnterForeground:(UIApplication *)application { - /* - Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. - */ -} - - -- (void)applicationDidBecomeActive:(UIApplication *)application { - /* - Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - */ -} - - -- (void)applicationWillTerminate:(UIApplication *)application { - /* - Called when the application is about to terminate. - See also applicationDidEnterBackground:. - */ -} - - -#pragma mark - -#pragma mark Memory management - -- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { - /* - Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. - */ -} - - -- (void)dealloc { - [tabBarController release]; - [window release]; - [super dealloc]; -} - - -@end diff --git a/iphone/Barcodes/Classes/Database.h b/iphone/Barcodes/Classes/Database.h deleted file mode 100644 index 764fd0401..000000000 --- a/iphone/Barcodes/Classes/Database.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// Database.h -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import - -@class Scan; - -@interface Database : NSObject { - sqlite3 *connection; - int nextScanIdent; -} - -@property sqlite3 *connection; -@property int nextScanIdent; - -+ (id)sharedDatabase; - -- (Scan *)addScanWithText:(NSString *)text; -- (NSArray *)scans; -- (void)deleteScan:(Scan *)scan; - -@end diff --git a/iphone/Barcodes/Classes/Database.m b/iphone/Barcodes/Classes/Database.m deleted file mode 100644 index 05c692d4e..000000000 --- a/iphone/Barcodes/Classes/Database.m +++ /dev/null @@ -1,122 +0,0 @@ -// -// Database.m -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "Database.h" -#import "Scan.h" - -@implementation Database - -static sqlite3_stmt *maxIdStatement; -static sqlite3_stmt *selectAllStatement; -static sqlite3_stmt *insertStatement; -static sqlite3_stmt *deleteStatement; - -@synthesize connection; -@synthesize nextScanIdent; - -static Database *sharedDatabase = nil; - -+ (id)sharedDatabase { - if (!sharedDatabase) { - sharedDatabase = [[self alloc] init]; - - BOOL success; - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSError *error; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"scans.db"]; - success = [fileManager fileExistsAtPath:writableDBPath]; - if (!success) { - // The writable database does not exist, so copy the default to the appropriate location. - NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"scans.db"]; - success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; - if (!success) { - NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); - } - } - - sqlite3 *connection; - sqlite3_open([writableDBPath UTF8String], &connection); - sharedDatabase.connection = connection; - - static const char *maxIdSql = "SELECT MAX(id) FROM SCAN"; - sqlite3_prepare_v2(connection, maxIdSql, -1, &maxIdStatement, NULL); - - static const char *selectAllSql = "SELECT id, text, stamp FROM SCAN ORDER BY id"; - sqlite3_prepare_v2(connection, selectAllSql, -1, &selectAllStatement, NULL); - - static const char *insertSql = - "INSERT INTO SCAN (id, text, stamp) VALUES (?, ?, ?)"; - sqlite3_prepare_v2(connection, insertSql, -1, &insertStatement, NULL); - - static const char *deleteSql = "DELETE FROM SCAN WHERE id = ?"; - sqlite3_prepare_v2(connection, deleteSql, -1, &deleteStatement, NULL); - - if (SQLITE_ROW == sqlite3_step(maxIdStatement)) { - int maxId = sqlite3_column_int(maxIdStatement, 0); - sharedDatabase.nextScanIdent = maxId + 1; - sqlite3_reset(maxIdStatement); - } else { - NSLog(@"failed to read max ID from database\n"); - } - - } - return sharedDatabase; -} - -- (Scan *)addScanWithText:(NSString *)text { - NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; - sqlite3_bind_int(insertStatement, 1, nextScanIdent++); - sqlite3_bind_text(insertStatement, 2, [text UTF8String], -1, SQLITE_TRANSIENT); - sqlite3_bind_double(insertStatement, 3, timeStamp); - sqlite3_step(insertStatement); - sqlite3_reset(insertStatement); - NSDate* theDate = [[NSDate alloc] initWithTimeIntervalSince1970:timeStamp]; - Scan *scan = [[[Scan alloc] initWithIdent:nextScanIdent text:text stamp:theDate] autorelease]; - [theDate release]; - return scan; -} - -- (NSArray *)scans { - NSMutableArray *scans = [NSMutableArray array]; - while (SQLITE_ROW == sqlite3_step(selectAllStatement)) { - int ident = sqlite3_column_int(selectAllStatement, 0); - NSString *text = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectAllStatement, 1)]; - NSDate *stamp = [[NSDate alloc] initWithTimeIntervalSince1970:sqlite3_column_double(selectAllStatement, 2)]; - Scan *scan = [[Scan alloc] initWithIdent:ident text:text stamp:stamp]; - [text release]; - [stamp release]; - [scans addObject:scan]; - [scan release]; - } - sqlite3_reset(selectAllStatement); - return scans; -} - -- (void)deleteScan:(Scan *)scan { - sqlite3_bind_int(deleteStatement, 1, [scan ident]); - sqlite3_step(deleteStatement); - sqlite3_reset(deleteStatement); -} - - -@end diff --git a/iphone/Barcodes/Classes/MessageViewController.h b/iphone/Barcodes/Classes/MessageViewController.h deleted file mode 100644 index 1d963870d..000000000 --- a/iphone/Barcodes/Classes/MessageViewController.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// MessageViewController.h -// ZXing -// -// Created by Christian Brunschen on 30/07/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ModalViewControllerDelegate.h" -@class MessageViewController; - - - -@interface MessageViewController : UIViewController { -// id callbackTarget; -// SEL callbackSelectorSuccess; -// SEL callbackSelectorFailure; - NSURL *contentURL; - IBOutlet UIWebView *webView; - id delegate; -} - -//@property (nonatomic, retain) id callbackTarget; -//@property (nonatomic, assign) SEL callbackSelectorSuccess; -//@property (nonatomic, assign) SEL callbackSelectorFailure; - -@property (nonatomic,retain) IBOutlet UIWebView *webView; -@property (nonatomic,assign) id delegate; -@property (nonatomic, retain) NSURL *contentURL; - -- (id)initWithMessageFilename:(NSString *)filename; -- (IBAction)dismiss:(id)sender; - -@end diff --git a/iphone/Barcodes/Classes/MessageViewController.m b/iphone/Barcodes/Classes/MessageViewController.m deleted file mode 100644 index 53b8b0a80..000000000 --- a/iphone/Barcodes/Classes/MessageViewController.m +++ /dev/null @@ -1,108 +0,0 @@ -// -// MessageViewController.m -// ZXing -// -// Created by Christian Brunschen on 30/07/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "MessageViewController.h" - - -@implementation MessageViewController - -//@synthesize callbackTarget; -//@synthesize callbackSelectorSuccess; -//@synthesize callbackSelectorFailure; -@synthesize contentURL; -@synthesize webView; -@synthesize delegate; - -//- (UIWebView *)webView { -// return (UIWebView *)self.view; -//} - -- (id)initWithMessageFilename:(NSString *)filename { - if ((self = [super initWithNibName:@"Message" bundle:nil])) { - self.contentURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:filename - ofType:@"html"]]; - } - return self; -} - -- (IBAction)dismiss:(id)sender { - [delegate modalViewControllerWantsToBeDismissed:self]; -} - -- (void)loadView { - [super loadView]; - self.webView.delegate = self; - [self.webView loadRequest:[NSURLRequest requestWithURL:self.contentURL]]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; -} - - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - - -- (void)dealloc { - delegate = nil; - [webView release]; - [super dealloc]; -} - -// open a URL, asynchronously -- (void) openURL:(NSURL *)url { - [url autorelease]; - [[UIApplication sharedApplication] openURL:url]; -} - - -// UIWebViewDelegate methods - -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { - if ([[request URL] isFileURL]) { - // only load 'file' URL requests ourselves - return true; - } else { - // any other url:s are handed off to the system - NSURL *url = [[request URL] retain]; - [self performSelectorOnMainThread:@selector(openURL:) withObject:url waitUntilDone:NO]; - return NO; - } -} - -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { - NSLog(@"failed to load content, performing failure callback"); -} - -- (void)webViewDidFinishLoad:(UIWebView *)webView { - NSLog(@"finished loading content, performing success callback"); -} - - -@end diff --git a/iphone/Barcodes/Classes/ModalViewControllerDelegate.h b/iphone/Barcodes/Classes/ModalViewControllerDelegate.h deleted file mode 100644 index 0b7ac91de..000000000 --- a/iphone/Barcodes/Classes/ModalViewControllerDelegate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ModalViewControllerDelegate.h -// Barcodes -// -// Created by Romain Pechayre on 11/16/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import - - -@protocol ModalViewControllerDelegate -- (void)modalViewControllerWantsToBeDismissed:(UIViewController *)controller; - -@end diff --git a/iphone/Barcodes/Classes/Scan.h b/iphone/Barcodes/Classes/Scan.h deleted file mode 100644 index b96d9c95a..000000000 --- a/iphone/Barcodes/Classes/Scan.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// Scan.h -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - - -@interface Scan : NSObject { - NSInteger ident; - NSString *text; - NSDate *stamp; -} - -@property NSInteger ident; -@property (nonatomic, copy) NSString *text; -@property (nonatomic, retain) NSDate *stamp; - -- (id)initWithIdent:(int)i text:(NSString *)t stamp:(NSDate *)s; - -@end diff --git a/iphone/Barcodes/Classes/Scan.m b/iphone/Barcodes/Classes/Scan.m deleted file mode 100644 index cb2f91787..000000000 --- a/iphone/Barcodes/Classes/Scan.m +++ /dev/null @@ -1,46 +0,0 @@ -// -// Scan.m -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "Scan.h" - - -@implementation Scan - -@synthesize ident; -@synthesize text; -@synthesize stamp; - -- (id)initWithIdent:(int)i text:(NSString *)t stamp:(NSDate *)s { - if ((self = [super init]) != nil) { - self.ident = i; - self.text = t; - self.stamp = s; - } - return self; -} - -- (void)dealloc { - [stamp release]; - [text release]; - [super dealloc]; -} - -@end diff --git a/iphone/Barcodes/Classes/ScanCell.h b/iphone/Barcodes/Classes/ScanCell.h deleted file mode 100644 index 0860c446c..000000000 --- a/iphone/Barcodes/Classes/ScanCell.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// ScanCell.h -// ZXing -// -// Created by Christian Brunschen on 30/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - -@class Scan; -@class ParsedResult; - -@interface ScanCell : UITableViewCell { - Scan *scan; - ParsedResult *result; - UIImageView *imageView; - UILabel *textView; - UILabel *dateView; - UILabel *timeView; -} - -@property (nonatomic, retain) Scan *scan; -@property (nonatomic, retain) UIImageView *imageView; -@property (nonatomic, retain) UILabel *textView; -@property (nonatomic, retain) UILabel *dateView; -@property (nonatomic, retain) UILabel *timeView; - -@end diff --git a/iphone/Barcodes/Classes/ScanCell.m b/iphone/Barcodes/Classes/ScanCell.m deleted file mode 100644 index 640d3a8f6..000000000 --- a/iphone/Barcodes/Classes/ScanCell.m +++ /dev/null @@ -1,176 +0,0 @@ -// -// ScanCell.m -// ZXing -// -// Created by Christian Brunschen on 30/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ScanCell.h" -#import "Scan.h" -#import "ParsedResult.h" -#import "ResultParser.h" -#import "UniversalResultParser.h" - -static NSDateFormatter *_makeDateFormatter(NSDateFormatterStyle dateStyle, - NSDateFormatterStyle timeStyle) { - NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateStyle:dateStyle]; - [dateFormatter setTimeStyle:timeStyle]; - return dateFormatter; -} - -static NSString *_dateString(NSDate *date) { - static NSDateFormatter *dateFormatter = nil; - if (!dateFormatter) { - dateFormatter = - _makeDateFormatter(NSDateFormatterShortStyle, NSDateFormatterNoStyle); - } - return [dateFormatter stringFromDate:date]; -} - -static NSString *_timeString(NSDate *date) { - static NSDateFormatter *timeFormatter = nil; - if (!timeFormatter) { - timeFormatter = - - _makeDateFormatter(NSDateFormatterNoStyle, NSDateFormatterShortStyle); - } - return [timeFormatter stringFromDate:date]; -} - -#define VIEW_PADDING 2.0 -#define IMAGE_SIZE 40.0 -#define EDITING_INSET 10.0 -#define CONTENT_HEIGHT (IMAGE_SIZE + 2.0 * VIEW_PADDING) -#define DATE_TIME_WIDTH 50.0 - -@implementation ScanCell - -@synthesize imageView; -@synthesize textView; -@synthesize dateView; -@synthesize timeView; - - -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { - imageView = [[UIImageView alloc] initWithFrame:CGRectZero]; - imageView.contentMode = UIViewContentModeCenter; - [self.contentView addSubview:imageView]; - - textView = [[UILabel alloc] initWithFrame:CGRectZero]; - textView.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]]; - textView.textAlignment = UITextAlignmentLeft; - textView.textColor = [UIColor blackColor]; - [self.contentView addSubview:textView]; - - dateView = [[UILabel alloc] initWithFrame:CGRectZero]; - dateView.font = [UIFont systemFontOfSize:(2 * [UIFont systemFontSize]) / 3]; - dateView.textAlignment = UITextAlignmentRight; - dateView.textColor = [UIColor grayColor]; - [self.contentView addSubview:dateView]; - - timeView = [[UILabel alloc] initWithFrame:CGRectZero]; - timeView.font = [UIFont systemFontOfSize:(2 * [UIFont systemFontSize]) / 3]; - timeView.textAlignment = UITextAlignmentRight; - timeView.textColor = [UIColor grayColor]; - [self.contentView addSubview:timeView]; - } - return self; -} - -- (CGRect) _imageViewFrame { - CGRect frame = CGRectMake(VIEW_PADDING, VIEW_PADDING, IMAGE_SIZE, IMAGE_SIZE); - if (self.editing) { - frame.origin.x += EDITING_INSET; - } - return frame; -} - -- (CGRect) _textViewFrame { - CGRect frame = CGRectMake(2 * VIEW_PADDING + IMAGE_SIZE, VIEW_PADDING, self.contentView.bounds.size.width - IMAGE_SIZE - DATE_TIME_WIDTH - 3 * VIEW_PADDING, CONTENT_HEIGHT - 2 * VIEW_PADDING); - if (self.editing) { - frame.origin.x += EDITING_INSET; - frame.size.width += DATE_TIME_WIDTH + VIEW_PADDING - EDITING_INSET; - } - return frame; -} - -- (CGRect) _timeViewFrame { - float x = CGRectGetMaxX(self.contentView.bounds) - DATE_TIME_WIDTH - VIEW_PADDING; - CGRect frame = CGRectMake(x, VIEW_PADDING, DATE_TIME_WIDTH, (CONTENT_HEIGHT - 2 * VIEW_PADDING) / 2); - return frame; -} - -- (CGRect) _dateViewFrame { - float x = CGRectGetMaxX(self.contentView.bounds) - DATE_TIME_WIDTH - VIEW_PADDING; - CGRect frame = CGRectMake(x, (CONTENT_HEIGHT - 2 * VIEW_PADDING) / 2, DATE_TIME_WIDTH, (CONTENT_HEIGHT - 2 * VIEW_PADDING) / 2); - return frame; -} - - -- (void)layoutSubviews { - [super layoutSubviews]; - - [imageView setFrame:[self _imageViewFrame]]; - [textView setFrame:[self _textViewFrame]]; - [dateView setFrame:[self _dateViewFrame]]; - [timeView setFrame:[self _timeViewFrame]]; - if (self.editing) { - dateView.alpha = 0.0; - timeView.alpha = 0.0; - } else { - dateView.alpha = 1.0; - timeView.alpha = 1.0; - } -} - - - -- (void)setScan:(Scan *)newScan { - if (newScan != scan) { - [newScan retain]; - [scan release]; - scan = newScan; - [result release]; - result = [[UniversalResultParser parsedResultForString:[scan text]] retain]; - - imageView.image = [result icon]; - textView.text = [result stringForDisplay]; - - NSDate *date = [scan stamp]; - dateView.text = _dateString(date); - timeView.text = _timeString(date); - } -} - -- (Scan *)scan { - return scan; -} - -- (void)dealloc { - [imageView release]; - [textView release]; - [dateView release]; - [timeView release]; - [scan release]; - [result release]; - [super dealloc]; -} - - -@end diff --git a/iphone/Barcodes/Classes/ScanViewController.h b/iphone/Barcodes/Classes/ScanViewController.h deleted file mode 100644 index 7a8eaafe4..000000000 --- a/iphone/Barcodes/Classes/ScanViewController.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// ScanViewController.h -// ZXing -// -// Created by Christian Brunschen on 24/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "Scan.h" -#import "ParsedResult.h" - -@interface ScanViewController : UITableViewController { - IBOutlet ParsedResult *result; - IBOutlet Scan *scan; - UIFont *bodyFont; - NSDateFormatter *dateFormatter; -} - -@property (nonatomic, retain) ParsedResult *result; -@property (nonatomic, retain) Scan *scan; -@property (nonatomic, retain) NSDateFormatter *dateFormatter; - -- (id)initWithResult:(ParsedResult *)r forScan:(Scan *)s; - -@end diff --git a/iphone/Barcodes/Classes/ScanViewController.m b/iphone/Barcodes/Classes/ScanViewController.m deleted file mode 100644 index 2184eafeb..000000000 --- a/iphone/Barcodes/Classes/ScanViewController.m +++ /dev/null @@ -1,260 +0,0 @@ -// -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -// -// ScanViewController.m -// ZXing -// -// Created by Christian Brunschen on 24/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ScanViewController.h" -#import "ResultAction.h" - - -#define TEXT_VIEW_TAG 0x17 -#define DATETIME_VIEW_TAG 0x18 -#define BUTTON_LABEL_TAG 0x19 -#define TITLE_HEIGHT 44 -#define BODY_HEIGHT 88 - -@implementation ScanViewController - -@synthesize result; -@synthesize scan; -@synthesize dateFormatter; - -#define FONT_NAME @"TimesNewRomanPSMT" -#define FONT_SIZE 16 - -- (id)initWithResult:(ParsedResult *)r forScan:(Scan *)s { - if ((self = [super initWithStyle:UITableViewStyleGrouped])) { - self.result = r; - self.scan = s; - self.title = NSLocalizedString(@"ScanViewController title", @"Scan"); - dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateStyle:NSDateFormatterLongStyle]; - [dateFormatter setTimeStyle:NSDateFormatterLongStyle]; - bodyFont = [[UIFont fontWithName:FONT_NAME size:FONT_SIZE] retain]; - } - return self; -} - - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return [[result actions] count] ? 2 : 1; -} - - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - switch (section) { - case 0: - return 3; - case 1: - return [[result actions] count]; - default: - return 0; - } -} - -- (UITableViewCell *)cellWithIdentifier:(NSString *)identifier inTableView:(UITableView *)tableView { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease]; - } - return cell; -} - -- (UITableViewCell *)titleCellInTableView:(UITableView *)tableView { - static NSString *TitleIdentifier = @"ScanViewTitleIdentifier"; - return [self cellWithIdentifier:TitleIdentifier inTableView:tableView]; -} - -- (UITableViewCell *)datetimeCellInTableView:(UITableView *)tableView { - static NSString *DatetimeIdentifier = @"ScanViewDatetimeIdentifier"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:DatetimeIdentifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:DatetimeIdentifier] autorelease]; - cell.frame = CGRectMake(0, 0, 320, 34); - UILabel *label = [cell textLabel]; - label.font = [UIFont systemFontOfSize:[UIFont systemFontSize] * 2.0 / 3.0]; - label.textColor = [UIColor grayColor]; - label.textAlignment = UITextAlignmentCenter; - } - return cell; -} - -- (UITableViewCell *)bodyCellInTableView:(UITableView *)tableView { - static NSString *BodyIdentifier = @"ScanViewBodyIdentifier"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:BodyIdentifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:BodyIdentifier] autorelease]; - cell.frame = CGRectMake(0, 0, 320, BODY_HEIGHT); - UITextView *textView = [[UITextView alloc] initWithFrame:CGRectInset(cell.contentView.bounds, 6, 6)]; - textView.font = bodyFont; - [textView setTag:TEXT_VIEW_TAG]; - textView.editable = NO; - textView.dataDetectorTypes = UIDataDetectorTypeAll; - [textView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; - [cell.contentView addSubview:textView]; - [textView release]; - } - return cell; -} - -- (UITableViewCell *)buttonCellInTableView:(UITableView *)tableView { - static NSString *ButtonIdentifier = @"ScanViewButtonIdentifier"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ButtonIdentifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ButtonIdentifier] autorelease]; - cell.frame = CGRectMake(0, 0, 320, 44); - UILabel *label = [[UILabel alloc] initWithFrame:CGRectInset(cell.contentView.bounds, 6, 6)]; - label.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]]; - [label setTag:BUTTON_LABEL_TAG]; - label.lineBreakMode = UILineBreakModeMiddleTruncation; - label.textColor = [UIColor grayColor]; - label.textAlignment = UITextAlignmentCenter; - [label setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; - [cell.contentView addSubview:label]; - [label release]; - } - return cell; -} - -#define TEXT_VIEW_HEIGHT 330.0 - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.section == 0) { - if (indexPath.row == 0) { - return TITLE_HEIGHT; - } else if (indexPath.row == 1) { - CGSize size = [[result stringForDisplay] sizeWithFont:bodyFont constrainedToSize:CGSizeMake(280.0, TEXT_VIEW_HEIGHT) lineBreakMode:UILineBreakModeWordWrap]; -#if ZXING_DEBUG - NSLog(@"text size = %f", size.height); -#endif - return fminf(TEXT_VIEW_HEIGHT, fmaxf(44, size.height + 24)); - } else if (indexPath.row == 2) { - return 24.0; - } - } - return tableView.rowHeight; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = nil; - - if (indexPath.section == 0) { - if (indexPath.row == 0) { - cell = [self titleCellInTableView:tableView]; - UIImageView *imageView = cell.imageView; - imageView.image = [result icon]; - UILabel *textLabel = cell.textLabel; - textLabel.text = [[result class] typeName]; - } else if (indexPath.row == 1) { - cell = [self bodyCellInTableView:tableView]; - UITextView *textView = (UITextView *)[cell viewWithTag:TEXT_VIEW_TAG]; - textView.text = [result stringForDisplay]; - } else if (indexPath.row == 2) { - cell = [self datetimeCellInTableView:tableView]; - UILabel *textLabel = cell.textLabel; - textLabel.text = [dateFormatter stringFromDate:[scan stamp]]; - } - } else if (indexPath.section == 1) { - cell = [self buttonCellInTableView:tableView]; - ResultAction *action = [[result actions] objectAtIndex:indexPath.row]; - UILabel *label = (UILabel *)[cell viewWithTag:BUTTON_LABEL_TAG]; - label.text = [action title]; - } - - return cell; -} - -- (void)performAction:(ResultAction *)action { - [action performActionWithController:self shouldConfirm:NO]; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.section == 1) { - ResultAction *action = [[result actions] objectAtIndex:indexPath.row]; - [self performSelector:@selector(performAction:) withObject:action afterDelay:0.0]; - } -} - -/* -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { - - if (editingStyle == UITableViewCellEditingStyleDelete) { - } - if (editingStyle == UITableViewCellEditingStyleInsert) { - } -} -*/ - -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { - return NO; -} - -/* -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { -} -*/ - -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { - return NO; -} - -- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.section != 1) { - return nil; - } - return indexPath; -} - - -- (void)dealloc { - [result release]; - [scan release]; - [bodyFont release]; - [dateFormatter release]; - [super dealloc]; -} - - -- (void)viewDidLoad { - [super viewDidLoad]; -} - - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; -} - -- (void)viewWillDisappear:(BOOL)animated { -} - -- (void)viewDidDisappear:(BOOL)animated { -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; -} - - -@end - diff --git a/iphone/Barcodes/Classes/ZXMainViewController.h b/iphone/Barcodes/Classes/ZXMainViewController.h deleted file mode 100644 index 913b838eb..000000000 --- a/iphone/Barcodes/Classes/ZXMainViewController.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// ZXMainViewController.h -// Barcodes -// -// Created by Romain Pechayre on 11/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "ZXingWidgetController.h" -#import "MessageViewController.h" -#import "ModalViewControllerDelegate.h" - -@class UniversalResultParser; -@class ParsedResult; -@class ResultAction; - - -@interface ZXMainViewController : UIViewController { - NSArray *actions; - ParsedResult *result; -} - -@property (nonatomic,assign) NSArray *actions; -@property (nonatomic,assign) ParsedResult *result; - -- (IBAction)scan:(id)sender; - -- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result; -- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller; -- (void)performResultAction; - - - -@end diff --git a/iphone/Barcodes/Classes/ZXMainViewController.mm b/iphone/Barcodes/Classes/ZXMainViewController.mm deleted file mode 100644 index 93db5a920..000000000 --- a/iphone/Barcodes/Classes/ZXMainViewController.mm +++ /dev/null @@ -1,230 +0,0 @@ -// -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -// -// ZXMainViewController.m -// Barcodes -// -// Created by Romain Pechayre on 11/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "ZXMainViewController.h" -#import -#import -#import -#import -#import "ArchiveController.h" -#import "Database.h" -#import "ScanViewController.h" -#import "BarcodesAppDelegate.h" - -@implementation ZXMainViewController -@synthesize actions; -@synthesize result; - -// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. -/* -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - - } - return self; -} -*/ - - -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. -- (void)viewDidLoad { - [super viewDidLoad]; - self.navigationItem.title = @"Barcodes"; - - [((BarcodesAppDelegate*)[[UIApplication sharedApplication] delegate]) registerView:self]; -} - - -/* -// Override to allow orientations other than the default portrait orientation. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - // Return YES for supported orientations. - return (interfaceOrientation == UIInterfaceOrientationPortrait); -} -*/ - -- (IBAction)scan:(id)sender { - ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO]; - MultiFormatReader* qrcodeReader = [[MultiFormatReader alloc] init]; - NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil]; - [qrcodeReader release]; - widController.readers = readers; - [readers release]; - NSBundle *mainBundle = [NSBundle mainBundle]; - widController.soundToPlay = - [NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO]; - [self presentModalViewController:widController animated:YES]; - [widController release]; -} - -- (void)messageReady:(id)sender { - MessageViewController *messageController = sender; - //[self presentModalViewController:messageController animated:YES]; - //TODO: change this - [self.navigationController pushViewController:messageController animated:YES]; - [messageController release]; -} - -- (void)messageFailed:(id)sender { - MessageViewController *messageController = sender; - NSLog(@"Failed to load message!"); - [messageController release]; -} - -- (void)performAction:(ResultAction *)action { - [action performActionWithController:self shouldConfirm:NO]; -} - -- (void)modalViewControllerWantsToBeDismissed:(UIViewController *)controller { - [self dismissModalViewControllerAnimated:YES]; -} - -- (void)didReceiveMemoryWarning { - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - // Release any cached data, images, etc. that aren't in use. -} - -- (void)viewDidUnload { - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - - -- (void)dealloc { - [actions release]; - [result release]; - [super dealloc]; -} - -#pragma mark - -#pragma mark ZXingDelegateMethods -- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)resultString { - [self dismissModalViewControllerAnimated:YES]; -#if ZXING_DEBUG - NSLog(@"result has %d actions", actions ? 0 : actions.count); -#endif - Scan * scan = [[Database sharedDatabase] addScanWithText:resultString]; - [[NSUserDefaults standardUserDefaults] setObject:resultString forKey:@"lastScan"]; - NSString *returnUrl = [[NSUserDefaults standardUserDefaults] stringForKey:@"returnURL"]; - - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"returnURL"]; - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"scanFormats"]; - [[NSUserDefaults standardUserDefaults] synchronize]; - - if (returnUrl != nil) { - resultString = (NSString*) - CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, - (CFStringRef)resultString, - NULL, - (CFStringRef)@"!*'();:@&=+$,/?%#[]", - kCFStringEncodingUTF8); - - NSURL *ourURL = - [NSURL URLWithString:[returnUrl stringByReplacingOccurrencesOfString:@"{CODE}" withString:resultString]]; - - CFRelease(resultString); - - // NSLog(@"%@", ourURL); - - [[UIApplication sharedApplication] openURL:ourURL]; - return; - } - - ParsedResult *parsedResult = [UniversalResultParser parsedResultForString:resultString]; - self.result = [parsedResult retain]; - self.actions = [self.result.actions retain]; - ScanViewController *scanViewController = [[ScanViewController alloc] initWithResult:parsedResult forScan:scan]; - [self.navigationController pushViewController:scanViewController animated:NO]; - [scanViewController release]; - [self performResultAction]; -} - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - NSString* returnUrl = [[NSUserDefaults standardUserDefaults] stringForKey:@"returnURL"]; - - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"returnURL"]; - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"scanFormats"]; - [[NSUserDefaults standardUserDefaults] synchronize]; - - // NSLog(@"%@ %d", returnUrl, buttonIndex); - if (returnUrl != nil && buttonIndex != 0) { - NSURL *ourURL = - [NSURL URLWithString:[returnUrl stringByReplacingOccurrencesOfString:@"{CODE}" withString:@""]]; - // NSLog(@"%@ %@", ourURL, returnUrl); - [[UIApplication sharedApplication] openURL:ourURL]; - } -} - -- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller { - [self dismissModalViewControllerAnimated:YES]; - NSString *returnUrl = [[NSUserDefaults standardUserDefaults] stringForKey:@"returnURL"]; - if (returnUrl != nil) { - UIAlertView* alert = [[UIAlertView alloc] - initWithTitle:@"Return to website?" - message:nil - delegate:self - cancelButtonTitle:@"Cancel" - otherButtonTitles:@"Return", nil]; - [alert show]; - [alert release]; - } -} - -- (void)confirmAndPerformAction:(ResultAction *)action { - [action performActionWithController:self shouldConfirm:YES]; -} - -- (void)performResultAction { - if (self.result == nil) { - NSLog(@"no result to perform an action on!"); - return; - } - - if (self.actions == nil || self.actions.count == 0) { -#if ZXING_DEBUG - NSLog(@"result has no actions to perform!"); -#endif - return; - } - - if (self.actions.count == 1) { - ResultAction *action = [self.actions lastObject]; -#if ZXING_DEBUG - NSLog(@"Result has the single action, (%@) '%@', performing it", - NSStringFromClass([action class]), [action title]); -#endif - [self performSelector:@selector(confirmAndPerformAction:) - withObject:action - afterDelay:0.0]; - } else { -#if ZXING_DEBUG - NSLog(@"Result has multiple actions, popping up an action sheet"); -#endif - UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithFrame:self.view.bounds]; - - for (ResultAction *action in self.actions) { - [actionSheet addButtonWithTitle:[action title]]; - } - - int cancelIndex = [actionSheet addButtonWithTitle:NSLocalizedString(@"DecoderViewController cancel button title", @"Cancel")]; - actionSheet.cancelButtonIndex = cancelIndex; - - actionSheet.delegate = self; - - [actionSheet showInView:self.view]; - } -} - - - - -@end diff --git a/iphone/Barcodes/Default-568h@2x.png b/iphone/Barcodes/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/iphone/Barcodes/MainWindow.xib b/iphone/Barcodes/MainWindow.xib deleted file mode 100644 index 16b0753a9..000000000 --- a/iphone/Barcodes/MainWindow.xib +++ /dev/null @@ -1,833 +0,0 @@ - - - - 1056 - 10H542 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - {320, 480} - - 1 - MSAxIDEAA - - NO - NO - - IBCocoaTouchFramework - YES - - - - - - 1 - - IBCocoaTouchFramework - NO - - - IBCocoaTouchFramework - - 6 - - - - - 1 - - IBCocoaTouchFramework - NO - - - 256 - {320, 44} - NO - YES - YES - IBCocoaTouchFramework - - - YES - - - - - Item - IBCocoaTouchFramework - - - - 1 - - IBCocoaTouchFramework - NO - - - - - YES - - - Scanning - - NSImage - Scanning.png - - IBCocoaTouchFramework - - - - - - 1 - - IBCocoaTouchFramework - NO - - - 256 - {320, 44} - NO - YES - YES - IBCocoaTouchFramework - - - YES - - - - Item - IBCocoaTouchFramework - - - ZXMainViewController - - 1 - - IBCocoaTouchFramework - NO - - - - - - - - 266 - {{129, 330}, {163, 49}} - - 3 - MCAwAA - - IBCocoaTouchFramework - - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - tabBarController - - - - 23 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - -2 - - - - - 17 - - - YES - - - - - - - - 18 - - - - - 50 - - - YES - - - - - - - - 51 - - - - - 52 - - - YES - - - - - - 53 - - - - - 54 - - - - - 59 - - - YES - - - - - - - - 60 - - - - - 61 - - - YES - - - - - - 62 - - - - - 63 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 17.IBEditorWindowLastContentRect - 17.IBPluginDependency - 18.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 52.CustomClassName - 61.CustomClassName - - - YES - UIApplication - UIResponder - {{315, 193}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - YES - - - {{198, 276}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - BarcodesAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ArchiveController - ZXMainViewController - - - - YES - - - YES - - - - - YES - - - YES - - - - 63 - - - - YES - - ArchiveController - UITableViewController - - delegate - id - - - delegate - - delegate - id - - - - IBProjectSource - Classes/ArchiveController.h - - - - BarcodesAppDelegate - NSObject - - YES - - YES - tabBarController - window - - - YES - UITabBarController - UIWindow - - - - YES - - YES - tabBarController - window - - - YES - - tabBarController - UITabBarController - - - window - UIWindow - - - - - IBProjectSource - Classes/BarcodesAppDelegate.h - - - - BarcodesAppDelegate - NSObject - - IBUserSource - - - - - ZXMainViewController - UIViewController - - YES - - YES - info: - lastResultAction: - scan: - showArchive: - - - YES - id - id - id - id - - - - YES - - YES - info: - lastResultAction: - scan: - showArchive: - - - YES - - info: - id - - - lastResultAction: - id - - - scan: - id - - - showArchive: - id - - - - - YES - - YES - lastActionButton - resultView - - - YES - UIButton - UITextView - - - - YES - - YES - lastActionButton - resultView - - - YES - - lastActionButton - UIButton - - - resultView - UITextView - - - - - IBProjectSource - Classes/ZXMainViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UINavigationBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UINavigationBar.h - - - - UINavigationController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UINavigationItem - NSObject - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITabBar.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITabBarItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UITabBarItem.h - - - - UITableViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITableViewController.h - - - - UITextView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITextView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - Barcodes.xcodeproj - 3 - - Scanning.png - {20, 17} - - 132 - - diff --git a/iphone/Barcodes/ZXMainViewController.xib b/iphone/Barcodes/ZXMainViewController.xib deleted file mode 100644 index cb597648b..000000000 --- a/iphone/Barcodes/ZXMainViewController.xib +++ /dev/null @@ -1,250 +0,0 @@ - - - - 1536 - 11E53 - 2541 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1875 - - - YES - IBProxyObject - IBUIButton - IBUILabel - IBUIView - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 292 - {{96, 111}, {128, 128}} - - - NO - IBCocoaTouchFramework - 0 - 0 - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - NSImage - ZxingLarge.png - - - Helvetica-Bold - Helvetica - 2 - 15 - - - Helvetica-Bold - 15 - 16 - - - - - 292 - {{76, 20}, {167, 29}} - - - NO - YES - 7 - NO - IBCocoaTouchFramework - - 1 - 10 - Touch to Scan - - 3 - MC4zNzU5MTI0MDg4AA - - - Helvetica-Bold - Helvetica - 2 - 24 - - - Helvetica-Bold - 24 - 16 - - 2 - - - {{0, 64}, {320, 367}} - - - - 1 - MC45MTM3MjU0OTAyIDAuOTMzMzMzMzMzMyAwLjk1Mjk0MTE3NjUAA - - - - NO - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - scan: - - - 7 - - 7 - - - - - YES - - 0 - - YES - - - - - - 1 - - - YES - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - - - 24 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 1.IBPluginDependency - 24.IBPluginDependency - 6.IBPluginDependency - - - YES - ZXMainViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 24 - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - ZxingLarge.png - {128, 128} - - 1875 - - diff --git a/iphone/Barcodes/beep-beep.aiff b/iphone/Barcodes/beep-beep.aiff deleted file mode 100644 index 8854a590a2b5c2570f9c5f51214468924bf8c69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66046 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 z%0Do&)<+z)mv)#k=G=qBBeFo5fF)x_L%B#GALm905?avQxIZbKXZ}z+4>$9;bPiV# zDRNT)Mt>VFTMb$*LH5JrNMDI7z5jS*2DsBM2UdEq{FKyBv;<-pdje$)fd73}?Yb05yISl13YFy&0^c zGovc}uEt&rtcw0OU|Z-H2E^Os{?W-C(`17K-yh#U@k!#Q&~yp z7gk+sb7@TMy2yDUcrD?mk9cQEs~y_?@NR3ZZ+Cg}8bb`lnIv(_pS# z;zIOgXoB@I(`{3eqDSN1dv54v$9sNDh#KFA;eUL-1Yf7Gr)%7596w_ALSI?eO|(vyN~V=9T!dh4 zLthuFLe)wwYiUxJ`?t)WyZ02VHNAqtmvXDoPsU{64DcW93*=_XUYFuPFl}piI5}-lyqvqgzog|cH}nsqGp#8RuYI@6UthVmh zQn91$SXFsPY$J$k#i4A*`jEal)Ifg|SU^qp zQn_-STru%>-Vou`+G!spNGt305*=)l^??46*b}v-tf~4c_O-V3?u9)=!cwKHHg#^c zGY-3H6XHCHQ8A9Xd4-00-Hl9T7DSHwT$~r`&163H2zPyke`=p#yLpN=b4KxOcq6}6 z7}@lTN3ZJZApYLhaHw^%CMc(v zo!Zwq1d{zV@P4NW^1dHJ@OtPo;+f=O;h2E3h7&DC zmMWcCZyLBKd%~*dYxv{Rl~So{kEyJ0Ypo-*{|A0J+<2i4Ktmc-Y6GqH+P>K61G(G?$pk* z9IM^i{;JWp-)?@!N#xxXoRV%;E*Te3tb|+!J;L8ZHc+Zvw)*u^SRq*N!=X6F>3}O< z7}}8AV<&4|gsmDHF|}_7p>i00+}k8Vw%_T7H-vQd)$-ak_1{>uwpgyAd-uSg{HRJb zr?Y4w0^7;vUD9D-SPoH$-lbHF{tHPi=`-z{cDd?#35g$=lgm8 zc<+li#2g9>V5|vPM8#4(oPT2T5#^v~z`go?;|oM@mG+#L0q151rl1=lRynVvL8B2qH z(B$3|?p`jxaYlO*bY`Yt_NdxgSKg}>1KQ8@WYvFUZ>WCTK3=<<71Q*MYt0!IypUW{ zb{GpM=nyDqCBcB&LVM-X9OO%7MVw;(h%EN`7Pf!^_3I_S^>8GLkh%6Gi=!4;?a|Q% z{kJ87?R$FG){b`4E2i7FRa&-Pt|NCIXgBr@2u?_yhTo2nEk9U%Mitl}^teFW?RUm= z@e68S-S@uT;@0-eUaR^@c3<^n7NX`jOW0V#UB+2H;4daB zcNzANXIOg!zu>ncI;sD24hXzUc^`h*ulKQVn?rZBt`4(97(K!}M!Th`2Qhlz+J##!|Zs4I9GXvQ#9byG{_66wd^ER$8@Oc zH+2QKgL>-vsNyEIapcx)shJi0i!GnD17FSD?>-pPO5Yms!RJu;KIUl93NOCbO*a|Q z8q0)Shvbj@Oo7B=wIk>H0HpDCS5#GQ%Rdz#8`o8LH)S++x8LN)cW;unNVk|ch6i@N zAeajb-OC7dSB4UOvLfFGKZ_b=Byo)-4cFj>8nP%kMolxs1fA+1F`nMhF+EkZYA66As_HUJ@B%z_Ml+LcG znh@r<Q5 zM&(v9L!&Bv*Fi3`>1|Cz?Z+QhwGm&k8usK}==fapzW-F^4fT08e0ry1mo3+VOC%8- z$q#*DKGCuE0o1gk{-sMW%;LhCxUSp2q-}>~sf#PGyElYmWeAlK>+SmSe zJG=B3(IJ5bpY=rp7om5X7!x(ak$vfsvg)S;?s?LlW3Te~rB4s^@cjK{Lj%vBic`MS%g;50X#Pn5(M!P@(;k#lmYM|t zHq_NwaKFFap$hgt$1T|1f{$5Gz*#N)iat;8fPb<1Zo`t_1@Ic4&)m&}8gD*1tGjT^ zLV4f@QJQ&wmpJ?VI3c`CN4100Z2NBd+2n7`{vpV$Vrm5s%@ksvNS>@u#axwZt%|P+*IKheT zRRe(&2|^rpt*kxJLOYXEJN|x6iAB}cqtLXi7^G_T6XK#IqYK+F&&>>NPBIxQo!@tF z#nUPdI>1b8_%-5Lp zilDUp{BUqnRSExQueR&bB(CcQriQoM@4MjILR)$Ba-)9x`nwh{*WH0RE)nDQ#JQ26 z^fR7=a2Q!OM)%yr6S~w@F2cgTY_T1EM=%$>ff$gVPO4&y1BG=hJNu7Hsl8t;L;50} zJ`5fS4w79;66vX}58B-@eaob9yADwJ?nmVoM*8jyQJh{UcRSK0^{vX(o)~ z{vI;Zv4o>gk?g!@g(f)sw_$av+icd-*PzSG0kGQibQC`pgR^Js$8%BNaQjWpsDlGq z`v(ne);oXPGLOsoZ{qid10#T(G*$8s3wcIEuC#nGSsrUDS2NMibpy=saanAkS$#$v zNWEe=?8@@DsFbuWY+TfPoRV6M-ENOW&eIcN@jafv9!@drqT3Y>;lWfiw{EGmR>|W&H9X8my9NK%*!JNxHsT# z*nCHEb$zfJ{tj?>O_AB;w{7F>+(O;CoS&+51$SicDlSN$vCqn{sE(*E0xfhk&X(hs z0@1Ue_=Ug==~=edme@P&NC%-k7Tm)m`=3W0AwF~1Y#D0nB)7;6quGz7p@r_^w^i*@JkLe092RSRAqK-jx6$d1p*H~ck`T5fS*}Rer5|xG(hm`f z;@HF+zC3(B{sub490I!|eF(nYo^3Y&H`4g_Yv%B#oS*Wt&mY8@KO97u`i-Jny$#Y9 zeS-Rw-KWu9&-JEN^DbI`Sa=H3kp3S2B4Zc&Yw~YwQA8_NLxZFL=Wqu8cETG99QbI( zYOdt=WY(_264U2h&)51cssov&N?8K9tMUlxD)!WpXj zwQ#7YRVD70AQX#dqlP)y)bRUGV8chE!;cvKAM$&881v^5K}_1`17P93?8xz zeqOg262O0Np{XsHRDM^DI^_LO(?4rvw~8)HlB;5*30-q$z3N!aUEogrYG>e7a==r| z_5}}Z?k+w7FUhh)KU>Ve9giEuQT-`s1F_wq+ENBxq<9E8-nnH4SHU!33QlN`X%)~$rXS61{Y`7{w4jZ2dr!vof&bm z1CDojo-@k{I}a{Q&V;?rT7i-+na1PNrV0CF&f--}J4`O-u!HaP52(55e^xtMlv7(v zTlGo#=9=X>;d19Zl;lhCC$YHUgS1WXOcgnvr#tB2Jnl`cpUsIV1^zGDXnP`aFTx{p z2RbYHf0*g;uV@`58Ib}r+SMD@fzS2*HqZQnnymiuaJ206-|8RPj}>lTK1c_CL1kgB z1#yap^g#fw+P4I@V`Sf81&aAlhv47LTYOSo^xO23Bun3atEk#-w*JT?M*!iR$b z;BD*_W^ce7r0dLnw`Yu>FI%Den156mo4sGMB}Xj!_RUY!Q|m3g-F-+68;u`b4pmQ1 zdn8!yn70waPjYnd%gn+CE%7JBr3Dc0$G8w&m=5R{nE&9eGi$8%;)CY@wN6aBmoY}} zeqE-N=Kd{}en}VKD%mgYY{bb)f;RPw@qke^Jj`^Fl4Ef(JlI;BwAH>XeQwg8K8sCE zdWhwO&qL3n&>Yh2k3;Vm7XTLYx6iC=IAmlL%ZB6g?kG3r+?ICdQzXxRImiyQu2u@f zp1Q>|e~ll)@Mcdk^dN_5gWW%A^O12&_F((6FodLJU;N);=@^Np2ZC(-4|L&ZCBUO6 zZaSk5p-=iYsd=3HKvtK1Su~N47sZyjig&mB$}!UOT9`RV|35rt8sYO9K#DOy?G~9F z?qyD3uB88sJDm`LdmnTIv%+Q2;SAUc+N~)9sJO_P*lL7vby36cozD~{Ggm1)Tl7$R zxY|RG;wGuLX?KlW1rJVyx*jmA3-$utOQ^AXmSKy0y2J-#TD%cg7Pkn?@-s)7;n}cR z^F7v7nU#51`^|~ovI`^R{8Z(tPddqD&Pfrx=pT_q&2Fh1U!lA^@@B*tx_Q#w18QD2 z4`;1fXn=pp+=U@8NhU<4T_Jvpc|C`pQ<$sRP`GHu2stONwhV3yH~EzXji!IKQZsWA zGGbnVcvtafvA*Gej4E(e6&Z_0)8ME{0OhUut?&38a_pGu!deCg7%?jA>JyyjPPaIX;F6jNm-?IOoKB|8`I-srcpj3tFjmYbjPAL#InpD3@e?8 z-y5&TUkpmeTyr^$z<^j#spc&po-;ZU033dkGN~nP;Ga^u_OTuxUi|^up$GykF{6bKV2{HDr=2GxyS*&?< z`}D+~GOccF{&^)cJ5rLFb5(e}Xo<+7CQ|a6e@vM$0v_3H(?20{UurH7{Ts4l;Y;|T zOekja5+dPo+H2y`m|Q|MGaFNnJpq3_YX>Qo04%23E>9jPTQrLLx zwl9qDfj0!8nY0GFVYE11+yA*r{x*A+BrUIBr2Sbc9&MH@d_`8;(&>GMT(o8u!nh0M zMGx5BN?VJ1z0@9$$?7BKr@)Ba;fHYll0A_%cGvBK#<~EyUfUU~x?26{_xBofZm;ZM zc7f<#exT6umrT^$rk5R)25TJ6&gctqf2LRXYy+&1Id8jcQ8(i6%t35adNjT-VL9G6 z=mF-93&%kRj)f95YygBCG`+fdseVn-M@@gOLVhRrqa>`bM}n+cA~WM$P=#rBj8uZH zCz@Pp%pV7xw=Pb2V*kGkfAroZ=kV9l;|M1gY{IYhr=nYkyX>D?T3El3|Ia*|`=oe#PKMCF$Z}|;`mFd8Z@of1Y}D<9JeXMEW@WAnS#MpJcmlpEgO2%` zl|x8QOD1w-$_QmX49ra&2yU9~hbW{Vi+Am7CVPJ~M}xnbRGV`jO2_lY#rump#HSl* zvM2qGYF}gA=r#MLrZfu9qBz_Zl9+TGz9!=(nw|;Ar6w!!_y{iM1GNQl(!s*^{&*e` zDB#cBXtXd4mY8c#=D`(a+5eM3^KwNyemY9#s5A1@LtR?rl#Ssd>dQ=;HyOBN{uR4N ziw+{SOBUjESyzdwltskj;bNSeJc;s#J-2hxvw%{mqK)-?X?Um`B#%ZE6`K0-BSYQ7Qo8rD(K@yK!knfd~8@c0zW??2=5eBi79qn z?J(DQhc4Fc0yuNqr$N=ldfqo5t;^>$`K{bCiK@s#5?vK8RdZ0PHyY^39?-doEiPp9 z2SEJOs~5>ahGW%-}=j3V0nU)I-&vhoC-=IcAf z&+JMGHs`r;VG(+$w|a$mke8vjG5l$G41%8sAeERigD0)C5;5?#=@S@Q);2;w8k4Av zVH1LU=$L}2cjbt5HTXH>UytEKf{aAHF7cd@*|Q}&?$KXsN7 zIJUult?3?l)-o_mV&j`s0Kb;;7X2=hgcGEM;;JI8F&}6M#5#x7(D&mUz|8^tba!L2 zzM#ZbGo2SGkI8;14$ZqHI{(u_%xwnC_YU3E{xS6$Sg3U~59zHS)coCc#~0C1=qxQh zBWpSFY_f)UI{X#hnqr3h2zz7~WB>u*^?jIu|4A||Dkf<3d8=g~b1KA9`6i*LY=_9u z)*)v~*qYz7D*aRJkLfz*YQWa$8&Ga)IpRZR07kP|hmTGmi~k z<-(nuDy$yUCw|+cp?{8$Z_F)~Y$)s&KdfZQ7+npj%j(-Br-A*GiO#j=vcRv_cjBwz zl=L?Aw+d?P8fz|`pr<)s38djEMX*c9; zl6z(E7FXt_i~cHkCEnN+D8Dzz*Ls`q1{Ct#%szS$Fd~X)D@y&1LM}1GeaSjYT$_?X ztdCfYtED_ZIomI?6B(qyuKuuD+do~#nBvRY|K)9w3vOKo?^%8W)2r`zLRB|O7HgX7WnTss`RtasSl(~en{@I0nB z*Es1vd?RbKa!m@C+{Kcgh1QZ2l?YiVTce_=o{Ss?22aE|qs>@>HsI0tE3nq|kEre? z7x1a+TEeaPe0)iO6m!YxB>V{=0Mes;X6eL+PTs1B8#OCPRN3YPOAh255e^hy7jCM0 zBHqLWDAsBh4etf_8_Qf%%)EozK|=}tu%+n?lqL(0D@&sjF2s!Ebv_lCP#oU@YF1-& zNUE?r*+DUl{%#+;RIpq9KDS=(o!2Y5SA0aW;Lmlrdp|^d-*9jAA}rU0Am6gs6jo(j zoOIm2C!-t1&HR9~O8J9FM?o-JuTX>pao8?+k_0RnbeUx~nHlet6l;xnYZc7wr4mdY zT!bjG6EA7}BFh`}REsB>`TzuHisyCCsv-&oRi!RK+{n6){hZ}Nv`E=Zbc#5SlTi$) zBKuJo!?*@y=;xTtYq)P5E3q8r<*60@xjvF@`CKvZ*SJ{KmMN2phc)MCrt~n3Vk(@m z%PMaEpv|V#E%2Ke0`&8AD=atR3bs5r6aA9p1FyEOv?&<=+e*m$GmWd+t)KpOM*HM* ztOAwmCrvKUN`6?aNWvq;|G_gOOmWjX!|#&9Ve`C&iWAxMB$UrDM6<=uCFI8W z@;SE~jcKAz-+=gQ8sjzR{S!G2tx1hW(6g>$-(?*mc&9ueY>Rk~drgf-^5Ag0TI1g! zi2ykJv*FY@wZu#p`o&Dqo(qzq^F`v29FregtCP8@YQXif{L0RM;&us@bwj!s%)#7AVTA#O}KPe274Fn66# zIUE5VhD@odEJevS)6?Ni019^3$Wif$faiX zYY-6Z8lMeYwOD}i&wPz5PXiKMVn*@yJ`XTRoC&_jObq#-bjUKTV~Gj>yK%Ipz+ZhY zw?K9{?~Ekl$AskVp9L~q-~Tio2ISZS*hSMDa+YOXSfh<|Qa}7&rVl1IYY`rm`W$~a zstDUj_e3I)OKsaHOMw-G!kOhww+tssMzx#sUdaU6VPdP#pM(#JpNhg8STer>np!mx zKUU)Ka+*rp1W1ewhYqD|MlQ~>!mY{z5*_F6H)X^CK8yNzj&Jx3_GNqzs6#L?JJ7gl zJgh`9eD=#V#fRK8lBTb8QS&dU#G!RoenR|Mvt=elzZnxa_1T+eDV-0uxtLN6|1aYZ z+F|iCtUlo?wl25|y@yoga1K%n-K=W`eCZCKX{cLZO#hKSJe=3AZ20_2YAF0EHLKvu z=$-XS!rW_d*fP#gKsYzO#}^5(irH*4m|6wz%b=r0X*+SN7wpHq3-rLuy7(ga;GK4- zh6!L_{%Nz?x^)wuivJ!F<<3?&QON~tVa$K3=@t%ezUz% zDq!J4j_sb*K!^Pc&!f7cfSCOZ7Wy=P8Dh%vhP}D!17rg?-)ckMk?E12JB;&-9_u>3 zJy$;~+o@1DtyBE$k5Vzm=vogOn^Cz->%@Bh`?JTRe*>M85H{n zaugEv+@X8c(yl`GpY<>H0n54?`ZTB{)KFM-Vp#Hho64`;O#Z%QkBl|2Qr={+pQH5c z)cLvYGL-qRnBF%3v6WMz6Xe^%DEphSxybt=0Q5L{CFVTB5ha@5;V>YJv|HVk1>RJ* z(|r8b4^u=5V63c^uYFr1Rcbny%I88c6u8M!WgDzn>*)5^7|Q?SL{C(JS<(Uqus^O1 zdMMJ%UhUh7;JW-meuCB@l*UT&ud)Cy_z8X$_dmN=5epE9eAb|sJ2Nm>Y__21@+1(` zLu0Tq7TkKeHqa7O_QN#!%Te!KaYc)66e!yGV=`}5ru2Z>c9{Z6Q~^DB!$SeV#>9xc znc(P0fL&2JP`}_`@bk1%)OMT-a|-wgvwqYPb#I^uF6f{^*VN6~VOChpOq72%&em=n zp|>AbpB3;F=SH&Rc>syxJeIAFp?=U!2R$%yBY)1kk3IwV8tG#r4@`tFBELqtqkYls z7D_Z<`v}SIdv5=-m1~2q*<}?|j+-hgFVNT5nQ8ZTY*3sYBuR5dk4r8A-%79IA{1I` zhE^K*!f-1heP&VA3V;?qdR5gs zE2)VZw{9{U9^|l;ha{_|m&fhJKOlD`e-UJ|8QODoXW+-NOJT((LHGvCir}v{$=;vg zYn_jwiFRkP{3#opn}UeB)g6j>(Q@4OpW4;Hn^gy9ifXt9adXFTG=HDsmwdgHY&s<| zv+a^pIW;QGy=mHe!CMU5!+*}43hxIBgV)%tqYooToj&4z*&ZjNP0NY<O%V3UE~2$Jxq8j*-;)O}l$Q zCcitZ7Vofd6c!^=MXjWdG8m&r-4IOD@0qt^x+Ww8c++=--8YYNR0z5nPX`PVYsONE z&qY>vI%hcw+KjUORd)-pwa#lQs346J+aj;VSR`+JG(Lyp%f_OS)PFgPUVfd(q z1HbA?A)99I1ciW^jDGtTwlS-a!yxESBW&8# z_V-u?e~oI9G2SgMoRpGT05Le6$jF zji8%FI@M|VoC*a>!sE^5Ocg0nbH_Dxz~3>4-HXAsINHTF z60D9kO;60Q{u&1M1xSA?%?4?cNBR;WH+%2k*7m>h_#)&mxXL2`n|cTTi?eqbdh2nI zR)ialiC04oxXhotNxGz5LBjNVJ8kG}!j!a}gGDtp10q^KPI5U5bP0obvMz1?(Bs)h z0zX(x{{hG2g8=F}NxttM&Avd#aeP3Q#d*dZ=z903s6&_w#4BLDOYgWF>Af88O6Xw` zV>>2Lu;u`phmDP9vevbR9h{A-y@N`T%kZ-P-LsmWBv@F_X~)F^XUaA4K_6SqVgEA| zZhp2_1iG!=EGZFt6Ge5d1kQJVY9x9xWI68sy%(HQJHKK!wC3BUwQjUH%6e-I?^dh& zB?{36J)u9r3f6;i5cF(t?&|+aZ5BuP#A#CfBFFDD|FtZj)Yz?e)L_=xuXVa*ewL&h zNpKU0R=76v48#@f%}8YPFeJ3)#jH2$*;sJTu;Q`o#Lz#6;l5zt`W_|<*-LY+82I9q zElc-(tQ+*lOhbLbz;`I!2(%-Mm|>sgMletEd^xh2j1wu{hWQ1K87w?9tF_QNw(Zh% z7JEWx>|ZIptavJzH?HH)fC{-kQJ456*Sr1Rv~6NFGj*8mLo{*eaiC-F3mqQeTnUpl zM@jFdx;-Chay<=$y>5@WO2;`bC?vkk-`cL@`1CuT%}D$ZK^CU<9(Xfd-184~5nqnC z>6!IdG3er*Am8qLYIM}sc{YT;2-50SggS+J<2Y)4(H$|#@*Gj^@U#>3xT-nP_}%Sz z``FgaR)P-4@k(x^+G{9NctpFuM>$={y#$To^y5zRAG*&MjC&d72blkiy<^mx!>KCU zovt?61XQr=8qg2&#feqaDPqwfVCB_>v#qbvggtpdNb7nQWxQmG232} zMI;YkPvDY?8@oxKYX;_M&#KVk6^CV*L8Sh7cZroJcR75DTj6xLmq4)*{>`vdSNix( zsJ(f>H1cYPeU8r^q4pE*gBGJyzTVmkCpA){`a($Xt~%_$9lg+6R;HOZ7cjb7;4gim zc-$Xv6mstZp0IZ~sJb$pHu8UYjt!R5LsfUZ6UM*N(15#cf$$M*Juwq%=e}d+6g6db^Bvw(MK@5bk<6 zb>Bl;rWEZRG79kG&K7uXh8}Z#k9C9VT$8Qtl7AX4XlE2wRBM5iyFJ&EaEG6$ZD|^-s zdlBn2VU$zqp5HH|&d5J`EjL`ED6RZRXW+oOY`I&|Nsmjj)wIfy7xZHi9u3=P?{C`rQPbHev8RQ?gMZN`zBJ{b=P^cn@1rEv*^z>@4OG0zSB@( zE{TOYihb`A1$82GW}eV}bw}uT#ak&)dYWCmx^AJ*v-sB6*sD!5{BF(Dq5lp2s{!!$ zn4q2MV6P5$WPaxsX9j1l zk1_L9>%Dn{o#dQucc&1J9bDXX$x^_F>D2>qvM&m1-(JJKu4|Td9XQzP_HO+7F031& zw~w+(I!KGsGbs>@84|$$5zdbI!}hv|+^o?{Jx233$}+sJ_kZ-*#={bd+3m2bt_S8L z-RWbQL-EoQwRhi}i5AXoV0ot%Vj0`YiNS04j2ztV6{g10Vm*HVHpr$TVds4rd+&!;bzjJmg1w?(`mJv<}StE(!AL?z`f~;aOva zoOqkJJnHniK9#mnA{Aa3f$&>rK6m!m?C5xhHgtY-`O!@x9}`y5o(uzMs`{^mE7~`vQ|0wiBOxl~^SU=;3Je*!5sPTNtQxbE#UfA#9gjhW8-aNK*h$j7@ zD()Q_@90_#sP5=+ptF_`+qq;9`T&3ysC?nIeIlAN0(wt+hl1mLT==%%sSRc#M(r4i z$(7xspY5M<@8tc3x9d6v{ljsb@$4?tjt%`BnoyH@+b7m_Tn7SMFTy+9hKPY(9d1fN z0>w*NPBoi!^H736InPI5MTtm>CGt-SzrL^f?d;Fy|zqKHb|q>%==L`6In#g!v`c@32QW z6mhZLV$T~E5V}c!iFrvu^e!9NLq5R2;aJRJ!sl}`EfL+D#XUsv>pdC!k)kAkHM7t*7Gqmv^x9U*kv4n}w#F>Pfo)H*ZN zqARq7UN_gB92x3G*EUcU_kZJ~ee0A~lJ)(6bo;t8ria?(kiS~*plUi^IWOjidd!H( zR2SVFO10Tb_Xn^9;y5wiK~HW3xiTq})qdBt!M-=dR&zK{BkkmkqsF)<(8lh%@wvKB zk*M(Mlj_&8`^_)49k*T7nu$ep%(}eeKlj9naw!=j8$9dG3#}234+*tgQb8y&=*(6@!W!@_! zt>u12U+n4zr*OL_?)F_&E|(Dd^L0*LVbj~%)>}Vq`Hr${7dzeI(LLOSV9LGWcFLmJ zAMQbRuNhgx%dG6W1qxrB|irJFE0R0>zBOoYH(JWpCid*3rm`2;EV zGwu#{Q*ydXopL#H2V0KFlH0vrZ$G$3dPN!A8)#_k9Iy;;tAXup8^eRyM@eV;Qpv;e zK4 z1^YZ4jrOyWonYJ-)RJM{7@`yRquoZHaWC^8!Jw5FoKI75cJ2Q9m{G^G}ATTnnw@+bsVuZ^#NAiJDll07X zT5-(OJ|&`fwajhk7L%x17_dj<%dqKZTY47_t2kJ#F=SiEW*?(IC_DMwP{xN%$u1O> zypUvY1&xxgkdc zV|ZKR3-CF`ho-x!mdf|VTUjfUy>aaqZ}vPB{VQ~Sut?KBSGhXsiTYpB`l4-8Z9P-^5%mx{ zyk|tdi|7{^Cb4sFBs*Qp(yHp4(^iyaC#4zfLc4AX|C~0OOY1i|iVC;aOt0#nf2_G} zZV2eBoaz;vt`4bH#mD^A-WH!PxhU(>I8)jgw252kQxbkRlFZRk$Xu5kZ=aDm)Krvm zx7aQJXvm56(!2=_*0g0F((kvtED~0nsy=KewDPjYP{|o*d=fLxgqpHBf=-5Yl3x{P zWtEm+QW-Nn&MWXv*q_*AzJBqS80}MqwwM;YnxBdl#jE7U4G*F(YDNBh?F1?&&&T|s zB)C*%D%B0Mw^MPLUDIQI>(ZZvIkRpFvJ4FbpYhTk*6-pa?C6*qK_^2#3gkR;bR=LX zt~a4HPF0s=x^RJXjDAvNZ%wYxOYIkY&G=VCO<8Kmx%!FPtFBnpdd{?r^#LE1Ig!V6 zjY4O^GbuK$kR5Wh7O(e|kei}~!8=4ro*l>w2u-Q8&5@}eDi$U6&d(FQ*Ub*KYPxxz z(EfJK%l9|EEbm;fqah=Aru$EZgZur@e?dIu$f!f=?xI$OMbfu*N2UMKXN84cA0jKl zD+BvU=5u}}pL1oTX&aK#I+s-@rRArJTInY9Z)<@^vVN^Iq_AVn;{KtboR_$1%;mUE*gl{#F=lZPRE|pyEaGP5D>Dub3$9IR6&}pWOz!X?jUW*#gr| z-9DVEk-KZu{RN@J8kv-ko*U$24jrJ#%AcJutS z?p1qJScQkB`}C(GPiQiIzG$!GKgM2-tkRN_MfE^?(V4Cq!q#VS0!AtKM)u2HAly?B zEB$7Ql5KT<5Kr*<6739)4E`Ys@?4pyM)OmZ<{fFi6`zta3nqxS>i!E`qgl!8sN=h1 z@`Gy=$eqvu4WD!WxOXTy-2HzF0}GU0qFUybiaZOiOCQ$-NRPWMB1le!=ZDV@94%pT zy^~kFJ=0D!3{HzLZ=Ezc|1VLzZY=+g*56~EexTF8z+SVy@_T+x(~cZFo~=ygtxSIz z(l_&dObcyi@tl$|vXF*a=^zjoSLI`lkVQ`NkCd)sElE~6TBJ7DY80u{bQ9QBjZXq}ISNtq~5$|Q7W6o(O1bAt?Gsyp&s*8)t?wS_rS+*k8 zD~2Y0l<$W0PhqO8M}iB66Ow(EUNV2{PVpPojo8qjIs83>NUw|WzrjaEakDCIY}NOa zZiQ7+tNvN!8_hRg5A9tb%0rEwrF%*?)qT|-agNV4vzMiR3E(MXBGfrbVVC^p(vvku zWG$UZ;*lO3WBmE=fcr*#h0hx% zsav_*C|7Xf|EL3}E4?G>+{eOig&xuswOgeR+-pU_yfab#!-@jc;)~p6Nf!6!w8ag^ zw1o0CNyGDxh_>pEg~n=39=G(d&fNvKYu;BzJ}>x9=F;f9n!BQ= z;tYb%4(V9DP?+poLkmg7S=Ral1V*^^YFhOW{ocJy)Qq> zWGa@~iqfi04;84SMf}XXl$d($KLM|`lNfgmZ<`kvUn!q%3enHE{iU)nR;J(d^-g~t zHYjVCV2NRgWOl_dsofeSVX#KW&ImN|%VX=jyTxa~0gCUIrD;d2x1}5}njq_F5JpYb zM)+RP9s~RG^o?gqJCuB`i_)HRd{p_cUZ=11Zhh%IEcW2kf?KYl}MpjRiy6yGi;oJc+!$bar z^bm@8gA#Y*d8vPz)~4;RR3(=cc949~Pl@o;dU=QGI@8~b6?I?B@{86r1gT%T?kQh$ zzNAM5xH8Hjx8?pNJX>&EI@I(-y3h4fG?2%L+84$Tl8VJ#XVNQoNt&dwYg+emThi(L z-=fdD7ol&pEYCi=A{V=0qG?9Omx7_@F}Z_K52eCWn%*TiE;B58jApFpc5$5aTfJ5~ z7u5^9d7C1f5r%+NshE8>S?j!zcA`E$^>~?oBEz^d?xM~!Sf#OYeD(KiC55l6x>cRd z``UaZdoS3P!SfoCuHZ{EQOpZ%xp-CSF)1>?mAr(7anR2m-Yt5*uSxF9?62r%pPXi` zWv5alo8y&v+hf;i&j%)H=P;)kURpeg2bF)S`KB+o)@8}5-1MtH7t^1H)@O+XKyQ(B zuMkTcEORBE%pb9D1CNLHja}ybB>pnAD+(-)X_u?53PzDpmTMRtm9OpKH(q-Kw$3|h z_9-bZ9Z`EEza?J8X^xo?GCpKO9O7L~ zoPkfJzH0iC_PZ(~C8%(`l%qcqaatSUy+J2N?Tlshf0aEddQ-1bH@l80>p6SVserE; z+Q_xJt%S=921)yy4ocs-c8F$pUXS_^>IzyfLLM!W4$vLadN!U&8(P6ndQWpffI8-K;=b>Si8NJY*O{Rw;P!evz_t7aL+&3&?O zfRGG@7dyRs$h*w9G1Ih9#S=^WNDbx`$yc~BuA|@S@JUf_zm~ER=D&&%`{6WgZLice zB`@MFd3$3YY99n%(2ihUH>|OYDi&9?tXXA`&%~sqG)|K?7N)hW5F}OSUl4cG)`yAJ z#hwoBX4ehl8Pm^l?*e^;D)*>crA+o{mEJ$-j`C}CcXg(?chL)3PQ6(61$7aJc(07g zjOZL_l6>P1N&ewdrLC%0r>e?EC2lqb2w7T>kiF_X9F_K&eNFzQYTt@2#_{F@*_p_Z zF`3stT^_P0^Kndr_L^i;i9vast}OUbCZ9)Q-z(6}7)pJC)3j zcNqQ?ur=)ii`0FYHM#+o?*+dq=2RsZhBSZ9x(VB*|MuROek?RIi!XSfKPf#>em6eQ z;v>7xOcrhr4320QtMKa|-;Lo^{IbnT%dJ_dh$-4E@22k-y-=O%_et#ujk-tXJB6=H z?^XZS4YfX0r7(u4|K$Mra=bM4wE0_FKm~cmknblRs?mp?$!*J9 zsvhSaYFJqNu0&aQt?sURmaAPN`4xM#C?6Lq8>!{3+x~6h}Q@gtg{ zoJsu<@%=kTypF2$)5}7c$C4k|G8K(A1;3RQTAVLdxMbRbBlE^GtK|Cs#RpLx}UJ1V6g0F z&0P5p;NfZuW!WE zD1UPPZYXnGQocP{vDnl-c}sCm*)9W%?BkmJE7cbn-}ORE8?w)Frus|XSnK*6K2@yz z?HjJNgq7qBitCg2L;AIHul$5HO?rf>jSCF)2pbzS(q{n4(C}o3<&NTXb<1S0!q3tq zojdZh`ibvlO-m>>^fR9+&M#Y68?8TXFVE(&7AtT1FUnjJ@hSJN@O^%sYCfk_)Orp6^!CF#}CFEQie4N6ay-~5`X0*F-uz?&Qs6vI<47?*m?8nb)_eYZS_L! zBiG2RKu&>jTHs!lBI=Z8wy3d4Dyyo^m5*{Kiz_`ZMbn|ZgGUSBdt6M&q2m?p8Y30m z$g{~;#uvgl+KK#6>e(Je+A*$iMsuyGd{5z(#$%drI$y=`Oj5QEey(!Iw9&p3t4mtQ zyEaUcY0xv#CGU<=EyE87&|-3LNutSlU$L?7a?0+~_VIJ_<_Lys4g?3Omvbb#*7iLG zqpFXPH&>oDgWP*yVCHhK2g)1#f^5Io4EZ-O-}he@4Qe)RdRycM=1 zha!98JEX@eL*;WVwbEifqL@@ZBQe-$ z5kAn)m9PU zXtC&vw|7*Z@ScGI;$EC#iA~N7#qzozDep@c#GlEVC0M9A9XwyXfiqD@*{>9|uGUn} z%m2}IG503$%iQj@P`R1EE2}#8j{b}!r);l$h1n%r2QLc$^)*JEjLh;ENV~8=60)yR z{4)JY5fnd=dl=fqjM0b#o~q9<$LdNghQg<0AF5~GMoUdj4{EydozH6J(Xd%L41ptW zko510a`{%vN9lje!Evnuj)gsqQTTk3rBi#8X={5$Q}vzX{zZP$OZuTvz16?`qBY_0 zouPG8Lh+umccy##eEUDy5@wxpi66=w60s(CtZ;h%c-fHZlLVhVl44G3tUkC6|A|28 zH7UL~2u``&^i;96a&?ltV43*5E-`$qda-xBW;;5Q7uOI~Dlh3#_fe~JzEG8MIx0H^ z`eo)sd8ogMP8Ob*<d%6~qD-si8M)1D}-w;mqY>{A~-zqvaZdI%(f0o!epC`=L zt_dBc-tKu=D|2NU57pi)mlOpx)M=9GG*y_#U1d;kkZMcx7wrh~?c#Itfck5)O4LGB z<8?P`ZFo@N25~CqV&WfHu;OriVv4!+V*LBOJ%TLqYp@^Q)U? z=N9A4%=KR0$_f0*S-G+M^#dhO%X-TXnA2rPU~i$y_hCd+mP= zekNL9I70T=R3xA5>LzLF@h4^-e|HE+*voTi!gboJ=-H@OoGmvd4$V&#iL~cK@2KZ^ zDz$;`cE*jh=CbOdRt;I2<#doL!Q*eGcQ99VGWwOah4^6cGI?740Xc`R5wpG4Mx}?@ z13!!EI3c^xMmwt?I%6l8PYJ`TK5&jETc-3V5zChu zw#VGpqy)B9Utqd)H?6G-2Ui}bs>o}$49S@Uzbf;5{FDdDbC9cohX%WJM#Vh&a!Z)B zoRJrI${&XZMW6H?Av?`&gaWoR(r}H+T)}H*v|xQgKm*Iy2zU;w}B%mbDR4q z?pKy24JtS*ZqSX25U59c-_@kx)&@;OX333`2X!LdFlYO$9_%~HmH`(tm65sXQ=&12 zBH16)clk!AMKaXma7;S??~p!mcF%hWThSnb53N{Q?oOQczdcv&!O&akNjwj&mwUCb zZJl4)^P(*cS2P#gUsNqTdMVR_ic}k;H)tWjXR5qKeHS^P&x<>F4U1|ByBnw#edY=i z@4L<^=G3oDDJ!)maPnTpu{5_rg4Dyg(PW2gME>EL#TC~JhMT|UT5(e55#BZB*pRZU zjj^3|SaPpaCEsO^lYIl(qAtFPkwYU}``1eHSn4E|qnkoiyEJ84NwR#WVOxwe)O8KXGwc>7-Ptvvm zt)z`^OoT!`*1KHO2G2HJYRE2GU81fahS|i=a94LP2%3XhG=%!#GrW5UGCJxMXnsh z_*k_sLf@(z5qpwWy^}b>zm#xB!9V2srWqdiMZJ}E zSa-^5EugDBs-_snG@Ek%g`JhZy|*cshMvftD(GvNER~km%C|M|liC=9xH|t6;a8(O z`u>r%W4uWIVC$wRtT~+guqa>FNB=C!rq1`5s0%2SenWFe(ed&-HOCF>ZQZh0FkULp z`j%%>;hS?l$K@LD%L1zQ%MaU@NEfoZ3T_2;3jH^BuJ={B77j@n)2t%+>`1y*D3o;2 z9gJ9}KIGF{Bg4B5n;OL>eM-Y>x9O%j)@2P~2Ps?oS7ok>Y@_Zg;uL(5tv5;JbDdks zZ_8q1xgljCujAhH1}F4GSqgviUB%6clZnUkuZs3-bz!~Ki+Q^=Kiv&^mb&|82}SDq zQjN(iP;KCDR)z$ns-{JUX>!HlBE6hdr;#VpEyVMAucPOLjS4yOMB88l0TrPvO-Ys+&o%63H_6K!Lyp=&-koqF&A{3B*~>y z<)a#}$j*Rp(MX@Ck&h$31PqbPVy{U0GvF3Fd>^Fm{%Yqkeb>ZhzS-4#6FvO8?~WLs5CYHkmIY zFL|A9j3T`zJy}&m%f{$`6V`e8Z&8<1ZvE!w)kT*om^D)j7i_%j2aF@io4%)%#_(P_ z|HfT5PL_VIN{}zJDWsEFzXkgO^`Spv`+2{YpNBJ3`dh*jc~!5HJ`@g;9M)+g>eY{Y z_Gr2SuHjnasgic3{cG3i9yu0gt!DjJCip+f+!X1d_7y%Wm?|4wQ!4N8^p#BFK8p1T zxfP;}o5Gu#5QYO4v1YyEe8tzq&-qSKwT=_ET78&TtYy-p@*H*fVSsr6yqor=Z3R)H6|+%y*t|l!HTjvl3%g>E=oVrF?mZ#xAlK zxLCB#XHev~h&cgABwg5dlGZsR6))<#r~F&e6z`W85&N&^RM0&2Nw!os*0!_YbJc?? zhVfzZl$=JO%7k86*)`NBTOa@iwnSUrNne$KFT4Rv( zcNJHD%-SGb!rCXu3j7=v7VGKlly8FXQ)XDkDt=exCus_INOEb7Dkp?g!z+f_Ac5HHYLQ9rq+>xf^50g^cCHI2rG8 zLI@t4f}0qMOBJp}O94lOwYIQV>V00VG+*e|dAI9@rFF&Q>vwCTT<29MxH6?UFkQuo zda9W#hDCE_#dTu2*nLrao0lAYF7!!|Q55gdA~Dr{Loux3sG@b5K4GJAW?Z3G$d{@o zcqD2^I``&#o0gY1wjpV?bA_U&ZU@oq;qkrl#t1w$w}Vcr53(2Nrr3TKT&Vg~sWeuS-(CcOEy`-I z*UCQp;%r9jd;MF<=W@P$Y|}lN7u8?>D(3)AJai|d>6uD6S!MC4A4$c{RnL~<=rG>RnS8CU1 zt!GVF#`^cm@=Q7J*-j!bLR9!;|7YY`>;Ra-1i zaCa8}>-jx8Cv;n|P*~!zG|`9lRxE3%Q1mYMO88{FBpk18$6u!&<#Ad&(#1CFP4COM z6pm~>q5eVVX1@3Aq>K&zq^gTa*5-;!$geqjG(4Am#ZjUw-tVL25sZLJaTdobX}M3Z*us%s6@X7(ml+7lRMbADgM;9NeL>sD%0hijIPmU2MpA1 zXA~H|S^5;us(4>>Hm`;CTsBQDRKD}hP(J0C=CqF~$a^WutDGp=ZyhZ9#Wcm731slk z#T@hADVI}SQ+QUJqR6x_IkLnk6&iCRU+A-aHyMNg=a-oGl^re<)}7Y(aU^DCGE(3H*_0$6X+A0C4cGOpIFkg zEm2T&UD~vTSY6|^>4aY*v#cRXgm?V)x+xGA##xnj;UqAmdVQHQN zW1W;pT;wQ|_B3}A`_~v^u2%HtcPef4`dr3`V=As&bf#%F)66x+`Of`$Rn!rEs^?IB znZI9taY&~!d)S=%G2y+OzM=0~1A`pCmA(T*ZQPzQ+2DZiz1<*M+^7*$nFNuoD%%EH z%2#;$meaUzRc7;xx_dQ4EFL9q+@tcpGV1fPc)>>G-?Dg2@RzFbp(D)$L!Y|0hUBsf z0t);VdUpst%AOa!9Qz3N*~$cW8aGGZGR+7zRt5W2ROmQ!E5FdwYW_66YPeA&x8{}p zLmLVgG8+n_cpD0}estOFAd9IlpV90JaigO_dal?n%g@Q{ADYZekBX<8V=mZ+$4DEu zMrdj|AwkvMd#~v?5m0#f zZ3BbHgU$g?k5Hd-e;RdK;u+%I#lHg)_bQ4V zKHO!FSYquR9^SYuWJVp&@0O{B$4XNITwGi4n9(@e>}&O?vAa%IJcFCcu5wzJ)p@n6 zyyzERyC7h9lOeFTYfL~_hS>M0=Mml-e>Qtea0Pf6`p3l$TWu-gD;uu{qPl;5X4Vej z?5;fnLhFy%Up4W}9NQh!O}D$so7!Emnxm=|c}=aMe1F%!_y1vW1juNvUoo?@PcVv1 zt0=BtwZE65Hq5tWW4>Rmt;(+k9roSE>gRQrw~l+;?j zhYjJL!|G=;V;Yj_v*vl^uHE8ByR&1h9{bizVwkGma2J?7yhQa0KChc{d}+rv-%R|< zCxunX>&RQr8R!S7*MR|aL(p8u)iOjLC zS#>7>FkNNtGtJ>XsHMGFjV*k-THg4!bSZqk0k=0`U-IPRMwof*XbuX#!2foxkXX4u5+%NTed5_H>ybs&r zecHH3djA98@~*R+xsP}|nPwjZ(*2{|=lx&X-}t?SAriQlgL_L?avwkkOsc|50Z}TqiNc#`(4fJKN3)EF|Tk-_XJ>E1X*Jm;a z@C$HD{RZ0)`FdGyc`a^w#(iwoFq4|3cw+Mv=S^FJb)j=zQy6O3V4^}BB3K_A-f)fP zx4Z;PgV%B=$Ll=0z`M%m<#B{_n0<|x%8+gy|27U~dzz!T+U8_Wy=@S$*pXn^4w*=%Ny#R!wUn`JPMgTIbS%RnGK%%;C-*zXt=k;74LP&zL4i(oyJ{c zX~ha?cEN#`pY&?mE=P%zVb#;j<~yK!({{#!rd8~I%?G(htdBkY9XCC%(^Ahaz{ss) z&S$^p9B0@)eLyMi1pU)1*s11ivXA#LSWj|>TK;7UERVot>m^!hpXIPR3vB)9KbHBR zuz43l-F%(B+>*&%Z)@=QFo z>Yn#A9I)-weFra z9jdWzg}1E~v#WJJdx`BOm*x1%Ep$)jT5%U{TS~-!%*xn9WQdc0Ihv?TbUX#qK-Y$Ie}xXZBJyw3RY4Z0BJgdmOssnCNcpN_0lh zf7^HAJliFzpKT>`vptO6$FYR7&NZIvK|kW?Kq9-AI>DOA{Kgp0-U6AN8|V@@);*r1 zcg|(&?RHiNyPP4i2Z9Xye`uKlyL-6OopWgH@C9S-BdN>wznJ$OZ1!O1c+Mnu3(jXW zj>9U( zy}`MUwaT%aQExX>d`BP%bLdgDE73i|UFS5SW`_ZKIum2(F-GN<- z!`Rayn>CQiWV~XIftjq0_zOFZ{>g6Vavm@-{sAj}ClbMg4E|%Wip1qD%vUlS>EEnv{ET9@0BbY2t_nOz-5s=#p^c65~Cf1DraDtC~3DgE6w3}1GhhijeF7%iOlnb%wkS-0J%*$F6^ z9gH8amcpLQq0}qtJEI;#=5L(HYDdpy#k&famz>WTcbqJ0s>1*(oIUY0mx4CCcex*+ zmahK*!zF{iU7n1;U6Yuv-7%~)bVrsOonqwx4od=;GBEXyTFdwaJ~7v02J<^TntXFP zGsKz8kUKlUI%fhn=)8c_T>Iz}cai%ITJI_asjk0ao@)$ag6k1;zk3PmFM1Q}9QwqX z2|}6o;55c|>LBIC*aqe@<>(7@KHZ7g-DPIHaY3rcxd(oB9s;{uLAbX&0P*SBv>$46 z4*|zrCQ9fkV{CP|V;*-`vpUkntT_m?LP0Wf2pq$RrKZ9=j5OfSc!}0Bs%bW{m&0h` z0@Ot3WjNgV8nkf@#!>EJ$cMf~%dynG4?K2vp<23oF?PDIFgMe~SbnH8D;W=9W`fB~ z2*X@v?`EJ$#@#)3 zLLtXB9z?r6aBDgUO+Yj0hd6_74coZw)P9=FxJ*xB&Y&BZKhPuQOT3TS9?WNqg*_-a zbb}0PAD&AYkvCQA&ZFKDKl{5D!waqI)Lpuk`ry`62i*RYz;y}kaUBC$E-UbJ zzrZ8uH|R35AurH}z5{pD>!=6xKE`R<$c#rLnUhf?Q-QBB&VrHDBglli;6>1d@HbK`-E8>9bse^I-2%tm{_fp!U$mdu z8VeaT{=t|5=2IJ?H=F>^05L?Ufoetnq}sUiDXzN6v&FT8vrv96AerqEWB{b*8jvAYsY|MibI9?05*{B34mNU?9Z; zUx5jx;xBL~x(J`pXW=t_tAUdS$789>7D`yyZZpQdnY(S zhXE;Fh2Nk`JQ^^N3x=RqR0ujlRihJ(73ewR0dg=--~kLVzD+FwUT_!q8>|FB@dOx% zhQZGCY&gvQ3U+r-gud=!;H&#ISVSj)5ZaBOV~9tB5X^q~685Cm!?Esi*w1|$M!Qdd0(U9cPj3P#=r5d!d*Rif zA5MUMPz5DLuPHTp!svs3Fs36rBLR1$?%{u66E14p2MXNB zAjf?JQ&cf(X7s`g#yBix2=N5!8omt6aRYFH zj(`F?h|RAk88p*N$(kEsfcrJDxU;}lS^>7xD$tfNvko7?7r*-(J8%zX#vZ9Iz9&2JHdKQBaLf!WVcjH6901 z?@&EePVh=cb<}*q2NmuCd3X0zLV4gd~1h}a%M{#Ai=v;`a` zEE)*fU<3p4bC`>lQVU7^GH@_egIUxs%%kRF8T^IELpHt$THs1N9;Bjwz-qb({726P zrF1+%bSkmA0@TtL@Dbf4el7$Z$mQ4#&<9_HpYafCDCSc)Q6u#RX{f`fn37@^+)Y;V z9dE^Utif_1Li4~1;^!w~(@A%PQS>k<)eK|5YcEhCt` z!ffh0sv$PZsW9Xq_=v!LJPYece)s?u8V!ch??@hw1!}?{n(hxh>Fba}pOY zVG_LscA<-4BDtv)U>W#;O<*B-1cKoL{EA}YStNcD)LB$W9YimwUg#P8g)+#hFc^mi z;}iHA%E49?Py8getJBkgi5>;x=smDC-2fBN4idqxAP0DW?cgU!hU;(+;ml@g4Q@wW zKn`jz%A~rXbodcf!yp_6M&c>>D1MIAzz?+obLltW4ZWK9xs>>M4R%7l#O6JK@g(pb zgo8Oi2e@z}zE4qjG~p7HT8n;A6VVNdgRa3%=o`=wKZSS@iReT05CotY!lf5LMb;ce zAAp1CbT}1tfg?~6Ov1-NE$9o5LI_&Gn>d3K<9XC#971hHYHA$14_)X6T#P<|PpFx& zy(b=mucPy%Dtdw$^j+|Q-T=9zhPI=Xa1iQ6d@YCmm{fK!94vwy5D2g02UIW~KusX) zUVuJQozZn@KsVtq^b6d=99)m5;&%8CItp4MUxN8tV5QF!Y#zb+v=gpJE8!d*2^FL& z6oIv14U8wazr>fR7~F~YXQalUb5tbS2p^)YFdW?gOHc{^h&y8*S^IntMYz40z7NXi zldvuQ0?tHSxEk$;^Kc8;5*LF)a13mKT|qd>m4{R!?nzBSwZ!IqijNM$Tj&h*Ltnvk z?1`V?xuk2Uh|Mmv1Kg*dkagdIeQ6C`f(XLs0i1|O!f3z(AHlz1B1!0!*~)Z$JuBM=tpYO8~P;_61z+3N_Z9xh38Nq+<>gOQzfz;5QFdxl>bJ0TZ2VDoT$c0yuZmqOS=eW()7AiXaFv;ePx5%eXwr-G$;^8eT44(KWsOd|dnO@V#U5^xv2 z08GrslkqO}89>w%tf3o8J^l@c(K>h(g~8`&8@!K0iJxy_3YY>uLMG?|594ppLNHe# z9n}hLrr^pw~f3TI(6dY*;6&7w;In{q>vwoBZh@-se`qFXgV^9Xoeh)8x_2T^_yWy>pGZZxhWEe;APF>p zKVT`Gfa_oeoizCzD|})D1jDt3e<#;H7vh(qJ7L2PP4lm87mspiLx> zVzQ!L(1-)zGyDY31|vZ|`7;NuAX>mcYDYNAri5q#v>*jhZ4odIrGWit9=P&n1vHbJb%DpU>3*+2uy&RaW*W({ism%o8-;{SWeb` z5XHj))E%rvd$18%a1Xp3J;I21zL$29US0y%5LNjO4Tgp29n8T4;CWmIdy;J*to;aL!W@E+ z8D+sDJO^GQ)v_D74F1Q^R`3SC56w81Xs?@umqXxp!s1DYPZUval9MO#C6enN_$2AS z5~2qll6sy(ICKbw!at-}lp+)SgSWsPAQDD_2jDd91UT>^UQ52sL3yA((2ClSTI5IY z;e!{bKZrrM@J=j8W`g+&(3{xIp&f7(;m`||0!@U;HtYx0_$u57I>K;}4fYev3B!nP zaiS86hnA2}iQ#z!pcn-a9X^ai@IIc26HqRGN0|B-3IzFd9UMp7;VYC%JUK}^U<~|; zU%=I11Z033u!>Z?GQ!Of6a%Fbn=@buQGolAKlCLTxE{^K6-4Kc!Xwcy^1m@)HTfn? zFj|3pU^p@h34$cCLKp6yJG+a-Vc`i<-D0GKR61`vsV!;)(9WCJKTdpU>+LxKTn7vm<&H+8=MUG0V9kA1L1M}l++^u;rSKP zdpf}{q+(ActTvEt+ZV0Ck5N62A~VEE!u(d?2H{TviREz=2MY*3F4BK0@G5v6@L)%R z`BRuow8sUa<;oC-G^v+0BJ6W|J>>`-g!q;Siu%avqqKVLm0^vWT z1NtK#*oOLGGpR?DaTkJYnCM@c;Iob}O^1e3T=bmc;LcEs)o?9Q2zJm2X2FG6 zNm$Sh+R!7yrS9+-@nSJu4XkAC^H6`%c|PEd1oIcT9t{UO2rj{dWd~3YiPkvE5B;G$ zF{yLJvn5~?s3-Hoc(@gRAZ-2LpF$g+ju@;eMwvzXc3uV%OJvw;8(za&~bs@|U`v6QI&W^fR7z&3OZ&%p60AAduO!5orRZc>Lfl5hUs zG#ZSaP$9SttRfr~_Mw1OXq z&8c)bC_x-B5{<;4(I4CjPe)Gx6Ac2F3Dzx0JntYWS=DmV5h^GiUI4!V3XUcCWDtB> zzm+w()ibe2= zCCc23OrRe@1RMfxgKsbuh{(LQiDYaQ;m|zNrF`Hi63bM=%{xS`^3fJjGr1U$oZL;S zatmNYJfd=ZNrmY}s_a!NjA#xgz6|exmaqj;To+&u0N`yrgG4)%}^AlWC!9e(y5}x7`#ODj(#Xbaz9+=a~8PQmE2yK zyC;|@s*~>83Wa&X>Z1z}nrUZzWf4cpMBfddI!2&U7}nAmu2_oeFEb_1<&fHVftBur zW#MlA1RE4{t9kEG?@c*FzEo4Y+g814eqVF;I`M{p?Os zHJ`(oC!IgZP?$|cr$6Q%edFSIg2mpO@LPgxqcarM5jICZfY2gzdljvRD?N-@lCq&Q*H0gQ*l$ssS0@Sf{!1L;uo}Q0cvtT z_;k@vQjpA4fW1G($lv=aAnxTicFy9E4p$Gq-)@JR%p zCaB}z+$qb*dr#o~^SX7Y=jPsva)~-`pe<}0H>k7?(oOWVmVDuY?lXAfsMdim=b+5h zQ`n}sc<|{X>*b;=BNfp`Gh8(F^O#;94I3^&MONcEw`+PSu3y_ieQ8;3wk~8LJy;_7 zso#LnRq!dKD?CBwiz8j`j>Eo9<&bQ4wa_susr)#-!kO*d1$xg<-bnDd20jJBXQF*? zne~lr)~RTYPw4W#ZVJ!(Slf8Y>NZbhtAcYr=>C#s^vO7x=Q_|i{^Sea)9r9kHFp99 z`2+4Vo%aTsuq--r3C`D#j&WLt!+7OgW^URd?tBXTRuQ*Y-Ws}hXpS)H=X_DbBf%%i z9k7Zn5pVV!*7`5^a)9>?Y0D#eT6K#?ZG>8={$ok{mCWb)D!^}lYf11K;0eOjl4^qa zb2QwK@)|eL7JRm#v2(z|lh9hZsmUu~ep+sMlX%lmJB%JKZ~aIYb82JR$$K}YSNvD~ zQ03p@a1uSmZMeHB8QfqAldHIanr;?ZPmCs`oWAB+)6>%;$&Mq)JUyggJ#ZCwEiarI zE@ibo|JKL#=6A(uMYw2^rXfAv%)9rEEO?tw9C$$44kTG(5+%{qe3 z0obLsyGDpe%3ab1?AVg8d1w*2Ivhjf^H4fAK>RxALc*ZP?!ki?;q1<-p_YqG5? zic6h9Pm6)ys?beV(t9hq%W%;I?@8QP0y?t->T<1hfHTinBK-CXioOg?uu*-{Fl}*n z2RZXobYT=cJU~pm(uMqFFDfJt&p3&9&*jd+8^gfoB|O|q>ysWF#ZUIqtthW1ba)@~ zgB0{ZLGbCrnUS7yVE))%(kG|LEtiX~{);VjvHF(t`s0646Wq(L-V+j!yKktS;LO`r z(kAO_dRnmj1Lj@$U6-{i_>A<_A-yV!0=y(yT~}EJXO;u0#VF5P8qaffaEaiv(R+#~ ziIiRX9}=iRxYHE#v2guag3+#tc)l_8i#u8i4qoKpZ@!?PFGd>$;DL_HYBGfP)X$f2 z(P8x4r|vdRB+UB{30tJBf`@%{ntf*lxk*RBrzh3$5xR9Q@1LvyFe;PaJLgEM34Y2$Dng{hyF_#dx! z_EgY+Jbv`FB$UfM>5togCq3KBbqNml=r9@-H0J!G};sC#fO z?PVoAR1F2bjhakHP5P5A7Ph{)$G2{{%#Z|^SL(Z&;1gr%c<;&F&w_4;H{Nyd#^BS^ zgU^?EzgRePq^{xSH~c2+8ic)6>qvnE~Vyv#81E)cGJZ zJN1MEt%i=-r8%XX4z~sR&OWj*oh?`q+=vgTitE3i17N%|xM@Ond+NOm$?dehUAWGD&RWp@N0@LV^e;c#)N{BOL8@=QOXszWVC_gaXx zqNhEjr%lHZ7vK&pz`ZAGf3#~f-l7Mp@+JH>m5EFaeA*P->Mr17l5`QhH^6N}XSStB z#=u3P+RJvMIsC!rcgd!qvX1^!gLmJmfmGZ$rYXsM%OBk_$%f`w3O>bfSMzKk4EUaU z97*r}*!@PosN;PGx`klLVN}jb%Z?A2PaacSPEwPf)6Y*(KbbU)Z<*7j*b4ejMKs5L z*@EWCNlG!An!L-m?1P@k<`%$5rRf!`Nr`-Q4heC7+{K?dL0T|5ON7^la5JKnKmDWY zsK=7{^BwS8V^4&*VrNGd+2c4mQMY3k<*soiaf zqJA3b=eC0iFKa`|m3_529VE940iWIa3GQ<$-Xa-IINDvNetJSf5gO3lW|DivEPkDI^7Y*m!>(oyX`i~#1lL9^) zr4c^uGPzzW(uB>{iJCkHK25;qotx;r>~eY^%1`v4SGvr4;nU*rX+vdz`ja4LhBJ#$ zab5V9htQez(Hs$OG0c_|A3cK9@CurvI(L0FceA29&bRFEy^Q8~hH9xp^0tj+JQRGM zkZ{iAtl~W9S}g@<_JfNe(Fb3+hp3?m;Pc9*$6*YIl}}MW&vXGDptRe~9qQ@5#Iz?x z+A!5Sj3x}U{`vx70kc&bzg#c1oe|0e)F@;o}BpTlO!gsWIOZR z>ip9xdfIJz+AFf_>p0paq@We>7MsAQ0QgKr6TU@rOsA*SAUVzEM!@ek&<6!|r6+(% zLPlHfwv%lINrZ&E*7US3;FAD8FErFeQ9o1gRJpwO@X>*mLI&5zO3;1(AusC(2YGnL znREbL9ckr$G<$9EISW4B=;V*c?|a)dM~A`hZ>EN7xs!OR5#A^!TqIvw)$ZsY_~?2# zs|4_wLj4rv>nx{JrRX=Lsu#hhy?bO2+(h!`w`5yg-7q@(!%xBIJMj5W8a~&+CslKV!TcZ6`0Wmr zv5vH|5%qI|JSGUvT&|BSk4@9Xq*Arf966cMWOt{j$y_AA0hW=THqV`rlCB*y(tW77 zd}#Ln@!NYcqdR0V%fY-d`23;yC6A7?DVCnDwpu4q^_3-oJJg?_9Houn^|fGL1Rmam zj}FF_UzVldlT4o3fp#^dKOxLD~0AbrXyh|Kk&)ursC5c zf=>x1O=JuYe)_!N*tndG|RfOn(n9x+e)7awp2ojDYIUVEQ2#jR#Hm=3qLntBl* z-A5+!EkCAy!ujfNz^5dMSRrdiPrK!&%lGnu`ss$|IO2|zL%pE?B+>=mia*n%Jke;?uJ|@vW%3bdWcbwwPTySQfedNh%bLnX%Tzh7T zN4fFE+!E5_TlxU4)rYFcOb!)?=C~n$GTAPmW63!_QZLBQl)9waah#dz)1vWd`E@n; z6h>cfa9gE14&VeiM`N<#->p0OdIaCHgS&*%o#nmg3W3jTElvH*u>n?;DcE5&M_2k! z3U_@nI{S{c^Au(hRnn@F4pCi*H6$K zu}n%+q%%3kIXy+r(Mk97#O-ATXI1AOZPU_d!tc<-cj;+gGo^UvhRIyHjV26n6LBw> zEInQCdoa&S4t3kL^j?*V=$N|Ng)VW+3fVYjK!wSn4sg$#^F0rNPgb3Pc1;HJN$woe zzAwn3j=O;W&pB@B(=?xUnhQx%3Y z1JLZ5VBP&`n&XiC=0fn%8+r1(;PV=v77M@4q9%)wb1c*{q&o9#2>3j*gVawKvd4Gy z^2xmaeSCB=e6+s>Ij>SV`$fg}k?|RdJ zl9-tGLbIPob9`zY>1prK9KWJ3E7C7EfuvVQQ9rlwKYhtLUXyc7mIr8##%?l9A7MV! z`DFM#KbkNOO&BGS@Y|=_6;BmM4mCtK!c0v`D)PHVRM}yzLI0WRDW`AgKa<^gG)FgC zPB!evzRm)2s918`m-y(^oNzgPvL^m?AK6xU9f&4;PkJAY=BTL+a0hu@Z+=~%e)8#J zPX#nbRy@@KDaQ=xe>qe-<^f-$H7;^{+qx^>_i6YPB_mx%QlC|)quKM&({|`I`GTC| zO1IaC+s zelg5thr)P)E*m_&h(7e3oUjNvR3WPGKALbAnlLk(u%GKkPI%A)xaZ6Gp8oC_cYO%> zykf@Cmuxsj51=_ZF{67&&Jl*zsKkBWssUuKgUF%csmVTQ!hgYMBAPu54r8osrY5uS z-eb9K`Q0XO0-7+IEen;#Xu|DyDnIyb6U@|t3do12@+F6=j((fUneUk7r{d%5I?DL-bu@D>dFoA)}JJps+0Qv!7`%=RA59!56)rcBT?8lFW5B-_jq<*JxqM&Ma{}vz33@mzW@}@o7)N zdt6%mw8oonq5qU|X4~9)CedXj5>M6A9=lC2RDvGl-Gkj(?{hT!73Ygjo1*2Jt*j=y zuYo3vrhbOuW_;k_x$xX`?S?)$lBNk?+Ih13&fN6JR8c?b=de|vcGmFj<U~j9E-H1E614|&<76B8^{#91fJ@iJwX$Wl9w)%v?0g+1DBPZ z{xb=-E(pKf0iSDfh3%qLeD+Y`~GM7^K=Q-)IcKmmOXgR^BN51OV|eS zCDRLc`=kuBmECO4)kV>)B!`OESk7!mW|V@b;t!#t-&RmRS(vAdwp`@6TiH`;P5nHf zYDaRH{#QR6&~K%vpPlY^lF>js?|gE?=j2drxRd+ACxo8%8qFS0X7sO2(@!i}SAkC@ z9OYSZ!hv-AEb!ZWFn^{U(=H>Yl=e%j)xp7M;N zdDgqyoNu`a9a9cXxZ7>UQL&?T zRu@mT)0%?MY0&RU{gfcb^?~2Yz;A=`KUb-rZp>Dmxp6X<`pG~7IUatCuxxzGpE$E1 znmrzTu1GBW)||QdZjHk84o|C}W+>#mE`)D+1bvW=Orj#2ZUxAUF7pNZNI0IV82bWq zm>pl$XC!LA^HyNnEd%cUFH*7~dRn-vhUcA+LOu?^oo5cel{rWsxad7KIgb9rUb_8&=lx)3 zsPq0f?R46Z>3>`BnTl7rMo(*tCX6CyXWx{)lOH%UnptlZX638cB&of1=;=x+XFPhP%#`#h)tuoJ_ATo~k`gq!f6^(bGneiD%ad_9uI5tx53Tz{>mO z0UK@KvGW|SXXxWT)MR(&`$yas)Jr9q#Z9`+w5|jRbSR#x1({woFwckB z^>cEq4BYkRY$xuqbT`PxFVvZ==ZbW-@`Tfmcc3Th1hLu5W5tNK+o7GvnR&ngr7pa&aWp7nqrc zq1kJ)Q^*FVRFycsZaS;z^6{LxVA?mR=tEiumD-IIV!g#!PR?9tpRsqFM;6nmvgr$# zx)HmH+jop~bpu+spJXO=?8xr+O35$Lwo2YwS)T6zZ#7b`YFoIi9a-~4CNvlAG->lh z+ioG^Zy(EY99`-TM|Ueml{6*MnC_<19hyi!dB)D#D9+3v=WV_`v%>P8ZQlEA${vKt zer7u$6t)n34Km&AM~k#3QqM}spO%|F$NY4zAf`v%aVE>z|GUMsyqKJluJVNx7O0as>pWpXInSOH3HTCHk3)%78e5Z zdZeuUE`2~L+^)+Z8!MNsxLndy4%$J^yb(QkfL{L0o?30&ZQ{F{$k&8D!@=(Gk~el=&PZ;i zvY$ykcH3Xc9QMM0vp%xX%E=PTM1K20ILoX9 zxV*Eue1k(&_ER_`A04QHRG0o>KAnx{W!6uYT2=lzzYMWl(%g#iE$iD$HucWh4qMHB z{UoVsgJmq|ZR2-e;(tH1wer9sIv?Vv^5V#&!34z)2dhVwSsM7H9W%5gg)d+h($80~}ay4If zE%x0~K}C0yLhzc` nR&eGyJHnakIddWZ1r-Z3%;mY4@h!tGmampV%8^eR$tV8@#`mxj diff --git a/iphone/Barcodes/de.lproj/About.html b/iphone/Barcodes/de.lproj/About.html deleted file mode 100644 index 14ce82ddf..000000000 --- a/iphone/Barcodes/de.lproj/About.html +++ /dev/null @@ -1,23 +0,0 @@ - - -Info zu Strichcodes - - - - - -

-ZXing Project Logo

-

Strichcodes

-

Version 2.0

-

© 2008-2010 The ZXing -Authors
-

-

-Unterstützte Strichcode-Formate: -

-

-QR Code
-

- \ No newline at end of file diff --git a/iphone/Barcodes/de.lproj/DecoderView.xib b/iphone/Barcodes/de.lproj/DecoderView.xib deleted file mode 100644 index dc8e161f7..000000000 --- a/iphone/Barcodes/de.lproj/DecoderView.xib +++ /dev/null @@ -1,450 +0,0 @@ - - - - 512 - 9E17 - 670 - 949.33 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - 274 - - YES - - - 266 - {{0, 431}, {320, 49}} - - NO - NO - - YES - - 15 - - - - 1 - 5 - - - - 1 - - NSImage - filmroll-2.png - - - - - 5 - - - - 2 - - NSImage - photolib.png - - - - - 1 - 5 - - - - 16 - 10 - - - - 1 - 5 - - - - 17 - 9 - - - - - - - 274 - {320, 431} - - - 1 - MCAwIDAAA - - NO - 3 - - - {320, 480} - - - 3 - - - - - YES - - - view - - - - 9 - - - - actionBarItem - - - - 51 - - - - performResultAction: - - - - 53 - - - - toolbar - - - - 57 - - - - pickAndDecode: - - - - 60 - - - - pickAndDecode: - - - - 61 - - - - pickAndDecode: - - - - 62 - - - - cameraBarItem - - - - 63 - - - - savedPhotosBarItem - - - - 64 - - - - libraryBarItem - - - - 65 - - - - archiveBarItem - - - - 66 - - - - showArchive: - - - - 67 - - - - imageView - - - - 71 - - - - - YES - - 0 - - YES - - - - - - 1 - - - YES - - - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - -2 - - - - - 34 - - - YES - - - - - - - - - - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 54 - - - - - 55 - - - - - 56 - - - - - 58 - - - - - 59 - - - - - 70 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 34.IBPluginDependency - 35.IBPluginDependency - 36.IBPluginDependency - 37.IBPluginDependency - 38.IBPluginDependency - 54.IBPluginDependency - 55.IBPluginDependency - 56.IBPluginDependency - 58.IBPluginDependency - 59.IBPluginDependency - 70.CustomClassName - 70.IBPluginDependency - - - YES - DecoderViewController - UIResponder - {{387, 352}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ScannedImageView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 71 - - - - YES - - DecoderViewController - UIViewController - - YES - - YES - performResultAction: - pickAndDecode: - showArchive: - - - YES - id - id - id - - - - YES - - YES - actionBarItem - archiveBarItem - cameraBarItem - imageView - libraryBarItem - messageHelpButton - messageTextView - messageView - savedPhotosBarItem - toolbar - - - YES - UIBarItem - UIBarItem - UIBarItem - ScannedImageView - UIBarItem - UIButton - UITextView - UIView - UIBarItem - UIToolbar - - - - IBProjectSource - Classes/DecoderViewController.h - - - - ScannedImageView - UIView - - IBProjectSource - Classes/ScannedImageView.h - - - - - 0 - ../ZXing.xcodeproj - 3 - - diff --git a/iphone/Barcodes/de.lproj/Hints.html b/iphone/Barcodes/de.lproj/Hints.html deleted file mode 100644 index f874eb62b..000000000 --- a/iphone/Barcodes/de.lproj/Hints.html +++ /dev/null @@ -1,14 +0,0 @@ - - -Barcode Hints - - - - -

iPhone hat eine fix-fokus-Kamera. Dies funktioniert oft gut, ist -aber für Strichcode-Erkennung ungeeignet, weil alles was zu nah an der -Kamera ist unscharf aussieht und schwer zu dekodieren ist. Für die -besten Resultate sollten Sie:

  • Mindestens 60 cm Abstand zwischen Kamera und Strichcode halten
  • Im Schritt Bewegen und Skalieren den Strichcode im Bild zentrieren und fast flächenfüllend vergrößern
Dies -gibt dem Dekoder ein scharfes, großes Bild, das hauptsächlich den -Strichcode enthält, und sich am einfachsten dekodieren läßt. \ No newline at end of file diff --git a/iphone/Barcodes/de.lproj/InfoPlist.strings b/iphone/Barcodes/de.lproj/InfoPlist.strings deleted file mode 100644 index 15309108b..000000000 --- a/iphone/Barcodes/de.lproj/InfoPlist.strings +++ /dev/null @@ -1 +0,0 @@ -CFBundleDisplayName = "Strichcodes"; \ No newline at end of file diff --git a/iphone/Barcodes/de.lproj/Localizable.strings b/iphone/Barcodes/de.lproj/Localizable.strings deleted file mode 100644 index 008c2f830..000000000 --- a/iphone/Barcodes/de.lproj/Localizable.strings +++ /dev/null @@ -1,141 +0,0 @@ -/* Add Contact? */ -"AddContactAction alert message" = "Kontaktinfo speichern?"; - -/* Cancel */ -"AddContactAction cancel button title" = "Abbrechen"; - -/* Add Contact */ -"AddContactAction confirm button title" = "Kontaktinfo speichern"; - -/* Add Contact */ -"AddContactAction title" = "Kontaktinfo speichern"; - -/* Call %@ */ -"CallAction action title" = "%@ Anrufen"; - -/* Call */ -"CallAction alert button title" = "Anrufen"; - -/* Call %@? */ -"CallAction alert message" = "%@ Anrufen?"; - -/* Call */ -"CallAction alert title" = "Anrufen"; - -/* Compose */ -"SMSAction alert title" = "Schreiben"; - -/* Contact */ -"Contact Result Type Name" = "Kontakt"; - -/* No barcode detected. */ -"Decoder BarcodeDetectionFailure" = "Kein Strichcode gefunden."; - -/* Decoding ... */ -"Decoder MessageWhileDecoding" = "Dekodiert ..."; - -/* ZXing */ -"DecoderViewController AppTitle" = "Strichcodes"; - -/* Cancel */ -"DecoderViewController cancel button title" = "Abbrechen"; - -/* About */ -"DecoderViewController about button title" = "Info"; - -/* Hints */ -"DecoderViewController Hints MessageViewController title" = "Tips"; - -/* About */ -"DecoderViewController About MessageViewController title" = "Info"; - -/* Decoding image (%.0fx%.0f) ... */ -"DecoderViewController MessageWhileDecodingWithDimensions" = "Dekodiert Bild (%.0fx%.0f) ..."; - -/* Please take or choose a picture containing a barcode */ -"DecoderViewController take or choose picture" = "Bitte nehmen oder wählen Sie ein Bild mit Strichcode"; - -/* Email %@ */ -"EmailAction action title" = "Email an %@"; - -/* Compose */ -"EmailAction alert button title" = "Schreiben"; - -/* Compose Email to %@? */ -"EmailAction alert message" = "Email an %@ schreiben?"; - -/* Compose Email */ -"EmailAction alert title" = "Email schreiben"; - -/* %@ */ -"EmailParsedResult Display: Body" = "%@"; - -/* To: %@ */ -"EmailParsedResult Display: Recipient" = "An: %@"; - -/* Subject: %@ */ -"EmailParsedResult Display: Subject" = "Betreff: %@"; - -/* Email */ -"EmailParsedResult type name" = "Email"; - -/* Geo: %@ */ -"GeoParsedResult display" = "Geo: %@"; - -/* Geolocation */ -"GeoParsedResult type name" = "Platz"; - -/* Open URL */ -"OpenURLAction action title" = "Link öffnen"; - -/* Open */ -"OpenURLAction alert button title" = "Öffnen"; - -/* Open URL <%@>? */ -"OpenURLAction alert message" = "Link <%@> öffnen?"; - -/* Open URL */ -"OpenURLAction alert title" = "Link öffnen"; - -/* Cancel */ -"OpenURLAction cancel button title" = "Abbrechen"; - -/* Scan Archive */ -"ScanArchiveTitle" = "Scan Archiv"; - -/* Scan */ -"ScanViewController title" = "Scan"; - -/* Show on Map */ -"ShowMapAction action title" = "Auf der Karte zeigen"; - -/* Show */ -"ShowMapAction alert button title" = "Zeigen"; - -/* Show location %@ on Map ? */ -"ShowMapAction alert message" = "Platz %@ auf der Karte Zeigen?"; - -/* Show on Map */ -"ShowMapAction alert title" = "Auf der Karte zeigen"; - -/* Compose SMS to %@ */ -"SMSAction action title" = "SMS an %@ schreiben"; - -/* Compose */ -"SMSAction alert button title" = "Schreiben"; - -/* Compose SMS to %@? */ -"SMSAction alert message" = "SMS an %@ schreiben?"; - -/* SMS */ -"SMSParsedResult type name" = "SMS"; - -/* Tel */ -"TelParsedResult type name" = "Telefon"; - -/* Text */ -"TextParsedResult type name" = "Text"; - -/* URI */ -"URIParsedResult type name" = "Link"; - diff --git a/iphone/Barcodes/de.lproj/MainWindow.xib b/iphone/Barcodes/de.lproj/MainWindow.xib deleted file mode 100644 index e0a569241..000000000 --- a/iphone/Barcodes/de.lproj/MainWindow.xib +++ /dev/null @@ -1,171 +0,0 @@ - - - - 512 - 9C7010 - 658 - 949.26 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - - 1292 - - {320, 480} - - - 1 - MSAxIDEAA - - NO - NO - - - - - YES - - - window - - - - 5 - - - - delegate - - - - 9 - - - - - YES - - 0 - - YES - - - - - - 2 - - - YES - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - 3 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - YES - - - YES - - - {{229, 113}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ZXingAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 11 - - - - YES - - ZXingAppDelegate - NSObject - - window - UIWindow - - - IBProjectSource - Classes/ZXingAppDelegate.h - - - - - 0 - ZXing.xcodeproj - 3 - - diff --git a/iphone/Barcodes/de.lproj/Message.xib b/iphone/Barcodes/de.lproj/Message.xib deleted file mode 100644 index de0dc8a28..000000000 --- a/iphone/Barcodes/de.lproj/Message.xib +++ /dev/null @@ -1,424 +0,0 @@ - - - - 768 - 10H542 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 274 - {320, 436} - - - 1 - MSAxIDEAA - - YES - IBCocoaTouchFramework - 1 - YES - - - {320, 436} - - - 3 - MQA - - 2 - - - - NO - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 13 - - - - webView - - - - 17 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 12 - - - YES - - - - - - 16 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 12.IBEditorWindowLastContentRect - 12.IBPluginDependency - 16.IBPluginDependency - - - YES - MessageViewController - UIResponder - {{1, 33}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 19 - - - - YES - - MessageViewController - UIViewController - - dismiss: - id - - - dismiss: - - dismiss: - id - - - - YES - - YES - delegate - webView - - - YES - id - UIWebView - - - - YES - - YES - delegate - webView - - - YES - - delegate - id - - - webView - UIWebView - - - - - IBProjectSource - Classes/MessageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Barcodes.xcodeproj - 3 - 132 - - diff --git a/iphone/Barcodes/design/ClickHereToScan.psd b/iphone/Barcodes/design/ClickHereToScan.psd deleted file mode 100644 index 1929356e2caa5d7ed149355e36ea651096cc3703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215188 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 aGNCe|GNCe|GNCe|GNCe|GU2b23I7MmepHYE diff --git a/iphone/Barcodes/design/Transparent-logo.png b/iphone/Barcodes/design/Transparent-logo.png deleted file mode 100644 index 52447abbedf3038321b6ef2112df9d3390de9d0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38073 zcmX_nWmuKZ*Y!b4kd`j#4(aYLk?w9#8tGC{8Ug8&?(PPqQ@TUC8)>)}I4WJ3Qc`e4{XausqoM*La8#I3!jR_>H_5Z3 zzT||24c`Ct&as6yZ7%Vi)bJ+ zl_Lb>WsNzx%OfQWkddMju^j^AG5P8xq*E!i^DXhWXY_sXWPO-`Aec_q7+!^! z0oV{xuPE_+h^RD7Kzb658ssM&#CXWebOZ998DdQ9zdZ>FNWV$;hJon)Ajg6E83Q4E zZ4n{~u@-=oj%kKTLA2jOuq_q3`5<%5khgMLma>q_21w^9#;a<`OBBdkm5^Y12%I;> zxSx{J0}_-B!InPP562&293+Bt?|v zmuE5odmtzJ+Ql#g@-qepoc7|;V-&4?bd)=)9?gh(zXRc!!qjx*X=|*+Q4|9C>*_cD z#Kc-d7$ATU@bM{|`WVjI@YPSZ>u}3zbkRD<&%Fh$3rDDJq_Vy@&ChRbZqCVfi|d&T zYWY4{{W9v*di-$fC-`uEwbs5)707N7CL2G?LZJxmtern4*60h-!V-ONJ9qIBIl4c*W$FDbUd79V6lXS6MNx`U z(o0yWSqj?{dSy0N#3RD_)jWuUetuZ~eUDsyJ z<#^I}iGQ>vhW2E36L(=R-BD1#;(X}~v7#eL#Ye=qB5=pANK(uvm<%WAQ-90Dc967_ zjGpYEq0Law;DZx0h#W5;PZLkXz^YzUoL{_B{7U0OV@N%^$WYCiJ>Lwk)$PDsJJMLPl7|9L#syh;)kUO;zp9wO`7XFq#e3~#0$T$73>rG zb$X(FPQ@lR3w^udgv12x64?@!5}AWG?((C8^!zrd7M=S*G_gK;T76m>tLRbq^c}T% zwdDfj0$e2_{;P79V!J$|tQJZ44*P=Rq>OgMfDA>4f)&rUojYP*)<^Znk9P%EGAP;z zH7HaFizuV`f<0VL4uT}CeT!!*5(d9TCGt$-O%neG#Walz=1faRN~1^E^y+U=ZG7zg z*qcLxKtoQWptP@aoT94Kluw^8peUf&H!?huJu;Kbl`6zG%f6GklRBHa+F-2fq03ZX zSl?(NSG}p5uX9}AY9Fl2r<13xp=(ehU6x)(J=0RwQh-^|^e*mQNyd!T@5;0Kf%>8b zg37HqgvIjukM+JLR;GAX4L#+*kK@|ne4BkEAB7N6zs;kSkm!>5xzsvi^K0_2q>QE= zi}?0jChW0VX^&xy&2enhzaFCRwnjDKslTI#1P zp&V#cw?oNl#u}qlHe1<{=U#kma)KxPPuMwgLwG}wXN7%5$7qcA@3T^PWV6CqrQH~+ngyU?9T<+sb5-zKf zcajN`E2&m&%6t{f@>~qU#Vodh3p~x7%_6-lmO8`J+UeSI9~6lBSQyH=?LV}yJ{(oT|iw}=Ici9bP9G2|WZk5e%WhChss`)KSQuzes*r zQLv74kB7`j=rfSMJC|ip@`^o-Y31^y>fy*^+G+}-E&AT7h^n}p%AbLo@`>ytyAXdH z+n3mw?@r>yR{{+UTGk21^XT>%^n#jYqRRC z)|uRWO(zn@2@Na9Uc^hp@t>nx^4KE!<}lciy!4~CsHD5ee9Usfa&LQuIYSREp*V3n z5zQWTexVk1RkQZ!>YvmiYvKsqV#}9$iKd(m!NyjLf`QQy0TK0F^-J|Tb?)PdVutt zeMF>0tDkL}nkJbLQdfwDAwlz!sQjLMCw5t-JzPU$G=xw&_Zw0cd7%D?a_ z!n^b@;^do8BvvG>w&E%0DblHGDffD&dd!D zPsUlDk42=%r~CS`+%6d}X4iY~n2oO5qC1>4W4QjEka`Z^5oi?{)jw}^J+EHedac!{ zl~TcP^l{&HU+^hzQn{}sttF+rN#CyN*sHD1+wyvkD1&Eo`LfOP4EK3vI)hJWx$VNs z;kxJgY87|c&zbgdbf{(Co%Xn_Rk_vZQuIh{USj#%w20o*(%i|Czip@c&x`RTnQMgL zFJn(JSJCJa@X^W9Ltjz99%S$e^YN{VI6v+^6iAGjkI`h{J!L-)mE+;E`rS+)%#MyH zjb|mEC&qPr^vQeN?>r!=SnU1POWHo*!NF#Dsd<0Y<-X)ja+0%(uDt0(=1=!*eOq;< z_NU-Jjvy}X84fn-;=zoAc@f}EGBa6KB?!ce8UhLU0)gBF?ElHLtk$njp_Jjcd5#pLU;ugWIA*%>i0qYj4-Cuq7Zm7sZw4n zJG-8!>8D=Zog7$L&61B+Q?^-?x-g6yLu95t7;v6&ui=710`iiKal)e&>*)C5n+~q~ zgre)N`FJ*+-t4TDI*2qlI~;GM)m+c7wi&KU4Wk5$XT7H*l#q~sEpIvIH*EK5I=lN$ zF7fu$p|)ZwcO(KD@f=MBDt!zCHnP-WR|2!%3&}ZbERwgzkT<-JKgX|yE`~WcZ6>Iw zRiP_w;wCWZ{3_8b6W7qd`FFI4M>e6r+J-IibQWF2MYWJHpdP9Yp685RS6A0~+(jNa zZ!p9iZU-}QklI8CufwW7>)r^0!otGN&4IZ2dP%KveF8@qJUl#qO*OR(Wr%EZ1dqdt z;>W*UJ9|IW=&-|Do>N#z_d^oqXLIviH`p#ZaWw*lvMnKprQ%}c)D(O+I`p7T z7fF0BmPrEtp0V2e@BbY^PSJ0l9v*y1fsxNhSUVoh+5B6;b2rSI!l&y>-h&6Gyv>G(EV$LIZr1 zxa&`rL?p`cuV3P=cl#wuVQNutL^57m{N)agFz|Ue>!YKidue{R?MzeAD~p31Oo8~` z(2$hQMW@xnDK5@evs_2?S9Bva6nT}xe^4tfc}6kcfdQS#PHd{ye?C=> zZ`K>}m&tDP$$AQR}sU?V6wXL?SEf6gGAZ=9qUVzAzc?o8R7Q-|9=|(=g*&j`{S1A zHy&#+#Qd&w2V+)`cUS7Fs@amo(0iHM__ye=6Z{H~qV%=GY`MYs6dJRNIEyTj?Myic z5lLbq?hl>7{L;Sy;*z{%yc~^R0+kaSY#?jEw zSkkUmVxfAy#sA|!!}eHPTZ>v)P-~Xy_JH5cH8`xYiKuC6el>bn#~Z=T(E86;q{?Gx zNqsNJXX#G zW~JlbU-_R*k*HPc#Q(d_>=9`EH$FezSNYsJ8+o~2nR&ir3iV^q)j&my%1jJ1`O7!@5)&GOgu zQ_xUCCPGC;ZQM%GBRqmHzH9j35)^Q+aG5%*O5anf{BJ3fERYNumYfyDEhy^5asHR2 zUJ?=#g0LF>f`E!ltpa}B_kyjYI9@!cZ0;`iysEI}p(p;E-QG@mu{~m^t}YfA${ziA ze{I(Pom|I#Ddj^h$l8QpTMjuBejrU3mXu7IXTLP=3B%Fx{J&pgDbZWWNfWEbMaG67 zEjCPo-B16QZWK+sKEopo>4b%aot_V|P7cO1awXG!hF;MB{XuqXt6&yULt){|>FH@X zx4*?wDL#V#=FB+FdQtwXEV8s{Z-gU4U(s{a+{y4(U1wLPP!i^M-3=fS_+%d0 zCkl0abD{l%12(61$(0%_WxCLO_88evPOjaBI>t|jb7JWN?*G{$Og%e0`^DbR+4gR6Wr9v?w8>4_#u2BEIh=zzBJFK*)?RsS>j#e4%yS0i6rlJ3%n-a~S zGcm6t1Qr2h?e5O&e>>zJ92&Z>1N}KVhbZ#^Z!z!6#IKUz3?oF zZ(l99i}_XT*TJ)s1U;S2|5p~xQIFfM4M{nzF}{V4;NjrVhi>!IC}#|BZEeLU9I8M~ zsbdlxMZiHb6|bkQ9Rh5uR(&9WGv2-46OPHnK3!@6BHNRZGeR`by3v`-j;C&x8dF|D zp~~xOUsj(L>fTZ_I#~hD&Wrprr8-~O%z7OqB)(ulqkRsVdSYZ58%j$R4VsXn6%kSJ zzdNyO%z~U1g2Me_E}Nz$4>HP*5@_tRe+CIK0~8g2H99@o>}JcMb;f3EFrMDVJHOxH!+bS-!>XV6 z0<(!5$OmB&->s9njld;k_&<5>&sCYtq=h$sQu8)Q30J&i|8J|gIG{|(6~^fq7^G`Z z6^D?bk?;q3UTo*ZcmL;$He%Vi*(?Ul#<%BN>iYUinwj2n z7y6h51HJPYTqqC{B_q`Zw~?oi$i0YKAeka0$?yK}a3)PHZfxhT3~86Z{k8X))o5C% zR5)&4k48E4V5(uizoDCftkY^WM!InYYCx%8L%Ec%M7(Ux7uiXIYv1z$+S@S3^0$Wf zr@zsQTy{on_>@6Tk|m&dmzJcCr9t=Wt?!*H0}~UcVarMT{X})ud#HoZOL%&ElF{tb z0PkUljbyB7ov8GKW(L>YQwC6$!+scpSPVSWKbp&yrOtnsZYwC_xF)Jws`}r7T#1E! zcz?31f%5>Y1eQ?!y3*#IQ(8Lg@o~P|g4gG!66!7eEW_ynJQ#Qe&8|hwE;#gk54RVQ zBMYDsoVKh!zWXl@6SanoH zTy^vG>OVjWmg+z6qsv$;5iBk-do*NZWDp;SZAoF8ImN|c(}Wt5T?}QVrI&`_uL%l@ zds2|u&5=}&SK5f~uTT2Q4O(v2y1vY{c{f~N``-Vf-f{c-{%LC10KEz*H_5Mh2Gc4yQ>`{(499p z7`YxTXdqTbnst1)fekobZaI)r$t3|f6LM~+BAbo`@Io1I0?6cUL%~e~x`ie$k%ftYxubhKT9&V9tu9BFW8<%th ze$4spOUoIVeNrk?Px9!0&o_M{?U!?A(Y`kOQ$>f`etcJr0OnO$k5f!dPw)9y!$yy! z@<>EI1AFn|bi^fg^DQix$;~)zO6_WAyS^*)jUeI~<<0j#Zlc}m%Pn8t{L)Q1=0)nV zwC4$cdmpnw^W_HED?B@~3sSW39i7PCZcauWzwH#=kA#GY{us(EuHYs_f)>Q}s!zcb zagB%7L)O#98W|dQ>*1{HeIidzs{Rt8oN^g7JGvQb4=u0(uVHH4pS+0!UK0@#w%5Au zO;{QEoJlbmwYQEKjyO4@34 z?7bu9{8kyl56er?sReO`bCmb>eN1FzWE234rk~zy zM6ad|;caXaIdo4AvHS*~u5{XvZoQmPP!9aY&)4_cHAFi@0^xh#)NLpqW#lq=gM?*nKR#% z*Ufj4|FMTOzt}a@)AQD~u-Li+n8@R}X=hl^-`+&tnHkBpaV-3=2zLRU2L3TDV~vs`piUtqznuT+^gyT{9>c3=?i zeBY%<3-m+noCjc&x23xJ+;Y~pD5N0s`egMDpe{nwv$JMn8A2XwfrwFZ#mABr#l^qI z{GVJ90$#DUV&q6iitFeQP)}0lyx$~@Dh~El6ue$?;RTsuLeNM)SE&yP5{38&sdE;_ z#|%KN9ZgNm(f8+q++Nqmksx81{R%=-H!_MI6TUAUm?;)G%k)0xTl%#4k*RDN6^US{YN!zy=N@-4dQ`WL+ zz=k471aN_6)KozRQR)TEvRkd-osxW-dT1>Y)xw`Yj)N0<3afS{^YtU01!Yy5NaR@Z zeVtH%3ev3L%zLq}fSxpfYwpeUO~kUH1VrVx90HKcRGR5FBW@1$6un}zS?5eEBGBz$QF7%eK^cD+)e*y>r1<0BHPq&%S)#bC5`b4sw z$%YbH`%rn70$^YfPLCQ^qZSr)Nl1dlO^he=l?uo+M2jU;n3!~`;h=i^O*aKow4sgY)t z9m2GEvk%HYoAn>E_RUy@#_Viy8AkY<`_<=iJh2!qkF9vEfX0B)voi8YZl&CB=x?Mw zJ^7$Jwhg2~Jj!t<1855AxgOwT#SB3mBrbUED%0TN2fAv6C=5mP?jb_pP~p@H38&yR z9%t)4{He|uj9TTn&CUE?>!GxTm6h+2xPp0IcQK$C0qlCE+9KQ#LrOENy4sl}faSDq zA~ljbxlYf}upDjyVJ%@=F;h4_!{=O%Nx$)}`hy9mv)b)GeCP!1aDYel)Xf^EKKKRm zi6^zVpY(#PS>^xiceqd&zUr}os;&k=- z$sIi5m3&f|eh&!RZwm_x73jpgr?8N3kcYA+^99S0+N>;an<&Q27B-7?EG)eM!V*!d zUvE1TqB&L=w!QVaaRhW*O-u~t?%z@B^smQOhBQ)v|z?0qp`Q%&Q8~-JRTmoK4GO%p8 z-{YOi_3^UG`}fdtVwGlW5DT{!lV_(vD(Ha$%w7V*2d?7fiJ!3mT~)KD4ZXiu@UzCF|!;NcbC1xNDJ{pYL#`-kAbE zngn(>3-bW))HIm`LE{NlbV-1&TSh${&e9wLRy7Dm=i=gO1#3eyw2pt&7ew@4=z^a= zzer>nsLNiqGu}vkmmd2`WF(mrsrP=U)FND6UD>yeD@@F{dGplUFB9%H-;qxp^HBO*~Y4gkeL0#mvAU?&emv@;2-T789g# zz5?n40w=Ao5Yn@HIK2jYr9mZt6+fg1x!d^1I=LsV~=n{eN%5cvp%Iv4n*1MT_wK z6XK)9^Z;}>f|!r}{kp2AW`VkVJTx=}TkQ{+GC-o%p&DLmoiI!8tG>sR zfe!)x>2Z|iGTL=9 zCQ|V~GiqivHuBaI_sR+GqphiHv#gX-PB4}?QoLt{f?hxbCkcK+&8_*Hs&h-x`XX9UL6|)8X$=;t4$y6}-vTTWI0<4F9T`U(@E3ZZ7b|oAGEr zbMrmhwnFH!RRiN0wPMqI?sMKeS}Ot+vj=I9jhFNqVs1DEtTJMj)ccU_e}>P6||LZSdOOc#S}&YupWWW z_BlK}ys5camsRt1mB*QB!?bQ~sOw6rXKz0qF0M3%g4T&CpmWR~fOS=UT&y>1ugK3w zpp=eSJKN~1Y4%C|y83wRPHaO_1}ex@#EREJ8Rp-&c~A;S;;|VcGgti%>OZCcZ6h&H z3H#oig5bNec!piRV5Ye z3%lRBfCAqbq^qk-c;lm_go=Pl*xl39)4WUF2|!l1TrO+tsrY#ZXXs?Wf2tLxjIXZ{ z10!SPEKAE_^`9QQiCj7DHZQJ`Op#2Wr(nnz?(d_@fQ4kDWX-DZGkpKeZ=!3nH$}S& z13|=k<13NNLmMLtRb-VHd^0Ai_{HK!@5~1+g;$q~MPe);w z!Dd?^A;ehB?1Dc`y_^RiaigdpgQ5jC%q|%h8{1mbVJg%WlqCABqE;$RhZ?BvEEQA* z;&Hmk1Z7FjH2ikU9angqQE*a|x=Rk%>stNrOBfpIF`m|UoK5kdz5TEq^A z)u>`v=|1pD@qyavYOIaE=p9h%7-OVi0K}&^E7ZoC{1k0_j|7YWzxyW()^aQ(y|%|; zJX`8=m}Bfcelji&PF0CeiDZgcF1yF_M#S+zjqKHvIvqQb8xj{L&$6r9M5>Qs3MbOR zY()VeyMz@Ei}k2LdA5s_lZ~;>`L|$K!F6~2tkaC$;(iPX>?C_1A?E267?eZ&+evbb z5~X%b;&2!5=f*-{$IXj2udA+7q9=f9c{~({-<4t_-v+dnbQTzs{X9B3bKoSq{3(ht#k^9UW%OROk5}uP0JsMyCki_q1tGhD{?&CG- z5P(Q}4{e@KpCd2pj=?p#QoX1ds2KfEt)vJ8%FY^I$BmS(8s8EXm4H3+&${gEOzB52 zkk!*DB#?-B?1xjdfBYx%6|V1yJo8ZtbQRJkaoS)3tuUrCT=CU`(yH51dyG_v-(z-M zU5mqNdueiEt|BO<6d_Re2aZp0{|LN`7Tdv5>LgXi;f^JMQl)(x9v*(2e4^v&szQfD z=eCd?>M6MA7Z+#UuazZDopfuhRm8{dfe5)Bvf__b83yTcTmw0RcbquBM5!M z*UaaK9aj)eGTR=&@#8C3Y6}ZPQt1#E;W1gbTTg$z8n3gP1)l-{_PR8sa^X=5NO4HO z6$LFT#uYoucjiYv-|3l`6&pQsEE8x3zmM|9 z06j|Jz*defe~T4l`N#g+1pDRzPI<;7vuGh{_AXh9jWA3gS;)Xg8f4xTgg4Bi!P^7+=R^N!2Ld89}%~aP`0-mz!@~_zM z2fRSq(lif8F|Pj851fB-EYw?R{v4Rn2MXSl{{k)F#O zd>QZcTV&eb&z1{cW|c4hSpD{KBrkQh3b2Nt@)dI-AY2ZP30^3MN3m|;+Hg02GRxhQ z2Ij5bYXOr~(*ME^y$AqC+Zu556G_1`jz0e1!5D)m9eD=IzZpP^s&RXq< zZzHoyv`DBN2!hO^H|R-5n-2m+Zl7StSWgN^iNOxku?!y9_upf2&8Y6Y*?%35Px}@^ z(UA1@h=Lh|Lv++Sb}SZUr|5!jp#EGy372Nad;Ph*ynJ-x_GhXz__!pNL0iiDL8(5^ z#xunW(RU*ZsU_tU47f!cgx#M>lhV7wqqC_rZGzcvXK08v*Yz3>A0pFfO-aqI_Fh54 zND4S)z@CF8jeMNAs$?Rf&VIpJI+vT;2gOK#{8=7xeadB~JtF;XMS3%}LfY8f2LCHS_>S3&d2k!xW z&#V^vq3SBTNwiAVXjQ*VGXCTFGXk>oFY7u#D?ZgSVW?z?|rfWnw%m#(iC>H~}Yp`-6!WOK`=TpIh&=#uTN zJ-k&cO-APg!`2#0sKk2qaq4V27jyG?j*NsH=<#gwA2)8GWlA!~a>fZs44Z5eE##<( z8+Ph+n&j*M5Zu~~p2JmoEgKq# zaskBP#+riU$sRWP zO-c>h7I;H|t{9obh#i*JJA9sOzVq@{lg`tQF(xjRqILA??(o5&Y{D9|NGov@i_Aro zw~I#Eiudu^iZ;V`ia*9-fS*krVPh+j6)KAMilzD8?eSxQd}77sacVq#w{qneCoumG zHQ}A!SRNja^Lm=RF;=-Kmk@ODM4VFXGva>FFvlY>YRQGnO*%jeh%BRQ#Y(%;m(6_FlPNP zLt@*K3g0NZeVwI#-?znjpp5=-RWaA-l;Z@sy}d0H4lPp4KP^hWGPqv!Hzwp3KS^6z3S1Nba*0FWGUIXYv z$H&L_+5xc#U&OClzg^Z z`q@BKEKmEF-20LP;X$t@58mu}L#4xwKG2}ibvq4RsMOHZ1dVP(8PGX5Czd>Hw10f| zGGV=m#}amkwQ2LxX*n&`5$IBjF`>A6I9>TUs7}efgm!4V9ZOx?nV&lA9jSO-&a9rv zKmi{>WZx+E-#Vl#y1UO>x+&)KS&rhiOtpiL!g(*5lU2-@D1v4CBFSkcO24pceDENP zFo}>;xm#NV&`xBdtYJldzv~1vr~j@_F#xq!rE>sut8_?Av_!j^CfsnL#MoaR z%#OLtR>xHxe9ER$o|4w4{iU!=?G!7^iDg$$K_NL<{^QL97G4EBp|J)dpMlJ>8127} zTzkU!3T^dln0uUdT@J6T2`k?9f3=*9fho?v8^LcL?SY+G-wq1g%kEtdAWH&O|gExbD+x;h3 zb2r9qptJLY*YXJ&rZg?h!=AD~yI&(;s5G9wqgWgvX)EY`@6Oj05QSSn8lSrmBd>=u z1QK0g`X77PW?xFgwB0PsHhbYxH?>I)G)M|Ly9Mpb>8AR*SVc>3Q1GVI5m9e8Et1W; zqmv7s#1$(?nY%sz!;WfI;odcbJTn9{&!|&#Y+B>fx60TA%69rxFElKf7MP-(9p%6v}QS4=40Xzc%`|Q zl#&xeq0009NDijCI$*`_i6w;i{8ExgUrDwCS)Dx#mZ-K}>i*q=;%a|STsXi)a>1|i_dz1L~w^%-! z9~wm?+?oFd0hPMoFbK3QvvZ(?Mk4p6Y{3fzk+2ATJ0#Sn5l47N3iB9*(C-$y+=vFP z#P}X1Uw`5WXoj7O`ny=V?g$a%%Ifjhtyy)fspsVsTdGs1P#(M z5yX47xj|YzYe;L_%T>naB}w8u8AEvN-T5KN3o!O1ad}rSYqn?YjwD2xTrrlJjPRW< z+vvX|eE1>jrU+oaWXROP4AvK;6|#N32+|d4;wc_e-o{~y6%=W$7Jx_mD7aEh2TsdW zEB6-a79TwZIsKM=;cxgV7*LbF+7$M7Gu|WlpZkC##*Gdj8k+!;Z`uxUHo#X?XeLlvIo7W z2)!IinTXmM&0FPjoGo4q&Z|p;!ea)o=g6r>!VeIArUk#c3B6iNE9@NsmwjAJkuSbotaV z7_BS6eBv9Bp&Cr-zVAncdAqXIf(K?4tIxg^G5G?t7Dl(WUs91T>W-_mA3dihL(b*e z7WLLqFyM4X-?_!*)-BkUQ!-T6>~LthHyp~}o==#DxcUrzfdYI;J&rtpI$8~lo>FuW%uPP`u`YCbcq)jW^x=e9b^#5jH zRIuICFHxE$FEdf5ze)N33{fJBd_maj;Ru03^aeqY~G^KLaZ-MW^T`@UFLTtwehVt zk|+_kfu%$TdhbF0?fVSua(_Pl!}P~h_(MLV7i^Z1M=@i8=61c$k4GIorNVsPQt`Wi zsm&nvr=t7pCKc|j!IDzTXv8_x z=kJxT^(Pz(v092cbC`JX9C-el>n{|On#Z1Wr(*$oGEe2954fuy2W1V=$s05-U%dcr zj+GYsWqv4$@dvXKggjjwK^xz{QI7EE9E!1fDbbYt^|Xr)4r%<2M7!2F*3lW$D(C~V zcJt3j97QIumGyffVz;T0_=-pX>%to;L#D5DF|6NbpXeN^zWRrFrbd7f1AJ<;r#F#* zZYAM?B(L3IZ(uy`YS7vxrQYmLeGtp+N3~u1yKP+!3?WumYf~|)er^yrU&uo`5tjTL zZWq~GQ!!wDM0paiHI(RL*I&sOE{f7MU>Rqf;bD|d&qNdT^LOIA&YkC*C35XGx^qW; z(ttUq{vns>Hj)K@dUT`icF`7X0pfxC7a?^LOcg@s=TCuiBBq^AqK1YKsTWbTGAJ_N z5!ap_vHLhM1fCQ+WBkcj5xUO~Z`;b}kZ7ddo!_;!|glNu{xbso!plFjz)f=Qde}7TJJ?qFRp3qJaB17sK z!Lmk0e8%G_SNNF3vDKE*;ANP1}j4MscXMRwBk^oD3ecMNi z3IitS@G60Ru2|m9Uks87^Ua8ZzrqG>#I^QVyjtWltz~IqM$PQB#rGGl%xOMh#aJzW zZnah0vFfkU$H635)u&^QA&0y(80QRs4GW z*TXQkvJPpPMom~?EaAff+6v7?`Es+#7^zxq`_G@EGCF{|rc3UyYKwBK$Tz`ptXb5L zo7S%oU3iQ4b-OpE?4bDP{jypR?(4WlCDSb~DtB`$x_g%~Gq?gq|io$`UZXtKTgWv-f z-zvkIMGS^@7LDBv4km?amM(R#s%sD?yOv+Hpug+#vf9-U>&98%8=iKbe~0t*S2f2A zbwf!?K=wwBErF`tvREw5yA;soUPY<<#Lr{`Hn>HVX8*WnZh@Ah;+EJX*Z~EKtpy%) z>~S(xOS?tNADsFkZFwiM#v)z)D*U>q2k^axK!Uz43z{&G$(YK5UGeyR=)X{5Btl{l zEIw|V21W)vF0Z3w3mA{f<45oI%7dMpsm4=OwF^&M)OFh!gKg7Jj$XBnQ5xe&L}JIJ zT-r2Yk{L8T1$|GTht+O64;KA!x%&LLs+Mt81G={xo=>wK<&+>1s)}cWz8CG^{2F99 z^Kr89jM4gce0m7s+G>CGimK6T&kS$OO9Tn2DdI_xlB5_p#mbm$;!VPtpRfI&-O0H5 zK{Eb9>H*vwbZc!}Kb_0bA{r72`!wdCftrY$lbZ`Sl&Skp8vaW}ID4r!J<-XTi{e~F zmTqsj!2oMq!rTOJL$xRlfwVyVfnJ)=K_wb&;A}|Mse80>+q669bk+FVG@tEZ=P8Fp2CgbO2^gvqyvrjhGyIUaeY{9Psg%3gpM(X%TD$8yE2a@ndsl-=Wz1l zS0@CQ%?hzrTy)=%Sfxh}$XcTy(A$B?!==A%VUn<#o%Fo?flpk7u=7liBxJ?i0Y+(i z@p?HHRHH>v_h#F_Dwjbktq7^WmFCCq`s$4PQ&9S^V84` zd|ie!`ZxA^`$}hGcA2^oyX$PB%etFERnqpJ<{^TO{l!|hC4%lqKA|9xt}DyNT`{$k zlp?E0h(J%^>9Rnm*N&kVv^sUAvz22?BuIG}(iC+Xj;J6}$=T<_RUQ}UmNM&OdGDL5 zdzEmy@tO3RI%g)_++gMhk0Zs3$>_5K1#?8z%_BTNqcBaCrd?ygh&(s#O)xVtb%PO$ zN$y%OQpd$SQC?v7+>#%^kRyXmVglUJ9EFhcr82XgG)AZdivxk7mI}J9`JXU^H)s9| zP6+cZKOQzI*?T@h%m}!LOuFrg8A-`0t`Nd{AYDHSO_hDfpH2`-Z>SySD!Xp7Gaoi- zZ79dV9Iv{jCSk=^W?VE>x9_zBLfyJ*Ki!QQ2srJeyAvA4MmZ<; zI`$G+{Z!7Zu|Ak7>z$gIzyrrof9Ol&n<|}JCQCwMnJxgA8DUZtG;6qNae>^feG_3eHlg~PpgRjw+iLO#q8}r zK~EG2^dDSdWM_Uqj)HeKrsO#ZBSfBW$9hi|2wJof6KSusV?BkT=n}m2a{|NOO}+V$ zt1#oZ7|Vq28iC49t?~Fhc`o=G^`6W8OJ;PML4#1t+bIJ z_0`h*-@gdb@n((V@Fg*jAe7T?!IcZ=n)^|P7yG5uEqAQCLB_;(X2bG>I)#)A8fM!A& z`4EF_4D71)_cH7TElI?q)-GDUUKGr$UI}#JpzUT?wcthj7UuV#F6MW>Rf3VL4PVeB zoE-;S?&}UhdL80BB0S*Yc(6BcHC~k&Krq!GY!mY$Fv8FjEi@20JPw1-j%~T=*RTqE zWR#RG3UcbmSrUPO(P}8vg<%LfU0YlOPpcEb%MV$$zoj?0G&sSWos!tI-{W|TyF*SN zJ5hp-&&LS4SDZAnig8Nwn0lvq>b}>GtyV=onbVCE?=9jZ+sr;;GJcpBm--qywW|%` zbyh!wpV%2qCqhbO2?)5aSI!iMHpphmjA-lKJHeU|`amU6y(KxfsRhviI=nh+#;_EjMZ+ zwm`M;Hy%N494Uf>j3lHFzvFJYf|r5C00LfF$YOH`}k7_NEjM|`{#jWEC8gGYkq zl{ z$UpT`z2C>3OFBc;P-EqK+Bojx5cM1s={(G=DWLgax=i@4N` zXTWLmyx?Z1qNQauTs)~PA{0x73<25{6!EY#7{`2g7`pCIj$_G)kjV52W7ca}2fXDk zU?6fQEK--u6JlRv>m?|4NjOK#b+oMIE-e5P|t zt$T|lL=hk8=ujE>d{^;|(#od>tdIm=N5j1J0mK80GDG}te#eSFa3i0MgMo8%)1f6 z5#-L?{-Rfq0>zBc$VV(GTeynP^h#7vQ9dK2?U8HU+Y}P#aMmleiLbgwj$lMZZ%Nb> zCQCNvq7!mgD1*n^3#LVlBh+XNn%~8$2;44Q?oEa!S9xAoZnPy^GuY>VVV_W0YzP=N zP%$#fyo$2|BVL^LhjTYdN*^voc4r${{q80+C-$dHY!+&5yb9~rF3dHx4SqFn@F>An)2 z)t~3{#EvyEyc8jsP#z8hx-Q;~K-jUKq$;y2n@Jil=r`oyfW6fG@9c#rXyZied=mOl zZvvi<&tspa*Yjj$Dyq^3e^@?7Nh%J}`1q`}|_fb(d^%#dt!m&Gl zgz+*dtJeDF;QQ6=Yl^R;bNz*T(P#69Bg+I^mtVM%d-&2{Wyu#V-*Rk^r1sS_vKWjs z6IDq^&eFVV#W3!@b335enL%~gTk*YCcKSDOMO1MFT8DPDBb|Xe>reM5ln#7V*t*28 zr@t!@34CJ8@cyTB*WiE8ljgA=>a|199);OM`7-u_tV~?RZ++nQcE06b`EN2yh1$0Ul($3Y zPZQnCyFb$f=%4KGEW@H|yC|$8(nv`oFm!j9q%;Cb zH$xBI(nxoAytGJzba#VvgEUA>mwXT3@41MXIcGon?7h~#&eN$&&3*?N0>OR*G|H8}zG>BgGbIJK`mQ0)+%jH=BYgS9oA^Phwp z=H+3XfaKzxuUP}bb8nMyE_m}0fO=dwAtB*c_gj&Xiq@;N)lj;>JBJH32tWof9d2j{ zHiyD~v9bT5K-dvE{t2$$jf_@1Yb!LRi9?G?V)a4$&D@x2L`mn7Dz0dV+L(>8&^>n2 z)W1Voe=JEMo?ni#39h-Vx576aH=AJ9I}629fd5fa0*AXAh^LGA#(1etT^q_*KGmO2weZ)8&y&Zp&(ovdZIStc zpiYe`8j!Q%(zdGHJUd%6-Q|;D*(oDir|<6}Ugd=TD;kkydI_+(l7N=}d0nkRnVtKd z6aLgLoUc=K?9%xi$14I=Kv!>y8LyD*PRH8-6tV;yCW|J?IscJm{XG9uXWh3}D4!ZP zfnq^}@4P<=|NKvO;uee<0Ut1$crY4@3@)^Co}^#(YWsMJ(H()W+1BjdYeqyr5EOx! z_y3N%AGS!d1F(L?nf+*`2RDmjR&Ph!`D+8Q5hl^lLF&cw#d6h{jl`B1bq@Nq&O@!@ zDEI?D8(K0r{C10sH0AwH`}U<8Q{8PUcM&=uIe4+T9_)jM;cq)qKx7*FUg7twg6a7_ z5;jeoK&WNCEzdu0t64^{u{}s>pV7K@R2|<1-m?DUBJbXTkfdj|{7okU=}2004mh&T z_>JZY4vu%$o7^6EPUNGo!bvvm)v>RJMq5eTz^M5&kMt>|{Bf+-?PfjrHV{wm186N) zbC4<>cNIZb_&1!TEo3LgEc(6BDfpIu?pyHyuLDc!0G=Z2W;RSa0=AGmwkD0pQ~8ro zD9ec_vXF}5tG^r9_qO=p4nNwG8xjAB0y(hU^}1)V-Sqjl>l1-z+j==`8oRdvJTZ!h zCY$}n@)mR*9qE_0Qv8}lpiJB2eQ&U+CK0*meEVJZ-sQCJAW#@!)S?Tm(W`(zy z3Ku(?hmG&Ah5cK#B2}f{=VbyA-;ILuKywB>7RtuoaoxeT4H>wQEho*u6gCW~A|`>3 z+YVHlO;BOXWbzaIZc|ZDzF5(VFlV@t%cyXs>4H%@{Ug#yx#k{TtDA#QC8LCXEFxv- z%)|^;b^dEFtgBLku+C3k$=a*xmm_|BAtZ-*UEP|&&F+EXFTVBwc6siUT3RapTwsa* zGygSc|B4eV6w`LmPD)I)R~>W&-WYs-Cw%56JIEyv zF3Z~JQT0nl!W(ejw4#xBHKw0|MqF`jX4*aV^+{m_Syx46 zjiJ*CiIJ*qjD%p4q)O~=C%Ge>tl?}mm@6(lglUR7JYLSJLa>g2J{qnAsFVfe(@yQ-n}I5>EF8d^}P$%Zf8cBd%DejO8s}w)1I>?^dJCENUM0BKULCB;5{`Q)h&JcQtOAy z>=|G>diUO0WE0i66hETt969p7mJPmKN22ALHeI1HaPrgg;^l!jxmA9qt6SMGe5re` zcp<)Dt?;>eYmeF^k30Ag+(~B@5rJzoq1=UGBbxbj4Q>_|7I~CS-bY#)KArGm60*@w ze}7s`p&ITVsd;j$%JK0l_a8<@R8_nzS3>- zoH=0J&~wJJktVgCBLQOHPqtphm{UCP=mQv`W+`5>nM(^YDc^3=MY3CM$@F35|3n=a zKm8r*A81rsK9%aQ*wm__^y)a?ov9@vfYdUH2&k&Z?X`K`|0+>u;eApZrtK@6U|VHA z&1-*T`mchBN*>6hevkHdq}v{kHVxW8JzlG>`M+{JAO44CW9gc1!g?$QZ&dUpq4mH1 z5y?J_uZ(y_DKP!*#zjPUFO*Ne>V0k6_DxHH?h>f@biRC&MO%cZR&xL$__gV-g zsXZh>P`z=Wlss@xm434@3b&G)STbI^AYuh5$?Ut)c-$VPgHhif{=YgD1NDdnUx&q1 zAtuT>bU0}*ZVy;M{M+E+S0!AppY>g$vof#rzU~*Kux}et$k5K)v9xt_yUd{9-u7CBQl9-8(v6?~lmXG+!$h0`^d4EiGB#wt@$oh3HXjZpWjm zBOslTJC50crK1$0TRU>Cr_3uGT(15o z*o=A*fq%T6^(z7bj5tpzPt$J9C6+Iu%=ts9=y6+Q(h$rGW$ELlk0=nI3aY?w)Fy(z zboqX%-gXy8cMs?W9l-jgtfC?YFb0L(RWna zw7e$Mw0}KGIQUC5TW|z2k)tr{+|hjqHfaUKNJ2|f(|u%QATS&+xXpWXB(=rvY$M+$ zuFY$-evrZ56ij}DDHvS2jU?E>=S=brXUbvGH1wkc0WeN>vXDMd5eQhYxa>2O;5XZL z9DJld*vuax(DYM!`h!T0Q1@?rc9m~jhV#o+*xQlHSjQtjum{O=J<-GGDIXb(gZ`)} z>GwEkk8br?>(PI@V_x+*c~NIuVe*2Ytc(%7MNPBIPWN53!p_~y;8$~*ifY6Q*fo`m zv~w!#(}XLNkTrUUP4i{&nL@b_+T#J-IEh@+;8+wwAR;*t9~+B_*Y}WHx$G*UJ~9Xg z&c=v3&qe1J0~02EFWz#B#lv-C2iWHU$(RB&!?V9nOn^EYSMA#jknv)!dS+u<}Mdm!ou#;weVS@SkYbKLg8qqYV5z%#)n2rfPH zTU5R}1Fd#x1OF4nsJYYBf}>87R=UAH`MsHDp0Ah3ksG;2%1s#hXF#LrCmxJ$2%PRW zTk%S#K)^}x0vP`eybP@d>OMxl=e^yEpD0oy&G7s?$O|0adxtgSQovsEt3VEK*!x0> z4FBi?Y4U&&GNw%JI5_v4(qmy^6I>8{?E~-d@Qj`I%_pKFRz?$P5)8g-FjmN!51I}< z`q?RaY(^P)NIX{g&ASYtbBZ3|S6WWsq*6~l-Hkux+LGMhp3GNmrr5Rtx4iiEhh2R; z(Y+YqCUfQC(BjevBlhx+51^P(7AXQ&2&;XU#FG^Hn%39*OxMb*f?7>B0-M%LHF^@S zm%KaLGpKQWwKdZHQ@%PVpJkgHn(~jMGL7s9x!T(jn1%;6NsM;H$g#0BH9p(?4dUSm zxFqy>OQhNRkHw={{%o9`2!Rc(cD`wN#yYrZ4qsm0p8^{N?<~u06-Ogk-1SSAESFi( z2>?l|uLbv;%nE1`dR3)bL}Z9QDN>g@>`cupn7ufM=Xt7D*Xz`N;8{at`O^d0H7rA zNd%l7_$50Web{|>vwegaOz#`)H|-v;%X#v$%727mj9$Id)!0I>vXcZW0}n}ZANBWI zN;Y?akNK!Z6g{$1#Dh+G93%X%=-PLfrJ(rah0yffq;H9KT_H3}e56;nT$OeV>AO(c zkx*om&98S!Rkp?g$0Cj2YrZ6{-_L56jvHBZIqbq6)L0_`OF{=|Eo5BcZMt(&!uQi{ zFy`4_TlQda9lxAV8O8fj89MtYb0rxL9q1lvB3o$sgoy@mUWwr_)sX?}(-$2#zaQUz z`m6&(jbB-AZfYV_*YS3rlsr%pJd;?y`9`#P&*4&rV9*`3*W~;Nu~k;yk#}j%w#0cJ z-aPzGe*0;piu17{>NoACnrXXJ2fZuX(355^W8Wk>R@&uVy6#^|JTmC5#0_K`(V3bCp@p6rbEyn&yM;@b zW}0N)rTg_0T^q|A$%K&U7172dc+9$XHLI4vIw@egSWuHVYo_aA+j%(GcAERQH72kh z@qXnoA9r{D2e;HznSjkQFDe0lPYs439?{E_mPhp2^2j#rYk(ul1^RA*_lzQbT~l4P z(!Jvj1}r0c!>_8psJv(wd{GxYj~Yy9f~2R8#w`o?aQ7KYjU#-M9N%%VavI8rnRWf4 zDK`>+*x_BU*1Im7(^BCH0Tt?;N?JoZCgY0kk0Gsl*PRJ(V2H}$JOh-tn>$g24^~~R%nK0^tm}R6GB5ucal`T-b==qUAH>r~jS9Vi120AW z24XX_2ctmE9$+&;RN^=I9qsdAyro|GeEa}CuHT52!PN2jN(2luuAc8opyRdG*h)AB z%8*}WPm}}|kxEk}W3pAubl0#rhQroK(ox4>^${OA*VYBP*GasMcIR3J$nPy2LnMi+ z>6_Rc7+t7|O>YAdWdfokiGXpmmGgKm!P5*kol(&m+_4LF0Af$X5g^<*_*F+=}$NS)RD;Rg3w zoS4Uk7(gt{qKJY7>&afuV_?ptfigJmwhC%4s3Crbz2miZb+E`f?fQm>`SzWlq42#D zTJ8MUJ=0Aj`WrT3&CAW+*MmSHoBzsPi0DxxZ>4EkZZ#GHm$S`!^;N1(qhaD{`qs;J zf?}evuS%oCfuf(iQGKyj??jpoo^I`>aufx7?Qha7AGE}PR!LQ`NAGxBK-+fh8xo;_A!Fnur!hiW zLxQ}K1&KEfMWYiF=uU2N)grB9&>lJ(KXb!rSR6sFWBV@>gRw$Y!e4r!SjO0P({uHArvi1ypFe-pv?L`p4iWj> zusSsL1G)b1=-?`4wG{ z^(qnfaE^abhMDc;-1-9ogC1pfT-BAE=!(jf5 zuUVVIksH77Qbr9`bi-pJVw=W1sO?N62~(Kxe6_ke;qaZN0I@-@HBBK?_f^ zSZz1aL>``7&_}c``DK6R;g}-vk>cijV44Z@-0y+W(3D0X!%M*ii*TjT&~Q|VT&E%= zM3SDJ4>j9ntro!j7yKFXFTVw&N=3h4Y2^{QKdb>SRct7HRH{2| zIk!6zy0$a+Lhp|v2~Xu1w%Gec-h~`vgLY+PM^rMhIPr{vx~KrNZYF+B*xClh+;~z@p{$m@y`zEjU z*Y)6^nQ>p#viv_x8#X=>G?OmCs^Kh~NaJJe`^HvfIR9-g4EDx?K-tlX)fkkFSA zS4YwP05iY}o43pR+bKtikf+;xh0pDYAB0A<)0mCRq$hFxIOo*@438|LyQMW_UEmRg z&2mfnkM^%QCDtk<*re|D#F}sy*gjZ~Bz@;}dC&PhhD=sBpUl@fk{YXKfO1U8)pz1= z=!5qs^mJrN^{Y#nRte;VOvyXzmAU!voNsZy4{vdgmswE}r?ww>CE9t(SgZJ$o!DA> z@)YZL(T~YoL?)QXu`A1dPDY+IuAzw3O(JWI8ik`NE~OZ6iOM0p-&D2)_K%f>`Whq}h`F}}L^-e6 zb2qLESHnaGw8xS0s&amBmvC4JOd?_yF9`WZwl>5TM*e0_DLaaH8vS<~EF#Z40;|V2 zlG0%6>5Kf5BG>u(FCp6iMM1KPtA- zhyR8@eke)l?h7evcdQgg$I#lrwnNzYeg-_jX};R^{RAtctg+57Q?M&!GR*h7%B>Be z=Ce@_?jXstF)B>xR()eH17o>$-V@7g1%5ekKTC}H+VMe~k(=agn^wpZUERSN6kl;b zH}z!Qm-07gVj=buz;YjDdvRh5Wo_7Pb=XFEX~jvu#bSSFQG`?WD_Z!yKim*^p(>vQOaE9)T?prTZq_z{s-@bC?V<^@%%?>VuwnX` zu}K}?YlzFlmobpGv|WX0SkVMerw#G-_z_Sa3oXfY?ht>1M5aj62lR|G+HwoZz@}fv zeYeHFR66|vlh&Yz;^oNEaY!%xx-k>Ee>i8Yx1nTgt{LMWo|bwy2+z_EGiB3v9Oa6w zkpi@Ws4@M=9}`%k&1~3CiKiy}%S$P*@=euR7A{i?$4UkM6-t$@n7qjvjxdqq5*NS= z`p#@*)J zg>#B{nco}o@+K5RjlDe6W!gK#&Rv9Z#oSQsuqKay`@!*r1zN0;VfD|WD2-> zw#cxf{fY81zNL+9D63FM#z~Rg@KW)6RO+1Dqjo+qW+;BkIo=jf)`-5#bAY30km;7N3&p;)U118gpSX< zw_>nFZZt+$w|qpr6CK?-@SSU}DP`Ty;M)6C(5>pzB_!!Q=w*+QA%`R;JfwET-j7in zcSQ(wF3~QVHFb=_!lGIlFF8Ch9(@dUoWBye1XPTXn(TnzHK6koc%6AenI~uZH5%FP zWTbLj8K9zwT`T(j#2QVfl3#`8)T{CkHxm&NOOhj1(75^Va&csnuqz2%Sm{-vo}mks z0h-kE_Rtk}7=e+f2kEbVQka^A5M6ClF1wt;Ous+nZz3wfoIATgn=l0%;#< zKjF|SM>(604jGzk=!ieiyqg|v)LPEaZ{E7^X6{C_-5S0$W<*P_=lCe?#vwuXz8lrH zK~~46tcbz$Bp4&2>xV(T;6(pi38EuIl1u^v!M4Kb!B0s(H1T15Ad*Tvev8gnig@gT zh9={dn(k7$>Ow)l<)yfqmwjaZW-8TBy*?E!ByVFD-gin-U{s3?iPYzUr&QzY=UE#t z@qKhDBw}Xf_L4RXJlF{uR(U-0Y8G{-kh@v3y3;F&UEX_g(E>A32=eU%Tb>lh;+v-`rE*US7@dA-JVQET#lCs z$W+v|@ghEvto-MXOOv91co~P5pMum1y={fUCSfOH1AU2I+RIf=>*4pYul~r;YmqXA zf0n2#*i|rvUqE>st{kmdj=_o|#ewCEU1jiA%Zm04>26iEc>Zk&hsczkJ3E&r4wAz%ix!Cf#GF z%|DpQkFdSnvdBALK;+}KG^%Q&w1h{9K}&4F&h}<44qtt94$V zdO*L{_8LOztIeb}603313-N`9w@6<*KWH2tn~cTB7zd}5Nhrp>S!z`@91}VrT6kzR zkP(-@^;dtpH}1+EC&YL^Z=Jra)h}g5Sbdd1EDd9C_KNu;VxELfkXF+3lFjMq#h|p^ zP+(kWC1oBag;dDF`Z%FLXjJAI5@lv*Q;GWD($F`klbA0=8plc~YMa|) zbncf=aN`(XZQnJPy-L^vNHvB zeJ^LIbTL?t`4O_d+N>oJh`3HnN|N$Eh2u(Py>ubEhEJo$3-&5vC}P+U%?bQE$rVvq zXhy8p4ogSAS~hO?KqIUg<%KajNUzWa>$bCMOUSZl_RDsqCJyU<>+XJN1A8bw`+!H?TsNzAVCGWK&T zwexBP9{4^{0E!f3$2$bWK6J|D!{uB4e-|`U@4SZSiX>cq0cW~&W&b2+x7e(6Y-y*c zST%M%+81YTpKir1)`N|CC+8~7>=BpDLV4P%gX_af#JUF2UtB1ur!UWM<{=h&)kz8` z5%PLxb(qkmWWLz@CFvg+I@(rI8C%`2w)=xU-(*FL>wIOgs$F>^mW(oMhUY_!-m5P7X zoj@v6PPHdCrq69!=zszAxZEY*!^8`9oh)_4cQ(|DqAv!LryrSd6@;?r`&w}xFzD6PnUH)%1 zYSqW4AyAySy)OdwU(0s1qiVX5m;g`9t{E8|FEySSxwmcYILCR+x8@;(6`-CO$>{KU zzca?6(`4vR2yuN@Q14rq6=s}xcg zg|X$QjXg#%P$PSS)h|kFL(`@kiP#_};uhZqa3r}e(^n|b+4(W&b9a*XHmI_0W+Oy~ zP5RwU|27RY0EV3tRC>SVe5_mKaSAC&QjDzSS;lz}itc-BtLaseW}Z?E-fKKveVr9D z6mjw(iF8haK63FF%S(ph$X;^x9yPFlE&V|y9Jae){__c?7_3lAv6$>YXH*9F!R9wn z8ts`sjVSS}7Uq|KzF9Bk9!y~!-oi`jdTQ(4O8YD?cH6fhgJmyL(@UR>-$+7n~GM#bTVd+BdLX&guOU!t9|eSGSEAvz1HGx z9J*RF)6;o9b5m+HVr5Lo09jv5>|JqKkDo=*tc6J#!KE$)$Jpn_^w@=49TD;^DQJEA zgh3~#m{oHBq%6F{dU3|+S%+(d?vjbTpzJZGUfnlehd4MS98fyr1aX#Sjf{x@(WfxJ*%tJDVQQ7|mS6P-d8u8ImbtO{@@F-Eu8^Ny1SG zQa2+?9n311RaNNVw@aME85q-W=^2^U8bXa#;JGr&NHFs;LM=$xu|h3l6FaS8_$C~8 z80x}HwKpnv>=;XLqZ79sDEwg(S((t-Ph%`Sml$^HRV+yO@)K8h%_%W4=Xg^MQ)T7H zqXThqG-$NccVJ2#<+^6AEYFh^>bN&sMx@BQ{(5uHI8Fi+XSiy`pEw1NSeQmbZGlQw zMf^W7S)|(Y%8pU5(aGySp2sX@K$D9>#TE_;^d!TrT-@x(LkWS{`8O#xQud?9p^yKr zKClyyS{e9W&BGn4lhiR=rkxs+b~!Np2=rls0)rv^&VO*e<8fE(z=cAuh%3__0~%~2 ztgL5o5&j%W#^DD;o%*d37Z!bjU~LBK#x?s&YPgZOu|ueGu51*zfqiOot{T0&7}Z+k zjHm+T`ljT+50M-O?*u;558pnF&ADy>KAl3QTzqQUUBhi3kvNlzco13y&w;#^6L?5g z2-{~rw;$!pN)m1pax6S+E)sCAJZ^B4;h=O>_q-LPOFw8b6|(1I@ld8lm6@Y!89`Et z8eRGvOXdChANs9~jGkI~c1)j?F>GxkA#|5GhM#i0%PIWxV-}KsOXPO=sJx51n@%0Q z!+7MNtkc=O){sUL3mlD3>}qR|)a1Kntb{rYWX;IVmxg>b2O8DV^LQ=;YPJR`&%?%n z0sl+gzsHLZ%ayWxDIX*w5hC>wubNQ`RCtPouq2NVxiL3guqWQnww5F`DzMpT1i${U9?@d?KcfVbCvz_ z^tN(=<{WSXU2qj@TGbPjEo-v`jxMIk*r~CoD2adS4NSW^*BE|dhaD!%5qQmuWrgSC z|CLS}4Mg%zVjd_hVAndn<)Vs;DjSia#vFf3*NSPvz+NJ5xhfXLv0!1^r69d?TV-B; zwE9Wvs^aENT`k=_mOX0#-iQN!o+{dXSNCd=zkFjK%=u)|W(DBdavR(NeE1e@UX$@a zU?a-7dT;9%(+DEpQm)4q%rMAmWBfogJNPV+&O_rOdmQu;#=1aeOC#Q)VLQK;!Db~g z`5n{3oWlf{-82b>$+QQ{Xx50JO$oUntMrBr&h6>j+lcY`O!~=C00bo%9~U?g6u)E8 z-l^23nFmK9M{&F{;`QXBb10j5H8ZY_N$|}RA7_;1mEliD1_64=Mb*tmlZf9uQfM?^)pXSge|irCid8(DsV9zXk&G5XUwRsb==t4y;Nm@)b% zpV>~A1E3zu0r-oyqI5X#yZ=;*xuQbvn%+E=_^npE(2&30CNLJAV|8St4I;%?=WfBt zIf%qE-}#$OCzi_iTIg7FWEMZC6?l-N#)oTu3}Nj9Qw5AhnyZ`paXffh%LHz^uLaZkTp` z%JMCtexAXl47JEG(auAJ*_UA`8J0{8ujQngP2zs;R>6#KDLTInufj0_v9Mk4o8=w=Y|dQ=zFDsj7csUS19Q(zEf< zL(k4X4ozn1?FaH!Q^Awjvh+C&{{r9O?G5LZ1{W^WE~Ayx6SyEIGM2#bhuY|)2tiDh z)4!<8mt77MaUl-u_oF?jUL+1rE|_|vMplCFChUL?xbY2RZ~*1jbX zNS$x_9{jou(vUblt6VurnN&dz`NHcuOJH^-QE#&X5$LE(vIIM6xX~=Qa<((Gn)PNz zj!^haWAZHaY~L`h>~3VL=5*zX5ACD zzWC9I@pL8E4`XDEg*eyjsQIDW26qPo6M@dJ_<=wa@-FZq>zzUI&lIMjQj-vcl8&`~ zM+0@dUsl+)4mg+^~4C{1SQ z$fQXN%`7#9M`oEttX~Mr4)pv9ODp zSTpgGZJMc>R8qwws+xo`F&T>Y#fl5y##IV0?5RMoJF4+m+HP{UXPF>AZ84fpgPmb` z6yK5tmS1UdHFRqBs`WM2l5$vnmF$HJCU}d1RcypO7<5M7Iwx3!keW6%RHR%Zy%Od$ z-rZ*k$uo(KnaNpUU@{Of{S(V}TTYj!Ty-va#*RXU9C`~F^DnKOhI&^veie^PL5}buTyD|Mx0TXkwMM6c(<-v=Rf&Q+)vfZ0fW;KiOfuM zwX$kPX>^3lawwDwAr1_&@WWyg(nADakCrkf@%M$X+k`37laFB6zZMnf%xzs%TT zP6NDnSlo#Su4*`uOylj8pZ@3z7&3&9{IZKyxxm~ZCj@FX)FT}>wd&N@!wv#h94(rM zLoMx?sJc+4xs=Cz7?0BjSQ1TaCMWc|Fws#hi0Cl#oeYz~-yOQpG!J0zF_|#Oq(fM2 zPN7@RNe#H#Fc>D+Y_{f*?KR92VZ{e1x$-kPAX~R+#dm@I)Nl7rak<@IUr5}@e1544 z<(WB5!8fYQ7UZkpe?%Bidgr_u0_kLgj=x|0Z{(&8BN1YCtssSf&s`cSQ8pq!M;z?! z)zPMq@ZX?XQErEP?N^mIBL<=dV+2Sq#e6m~D>Lv76=Z2IzAkW85WA5QT$3X-{eog2 zD(nLe)iX-S$A{v}TfWlu#u?&FMske#q`VXIcoRAY;WTk2Q3PuZr72^#aBD7#nmi26 zS?*vLI2Gt5M6&YGw|7f!Z?aOCh&@x_qBYKGp_IXS)osy2H{#opmC0ElmXh!-)VHDi zy7eFgdm_M&s4tMv6DT>QAnOAzY|YH(Qmm#H&ix!N(=eE;XMDVPS4roa)5r&=N>L7< zrJbtZJ1B+Pyc5LE7;?NhL`aeFvb2OJM3&`YkiigR?`HXu2GV?K-^s2-eIemNftmVf+`H$+x(#xzY z0n>2Ts*Jo>LpjQhM`;$zrf}LK{9Et5G#;@{`-< zPCr8AB(B9Je>q3)f4>P}#het!V?i_2H6}6v2pi4^V{4C})qV72qx~zTHNF!OID3g< zr-Y7P`G{S-@O%G*QKy5oI#TodK86AGXM96_zCl~;<*})K9AZ@mj*r1ds4jIwjA5)< zvNGY$EE6NKgda1DR5RXi?@^h6iU+=*mdn#(o z-!InXwVMG6?y0iZroy8XSR(u7?G_eo7U|9D=wc%X080X+}UTMLcHdt)%jh~ zF(v_|d(tS3YT0%rhxClnsB<%*H1q?lmoGoH`E`7QrhoeMZd2K1zhQrZwFC{)>6M7cqaWjHBPr4I=#V9V3xP4zH8|GRi?1crP%r7zPSt$`}y_t5)RzYuQ zi&U=}2w4CS8IwrdAh&70n85c=M@`0r0zoWmdb9YU%-Sh+L>-~8F8nq(WBxKOVR1Ei zvWl%$ghWVMHnxd*p7tr2C!@WdeIu^g7Z$F}`k#$vhl}cAS{fn1B^SZQ0yOi~M;pTA z?3;O`pNzp23sJKgU4D@|$1V$>XTG>Lz}adm># z<$7(1^67UtuLQxsZ*p{(YNVg+97PrOGo_P3mBjSl!m#Vq;}<43{%x{O)-I@B=_H18 z(&+Tmz`IPY0!-MTyg~doEJ1x_f)C9y+>9l{m9@xaZxwqIkO(V-KfhGb*iSLvvUd99 z;2|l;<}vF4@IiF<%)%nK{mPYo@+Z_4j&IVv#5{ZPx>qE-Sfr(vI0;t$zlXnK1JCb4 zATFSjdJ2G~6Lfr^11$_9cXqR}T{Brjn^@>nlnPB0BCh&LquGpQi>po)dAO|?p%4Ff zK;A%A&{BzN zx>pf|Q1Rh`@Q-l|vqMZYFHf49c`hj$5G|-RqxAd}6xIm`+F4_B=HU zHPHqxy=24I2TTDte};@=5!Zc^UNHqP_qz3c;dtc;1?X=Xkz1fN_)vHpQDPdSUQctx zoy3##{hUIi4dh5gd~a~=wvZVxau#DW!qM|vMaJa{jcc8crrQe{m=sLa`~U(ECx^$i|Q5bPn=C>ce62# z>!;WiWYchb(`UovNE~(AvlZdB0ffK%jp+<{m%J=#=MlKODmU)|Icaa^T>j*1OpXw0 zv}kJpQ=Fr0fXM*rOy#!HH5Gd=JatKSncXoff@%58Ny5V|d30u(nokyU<;WeSGM1@J z9r@8AiO`%)N3^NH_^UsXh@6**oVG!lxbY3boqzLQ42aN>@;v@V(2w`Y;<44MA;KU% z0P@z5|G2&?wrNJ=;iREdbbb(Q69BZY%}1}h3z<86p6zE@<7P**^Fa`JEQ!5vTe!Gx%#-nNLirNyev*U$Ff5@52;mQQpY_;x|$f57o~H8B6@&{#Eg=8yL&iSDYLL=~&4|#!xFkZHF}2!BJ3@+(3&l`U=h)Cu?5m ze~frmRFkxr#q)vK=_aojAO2BVo|mpTwlKx+n?fLYQ!Oh!;E*SqkQ%aY&p1`0@k~-= zyFrnP?z^ShP5)~pb~iTDlR!^nb5=@p0_Pjfk|pLcsf=@qrkO>toaI0&&i+q)X{P1nJ~fZS5&E1@o&jQGQP`SVQ#sKz5@^KguH;395*4R`g#%o5_; zn7t4v?JJMQ*NAcubqPOd69Jn2o%1&tI<5T}$%Otkh|Ne1q|K+>6U%|$q@lxAFb14# znYtirdN$7+)(VfjeyXiCN*g1zMjkyfdopjDT9LMAT{(qi%p{&cokZk=MnnW0(bufk zRd%=5nOmRjHeFxq8+6-}!r#aUZ0!dV@^!0ChKMqIbMVY-)q1zf7#haRFlOZA!y(lQ zvTyv0+Z)7PtJkWIJ;X#P`A7@$O1AfF;tH@~8c{CZyn&`~Yu4aZq2717eQndB?NwyP zMXy_)I`3ok6F@-|^2pr34luz?4#FAs&8Czw!rSWW6l&G^s~xX7mmT2EPWxZI39K$c zUZ22&r$Amp@g<`z9MLL2E>5wXK&m$C>Zd;vunC7ft~}(@1M#BvL2+Vr`dQ- zdsYJQzqRu~C=4mcOg_Lgg4&c#=lt%(Zlut{aRTh-7@|iMis-Zp&?FF@dQaQqdfFl* z&SRZl6FZE&ckeo>G(7nidZba@PG^wgJ}gC?;*XrV(PBs_ngkbPaN(H*9jm6R-OdU& z=Rbjj{JUqI#RyZdJR`# zNG~S3uZo^(Z0I}`iX}YKcfNie7tL2UqJV$>-#D}UqOhkh7nRTOyga7~wL{lzP-KCP z$vF`;F`gUA>b)yqw)ool}9@&o7Ye2+yBX(lb#!vT7E%_brRPTp8{rt^W&)fo<3_CGdQtt(9r>=(uku5{Qh0keAj-CjO=vQ;MtO z6)VALe=Bu41so>GWL-eKB0pW|we$@SpzMC*cRkLSIQIlC^V#ig_CdtB?9a$Af{e!X zK+Z?dKE|ZTsY)AL_wM3&g{b)asBZ#rzI8m$dSf-dJ2;PyS^uy|FL48Nj~Km11rxbI zEQ@eE;6E$ec5QolJW(y2x&h|!)U;a4SB!;n23HjMn{rOUUvyi;wy=uFz84z(-5Mm& z#nq8=3zgz8YC2op-qK_pGx|ua82uV;LP* zq+S=8&$#q^NNcE+@?zm$X3V`rTHm|BK&F-JWHUa==2fJS9%Po~PW`)277uiD0pR!5 zY917qQKTL})~|j=;izaVT)5uNa6gZ_O$AXl5>*uyVwgeGG(=SPfe*<(w|J}^wHLr& z{&8JCTQ8tj76{(HbM4MfJL)yNFx6Qv6>^9mOvI(OKnLSY$LX$XyuMz_E{tMZTXCj; z)QQcMSVV3CO548k_d;KP{<%L4>I5Qtl{o91LWRRhjeRiKiHU2@1%h2#1_lnjlH%eC zXDWnPn-bwfT`H||^Xa6W#5?;0>2%-gHJ>#%fM>r}^I8M@TGf^V>${%1vPqCuP&ngW z_X3c}Sqp-4?4&+&sq<`FLVx0etgrFW2diy4s!8a`j`}50gq1>6NDf9;RKdS}q>=&%dCvh(mQCB!t^X|< zwf2NXU=%}Y2J*k8U8vwIcBSPBG;`O#+XJ~uQ0cIEyU;|dL}_P_RMY4GOUT2;vbpP% z<1F!5UCw0SR9D7AP5fUWJx|V8CM^k}C%@baBz_3o99GFbtD`7?eOTcAY$WhJ#+EeQU;+)AmO!aK0g;>FA#I>`J*sP-<~)D z-c-acNH3I$L5t{P47Jpui|@Y#kbMHY3XmJzyY>#Ql6%lZwJ6*BE0LxT@32|i#=OLj zOOMzNP){=c4o?6;e1{c-TB*6jh+cCny*&FU73ERT=Fi7CNVSA)s;;NgVE8khXund{ zn$spxC5ag$|NKi1t{)^)!g4fdni;3mu@Vy%$QdZwmm0pL3BaajiD4jp^eg3#die() zN3M5Hp#Of&;srLIwVl z6UNmniSIu^ zBp_WzFWuo&*`5uJu)A#yV3umu^zl}K+^yJEcVtPG(9hR=%BxEJnTG7_($-4fc)G5| zP=?*Iz3(hsob7eDc6aMNn!J=KlC~u z{YgAz>wQk7xEM;S(*FkOU)%q4BQ!NNOE&VX^5zkR9j+L74ClXV2LHFC7=>j)pDeA- ze3U?3pTinkl9RvW$3&l}u;)xRvHy*Zx{hYoGE-zNSbRiG! z?Y@;5IMg3W(u)7-O6@4Up&r+^Z4E3+Vj2#8Tmx5`JV2&ijuil$I*{O6RI!5?O}n#R zyu8ZFO0=?=2$=3!o$Z>9;L{)V_OO}6L=9cdg^iO8kTx_FbqzvIt%w*{R0k4o&wB3tfIzMAZV}h|ht8J*_qk>u>ZL9Za;!cR-L*tXDZKk>937M; zq7UXluNPe9{s2-c*@_b1M=Ut*ex><^m8@obHUo~5cI(4X+H33Mx`3Aa2%kx6RU&kJ z&hu$GIl0K)@-J!V`6IpQcZu|`R2f^tP3U)e1kDapQ={sBPt3cLf^6klV+olSq<3Lz zFj_~`*ufpuY<3gm%fp2!H)}9Fun<@d3quBRTAaHTj&&5e=_UE^ZR7evoE>NvsbdRW z)f=7z8%P>}jR>K1@;R8sVnyZYqDW-Bj%qqaS8W8uXjCia{{uViKqlhYF`@Xy{4g9$ zi>4yAJD0%ct59w23vh0+GS7ko_!O873or3)TF#{Y(OT8IEot#g9{R3uaAkJOSY(TY zaf{{uv5BPTcR9qzFbB{YL#>nJprAJoOV;)FKjv^02VGS*+dGv7Hg?v(y%io9TCxG{ zNCwGuiA^q!0`=r)CXD`n?*-nq0p}vW5pH?QU)fEY^3u{CAg-DEiV9K+`ZAuRt^Z;c ztP2!#i409>Lu(SHLEu3+8Xt@3ck@k&w6?fc;OBwURYvF*#4_Ol^Xt%`mm}ljZxK0{ z9fp}Kc!I$d5*If}WMW28Vjss{s!`=%W2Cb6>p?9)QF;nN`{%!$;P zjxJg`3Sr&RAP+fb97F7yoJB2LuF<%1<|b!6@89|Z#?0^g`yQXq_w#wZ{+k?Yl^}OF zGWC^TW}Vz3JwleNpl;~t$$ckm?#xy}n*)-#HfJS7IX~+=_HF%dy+!s7wTi(- zl>xLEy>n$&t$7E!d?i5BveT(v8lU@(d)=?iv>zwjfuUaxDUr#m+MZ`nE50RReP(7QAOQ)vKJZ)G8@W|+$9~m zvb;Y3j(~3c<~N;HdTv^XtVJ_Wnz&gAmOVZc>+9x|G7v<;|;=j4Z$p%HCRytHgJxl*=2F8$A z$JV(2dsoE-m5PTs5>m_cr0S^X>B)fl{Zz_B&FL1W&PzFzE1{>qR~qW5+3=D{AWoj` z-YmyQ$8yFvw(+%GXR>-!6GnGOn*}r+@^M@6^7ZJT?>l|NP^a3bf1r*U8q>Wr+@LSK zX((?PbxtGk{DUYe8gJW@EL|aD@VfUU`N2yqNe*Gp0G-9V??7g5{sM)wp#tABcLDNf zeLrt5{w!HUXG|T=NH!6T92gjQD(cxps^R1ML&??JQlb6L@tP{C!~e{mT@0mPaY$U? zWx_|-Q|hd{!Dl#LGsv8%-n*+L4Tkz|tvn_(v9=LzQ%3p5>IAvHyTDl?wVMb$JpaBV zyV6^?eXk(b0(t%|y`>-|BqS>)M^!}#*x|_59fiH|fUW2?O%u|vE973ZV?UnuAEDfR z{Tv}=cB~%k;09=o=3~g1GNfPaQ*zYP`6>W_grvZQZ#}Mq;KQ_epEr_fm*&{~s!(Pm zk@>OZjzfMQ(SQ~{LeS2dg1Z+T>C~62Q*F_Ld0mBD5FLbUdH><_XDay^Y0DVi6J>^H zoXm=Bafnt-MR(UlcGE}B&LW){gRHUcJ?m(Wpb-zw=}K-DY&^xmipIgPqlpn>Mm))F z{|?U|Kq>NxbO)ox%_Yj=xGP8Kk#nnX(jW3p2KqMa} z?Uy~|pnAPkH1*(_ZI5PB_A@x{H<-zC--af#hAJ0I+2(g{Is5BZi-&4sv5S z%4(Uj9=sJyh{j=s-yUyOqh}WN=F}_1PrL(w<~XxRH7hOj7%GHV2-k!g$DLt(j39k# zY)NnVc$~tP&RGH3^rV63P-B$#%BP1Z%(kG_ws!LrL|<(bp{(&X1b$yzZc*<-k{SH%tfFKx1A+0gjr#;m|JLv3UB z@hvPu<&b46SPbC>=tF9uSJ&-LDMLS9gxc+f6>D$>bkOKI4jaSt&(3%D18R^1Z&fbG zE$uRE&rc2xEOdtGAo|>XS=gJZ=b5*~fMb*CsPsFwzCoB&ik~tpV?2IH$+S>gY5Hjy zozu)>`KMaXHE9W>lU<37v%70~6h7tUzUdsxv#K~{C^p~2*@%1Iq}z3fWm)VH>VB;f z@F#*bn{y2N2`S~9JI8NA0UDkfBiB5v2V|PLq2ZG`;Z_5;=6yG%`}J6jr(FE0C3%fstPvAu4W)0Te` zh4MjUkw;-+ww1TU5ym@~kI)Z}71_MG2C@r5SJqY=KS9;nn`4Z^M@R@$u@^IRgmq|4 zo-BUY-d~HuaoqT1jPOohW8qNrAw1ZyGD>WFTEN$Y*>%+Z8Z;S^%pa9vGo)Mp1!dTT z9nDbUgH++<6Dm=hVNNX`_wo4jL+E?HEM`_E8KSnfI<0h##P7U+M5b)5eXcTxdZ~W@ zH~x6N=ev{`FWb<_cTsL;XrVsD#l`<~y3xe@QY?X35g%YNvI+o|vlHR3Zw zJA5m71Qf>KYrR>>R76F3?`d3EohTSVaF_k9Yyv7yG?fi9;KSl^D$p~u?G7UGs-1x` zR(*Uf?y5`w&HRcGpi82Kj6w>tc!*!5@pp9q#ed=|CnF7z&-y7J*qbjieiat;8%=-u zv98Z#*Qj1HrY8h!VFaH#>+=$%yjXeds~qLU7-Z4=vPqNzyi{9t5 zW3Kv8tr3~JulY=c3vlKxPW2`Q&Bdf0mAb96Td;zsA$-3&IWV-Hxz$67?pirnDqS&! zJXp7kk@Q7;YjnA#luECF-fl7O7*E*`xtt@;lt-4qYe`yx@PM(fX;c*el z*ZeV~ZcQ>exR23YIp_Vc1f_F2&^4Xx-A&~hI9Y)O7C(gP;T!Az9#SLMF|2XSVT0V=L)%#f0J|WFw zJfUz*Kk)(hD-Tl_`tV^pDx+?xzAw4{(^-%+oDcgNU_NL_ILmA5NCO>ayfNt-)Z;Mm zkK!*;ajhps>=P+IF8qa#dxDO#VqUBpd9EFzXLbR-p1!`m z{yw6!tmfM!U1hZzb&qW7 zfuW{_H}LMYy0f{oxgp-gh?2QDRD%G_-qOal+61D7hrLgk2$P|~AS zj2G+I`H~%)Apo=fVfAvD9R~J23WJF3Ep{?9ZZjL~07UKMO#e3Vz7`T^2%pOP+d;Ok t)W{p0UI{srUh;^a)1>%(C;^Qm+menS0{#tmBKD3M`w54 zU3wF&Y+SZ7bRmq%N)r@Fh=+sTgn5{uu+DV3f}x8WLqUDE>TK0n*2&MN_k++}Hyc~sl?xULBZMct3EMn8Ty>R{ zyu7?-d#TNKakEoW(b3USQdU(`Rhrd+Ds=@@D{Fga{5)5wGrT?ic1?^0Rvrv}Rb>^hjOr{^ zmDQ?hx+?0rYFaauRdkh=MU+s;PC87XG;FLqtp1Ib4%p6mTx{%ZcmFFb?MR`Hxk}i` zB1R`m6x*v4y|==!v2H61S5G%bvdC?$l^Bi;Cx)|!JCuh?$MUeT*0ptUbF%W#w{mrL zw70gxMXt2d*+y89uB|0ASE(KP-%d4@vZ-lX!n<`MCnu%uoX_23;ZE>Np`Ujv>Arfm zD?@1|!`;Qx&6=@rC)lCg*@Z4?YN~7O?CxRZY|SuUpbyEJZEtU*yGToGk&23zy0Vt4 zvZl6*ijLMijd=^Tlr>Z}7A{m?w1D)ij-nlX0(c8ttUa;mg=%g71GOTeUDTSn*+XSy zh%s;YHou>W$Q!Px|C4#*U8ER%dmzCwMUmeKPfayw}@!Z`n|R>oPSocP^w5&&q~}~ zY(2cJ+!*uhzz=$>@F-<1(!BlI*QPcE2?U#!v!>Lbwv#|Ww=xz z40LTZMO7V5MKxs=MKu*|xO5aXRN+!n1sdqlQicn#TKHK5_;9JItEtXW);82xpt3+s zd*M7S6;-I9=Bue_>8PvCGgMOr4fBNw?~pQKvj1y-z}RKqgCAf{S3kg1-R1VX7>?@} z*hBT`j$eLtP0hJV-Eu^%+|FO$E~%!iAu1`t=`3mJ;^^YG3OaNQ?0Td!5mIM#2b-yB zYHO-1sw?YgDwB68C$KklS0yRbT@C0ODilUt5ld;2cPLXRFQC93DC*i8%H$o&6T(oM zaEJ2OQUmY6cfiA42j8^;33nWq8u$vn<5<+dhwvR_;ZDke2dS&50~g;RwQ#2>T4Y!o z-*q6Ja3?W38W7e}#dIz3Hn@XNs;lULPJG9*I@(xPM;l{wv@u3Uhs5ZpkYTJ%ht#H{ zgJaYob?V@hK%Y!g5&TvWd|gpfQA<%qoSgyqN=E(rl_K>2!0G86)i<@dR4%} zs{n5Tyd)a%zJR;Kn*k0#XP$=YJk5m~3+6AJud1_9Q(1eV#v(2Cg@!81^Hg;fEQGe0 zEX)oi_TTpMw!TpJ9ga43SATC~>5|@N>SDvtSDUNU9a+Q&+u6p3hRfYtZ0#Kx`tB=@ z<|`O4G}Khl(bSx!Ivd=$Tij1GPrdjsSb&j=Qrl3aV|&up*8Z0R?HT+pD;8DvD-uy_ z^cwzUu3k+f3ixF%QET)X{$;LSO(Y8VWiC-`^cwzUu3k+f3ixF%QET)X{$;LSO(Y8V zWiC-`^cwzUu3k+f3ixF%QET)X{$;LSO(Y8VWiC-`^cwzUu3k+f3ixF%QET)X{$;LS zO(Y8VWiC-`^cwzUu3k+f3ixF%QET)X{$;LSO(Y8VWiC-`^cwzUu3k+f3ixF%QET)X z{$;LSO(Y8VWiC-`^cwzUu3k+f3ixF%QET)X{$;LSO(Y8VWiC-`^cwzUu3k+f3ixF% zQET)X{$;LSO(Y8VWiC-`^cwzUu3k+f3ixF%QET)X{$;LSO(Y8VWiC-`^cwzUu3k+f z3ixF%QET)X{;9e8wIBXvIKzowFF4wZ&jyQCkVl0FqQ&q{L-f{f^4#zgk~e_7lQ)Au z5F({2$;bXOtKF=e-Qj>7!`XT_$q^q$a>l{EKU$64kQH)9?#LCs-4Fx9)@Zj-M-_<# z?F2!F5VE0BIyA`VL2!q2&t14jhxeopqzW^m%k-eb2Ah0D61lhv+{R9rG>zN53L5G6(0LJd>t*l)U~ zxgX|rN^@UZH!CN`Di4OM+1BmWz$Y`(mQ8F-oD+r{J^?O_X($k-Z5YljkkWQCeI3S< z>Q>@Ip)Q_Vf71sN^(XED=f?hh6j-Q-DEioVLSon zjrEy%di+NUf0jVB)X>>O#9d_V99_0rIYOOe?XVP%`>t_Z>Q0#$_1$LWZt8+fLpmYp z59%au5!}1_1No+O@`s`B+ZYTo^^W$=3^Vc<1>9TXAT{Dz525y&X%v1GGlm;gL*U2O z-){iFMdnZ+dLVna9HDNsfto`F14vlMn+Oel`+?NaBcP4ZeYPaw_Ya(H+&j9+N^1`s zHJS9)@Y@AKtCFggGHhF|Og_)|aB-se_@^ikT4}dU$j3=TlJ0Q!p3!O;T8DTfNFIO& z!zD#N7%vcsOUlm8#nZI|Nz#QpAI^X`4P;~%uEN@>1K;r6-^$a&#fagIUqXfr5D-47 zEd=+Yz?gzL#!hw$@b!N?|6=fC1*;dXTMbc(R2Us8rtWr(4irf%M~~H3b{%K~tQn4u zs~NjIjNKQnHeHGx7c1=3O6~yeyUoSTd!D1cowG3WvQ*|5w~|3p%7$TU<>}}F!M-~g zZXVsh*R+y5!lk#`k*EDcj5~p8RoQ~7% zYU5;s!>=KHXs0K3e6ghvKCsiC;RWFg2v2hKbh3vq?tKh(Vpu^;LsF9uMjM{gPHUHJr@7pOUJUf~ z#QtulZM}$4;g$2|rtbo1R8cu+Fx+y^a+nS*;tFsgTj|D}NC6W%sl?+=3?&mWU)_|AUJKI5V zJKNafHdVpixx+bL5e@%CF%bdvy z`>sLw&08y9Lis&}fluB$+~_Cak?w9!HVepbEL>zxfKpQQKh9WsM4oyVU zpnXQgKpg zQa_}c`bhVY@1xphQJ)QcocsLQ$G^{mKF|B4^(pDo(sy9r$$fSEn)S8mySwknzPI~E z_f6^hqi;*ULH(xo)9bgo-}Zic`(5Z4+%LXge!n_tY3T{lI?^ko?WO;az99Wb`mOX= z>1LV1GBachWj4up%AAl1koiX@SEjCi|Nc|@|JHv)e~E*c^>Wa1FRA=X3o4Y@ree#noZ zl0&BsH6FTs=+U7;Lz9PA4;ws8eb|~|yM|pJ7CY?AaIxW2h8que9DZ_m=ge6yz4lImn%oi8UMqL{f zKdOB6(9v^7TaP|6I&}1>G4wGr#;hE(XUwfJNnpJ%0*jHoA#|{8{-pd6vR3g?S2&3KtY!D^!mkGk)=S&+#|LCy#HLFm;0Ygg+;Q zOemPxZ=&`@+lgl+9^{vzN~Pb9UtHN~K9k8qo7(U;lK2)P^-1?rz|0T)6Sv#vhwBHXYcMwR!61U7O!ojIwaF zh_#fpw6YA_BC%!dmIqsSR%TW=tvFkaw_e#=ZEa|M-kNRmo6T99GKL=GG^4~;&-S!! zshytP8N0G=2HX6%mD?NIU$U>+zIZ!xd!vJyLx2O}xYjYmsgKhZrzq#a&JND6UB3YER%MRTg=XO-PnYi6`r@3!-f9f$5I#WrW(>(w3{JK+r=jEMEUTeI%E zx_|${m4BbsWe+z!{1~(#=xOk*;2R;sLykT|k31i-9&dS^6>1XtGE6%x_{roa zSHg#cABmtv?2f38+!p!e>H4RsQA?s;M$d^3kC`14@NE3E%dx{^Pd@MWeE)MI&O46t zkLy3>FYI0vy|jFp_iEj%jMpn(C&!z_zkRdl&8viY32|@r-adP$`z|U`J2CRT=KF{w zjim4o8Xv-wHIpM!v{Iga)cF{lIyd!snnBu&^abf}GK@3cXD-W3%`(r*$=;OxCC4VG zG}ke==F`qkEqQ!RX(ZuttzQ{UGk8AnAV6gNDh<$jA;GIb_JNAwxzEk|FgJ@!dXhZ?b z2=pUf(+nV$63|tFKS(hC6NAi&OGrxf>Dy15)|m&gQq?vzX)Q0VUmF`(ow`l6w+kZVd_d4Ty{hjdm%paUJwmT2_-;H>a zRotLuwARk+;Q4^agzS>WL5NO=)QXd7l9H6rAd@g&Ww1D;V8?_Z5~_Po4aF&Vu`;z< zZPM1SZhxLOTs6$vUA<iOn;Yby|2!3kE*7{n}~-7se&Uh zepffIZF+Rq-^VZ^{9Jg%=7xit8lFhaJ?d<|*&!i1LF0IC74P-g>NNy9*6+mFMOUuf zw_F*Mmr?7pGxoe{+F1W2$30rsUvz`Ae3QclUwWPte%6tC*iq|?j?r&k1(heoVRka}D(z~Pe3zy$|2 zUX@Ls6hM3wnr-f}W4~{(Jaxul+Rew&?;TyOM;Yv{`duUN5Zj<=A1k@9=dS*d_w#f2 zt*dAKZS4>eQ^=3L7j<}gWtzq43CoiZSYkw(JAICe+g^# zWr4aNR*LTZx2vRy>Ckz#4Ii^71r(-j(#oiM$lSy&S!B1`X_tSYEQBWY2~24F*L9Zks3aocXI$+#TL)*5_@eyEwDnAI=MpT)}d3;Y}{Tad>(~ znqk7*gm-r?j?4<>I*tyEh?IK#s_{aD$)-c6&z?5XV$W){=5Jy}4V|0qsl9&qTI;1c z!A@rGzuV#^LVqlwb>><3E9+!}$Zio;u$-x^i!ym!}q|H_v6Bf+@;u`gwb|>RYw#NQF?%qdlzKPQse}X@5j-Sy!qte*MJns;A zJxelW$Aq+a#&M0^{EDpE2J_jO9xu||-mFOQeDiTsLxt?na)IYD?#3}ON;O6VIuvbC z6ilE8#*6)Gu5fP@ogB zNJV*}wTbbcg?ko4YkdB%k}bs^ynwGIE6absROGX!k88ff@%+LcDj(c97EzqbH#p3D zp8U;ayA2#zjVlhDt~-})wTHR!ae4UOH?h~=nA?@y4tV^Qdo}fQi}MSu`pcEGJpJq0 z%oAfaHm4*!sY zw7?Iy)kfx-AKV@EBCBF(w%y0i@%aQQy2BYlAVmUI%betw7@IMDR&#SXfo!d;xyw#v zct;qjxcznf(YGU|zpKWmjt)(n;hf@QX;xNlaTw~I_(DV0xoiuIMSEW9pYq)tQDtz6 zEx9ptG}j=hKGxvwGd6ECe=RqDFXz?WVq1^$BPthJ=QnZRZYx;$!M4QLxkP8r_9efY zuw}EHV>oJoHvF}vyEp1u3{PFSGu!+Gott~!nZ0>UiQw{t_;Uh9zZ&;6ftFv%(d_&D zEo{qg?9ulashN2PTUHz&_c&%~uFa)SEU%3Xd-TjcMu(&jXrF}aB))>$B&2}&#j!3H%!UJQX2hYaVITs@qj|HN}l{!EFS?7Zk0q%bJ_ z*1-c&llA$Web=|}x0D5!MHRm=%+EfvYTstXIhQNlE$;Exb5Er{e`x7bpq{_^bXMpK zhgbX6&-ag6m-2aawXV{}_winv+wmh!#h`1)gA6TYE^8$uX31myYJKt>wT<-lXt41?nvX9e`gkL9QQep zlYYx%h23qX2N5dY7dwQ`4n1$+!nZ$~l`VJtqqkR<%fn{Bb#6>&!O2TWOC_I_yRfYM z^DUpw$#4j(jB7NwWNdbx@6J7XhO^|EQK5g*tqYDwUZq2AnjAN^K<_vgH}Zz>=#rxD?G%dbRD;WK$+ZgLCiqDm=udZ zrY@%cXpS0LGI#W*F=e~+tK2udK6{dF2C6O>NY8xeEpOkV6~G-UxK_0?u~gvBh}p>n z$GE&nN}$hdzD=Oq5PrSI@oZg9`AubB^$*i(j-QI${jkF8ad}kCCc`-Wh~QNOl1q6o zPRFu=4IZ}S_cNsSD|%j2LAz}Ww0UC%cMF$AW9=Iwy*CQ}9FZw_sH?R8HS0jg6Q5Ip zfIBg^6@5;wa=N^mAMehNTlA{bZ+)G&#ek|XYwkup!>G^P2T^%f`}11H#Lm3qcf|6+ zMIR;E+39B$-`)(gkhtDI#oD5jFJCqEY_*@o^H{%R0zDGkYEXLY9rx8|^XHH|1d>?v z;o6@+*6t9f`389SJs?n+pRIR5g>PIS>)D*D8qb$F>-b;3;1nGGRTsir{k4t?nSLicKy||ZsblJC>Kb&(e zD02}w?L6mqSpSyO((u@oe=9m{lDb=23kn|`D9z?B;WLg~u3|GSbgN9t3aqDn9_xBPMCL(g z;^z(J=e5#;BccRXeLt`Zt6g{K`c7WA&Rp}@_R*maF8?DYxSz~xj48W)n{{w)>C?@Y zW6V#FdB1&fPOiCjD9dux=Hu=@nQ?-B1bP`*HYwn>Zy0|O_rsa&I#usOo+l#4u30l% zBYUl@!$ylLvq4d2uVeH4jLkn^wFtT2;P-K+!Sc9x=GvGCD>Ar02E2Uv+TEF+_HmqMCT)-V~ylMRS;j?9%yDk?#VRCDgM`|HCkpBu|sg0|OQ zsR|k^|A0R~?1nW%hWT*p%C9?K2L~=FJar+zWt!8;`%eT1GoaIOC6}v_?|Ia~iQ_E@ zN*(a}jm8hp$i)-WnX9A&hC7A1hXsXXzI7>$TM;NIpFKJ5TgpsU@pA5ms~Ps8C(hgD z1>HY3%bh=w&DC((v!1o7mP2f$Z(?s=-`~MUP%@`9Jn;5g0*%>hIQ)p4n{QCTGX2E`Cq2(cJ$&S@ zv94S%!oB%OoJh@MZ05x|8Ny#zT4=|Qv!2Omps?^3Yb1S$8*~X@_fdxYz`dG4e={W>#`EKQrKj#AP*yS0% zS@fOiPc?%5>P}eu9%;}&!#T=|%sQ%QXBK|3DxQ`id#7lN@3q1wnU?9f%}2F(w(Fq= zKFVv^sud}hnq=Da!_DB^9IhP<(vAiQ9%P)YGbqxGW^rpW0`DIW+V}Cm6C_^r(f8=u z+0h|2P-`819zdXV1j_r}^BiaGP2WQ9i@(xLJ~+PH%^9a7W4+lkZ)zQ1x8U()J%gs3 z+?X>=&fZun&eJXRAB$M0Dm*Kl6U*%RtX#WK@?p(!sou<#HL+1^%3|k8-}!33ckilg zZ*Igm1jQY_;(O*Z^d%a7G#G7T-&I6LR4VtCuGjJwS<820XXG!9$UDF8-TesL5}U{h z&0>b``SencW4dEf7M&LyfhOm1ImhKzxe2q>Z-d|oC!*Na^GeDSk7XxPA}lwuA4KGN z8fBC{JrR0oT~)fR>UnQJW?9JA7%8cV8Jrq0;WkE0PPWUoul~;C8vG`|XR>!)7{;hq z3VeE2ZNv~Ym0Yb=3mu)7h4er1p}ssQC^sVi%~xoFrwXPD9(y__UFKR?{I+wzI8D~{ z+>M$~a|%*4RgOg@%-Iv^?eFXTm=lrz>{;Q%Mvlo9!QoVu%a&#dIhsCUT5@OCIyZ#X zf8H0$J&@t!kOFPQ7 z%uLb>zcsE!O*h%xWq?Fgf~WRKy@rZ{Q_I%!x86R>_VJ3!_B)d2`1or>+~~ely4yE9 z&%9FVQl+HM-N(@{3>s_cbnWxi!x2f@tiIwcD(pPLV167Ynr~u|nr)pcnDsnHHz6u^ z`qw+J_p(;1Gn+EY(UeSxnh200Wd1Zbj3$9$Br$Tc`7RJbEDDGk)I-B zTGp(I4VrYe#&5kK$R?L#c`rAUdw0=}H?N};AG7+uc{3pBd4$eRy*ZU}X+DaAbLan# z59HXf%ocGU?_3zGT%cp>;5hu5HhNj2<*34Z{?NyH2xslX1pbS61WH*m`J*7h$CCR` zi$j^5rTtFr0Z+VluBD}o=J7p!SxemXAHmDv7kJg$VCF;HEBns48(x#!;$UF3(cU(T z>&*Lfe!5_?xAgH`zjd=6Rf1Y(PgjvhaJr}|o6H}*&^#Q536V-m*_&5hJC)|fy;|+? z`hJ$vROb>JS9f2Wcb;a(Yx%&6~=E?^N;gjd?RBC#k%q`gC8?^O{ z&w=CsuGEi+iptOb`bN)Y#m8?Fo^NbedeG^p1%Z+` z2W4dXDBWz({N!ZMIQNX6t?|ksr-6ApTVt|5G-D^PGMkqc@(&xdB*D;hx4W8t@U;h7 z-p;J3-MjtQ&WVVA554fQ{R_g+J$8>3<5~Eu2raKXlks>=<&AXbiJ4j((s$~`XK!H` z>W%X9wtVm@(eKsPSP#E7HG!pitJGK@=6!gPqsCo6xhii}%B`zMS?dbo0&RUSH@{b` zuM0FbTLRN@cfjV;-*Lf)hb_Vgv|lx@?!(b!zt>*%$w4qsG~=5Grus$>)_=f(#_g$& zK{G4?{Ep88StaHgh0m!+*!2n&wTxpha`t+ zJ{eVbI)Cct4GrpgE&MqKSG_A%c9=OdBeFQ=M>!$f;qrnj(SCx0qM$pcI1!i1xiMEA zKC`YKUXgS+Yfr3Nbm00)Cgb|=)N=Rvke{G58b$`mEbW}JGjDk+Tly{Ye0WQ3WzrS5Pa794YV?tb zZt!0J1lsRp0kiqak+fCin+@(+aTI5`R|k!-wo%s)9Gx#OU$AF$`QsA;C)Uf_xEjaG zkaXX`agWm*i@$|Ud6A)O`&V&9L{wtgi3Z+9v3gaEUC<3U37veOM@#HzG8*X zr0~~tAG15__vrr>E^y;8zFKbZ4g29ySo7DJ?C8ndjTRc`P7io*A2xba$`bC?$CVGV zoEqlTALIJniViQAU*r4en~!yAJ!k2Pu#AQR<2lE7Mm8sIs&cM~yTFgT9mqI5JyUer z+knXCtR52=%J;8|;QHCr7c`vQpl7g5HjwSjyaiJuC0Z?-O8#laX7@b(c+QdEeAD>h zE&5XBg_hYZO1FlkjGE(;pho5nZJgcOfKskB_4YpN}_}AjX zsxdLoRF9-!>h*lwWtdNRf0*-+;+td`zfIuH4MH@{1cQaU60{SS} zhl8OAZKaKF3vZ`Q6JlVIji!S4xWg_TgxqMVWEij9{e94$+|r6=Z^QKw_2d145bXUI ze*g4eb|L(KxO7!ibyZaqTK^9hEPP$3wWsYmy;VOg?YdZ7crV0-|0HR!#Rk48Yi`-h%g0;8C)^WQx&gV*(_7ewKlC;SU z971E9Y~5i0Bk2nwHW1o^mi0HHW!bcyEdikL|LTcjno2oVar^*AA6WH6l!D7C>v+XV+pL}+3c5o4Wc64{O?eJ{vi1p)) zkbhW*`!**WN1Jb1d%AlF+4xm$w_zXrPyg`0nFA_LKwn5D!wv81#|Incr7tjMj+x|0 zro(oZ8?F$rY{x$u?BA6E`arOO0(?fn%K1>?M*;TRwQ>iL7>w)g(<<>l`yPqLbo0Tf zQGmUEitw2Q_0cRe6HSND4B@?%gSnVL9gP*yG8)3I7uG%+a;5~k29<>$b*T1K+di`q z^_hU=A=fY4fD3;VMRJNQNPQ@q%>Wej!Fe48xtjo=aX^aAa7;rfU)~FwMNh#-P%iNjLO5KE znuu4za3h4dsDXGbd~Sj;57iU#!sliP3s4Jry%Ey5h)+lenk!2yxqM*oK!DaD;1dZ# zehctvf?6Izb$qCq2d>)Wc6BnW8W}*q9Y98@U$l*gw%?PoZiAIF@d=WYi zD9uCzNG1xgIARXq>*4!-8;wuY!E-&(lY}$^o@5E zf~xGq40cNcku2nM2yq^#wt-hii1Azaf_fr_WSoJj_apI<44;EcrVy!Q*dL-0Ku*($ zH1hcZ7#sfDo-abu`E5^^Fc-ByUx8=7$n!No^WZs^NGG*jhav)#wmsiL957P*a{xRy ziaZCRIxtK-KM2)ycn(I@9iAVfiVn|Vh~44&31W44jzFayo+D97hvz6rKSGrqXwg6; zI?-ate0Rjfl6mh)ivt?Blk5wyNpmOKE1)%YqP+%LPAA$Mz}0u6y#-orC)zuZtrpTg z5*cJ!ya!rkCt4EFDulEYB9p{@fV{DVv}7WSq$LB5C8T{IvPoJBIAtkG`-G~99Fmp_ zxDp|)5<18DrA-4`v5-~)`+P7h9cVvpM|tykifKjz!eB-KR`34eFj>dkoKJ@B58#{`y`|l zL8>tB3+T(~MEeG`EFtY1b_8n*$LfTib2FCpW`{DAfA?bYdTu3hlIxgc@ zdOnnH4OkV+lmM@;1Fr<$Uy4@>JnRSUa>c+aCFRP1hw1ISA5aHSJQnbVc^ z0u5C?@Yuk^{?sn_9duH1-SK$fK{yX=Kw+P2mn#Aa#VZG$oq0U)#&htVHxWlrIUvhB z$bJI~8%`3G61BwN-ST-LaTWa_*u?p6_+Lql50HSyqr?6?sUo6`xY#WYrz{BdqtV6i zo<7NbGO}NY@5HrkuwOuD1$u<~iAfC{GH%)|E!_ns1;kh4MvvG~Bu(oxc+~7U%PbuC z95|Uz6cBd++(OU=oDyuP8uSe|P1ZtnR*9aVK6I%;W0Xy7{y3jaR6vDWOWX%^6KPUW zWCRQo#ruw!xp4c*3;;HR9|d&)@<60Qs5TNw^p#au?0GvCpd8Tos7L5iB-VG>H1lKt z)&elBTVNS@P86c`9r2!kS?#)7s3anK1V+P2t9Kapr52SFQ9a<0WHpLG2^g1K3srq| z4>;Obu^JSM;xVwe7JMVNTVN?clNGB)ap)BWa%)jB5!VBdKB2Ez9UM@3L1y_o@d8yq zJKS0_t!6AG=mw)C>(DC{N8&1>i-G$qmC!Tkj4dJP%Cchh=rz3f*o>7>j*Y|{gbmsa zcBO)3J&H%MLM-n0yhB{@hpt#L@43UoIB=HcnGoCrt!xq^;2r1;E+*((rpa(n0*Vo0 z8zA~j@ZX|tuwn=2kLufi-lAwBxDMiHL6hAT{DTnNHcLjV5xqlELU1*D+bvN1Z{tyY z;S63PdMZSgqa^5pG@#&U0L#$h{Y0&hVoGcgr0N|3j_+yhGg;JB^8Ygv*>?J=_i0@mq&zl;5`5e{pQ@Bc`@sT z3ZQA`5sy2_-3JQIb*cbmL*P*d);*x0Spt*;(Q=?{l3}P@Kzi7hwvze+j>LoZ99MP~ zgqQ)$2jzfR{ZHXs=pC1lBIN`fcAn>gL|r!$nNX`x5wt*4Of?~F=+^awPY0b89>0}T zGl%h?KtHa@I%hx>&k;7Ku;>hUK4j--cs{&vRI`ood7!^HJRiE;&BAWLzmvh^jTVrh zx*Pvih7YeG7sf5PK+1@GD7v4g43AbCK>~MV|Gfkr2Q>*L3P8HIIPfS5kF=;bdY8b1 zxLVNL@-HPCq4c;=dHg&5jnK&9ArOVeUCE!NzX?1Kk4Jxw&H(qvzSjgDn-+5Dfvt&k zV?UuhuNLZH9=yAhS2x2u5C@2Cl6#P>`hp4E6|W{F_>HyoTtT*wT}8fk1)%yn!jNJ} zek}}GbGqfXK!2DEuOO;{wLVk`Rc67g)CN8BQ^?k@tL$TlH5uiA zw|_+$o$`)(A0SO!l2-`6v6napF(jdUc%QzKeUvJwfH6H4Jg^ve@6l(lc~@Qu_*f$P z0!7x9R|>JegND1I2i{xs9UP{sTp6V74RqG(y5X@Ph4IkitLcWvh7`Vpu5D!xJZ3la za!7f1^a@CIcXT|g?~YytF9#ESgANvc@7rxx4Y}x!4yUZTrQ<$dclbJ}jk?lnP!ZHS zJ=5`k>K44HxDCUvI){Aezk`LCFg)#!_X7qjOsEog-N?1__{7aFI*Xx3!*V_Iet^!d zawU)|CJcf3FevJr&URikwC>?Q;n#rfh#vUGpt~C0qR1}%Qs}cXVJ7kaZ+;1+uSz8S z@8NCapeJP7F%P%Pg{Y9go#dW)m0$tf_oxKf?=T#~`4*M^f6IRZtrQcLLfUaZ1gE`Y z{Qp~i0!(ON{Q`3Oq^o|4Uk35x>6QPS{}$R)ChA$fl`kOsW?l8agT|JLSP(y+!uikn zi7>(RGkJ>7M(2fgr3QN}qMr1S?;u-_{JY^LK_icOY^c+lpzSGuS|bKh_yxQV%YJ}~ zvY+vjp$ou-@i40g`QG>`5EB!|$Ynjqe*{}$KAw=rp4`|?8dIVB!h|;+h8aC#(x8)p zF?^8kNl!ZTbD8k76FecN3EIrg_Q-&q2*%(A1gxh!OeS2kYtymkqs^cANlg&{bCsOw2M7UPHjW*X}X7(6eD8yzYSe!`)*(!32OPhDsB^ zOWN~bN|On75?&<1x&&Y|JT}1tyK3S*+$sObhs6LU{vi+WUu=84HqsrR2NSIV(9=D? z5#lK#`2tvt=_-%;xE;dj=*Y)21WeRK%J58JHq85UlcFmuC)*iZ|$Ef4%3PuEuyHDJl$PRN!H8Yx^Y^j;oy z!r_&vZ*bxCe*vGw`f8!34ef;E1LiASINq<|M;KQJHBwj`t`L@qmd(Aiw14=B6yrPjHi6O4q|VBbm5V8HPHaI_%nDza87EV2aEON zykR`$#~9xTWk%r}q159bR=k!7EeG(vLW{}-E-q^>w6A;^t96w42G)dSF!1|Y5{otC z6jgx^+|z3UE~UK*JSmE_MLKBt0D5t%v30Q5U~Dt_j8l%6DgJ?y5`f-TEY{Q54VDXa z!5grTC>ED!1N4*ee6grryfl#nw#C?bm?(sI8th*K@z(&3OQs#ikJlhGpmaoWFp47e z@r2kGhy!DJFq8QiERC@oSmVSxJ7QZvFNNj9Y#tkYw;hYuI9tGRkkq;{Mpl8Y zb|fPH>V$-eV<^>jB%Wu%v9}_dpfE-l%=@%4Qc151NRkh^MQ(Gu}8qzS18-g#eMI8 z$NdJSkFA*j8Y#_K7Ty+8b32z0dl;Cg08p5V<86X5G9`=WU@0yi#%Nu+d{}S5vb}R_ z$atHeLMsyLt|wcqe}wWy5ED)rZojCw|Mz@6YHZh!{Tu7Yo`&sGPqxZ&!uT=v=X|Or z7L~^%$X0nA#x-?EKA(6l)Q@`@O+Vq|B~jRL06og~^kJD+c|0m?=)}h|t$e)P+Le!M zFsgj;=nD6UzQA{D{;^JqkC#>Pj5cneyYjJ5QlkTkk7%tWgtb0{7%&1at=7Ub?yJyb z>75~YK*lSqxS}B;gT=Z+klc3wd?IK=#Jgb*`~j~9FbB0U@t7?J;?INqnm@pQ^Lk28_D&;S8bsx8lWoE0sM6VEaf5H!i|nBsW40GMJuFj>$J zAzEu$v}*kX8$U3IC-l*FdMS(|3)|?pJfa{KpI~09Cwd9=B3ku`;(MYOLw(bZ7Z6W{ z`hVcXE@66D@aDABzqa|3DE&L=X)QiJw8MBrf@N}HBqhodKug*HEh@#MT!UJ2$GtWD zj^aH=T@l#VIwG22Hic>pTHOohmugKY9i0)Bzf$d0?}$3k)&T95Xe_v|iqk>q=o!Hy za8B^(2k#3L)$m2Ap*KF&VpAHLVP2^{r-h^jfv`>g8G`Cbbcet-ZaJjz=Lj~GRnG|A zdXxi#>e+M`3r4WP7kWnEIs~@v5`5xNo4q>bHXr(GxQ3zltPYmQgP!!ydAKiqnAF@+ z@)LLOTpgTImfuor}(EJ)HA=4INd8Bzk{9iXF#l2e*R>4~k zyUODpB<9x;mwMpimKwHb5|@Si_F4hQ{}JRdzlylh10UBUcsA*(kl$W|V)+!1$NUP| z0z{=xl+PvgxAW@>I=r{_P#U;3!K=>oAcgzL&{u<1JSIG~VmM^GmkV)lzADD}o@|ftN*1oSaeow z0hcMplmG^n{lIH5riSeOV1LCMNw6Lm$$?$)J9V4HQ7ue0*-OKIhezWW2is`LnV}ZI z;kh6RS4H*~+i`dujheON5_d@)AL7NU$hg-_;p#|z6pjaR-UaRTASZyhD#*Swg{viT z0#Y9y2i}F$;Fb}Os>;d!c`FXv6|w-aG(((s0YSB(T(C4AKeXfUN*u;D0q!2D56?65 zggDABHBe3%R|)BEA@B~0O8DkOiQsWeD+Z6a@Cp-8h`=MqGIEsEiojllcVF>{hj4*D z$b$gN43E?Bwwy*Njbun`1^5piF!;@{01VLy^8qY~F+AAt)s874$D*xzlAsl+fcKI| z1owz}57zAsfpd-9gzmIppQ(ZIKLPJqZx{i*tL>Od@KORi5s#iTAcrla9y}*OVX$?o z;QeUDq{H^6_Xy8z;PeK;MF0}d6;nFWVEp_ZM$ve#i{i6E1J*+EQ{nqP%*)k-^;?KQ z$WJ-QekJ4o0I|ly3}OS69rgiiTRtixOJy%=1j##)Lp*!;gDlOxFe}OepDzIpF8{qy zyH>zERRlhWeQPhw9@oOVnh&wzF(abEfv{oZ4*T)2FMb-D4Ex~6lh=6ob!B|6V;C9^ z*9iFFQw?%(Hb4%(@pJoU4D9nC*LG1Md>;d6C&rN%J_msJ@l$*GsZ#+IZVc?kp8;nP zX2J)b=$Ju%E5k80UHCm`O}Mm>HvBZ7KKc#rbKx@wIJ)p`h!!Cu_^sz<@R-eX}9kq2=#BU73L zI!%)Xr^ulxp+9I^D3m4#lk&N=IdFbY1y01p({#}V+8EkUw1K7umB2lkHY|-7(0+qS zfVZ^8;Q0G!Cba%=l23-V05mz#X3PQZxl@rb?D0wkD>`KpJrA zLrE?`^TFaq5S{}iumH+*Ih4#|u)YCVss>08tfCK=&?YY(pw0zpEx2pLT_3`_fYAi5 z23$H|+XX<^B1?85+|8gIO+e#fh-n@m=Y#Hfa5n~|9?6>vsar{w;drF67j_+-B8mwb zdj%iSHM~<^0RfYsnon#3vK+KU(ST;v z5(da@IcQ6apuGxxBjj=k^aA<~mQdeAMB+vSQD6jmEy0GNk$gT&(AnP79}#+yN#JuHTi3A}z5YnKC=Ly;i4JZjj(_yD0kZrXkKKDiA}7&>TMmlEr~pPTK)z0quM)J-6>x@U zN(9USWBM72&cyTR7x{yP`nJlZiki$U9 z)XFa8aEylGTPNKS7!BjTPUNQ;UDkyhh0$O%)%33M#(?>uQ0P!5U761anm-f*2nxF4 zK8N>?EIB;I**PiyP;If2wqg52Ri4-?p zSkkKZ8oJ>o5VQhIT-tcqii#CPgDKIs5UVt)xK5O7NpTaY>_D_NZCr5kluR;F@8Jic zKvXBbN|b3yF_TEgMmiO3yc9THoka>JLzx(Y4UJODMYuHSf^3qV0ttq)K}M`LZZfW& za!Bq+$gDI}B~uFU?s}Y`Ptdsqb}q?Ih2N`yz%C`V!cXPl zh;^Flx`7rGNEOt2Q&9LlS+XsIWvMPo0eK7>5IJ@ksTKAY`$HT$um;v0v;cVC6q1e8 z3X-bL-C=(~iwDf9%`8$abl1H>w4kaRwE)Fx{V8NQr4|{%7`00Zpd>&m(rASu+{733 zfW%5~vx&cn+C*4Htltk~0^|wOMit#?1`oiRSFni-gm~ih{p(Ex<6+Jd3C2sAtY5$X z%=N^alURWsfL`>VARQtMEhnx}tr489Koa9k?9Rj%pTm;lL9(DbN$^Y@wM98`jiA49 zlq-Qjp_ra$X#GVPsh~uh!yd%qDc%i&-h6w-cj)ZWEv^?_A*Dc}Iz-yVf?o-=2zZBJ zL_^S1yr+JHy>w!F-m%TsvDkGg9o>pu0-j+7aTi)t{}qKW91s{zE)F22p}TjZR+!drFu#K6@MH)z*r7_|A*Aw< zNiN8ty#j)se%^>f87Ht+bZ@&TEM(Jhvx_MpZc<5vfJMFa;FKST!=Z_S2%~yLH#w9N z+`Tjm{3&UuB8#htP*NI>2Y_@FAy&{9dvj>-^1)R^I5x4~M^YXphzjCqkoc*Nq0QmF zi#t{kPf1gMAjNT(Y7u>^i$vIyA(4}K2Gn3*?BMZjg;xsssU@J(#FmQ{Q3E5Yc%vpHK7Kva zL}`$r#8`1qq&FV$J!|r=C7_2DD)&r86O3Ns;q{YHUcdi(V)0j^PkmzIbx>sjRU5RW zJt~7%ppJmwbqkFaQO1Gy;gV4;k{qwM-t)|v>$Qm}R&WOG7py17bAF<(1X_wZA`!Gj ziD;_@ZDB_5V2VgW-O>9_iYs_Q59t8~8g;Pq7KJ_)QBVbgLHZrX`5zHYeZB;!cu`OQ zL%_XB(4xc6EV#E;4bWBbhn+SckNX6%#1lfIAmxs?g?cU$-&g>H%I~mMF^zyw5U_ZDde|<$tI9PKo1l56_8F0G(@71M?!rZIQ>s{5|B}J zR|u)40U)?i}^Bnle)M)*Aes!#B=D+DX?ZiHh5R97If6C#*WA`LzIG-_}> zrMVjnjGB=p34y^QN{Q&CC5Rd-hc*-GR7!NhJ0TuYeHg=LB11ULe$o|zo4`YGW?R@9 znZoak32aSm3xM#f0ZI?+qy`{3%PU%lEGo-Jp`8#9KnWoHc?9&B3#6gB(|Ozpav$;o zrj;(>1BQ&Jpc@Do4{1JT;|reggf;C-@W2X4 zfq=*rc93+SGr1Rpt3h}#DU6@?whLE7TS$qw5EALG>W+5`*g`#G(%`4C6$$qWaim zy&DLojNV0z6-%Q`OX}3XaC3e_H;7?7{!s zfkgR(tG8L{PMQQuugD8iMz^>z5r7E^M_-Q*|`#Zq|>}5jU0wE(NffG+AjcO*BKd( z{zP3rB9*vh2$b&{$}iL`j#gHV83I?o($f&1nkEwcy!NnS&DSXryQjiJ9($dpvDh&F zjhHlkK89P(iP%>5MB&9eiQjBVTjVbM_S!G3{lXV-TYK9Vzew&IZ8PxJy2~kDK4cpr z?c2uJvI$x{$uBcHXXE&W`2PBfY|h-V-kiqm`EGEdlpf-w_J*yh-|Fkf*q4?_BY^R2 zHiMA!RW5P44%YFIQ-uZS-i|I|Ia8O>HGklUza-$6=yV$G8_~XgHe`6+eJCf$#a2_k z4du6@OxK?Y%>ce($am6`I+u2Zybw@bu)SpNFoJR5k*vfr5ZC$~Z_8ro`Yc}n`UCoZiE+cVOTe>6C{mg7c z0(v0V;)JT>nJZ-NC)=oIj&_7Kz7Q$o`K5 zAasM};eO6*xt-ptp4Hi?-ks@iN_+z}J52KdK-pi;Y}qCTMatou+q9Q)%;i5 zjc+Y;ptz3Ijs(@-$ZD%@!mlt5uhYd|mV;Ah|BOxAC4(q3Sq}Y!qThWarxiJPhx9A- zJs1Ai3syKz(BT&PH%{y4&IPQK1LnJ86Q}FLPYf_v1~?3^UEIth;Ct zm&$MGsGO-hgATi=Ws%N3wqDIS-wm6}(p)-CWJU|w+0Vy2SAOqa#!2bY)mtZ|yI^)* z$MNCwS-ADK>uavK;Hn!x^FZI&nd&pz$SFS&_%XvH+V1*JWL#M3)07yt>y1vwj^n76 z)$D%NZ=bH8(HM^OS5|!e1Jm_0?AgXGo1#9*Qr4sC#M*k-wE7HMaCetk zF!ocnVMx=o#9d*~WT~=C+4rYe1GNIToTXg$z=jUHaW-^*lvpOLIBW6BmQN_Bshnjo zI5A5HP!S;eKaX#No?gf=KewcHITfJlLvl$vH#f3Ei!7E-Gno;#2{ADBJh4(0z*pjgfbNfHV|->9WY(MlgPW)Cu&A8W1~CGI^9{uo%S)7YBPBF`z$IvFY@J~4Gd zOby#NR@B<8)|_NHh*Z*~Aerzyu524rcocFI>{16FVtcAH7VYghKIELH#6xGn{C#oK zVwj0xrAezwc&}R7r8R(kWIQRaJ(W`oyzldkFM62re>icEv$MT+{j5&i?W0Kd_6~F@EB?Nz5mS`A(BCPCgFEn%O{(a{VWXqhy}6%_K>p{he_oMIBlDqQ_H^?0$>hD4lV)~SQgJ0 zrJS7kZdMn?!P^zIkQNuD#Enwa^enoSxG2>)Vfuxq)v2@5IOf7d396x~5`q|aDkLBf z)1+<#p^DIa_{Qm}pxtj({2^)xO~0#DXFQ$;c2`IZ!6UeT~@-6{>Bw-DCH3D?z}Z{rw2*o3&s}dh+*rV?YSEU(V51-o zb+Sq{k6XgBsN5(<#4q|ZC|_b@KA0G97g05-J6Cyi-N`Sz-i*5sz8ga7PluQ=2m~{+}e5Z}pX_g)d2+li!ahJhp07e^Nw0w3( z?qd!#yVqm z(x6sXCI(f=6Lt2FmKU_7DUw#RXgX{lgJgUZnqheuObu?F zr7Fj2A&^ya32CC%sLiR?sx|(r)ua}(!1)WrWD$L!n0)jvW_RXJ;Rofcn$?0@HLevs zN?I!@Q?EH>PH6cOakbj0wV1oK3K>dmDpmQ9rz_|xAVE`w@WWd5YY@6ACv@3A%tq)% z=iZfK$BoF?$F-Ctw9;BoB~J%c3-Z&bnlP!JCwM;Q+}GBqWdwP}x>uabgY84y{yMIsvrKaW*UqfDol=ZJ=QOvUA(j3AqeNIZZrRU^fu z)RqM)rsWXLMBk7>AEPNE5_!kSq|6NLWj8rlE=-oo+I8y3p;zycm!135Q|QO#=geaA zh$e)X49b&fxplIvPdS;)%E9DEz`8fbx^vdx%1ODnMOIuQZ^noc=Djc)E;x@bs2@yL{cJtv^pqFa6M6zg(wm!@(_)*G+%n+ zC!Pd{l=Dx}p_lcHPN_aowB}C4rFpro%%t05<+M~)t4kA6$t~1WFx>I&f;T_M+t zF5L`ePus&TKN^q%VZ)uKElP9LrVd{_z#!KU+(m3Dt|H#PC zbJXsN_nHMw8K(orV{nQFQcA~}(+Ocw3MDcHWztfsVV6ub#1qtzX5)cGrUPxSXF$*% zuT$?zi9y4yf$|58+*YFS&MmV?p@ScwQh;i-EMX}^$#_HwFXL7mABRDyPDOvRr568yG)3Jp4FD(DC9^!Tz@cN;9@Osm^vFDDK8^@yY0(O|l%(4k~*m1pcDMr-@|Fu zxtzF-`^FfXc&tTUvByh1-T*@Ft5Vf~Q!oZ6(CPUJ|2^a$FLX&L3o!9N?TGb>>- zRvaB08y))rtKBvu#A#*l_n(K*>T?NoyS5KVdu()c0%PDuAu|?^j*V8xOEx~%N=g4J zNm?e+>d|a$E@E%~0h}zcvki9>*}Ff4zYXX5>v8Tq=_s8s8e-Y}PR0_I&AsXb9*m9B z-J=D$PDZ1=Rb;cV^SxJN1xj`F^?Vz{e5pbcesp})eUo1mH+yoNUkA^=3OOGAcu)W6 z{iEqj-k0US5ij1G`W_^Gq3tL4V3K?#Q^gHtCVaPrit zlY4(vgIvGP69}#FOP;~;EP?2C;k!?r%#Gty4gl^1W?5&c{G3xK`RFS-)i`-Up0@?E z7>)GQg;Jno|6bJ@=B1KJpf4?zZ5ET0A^GHFi^Lz(K}yb7n~D!Umb${V*||N}r=Ejh zda@O3{l_PXJgI@p=w!2$oGb{pE;aL5$0#_7hP3BO=qqBcIEg$#B?BQCIhl^6ES`WB zKNwpSwQk;i2dq}j!fKBzy!+%yY#eFM2w8os46Tvs$>8J&=p!uZC+AtE=^&gd?bGU2 zw1^A>n39{BTBHWQqIZC|chk)absq=a%$3gI0azBkGz-DKuK0HIQy)2BAl{>L$%s4I zAf=W{W;SmG{EhYqLwY8A~x#3f$Om<{=j4XVIlaXL} zBpr4m@o+GrV;P>o^3GY&-ZcCsymL?4Iokqm2DoR~pc6pcNR9j)xv>94MC2vpJ08wP z+EkDz9u~8a1e4VK^9m61)#0MAPlqq0-W&TRz@nFe;vE%E3=c1bXh%-eMn3oGi|2#- zacP`~LN(`-4x#v2{-dQ~cVe6rlak>HzV{4=Cx)$jXqbC>hJieB0uLv`;S=hBCHZ3x zw||$Ra_!4!AqLM5$0u5cu^Ao)Pyh)jKG7nX;aF}sJ&_H!N(m_~rY1#CQspyYs5Zxt zJVP!r019|st{{l`#2l5(B05nZ^Q?NyKV=d8=P)5s&i#JRiTh7v$Dw#UKH)5C z7lH;yU#21{#lUVra=k=XVc?R&Es??X;gFn zoT!k7j22x>zDg<`4`HMdZjQTSP(H?n+${%rfHmqX-%zK%bVjG{cP+nl?AY<+>9Mxs zEXiT!juC-l$U+3^vG{mqSjP(}SapJ=KplFj%2>)KwX$S^uTnNU9v_2yuF@tSawISH zW4>qL_Xs`nmV^H%1lR1(!k*i{uGx4`kLLZ({g?QdJ6@C9W6gypSUaYg1V<@LrHFiD zOEn;}W<(H}vK(HaB#Xwe;OJi}^!{O)@P8eA3k0@tbCdlJ#39%j6k7iF=&@r*(_`7u z=$Jd294j6@c9efSnQ-ng3id&Rc9R^M3CmW=QTDdy=UNy`Jvmn3`zVx-*0GXKFfFAy zM}wn)*sqVvADkc6UjgF*;gCmE>j}W!P?mD@n=MSw{xG?M zU!3o2O^7^3<2(vNGCcE@9jO783d&mnpAv^7=tKVRAita&4!81T7Tb%$#odSXQ_^OF z$^F{lb%#GoX|-CMyZhn)M}D&l>IBfg&|jULVp2i+HAx1^qh4{Guo z-Sr-R;_#0ZDc?Y@H4X)bF=t*xVCLslW}!NdogMlmlgP^3vmms31>B+d za0p!GP(d{UqCc#XsXY(5kBB@sSUs3B(}%Vg;gg5{ffi`o(e;H-96B_kLGC-XL+)_( zQ1EvbKgAp+dW?lRbBNlID}2YAzyL#IKc2@;lcC45M2biU4h09FRNr`yF2pCBhQdb< z9{Nu>y~jtf<>Jmm2fxq^BUi6JaxgxW9(0H5r1W6e^@)q0VP+M1=bACz5Abf=wP9MVOkHpQ8%N5pa@XSFULIqE{90bY$~a)u zA8`Le?73(C;*Rt{F!V=$gs=;GTY4ZII&dHzN)EUo%MaBLv<)3VHuUx7&$!~XpL?FH zjMjp@%5x9Cj(#>29vGsgRl4LFAV8ihO_$6=M+Yu61?fo9Y+9_44rS6D8mb+bXLbII zfM8qn`b21`jQ0cDc<^Fc+O<_P#&KwIAC`-KyINO~KQQ!%&31)9RGZ+(H@%CWgr)qk z`8W^{g_}Qq`A=NSht_RxYVh1^-n=R27B{W%8xO@s@<7A43nm7f32oEkc#F(1c#aFSFtO*dF!S@r-Ior!uZmsdT0b}l)uHWrc8_<7 zza-#$z%#R|RRvD>Z{d4KFiRsI^!ncZ`z9JOVKuY|Cv1+2bzX zpb2IEt0r{hQKdn5lW(-UFCKIoe3LoWeOK3D%d`Lb=|6m9uPeOuru%k{4xa7+HnJc5 z+2H+ynla1$SIuWw{K5Xg!M&FYiJQdVHMk$#PkSsLZn}8K;QsyTV7k9`5Vie-{`()k@r?&v+gtx|?GLaWO!i+WJNxj(zit$;H5W4XC4&VC z38>+Pm)9}Ii{$SVd z)Y!1ZS;kJ$J;+=FUmMuJf8Zu@ie1~qJN6Gy{;_6OV}?9e{Oo>J)2@MF|3I>To=Q^T zg9jvB0kma^1m6R7E44iHy~n=yz2vdt_a1xfdynn(!i>rmGflvo*?{ni`}d~WMI#6zZ>;8c+tXOfQ zPBNL!iCdlNq1F$oy6^Hl95;F3&-!pMRnhzQ*9Lyc5EKLRrbRSR&>|fOscYaZ!Iykg z$QPOp69jdVSBt2MWiZ{5bjyw9NiM4DEN%(QWi;*|RMG!m)VRd8y$=Qmo{MaF zhwfqUL+WE8NYk7_k`VPX@cLUNUZ;kdhtJvRU%O~lY zeUkNmbxZ`daasK0?J&mMB9UMp{LXA&);|v=sqx<*QWQH;-?AlOcYi3k{Fa{@xTwWK2G6WULV_-`OyS3+ zpbkj3w?(F?WaQI541zruQ2w8b-tdO^{_n@-cW=DMy+m_*)V#L8l4Q@G-`Czs??no} zYnEz9vZo*{`DR4yX)|EMj`#eMnNhHo7;LiVyrzbg8#r%3LT$pQuvmmFl08Kg_SgXE z_CG{C15s2|=~cvDYKYQY)T)9p5;g-4bPJzaJI5fU5nJS9%tTv#qP)~SfB+dfNatGH z4OOk&yGPT6x%X+31os`n^q9hAQTfiE2!txBpCtF&_V}$5{O`r+y{PYPS6`OMB&3S5 zo+2mpangxBJVMt;Yx?%|5!}8#dnlxRg+1hATiCFh;F^bf199lv^FP%sdJR_a!k(;e z&YnIju`-l4 z&Nt9Jw(2dP_Fh}$GDnbyXtxA2CEHnP#kVlTyQI=d?gz=)frJ zW3B27!Hmc?kf^PF=o%Hx$DwY^u;zP{gv^CNoyR`>?m*4Kuiv6N*4gqY-!=6eGa zP)W>O<6^|@XpX!j!Rt@agq`+B+ah~1b*%BP4=Z{I!IKs6f<^P=5J&H4;Q)lEdHs9YCFFRl0#z^iE;YeMke-U(A}>Fw+5HMF=d%a@Qe5E)0JRw&2<0p9En;DvICgw{< zNiUAdQ^LSrHB$z&> z@M&{mzEa%Qu!wp?Qx`%ibV`gD5{*g>c8)pGSAv0e!-zNTa+~92eFPY#80W^*8fZ9; z-V*Lk_PXDM%r@)qM`^dto3{DD^!7$*NUJJB&~klc%QeWUB*Nu950W*DD~X!P??u(u zOgkp0h)$B~dA?ya6DG;PcYULzQ>037xVyJE-A$LU+^sa#+p@ct5AHTNZpJtUqE1S3-{R2N9ro@PH~T#_c!w%KO7TvM%k{g3up8^@?m4-aUh;D6 zQzZKth%MIcgj#v2k*emcAbAQ9PX7}8RZLred}nus+?sh#QWivYEMy!%KhQ#Yr) zuAODW^rXv*ZX{yR8@oLLA6g-wCv*Q{5t)@J$GeTvvE6PL3~l47Uxaz=Wp}u1x5jlx z9)jJ+(Yc@Zel%w`6%C( z=idO>fE*V8au=dUH8joNU+&%o$z4QnR~t4mG(ZORu59=Dxw+wa#G;_3lVK#6*{=C! zXsWvrL{y}^g54|RtJkMO4tExXX6OLVC?oApN&pV)VdQDPk==%h(&o^8BqbeG!+k)5?& zzG1qF!~Kko+W9BYxyRc1tzEm|iCVaG*UsbQqFqIDyLRoQg*)pAn2%*=#j1z(&ET|_ z=$!XIGGca4k%+B%(sD#vyV9NMF6bdm(QrG7m1)$`u9BZXE?J56Ivh^_<9R1_HBt*a zcIrNuFX{b^t?w{i@1gvJQGaCT&TMBvT+^M52nahl^=5#}L9mmGWY=5|FX#laBAo6F zDW;Uw2w>zjYidegp=%Qb^44l5&CwR+OTJwK$#JEV?rb&PT}1GFna~h3-DOUiPU&SM zta7}oAT9ZU%dXg%h!ral`KIDL;RujV!}pF<+|D}9u6ydrHg?)wjZY|8!JpAEcPX(N zuvopab0?vQ&{C{Q`LdSB0#&JlKpXI)C^d5v$jhY295v&>wW09!&s)W$8K%2xEGKtD z!d&FMggViTF588?cETDgI+dNsda&xD#By%W&Yqn+dq_rJZE^pU?hJZf(VAN4$7ou$ zvkfKtq&o{zk9LL>r$E4A&uG3>-Y4cEBrh+gNHBd^KSBH3cHE!JvutUiz=#kknVBk2 zQ{=3%v&EQ=Q^iO@rKqwhq~m(j5b67+2sN63NzWWK{eRLE>_k84(R|MX-0$@%me0Wx zPHxfu%rW8%??72dLC?;#r^Vut_JjbWJq&V7j6ajav<Q3=_4Nk4#uWyrOTi0U+rCS$#vZrlUv{s1P{ zKw@PLcRQ!N{RHB2Ppjd}vw|7r@u*QJ{KTuqxM_w%1O2jgNHl|AL2ttAd10d`GE;?= zZJa5VEGLO|ih)FMP(?Z%$&!$`}&kS*K{?xf+s zyQkYYpT|;pwW9}(w7Z}TgWd$x>CwJ>aLKWE_`_}#+&7VEu&<&?tFdK_ky2=9-67=$ zOVmx?5dCheVhzJVOuj*Nqq~SBs?whMo`DsqpM%id~D ziVmT&!S6~<*@{@NOn&NXo6G*sxW&|MbnzUzLUZ;id+pL@`r1QC+Im7~q8_ zz1TNVOp@FzI&Bu2hN7=-vbgndNP6jxYIiGG3R=mmtb{~3RWoXMl$r&>5U5b!8m944AksC}opsUCUG?su%UbCB$lcyRV0!=>sQDtknRer$YlH-?F69q&7rMH;yN;4& zFm(ArWo&gdYsEffb>LM;ATTR*cXf9i^H#%1_H<|6NmtN~=>^n)rGNWG-C$+%}!g z#ob_-l*WE6G2-`oI1TsNa)4LB<+C8V~%i4f5Gl5lCcic5c3ll^H zYrb+hUKis4&*z!MOS|c?>873MExmd-o0hH+t(YcPAd6G))}qMFj@)`z_&mN8aotOH z5BJHkvnjlUUIT+naT52eJ2DJ~ySr+jk-p)giU@_It2HN-P->XEtSvbB0ylUT{iLhK zNQ#tz9c|KpqjRZaYuhzfIHrTTGiQQ}QL_F*n&u#>ft&^u837AOEzY`%0_uXHs*ZNq zJzcAy!)=t@(Q2wex9&F7J;FRw=`KyWYQEVc)DDy6{G@5R?ix!aSt4&X?gV0Jce-cQbS5KZRX*?9W}~2Bt2QBlearg=*XU%d$XK6F<11=p1d12v8dpXO zVTO&l!V;~Vt2}01za%q>ZNXP(SEI94%g!zf7QMrm4gXDi6_c32=lx*-lC^md1-l@e zx_TP~^Q_QGDP?)uaGvzM8Fg7F>vJB=taDCY;aw(O^Q7n1(Pi7A7D9xLwAqO+-V~*K zdFhCbULU2eX^8u;8el|@b%L;98G1NMey5}t;DOAk?=D4zP+a+~cDIT3v zEBbI~28ewSD-7H`7JN+4qS0wWk1X0X^T8%X&T9&_=}JM?rxg>t#J-QE;k!$LRIubM z>Ky50f}GAmM`!2%1%oBDT`^ceRQ^dLiCcO(h;g3-3B`WWlOzZnCuKX5zCj=O2a4BlKVa$m+-R z75j@G%A3lZsC5)P9nV^Rvd#<5)B~%wqculMAVEtz@>sM=kD{P(pVzVWz|XfnrcOEG z;;5rD1dmBwMbJzsrm|(rLQ)i05GUT}q%H7;E98Azu|u7?oPg=*Vnbr=)dJRJp$Iza zm~SRx1%8u;IGduJq!=bF=Lp$IB-n|yLIFDgF`cY6Bj~U(!M2B$z4$$;8&J|Q$MZKY zUYjkRb#HF2o-u7}9u%|A3&g{uo*<*OV;&+2^_6M>@bP%mG_{Rz*3qU~{WE+zI;$)g zw!U`|M>MS5VFPWAzj59@66LLNU)R9*CyVYO9|F_HCmSM5#*@i;t%EG2dBDNnUIS$ht<7r$pqfnQC$a={Suda*`!pzk;-G z`f4s)a=(@sX?4Da@xBiCzj!az3b_#qKCa~%!b{_h=P8Yo2u$bU)9kc{fB2b>{YZts zmsIVT=$O~u(b3-S|G{ZzRJC`!c*M0c~VBRk_8Q8OTncU9zUeKTaK`kbeVKIT>pphZ1xpC@Slv7oV$ zXBBPPD0hwaknc1POVZIMJ^iQctv+X%>YsWZVfCHZ6Cp2FF>RmI^g^EXuZg2RrKM&g z#n=Z$Itc-hh=GF*n``3|SsUr5_Ku~R1~WmkHAhROaq|F==Ex#b$>7;eqh&pl8f-){ zKHWR)7JLuI=2m8E1*@5WM9xLgCd*umBabyDpG#vFreD;qM~Khw+sP3xu^qRi+Vn4rp%cl;jZJI zbk`HHwk-AybnnCm93a8i^pjHc|nvw8o9zcM5X$^C7UU#b9t=R8)jYRw3w!5Z( z?Wxy3-M+rv?MT~m&0ElX*lYd}`92cpX2C1s824`d)9v>+wb!2nmq!FXei~O=;9mOF zX{~K&J&e|MaeEoOyH4YAhT-1+G_w2Kk9belG5z@4he72bH1s==4*1mMz;4oACv@7k zV~F-)aouox@Wfm_33Ub$9edrTXulBGi*Ts^{dA{>iWd!KAAU9+8|&0qxQ$q9&c)|Ki2N9JP5BdaIH~4 zYNu|;Q!_PhMf19({qK=8CM*Qtt_JtxFCv?oX6&{d^|)KoX};V)J~-~rw7&c!ulXS+ zY`>I2vV%wn`_{C5kkTVLcA5nb^1|$RtzCHDm>b<9qr<>+f&ChTzfL2Vnfd9|O2*BD zS3K$AA?Q|dd#E)Wi(7Rpz#$f43-4=h{|8*LN@49bOlD!2TVI!3uSBl-VA)u>D-Pk0 z<#L*tH<_RK^$$dJg}4*TF58~AJ?cJ!0B zo(2j%5clQ2{fC5*;Ow9QXF)L#Pm^)?HRAw})8^Oxu)T!w4$_f!)`}gh9cREWz-KUW zD^8>E@Rz0$%OLS_kvO|82ec;S1UA#CEq`~K|7p`(WXc#Ms52cGu4`{slbXJDdUW%w z0P7W==d2Zvox@>h28TNd=w&b8-tImG);&bwG>P?Wt9CH%*e;yg4hFih;E0v+8Ms@& zi6Yc&(4GPFl-i=TWd9j$an}htIZY*8&a;4S@v}&Ob`B1=N4~iD2inb?Cyi+_8wIR)%x^Vts3F%?}X4MO!enmGks~$U?VFuY{2E zf%d|V_VzPYD8h7&?x)AUexrqew*B_MLTmgl@~){dz69P1~Lj<$14ym=FPj3B!d-?UY*w3Fv3W=C|EbL?+DZIAPRYjY!|8u@O!cK2Cy+zvs#U}N(&0U`Dy0Cp1 z+yAW2#r7I(7c(}OGd*H+T-;ygT3Bcgl*} z|8M;&!+fUIrDKqMc}8q<%PYG5=vpX49?^XGYwd1*z3GmTw2|!#8-;K2U7Hagb9*Vq z1d{jLnQ?H@v-h24y*A%J&y3Bb3~2SfUMjejJ0ccyXt#r-c!ro`ZE|0p>HeA=z{Xw9 zSpXV$Jxrm!mb-vfe4XG=8!-^q%{wzmA0K}e2qr@sE?Gq zF3ACIj*+us--hP_W~bOJXu)PwtSw_7%zfgicI~sDCDgW?;6)iepv5u`u+CZwWG>3%3{zkfD z#d_PQ^8kOg)vcY%c#L)NmMymV|5iKQA(U-uB>`Q*ilpsR56}K$AFSp1GIx!3k!m_C z{1YOQ@$l(X#$!JhZFvqRY!|fhtr3PE*xi}Oohb%LO$#I(7%gjg+t$TIY3@3X%GL>m*B^y?x_ewG z94v8Mdw)BpT02Pnvx4JQS~Psxx;`aLvowDE&a~ruwZ@yri?R3_QKX&@KLnkC8TI ze=Jh;;H_E#A*8~4^xCynMXj^>SNzipl3?Dnv79Vid>ad0oUZa@1HDbgNT~2AmqrN8w z#&}Lu{lVbA??sPbMKp!{{&vM$MXowinwS-|uPcvesz6y=p-m%aQ`53m%9 zPvih^@30X`>>2L%i_4YYvCUC%@fdGF{B53MXRbF+&2P?)?GPn5zO=nPT!zq{<^@3rd*dz&VcoiZ3V zWqSA8Ctqs+E+FM|AZkeaGz!E66kS-j6%cxiiBm;nDqnrhw;bK`GC+ILpczu_+oZFI_l9+ChI}ses>N)av)j+&@I{&A8UVt?@_VQ`oB%1 z+OuHQ_CDbMr=ZG*jd7j_I4?Rl&79F>42C%Lf=D zSE_fr+k#~=HxQV*1_G)`@EAAVMblCgN_Lir0)v|`I>mPTwhcrtThA`~mhh|VpW<@l%OAah7Oi`c7P%b{qgcF!AHVL3OY5$1>C#U=@eQs~71!T+%ZIMJBE6J1 z)Lj~U;I`-6b>_mZHE_S;Uhm%E-sBdz%iV9ff9EbEr?kLb=w8R?_3mQQuk!gn_*~+C zjr6NXW`2InT?$4s`JBFg&Ak!1(xp~<1Clr7rKa|;;q5p0{5w9s?yewd`BwKXx5&NS zT}663xvSlOaPK57;`0u-kk4W?-tFGwu66I@vxM3!-EX_M*yr;6`*Pa!??{(}c)9yM zw;av?$mjjjpX=Op?)Q;g1I{(>58(1v_gf%c$@g!Q-b&6(-pW!u-{k&1tQJx$`P+!u zW%l{3yNmZ#{yF8(yF1-qQ}cK3UiT$f-sAoaFaPSk?QU`Zw|msBabI)~yHC4Ykzb3} zeeRFk{nUKU{XG}hzU4m4@;>)xt_xlp+#P(rM%_dBeBAvnEbnw*bq~5vV)Fs&-{Cfr z|0bTkj?UNJ18%kZq5H7g1M8&*A?X6MwAwk789?9^xu1F(|c*9`fV9jA0YR8 z$gXwQTYtXO{jT-wLR%{T4to6e(0UKn|AFs!qPv*!@NRNT3{l@g6!r~ZUPH8(xj&}# z2X1NJv)8x}($7oz{Gn;Sle%}(lmFiR_S$T1_D{^C7>w|m^YH4`9nT|>sGKF+d3p25 zC9KPvUdV;aT=vjS3)nhe&1*iXV^gzfTVBU8LC4h`Y_8n#H&~z$~Lj()6t!dF|KZEFw;u?io~@p?_mc$ zpre=$U8L7LY=LsiUdoZMTPb@G*@6aFT!oT$6;fLHa<0Sy-$PPD&OwcxMabFR+fUbD zjom^Wp6Gz0ngwGt%58cjSD+#C(!()`wvb<9*}-zt&+>YX+qTL9ubNgg+%`7JQrxuT zv;rQ2*Zoy_P0J@Zbo#T&HSR4^XwMabY}rnV9aj8j_NwlNZpxij{+BEqSv|j#U2>O| zzmgSJU*dEf?h=fy_QHGgZdH1M*``N&cnq=IRR0y`Ol{=o1B6Sx@Lp)@!SUr>-{gKa z*VkjZU(14rF45a@2eL%s2fX;}ydzm}_5O{`sh8j7<-Fh2US__W!$8x&(aYCog}#le zId@jC%&d4gD~vFrcpuX8p6HC4M`_?gH|cHdoPW$T`3^o-vZLKr@!|#E#YUJeo8Z*L zbaUZj1mFfH6g)$?iE*@Y^eo{Mm|t<~Ea4BNIdYb8vowd#5cLCeb^yZfh3Yaf$j?ryQ#4 zqJMW<|2~hmt2wq<&e6$q-F9Ec>vpX(7jjME>^k1sJHSO0T~wK_+UU(*!rOd<)C2Lk zyOq9fyKeyQ^u`R;F@igG8I@Of-!*1SwvC;xTIs8PW+T=uVa|0k>fmk3yUnPbxGy7G z%efh+S;xDAd#$nqlEmLFAI|I8<6kn;XLX%4Za!Ow-xxSym3wurc*)2ft7L+KI{;l$ zKc3fdwtLCIUaRYdi!hJoRiiGLziFRU?bH@fbw~0#&Zai?Th%TQ=>aAn7R$YMy^6`- z`SdCz>ThOy^>v*2tlV#Pecp;&;Cu~-M9T)PW^XZui~b8h9qYFc@>AYD-W5~P`+_kvNx|fOa~mcssqGP z!*zMbp3`+#`?`Y`s^F5%y?GVKpR13U*&$!GWNi0z72S5!>bU=hfVky5^QwdJ@HN^^ zEu+&eX5H8O<<*2F+rkh!W|qgOXIslV)2C+C_q$_joE}?T>9vkCX4sF=y&Akt6tw*9 zZzIPIi<^VwYDrzA__Wedf6lntD{*&%?P^qihK_z`x@6>pA@QsB-RuCCjGwKf6Q|W) zXGEN^S;&huW`f|iq)Q1g9zu#iSN%C1rg1X!5ob*sS6P~G*-{OCDQ^{!`J8+JU zfF2sj)@2jhv+b^Y8}A-)pCNY3weFp6BK-$1cf&~buUX6X2X4FZ`gFkrd!KYc+x0iz zc-vhMZ14L=nd;1Y>p7-+RC?3N>^{HoA7(P%;)3h{$6e1J{fcZBU^8&04I@eJZaSI$ zTNZ9zb;&WE(JcMUrt(*LKY-h=mYidtvvZ^mW?}uI8xFe@oK`$b(LPO<^lr8x zcZ_D=fz=(?@6mOGHC){4xo7#555TvZW@~1eaS7)7(d>J~YW33HX4Jsx=H*YHB6a^qO`0|jqsr&*TS`flUG;uWhl)qn6> zcB{s+CoP6M%x;2ff8iCYw*K(7Y_1y1p0bhfN^Udi!W-@$dFoYd*mU-dXY5=z-SARw za?*vDtnPT`wM-ru&)DZawCu&)geyBMJGQ)*#s3)RW%3+!ypUV4?Y&{sk7aQieLLMr z&45Ges`2b6tgq?H!XEVK{l)b=q>$z!54%i>jrH!js5BxN%WW};p=&Lxyn$7z9Qud-Y!&|1!ITP3h z-mSwlNuU%Yqx(0CYoq`?D5^xr5jZyA#`;ja>c-n1*nadtHmAIO`vX8+&z6K;&MY8oP$#pO zGq>rfX^<(K7MY0{7c9N;Gk4wfz{Ga+HVG>tL=$`i|9 z=5kGO(W=!OIzGWgwsZVrc=cq)@y@0vrwzwAr3p8zx|TODExNXd=~m{3%iNlu*`}Zw zKz7M@mopBBHfaa>Z1(-EIMA_S^-YWRxR#F%a9VVj=>@y9$NlE=>T4_n6}TIe)6Mb7qE#CPMsk$Gd`9UWA9aq>423(4XG7uQEw6+V1S81Ib48X0Jd~wnVqFA;Wtio zly>3$nfq}ppkJs>0NKG6QQoApOFB0P+6d4s2J{Ot;*y8P*d~5tx_iDhQ2r<#MxWul zBjGj-PpSRqbQCytaLMJT0bONSGNzMLYufb#G_COqH!WaVO$IJQ{cdnB;W_^tX8|~$ zFr3f-BC!rK4))k|aWSWZElTjq+ag0c;lR0Sn$OQ2$U&xi*w};F8O{=&s+ah=h*K}# z-k$dtPaM4VIJT=|3_yP#s!IVm#&-=vT@}4HhOW|$nSHRluFDKLz^A4Gc>3kFNU$2s z=iEWNp~6CbqMSxpYzSY2!p}u;t2tBI%IR8o@wU?dZLAZIrfcSZe$AS{T661~zg)BW zYemqwMceqSac`pZrXdY%+k=g-VI#3-l1sCWQyY#;7r$s&7S=D4hwbeZi3LnkDtBR5zmfy4kqec_Eb=+6&nsqI(q6 z?%mezGhrEZn{@84v*U|9>P$_?_6FtWXH(|a?v?v;x?EjF_YUdaHJfhWu4ac~S40}p z9FgW{&}3aWlR`kmbIq9P0<{H4^<%SvI@qpbhVjqXR$anfkSps_{0xe$Laa7SJ1;OP za)b@xSLkXkTd`BCu(#E56Z$v4iayjiZe}+TE`LI=KN;XO;qL007R%~Xo|Cwj>@Ylv!mbz6`USyy_#R|Z`f3p=F-`Su)Ca(cdk(0y^Nbkmag79A>9Sj zx-%$nF3f@6^PDZ-c0KR!Sa8*ipLw8f>{Zn{-zEY-W?)3yUEc}bQ^M?Qv&4=AqLtO` ze${WEuAkwS^PiO!U;n^#J(Ke{BSTLto1%Vxmh$ocDZAp7*~-&4l4N&HTh8b;E>tc< zDsD1tD5fQ!MbtH_2rJnM-lnV~gceS%{O=ipt6)Z3a#SQ%Fp~WfMRNF1BTm zO-?n3!i=tFrMX%PRm@#hGgZHoR7@(QEDdos-o!UI9vV4+ju(ZwXQuIIbU66!rF005 zt!a=#&5;VEgbdMP(3YCU(iWPNP(gu)f`L8AJW9C~Y56_?WeVEHJi8n(_KEvEXKHD%igg9})Fy;|v zNkJ;A;i4{!40NoJB}ofa$^}}8bcR(zikeme0)Q7%bJ_19wyHXL&~BZBKTc6f8TTs8 z-`DU+=n1)D78n){G8@KdYm{?bwvfML!_h5;(_6 zQY6JmTu&Ss_i^mk%x1640|X@|wscvD?qo7grr7GgVe*0`X>vXit5RJON2E-SRFKz5 z0G6W@jD#@_h^;D#Td}bZ zib-4$LJ|jBoQ9y7#us}2URU{swBx7Mo3rsc#swDRRWlz#Y{58AYS4<~qOvMOz{HJs zUY?^2xJx4AFJ+^pViXU@u93ucSKRV%%+j~)T0e(oqa06p&Bg%BzBp*;KWz{cQn3;9 zA;TIFyWbY#JPr#3R_1wUdv+^r^%-|B7iBT3^ zKv}NgtPJg(tA+g|xx|EdwMm%Y6=n#Y` zcP6^!uR_!Z(lshk4eL4yLx>cF(I8v%*%%^Yd2Iw0%8{$%v7V41S4VlL#w89{bG|n4 zqgf;4{+n#7W?SJKta>Rb)T4U6>_GsfNSRunE~J)^M1GM*X+4X=dej_xx}8M#Aa0)B zX}FGFgyi{hljD$W^SE`I&;T#02a&ZTi&{;w4i$2;L7vp-o@S81745{=BTqypssYnt zwn@F!?CQGznU^Ellpwk@m&>c??&4TO)+P1xyoEKkjz1THVLl`BRZ?0Hk({#c1Yb2| zWm27dTCdbOR;;@kTD3agHm&XkZiIO*Uc;VAKAihRy5`xO!7J>IwUhn6EB<4>j!9H6 z)W|gI0VU;Yh+M6f<5?xJwTb#%>STfjZLYzEWdI$yCGoUnJ*kCg#83)qZ^L^>Rd?tA z#bpsE@q^spRmx5iX!#bZ*v%2HA^WEM5)OQMdcna3E|k)GtEtwk-3g9pH+i{cOv-&u zhr=ghnbul_UyEx60mrCSYrL(T;cDbQ`hHJt)QxjFwVgu|U2Nax+zV2z$QpA)u8$yz zyky#ETx*ktk|@+`t-e^FsFiDBwN|aw+zW(aQAMHn=wG~wx08)pR*h?EwJ3`!nR?At z8zk(ha8=Mv)?7Afb4^n&sziX)B0)8((L2=wITp~Rx_TcBZZZa!{ljbwUgUjX)mp@( zu5qOxadn^iWjN{6Mo`pOZ9Rq4qiU=sj@DOrj4K)YeiNv&B8uIIDR!ldkv`wQ`!l}v> zDpP=TYOud1rQ&BR74*j|!Bk}cBfL)?W{JzGQCo7-T1lpYiiy%n0d4)J&J{9Ry7|>w z`qWgV((qQ(#vz`BmU($bwiPr!IDjo4idLc^Hvkk=-N3?CVyb1L6i*es9jqhjl3bol z*-ZXlqUeGz&&us3#`{!-GsFtd3GrQ-60HexX`W)1BcvLsn#Php#Zks{~ZgL+{mRudtqS*@4K6J`9msi+)+k(LX5 z>t{25lzEL7GWDWqPQ~Sn#84=w0>DwlfF_YAB<>%bYLqWDdT?w0t4gfI!wikXaM_;k z;g_6Ob^Wq)e>zomljZU&d@ENXHAui9O(%mg*=+LsGNsA#r2UsaLM-n!*gI$KvzJ}) zD7G!qFDH{cKs8B=0BRKmQb9Iy50IWLNHa!pPSXv-ObU~+ebd6pwkCnp_(`G7tIG-P z_b}09Se`tfn7;Au z!G^3pL1|*Nmwc$gsl1L)^iK?;%V# zof~y-uD!90L5xAn5q)yQ(_hckO-7sY)t{c8l?1L>X?&ZLk$+ zh#l=jfh&oPQ31J1zi#sB$LsFf&*1HQZKa8tD~bZ$&_-#Y#c0qF!GS4AM1(-lAOuo# zYDm?od7kGp?csiZYwc61B!#?Jb=KZ%ul4``{=ff!tv&C(_7s_Ls*359vQv{*&{M6M z%v;%DYLzN&Epu6i&*Z|CH#t?D}%GFSf-rw+j65hBvsT0(h%IgxS zaI&(D8p;>wq-{ZN(o7X>$sCsA$(5Fzr5IsP3Db+SiljP1twaiOh{}nTlN0>gA5|LN z@Svr~8J_nqUxMDYlj-qz`$rL;7$k+0cr`IMnG#5zY=JaOiY6-)T(T8ORsy-nV8Tp> z6W%1s^!$&if7l~`4W#UShu0weJtrG&FzFA9XUS;+ptGt7FrQKZ(sUC6WpA+F$Re&y zOhywa&5CXoVY@U@g@~=BBAhrSk+dW&q?w$WFh6Env(FLZT-ST{HHh&R!3WzXc1^_N zsfqE4aSV(XC(H-&g7*d{c*9or`n{LmNkR5xw~m-q8^%#{zljL_l=2RS2iw4nNL649 zo(aoUR@^N|wl1k1&rf6|H9k%}#(i>;%|XP%&@Os1#Fpj8X})o9;$Pjc0*)#y-#Pvo zT)9`cVF9JcCV|geh@xGNCj_`)jn3L>p5-}`q)OwNv2p&#g7Ij~A8&oDRs`KqCq8xy z@eC}MiBGe6(+0H0(OvvSV}xl8hX5KQAKT>$S8tcS@v+i)S}J4Vc&cm`-qaeZe5#@` z_>C3NMp}T8EjHt&v6L)^W9HL3{fVR^Q0A)Ta_D-x2$IET&yzIVG6x5 zCV-BQ7pTmWBs@ndk>pBY(dPKfSf$L%=eaR&RPVlXch?3=E9LFC!GX6lPvX!@q{c@1 zcR%Gufz@&_wn8&o6^+HCKKW>@!Y+@FhGRaWDu8=f|c&InLnCV2ZqEp}_+@2-a0o@J=D8SkyF7#NXa zA1NA5kBst^uv&4)*0@~M&0QAEth6e$?>v=EJ?rSP2EOV6vwBx}<x{!Bqf_#w8lY0-I9@d z!fSrStcO)i!b&~)YMv|?sa?9^GsU}y`WCki(70j#DddMINpmAm8-9VbV3*8rG~$g6 zha#fDCtB;Kmy@WAOHjAKDE(EMiRq`jnYVN*p4y1(T!#A{puU=+j=~|tT7)B zL1`JDWBTxLdT4lfXeb)?hlXveP-TQP|J_4+>TS=7x+}jVasG#g03liR;b;g#6ywkk z4v`xg#v!|m|3iP6=vZZ|4S8y-9GaC6hE_;Tl0!vwDyA*K@JTUQOlD;(gG<*nkN-VDxZYE2W4gwiAYm+9uKC51_#+hn~m7g z{_HzHRGYtaT$^_o#yA*^hWx=Hrj<p^P-G^-kQ5|RPN2vv5HHIIcLw~yfiG$eaj$>)|D*dH zXdL7jBzx0_W3wfz9AW!8=~oI!(UQ3nh52G_X<&ua_#fzB7>N2~tKk4M1N~IomNYJ_ zf`5Pi`D$DqtEtfovf7^V*u^ec?Dq#=y!P=W1XG^?k~ZicnC~|Og?`XvC1fEW#RDa% zEntwl@EA_XSm0)o$x(xUs6_pqoOEJNTmt$2u-|*JO7U{90{Iv8Kdcsp-8$xC${P_= zyh&uPUFi4jzu<`_>@v6Y_xJVp&GyHAVSm&&!yE&B4-KX4>C3WtV2`6qbFc zEvTx$Zn-+qcfa>3hAHAz zB;HWeez^;ERU1-9l6`$)FCO)V(qK+g^#*+vXsfcauUEO=z5t=JV2n`Io3>TX5OMDH zkrGS{vQkQF#iZDiO=qu{=VY!Gf1aY+#Yh=;`{Dnp_up_rosAYx-Pqf^#3%Ff@m}v6 ztDiQ!4WGS_S67@P=H~^7j6y7LJ%B*(c(RmZ-b)hgX>sWFdY)42$Y>~|Y!OnQ?Ct$4 ztlsM)nOV2iz;PeS@4 z=ZTKRQa|YFIbV!&bc3kJd{x)UrWh_Ebxu~OGGyRmdW$`&-rB9_?B~LP-*D$f?z5bs z!C|d0Uq{mll@P-0jGF~L8B3x^7z?BsQa`CIE?nhvq+*Zx4N-oGhvbN|*;V2)UTRZ! z_j9w@;GOf;wM*%F-|7jwf$b(P-9b-PcMt#FJw4g4zxR2QiW}~{B4^TTx8C>M#}`S~ zloAz~pq56uo4M(ZdMcIIqSw=1=<$In*=f)dbuaY1Mc@wK8L?B;Om`81%5p97?@mdM znwu47UZ`Myu)%C7%9rnVci)%zvK7g4sPhaPU+VTTE`8He6bWU$TQ|PImERo0^ZfH~ z!ft~nW>2G@`uwC^pF`H_;T0XEyTUQ-38XIpSFAbUJq245GtVec-L_gHPAp`OBQ6dB zvMFS`&1KlUkJrR-V>?e^(=+J&-RAG*2hWwSu0i|buFJ6Bd2gZHbd|c}u5@=-cNaO+ z1)H54pRq0!aT&O+a>4(8cNdHh@sV6W5XN0dXwDQHq^hoN0rB4rP}*h#DrGMR;e_rSXD9xZ*Qlbaj8M%-G-8)y>^aDO;Rl7psSJ!Y$=;kCPY9f(xS{6 zn~Ghhs@951TE-<->Z(Y}LP~NxP^eRI2JSNY<+gpZUNnKYF`9;F%0~p4IxHCqYC&@cgayEir zEL>WpGb7DT$|}nSR9a8(mk4$uyBR+4;)vtE$>YO)h z@vaYm%KW0Uv*YO5!eYpe4|H~PVDNJeE;LoEt2?Og=;WXBjzXu`(HW7AJK`iM|Hee5 zqw|?PU-`R_opDBwsXXsvxBLP{qyr?v&P<0ubPJxApEoOZs#0ZPM~W#k$yF#zO$dIP z+N8Rp(-VPJRwXeO08QWNC^_g(^#8yqgJA`o`N{+mOh5{F5n_leW45qa}7IZRRAneXs{o3^g7tk-hnKxxv;$MQ`qhqXM@RPglI`;t|3Z|FJ2F{Hv)P~{%6c7HfXRl;Q!1B$ zPbS|HXNw(`DthM8#~uwIGo;L;jZ(#SwnTkwr8(kR;#uX_EO-Z)yr7Di5<;>OcDz|& z?nlo3I#d-c;zWq0C1%wHfxqyGWdpfW1YkiV6lT+QDTImGRAf88x_R?;dNH5Dfb`Js ztf{zKmRinEB67W!I$j zU1BjHF;Ci={`4M|6qA~X1kD`F40NETbLQanXa zN|<_)qZY2zdIuTIE@XpRQT2SbJ==aCr;79k|G{iKqL(`7SD3R~+S{|)_V$@<8lh}^ zA#2*P-wu%E+Tqa-cblJNUSe7G#cWD?Vb*J3^fdid714Xz<7`Bg58fm>f}@I3c0K`` zvsDBZfiB8qOi92rWP1uG+!SKZ;!f4x$9w~OySs#Lu9qh`d4()_+2@M3XQzzy%zBXx zVIZDj;gr_}g#XRa zKf5}{he}->XLrn*%B$Pk+S=Qj&*r4to`W#%Y`ggf7anuLBdLOUd(`H&Z`W>UE4!h1r!XyLmc>0JEELO4B54DH^%P3m2Tc0?fFowEwlUH*u)i*~X%u1`pzoUY z9*EA9#z;lrG@m6EmL-3assbCXHD3mnYL*Zt?_wSOj~Uy?NH58+V1FH z_8ae4tAuT-qishIwVBHAGC$hZ_E$%ZcUBXQ9VOsLOUSlGM@?IJG;TYUYA1vszW@=m z+nB{iGpbV794(T9wl^LVwN=2t)d~b{X{jxGdCeft8@ZwwwyRou_DowGimgky`as4NE0_fkfF!VVzs*B@w&6von94M z>7#e?0^r-5f}`G{w-BCBAB~AfQB@!XP6XYM($dii%TCdW+j6AYqbZdHR0clw*>B)C8JqIe!#4DTy&wX=7kRG-tt`iO}ZfoaIQA?0*TA zq%n`0*6?WN$d9&fzx~X5; zi;z}TE55bP9<5NGU*6XEtw&pnN8{FcmL^Fh@};9G1gyWjFUbm!{wJvmP7s<8lHe_z z(9Kk;M073m2tXOM_~o30bmu9Jk4CLDc58*DaTKjn{`gNDAc=+^)r%)6EAr!7Ih!g5PC-o6la{yB2EO7*nqrBGyNnIwpO}D zxmJ!xBuZA6UctNwu8_di%ptXQW3|+3?j#ylXp8~#Fit zFngeXA6xnl9bKSsfHc|K%57X^ESu6DwHlv)+vTSCoNNb2O zTZuqm4Hv9&i9x6A4t??s|75XbLBDy6M02-PBt|39qZUu_rbQ0KT98lTSZqy+gA|B7 z0IiUxr?7O2T}md_{YowHpJ>Mjrlb+Iq-}+?7Nm%$tFt_0hT{`t4Bw^MJh31?Ez(_M* zqt6&9Efo$7nMy$IPvXUvsJX%wG~=;q!j`mV%}qjS5ehx4Sz68d(Wjf=XtP40i0S_Y zk?q#GyPE;DSJAjP?wagWq!vYm2m}_$<(lbR%_)I|%|0cHK-8QeM^V)5iHw~^ErFAZ zkXTbT>x?tC89_FG875l^38zTj=PcK>YRP$)878bJaxiRpt5vny;$xRA7(Eh0f#oNT zRj$rT(!j_DB5VzmiL2>s?2sy2Z8^e^fY>y{TnX4ehUP&9j4%5(+mo7uE?mvc6G#+D z3nWHtXqiivk!$I1HeZs1yx^}9<6dm0Oz3mXy*7T*lfH-#D~|H0qPdCx=B84!PbO^6 zXrZ|&YF@$A<{wpG)I}o(1(Xm^tC=f`YQ7I*p{Xbp3EIjgj5Gz!X{#AErIQ*%?HkH~ z4%dm(+)eZtAvhF($OO$X#nMu8d0Z^Jr$fh&2hDFfrY3tV366ea_2?6hmKMFH=CFBX zBE>AiRS}JG{Qrj!i$QU5Y66Fqic}<(psZLlHGdI)_70`_Q?WOCG2%`evMZYq44Zts z%_B}75G+9@Z%fO7xh7i1f~h1#R`AkMz;GvMT4jUle3Heji~_-y%l{X}LCE>0jKhf3 zAlB_j~uCJl1vkN zDXGg6aX@#47WD%=MvEE2Aw>vPQe&$fyBKxph>s8oETtqtlqrsncrt)xh+K?=^j`n( zgsA!|30e*+iER>)APayAkoCw41x-aHY~I#KO>d#xdFenBu&}9wK!C86VcB8S~4#D5!k0#ClnL?tF3LbHzm|$ zx-zM3DlCE{!~c=sh-u7`q9f_XBS#t=7ZNx1IEHx@BU)SUwNC%!$dTzIQR5WS?IajB z&K>a^k1&kiR6j8#aflvvF6KOI+K;oW$~_Bq}Rw&#_D1pnwF>_9V1z&SS(Y7RyYx? z#W)PJDMMkJO)ikPG2u^9Cu}Wt3FFQU()bFyG)c$^gF28TUkv`OBd3ltdCK{!5K1EejV1nX}l?K+q{Q4fD3hRSB@t zLL*P>Sb2hjusBH}YKR;Ez`~X%b{;kc4fYdS`tJFSe7^lT5E^aBI~X>HW8I4=uw;XV zluU#+IB{cI`i(_b7vq!lI4W~yY{SNaqq(*Z~;ov85W za#WcH6*=X`9P$JSZ`^BQG#6*7W`hE!Rh2mL@Td8Ur~wI(t)!%_R>*vUq`50|JQ^se zunZfJ!-ED4`IrO%*f~Q$=<)uU)l{=mqFy3JWf@9NS#%IJYpkf+24XOe6Gg<8Y>*oo z7s$#Dr3I=L0#_Y_MbPT8QBQ4s!R5E%)YhbL{?8@Oa&ncrwxOXuUEjce*x)k-2-Q?Q z#WS{`&=A+d7c4`Gsqb&7R3)kGoHp>+!A->zR!8!9Ur)dj9{2-z2`t*y)~TLw+I*R- z=EMcb*@mz_Ei2H9z=-QTWs_>Xjdw3$=75lOkaf zHBvx6MAniQy*DH}iALmDG?Xj{R>%647DISHR^z&7Xw!EKpXL?KprOK9Tgp9ZIMtD{ z_;7HtVu6Z+A?+11YbA;e87D7q0>`jEiGYZ^K!(X&K@Fs#|ES()nny>T1>pY$VcA2x zXsOD}MZKZkj@sSH-Cg>?tytxw42V~%O7%ADs6^B_5}FHIB}GyR_*t8r!IX51^_rDq z)4&Pkn!^&FBh4pDw3tno%}l6j|zX)#ffmrhCc7f7+SA5f~0s5Y;XdQ*o+-E_TQ zS6`Q_Hy@F|u4T+OO7&iy-TdRN24(nhR9~!*>wbsAIBBpxtOKx2n2Q2t^L%{@pgQ~n zGp-vY!G>vpk||QbT8boAUpGO)ENKoeBCsTEP!8&<0IAo1eO;LnP2j(~o?2PZAdUwd zt<;Z^l0m0y?T4}gBwjNwS?FSYh2U&?+RlSIuO6+mwIl?*0pBj8#3};-N|uW9i@s{b zy)C2!S*pYOjOO)q^SE%TWN~9GMb1y_W*tjGeWk@gFK~gRHzoG1 zlDr9lip5-vOK*HAjvKEB|mO|G?wqrm+`?P11DnwXc>wGKZIU6dP zB{^8}5WJ~hRgQ(s6zf(3omh(M2x%QS>RC&jSCf=nY{I1S6bLyz&3hd7KNE z%!+jp1s0Q>=L!m#3}sT55*-nd0%5APkkql4p5tj?d&0O?oSaG>$_7Dew-ysZGqv+} z&ghCVhqe#)q(zIU7q)XXw$jpY7K?C>ZM`c~I2>U~#4ITkD7_H~M_JRl+GiCC#s_8f z_AW!T($?11+SQ#9K|lQwc?c7DR3+MIT3puN#h9(2&S8r~SXZUR#26a{ix9xlF=Fdc z`z9-}D8!QDhL^VCX)~=hKfu%?eR&cKskUG}E+Q|_z1q4`l67q#BnG2e8In=DCv*I> z|4CG^MX|g{fr(CBw<4j;My57xg#n*;^@XG)q!%bc_YHHYgR3<^5p%X?wK{mUk4ba9 zlKv!!Xo{gMuqk#ZA=wtNB~jRB%3w=w1YGonIq3Yy0?;JKo>Ca!&BO>Heo$0mY>uho#2G}5&- z$PhIYd~$^RfrPpCc3-Qpq(m;NtrVK@BwnDXRGV=HrP?ZIhs7F8wU)}1la*>kQeDJT znWf7+gLdwyR3uzoMDQ0Z7ZtCjmS40OA0cEMm!dL=>I1HP{>MIxzFD#<70ZZiGd;x3 z@k4r#N)>2}$BF_Qn`L!CR#C8vK5}g1EKhm|1_V{2OkPVAvCvi{O3u*%ScRbrtL*}8 zN?2)EK5E^Ob;g7(hfUJ(tOYi-&aq8k$wgZ%#b}iT+|RL4|4_t;y{bYG1p+8Vl(!t?_o5tPkFwFQeM zio!ItIY%|2ORz9u|C2Z_wg{mMkPmAVI^~LX$)c2F#tUlZ+(0y}>mr#W&04ZxOEq#9 zWF(=R;5t4FR;ZNV=ZKi1BU|Nmg$TtIcGd88OV-or8gm(M39boh<`8QpNxhXcQRCJN znp11^CkJi)L8b$wJSe7`ae=ELS{>D-t84god9V6KMxESIJx`5Sv#s4^*3?joMv5uI zQuGmDAQ#wNApxMDRnwOwhMa&+b&iA&Hqn~Ymy=g**IXEC&Hbu_h8d#P60TSTX#_QI z5GuIB=I08X2?oTjj%%u{fRmU(C2tLhP+aX(?5K(~)NEbk$O0E))p?KQ>NSHrr(IoB z1T-Y^<<+cSQ>gK(t)c{J84H@T{;R~PXB@w%`V>dj@~t6Y72t}x3tcFz0F+Y`e_W+P z5Zf;_&lxt_tcMkk2uI~nb;@PR;f<;*TpgyP>NI&5K~@)lA)+|3zN$Q#(RZzd6;9DA z#MK$QgqEVfS`0^tIZQ=bae{AHZAptFDxwwHI6%W1vkKKU>j%x7x5=o3wN(h*pcwMS zS`l)+LzEo`!BHMFGF+@a)xkShTTWCGazTE7=l2X?F}9GF6|WvA}eO* zTx%()uCi7fH3g|Mp^0k**Ku(nP#CypLMpkcfGCG*a_h8wz@`@SHlh$I!zw;+78*sz zP5F$H#f#zR0=S8hIrq;esAhkbH;>Sulfcccl1Ms}$tqgIw|TKE4-J-$T~^sJiI4E! zlsL^QpSlL9LYcgEZ^XuoT?pZUbzWagN6WUqWF53KA+xiTETH3>`6wT4XRN+WeCT^~ z2cO^ws=t2Bpw8}Y`E@nlqvy-OR_-R`9&~d1D6LCm`K}n<+U)*y@{!y`dN*J9-Q3Bu z_klhGZ$G}=&b(uZ78ce#U9E3%KUdwZ&%%q%LG&I(Z__b0Sm3lkpE8F3VWBiuk22*; zz?&G^`@%``MBwmdUKBfCjcvKv^mH}fW9P&0B8K>;k!tUWm3mF-I14&PCSHhnTJYSbj=|H}%~m~Vsvw|s zGiX^3sR*OLvs&cPHhX5{$mwo+$^}YC_!?u??y`H`x8OJ8wDv+bRP$#J|LR2Dn>s1g zx8c<-go?fmDf(r*`_Mo0Wxn%l4*w{Tnv2t&W&>}Fi2LrRs=KLsei;mQF@SD#KloJjLG;^C(r2BxA@Lm_yi1p;$HuqnJg<2nD>%m8*V#{WqemU`7zMLa zYat&sx4zEtWd9<}re6{TeaxMR9~TLHTf)L@F2_I7=EXxud`2C6e3>{3adZiZeK@rL z8^;rH5PZgcc?edtG69|L+@MW`WZ48Pb;F_T{$;WrXd^-QJI$=e1r zZ%#DnG~Q|Z|8=R_27PQ{Il8Qym$ItJpf->EzUp5?V1RGWYg>MNzeRIL zqPd;B6{qdL^ElO7RECym=T;2T1Twgt*R^gqUTZmuXxw~E14HaZ4nI`w?tISaL$UBY zIUrh#w0Y;9F>8$Z4R^h+7JcUCV;UIyX0>^mz%T%z3^iKNla0}<`FN8v1lJqT+DZFe zJe$xHnV+51&Ct5xm=?x%P=MM$merOs#A*T`>k{GL{HU1*I!$iHuqt$s2X)|7 zB+;sNcS2X)z(+mGQ7rGW>@J5^*8ccGO#Y>s4E;;LU2WFV#Wu#ypfD_FG&X^0Em`(uT*WA0dobJ_tjpp8xL_%4d8nXZl58 zW?b7Jr$;kgiph=A`oq6ej1T{AG16s(hNK_dDRrLXzxliL^(Cr{ zTkfT7&#iYI?jkAiTIGY^O z!DX~LI9GSz(`P&)YP_|FwMT--T}$m=n%K2{v1}Jj^}_}R+TPBCJDXoXk&XUMi;8s4 z9ZUBNQe^$wjiT)iQsfcK%|AF^DRpUe_2FMTsxr7P(Ypb?TQQhrgb22~sm+MdX?c5v z2H8b}s5h%?Raa{r=ux2VLZ0u;$u2>uPa5SuA@Dt%9jtmbN;<-sL*HBZggdaeJ3qdq ztcGCwvli3Z5?mxj*3BJ1tTvCxE{Yp87OGh*JvNQ(^7tmQg2{GgEpgPiVGKWEw$oFk zW;+3Dj4DBIUR#1GY8?N}FnzR|4c=M{q2SQsYqjfUov_yo8M0tIhsn3%^(OTtKYj-= zbk4QUB!`F1R-HFVktFHcaX4cnklzn$=J-fcJFeCRfQj&&lQrP23mBk&R)ux-M; z;S2V54c|OQ`80_>rky$8Y8Q^Tofp5%r4QhpXv7>N&c`!~@N;0Wm0){>ePoHu&c-C_ z3+xb-0YT~wX2fODTLX9A$cd+^R&}sV*I9j_wxL628{$>yq)ODP|C^XwS zH5t7~@d06T077UH@-dZb1<B|qvXR7{qetQ_F zHo!z*@-u5+a745L`-F(lb|S)7HFY|lrE@UENhoLT2gM$lzilc;;klwdYPtD04#I9X z5{OGV+F+Zn?UjF#`kMUVqlO0+lGA{(Los}U(=9IpR&=K0IaF5_Sc%SGWUng&5zi%T4PdjcLU}7q)ePyc@EDx3X2GA#dp_K`}tlV~?6WV~%P49Tjs}hcsa9W*3t;GC!OcL>W(->@hyy@e zY$4WbHP!*5b_<-L9tXmWYIo7F7E=2x- zqJmGHh%pKgM>Ij+ZS1;2i)rz3if@HU6Obw`0K8VJ*2uWg>#N9-m>wIjk>H#zihD*>%#p zVr#I+tGUr(gkaE9%WgdKTLjtid{hTi59v8vww+6m+>V7qft$Gmzx!1MdNb>=)OBX~Ef3#JI`}FV`^;zA7O71&l=%(Xg-)oU zLk5WOF1|k4>Rom*I}#n3ZOqa^&R6TQEj&D5?d|v|U3T*;Tuk$JoThUeI=4m-d$5E0 zI<*g@1DVumJE}KxP2~n@vVO8(^!ML&Q?SXLTUxW?!cCj5x#_0w?ml>^x`4)|c^-_; zW=k<|F5jnZ{AYh!?LYY0^%Ewud4F~F{?oWSaOTTG(mv~_G^=+rrb`#=&{qeS+E+Lu z>8J17vVP5i@z4F#gItr{et^#TlTIBlG*^{sn|V7%Mh65Ql}clXozYX9X= zor_mHUPSO7u*R$BBzz%T@k^h0fCI$LBfD<`mwm0|H^>lT5=VvyZ zyM~u;*R22S6F(wMnca8Ybj_x7qcwcFZH@QQTea!rRQk>4E#~d!9p)@^w)rpSkIb3m zl+H45G;iYnEoL?8t^EHd{!ce=BfXW9rT=d;YrrTcm(%oZ<_yY}*4U-DQ}Xs?sVx0A zti6l>KjQyCn{!E;pJzV6upt+k3rH7|yTtsNc|Yl5{{Pfm#Q$0(Hkc2Z%gh!0ucP*S z^C#vU`+s&aJsY3?h;%lHXPZAa8{UpL>!(ofB`<|o8pH~F8L@0oi*__lf4e98RUe99a$e`lJ^o#q9W9_Pil zN7#vf+~mzu-YPR>>b-ZFfAuaj53_3Zm@e;PbCvg>k=W~PHg|aM_Wsy>#rspF@ALl5 zw3#OFBGYP~_devk&FuEh^iIc<3GWK8%6!UO?R^5dOU=0V7f3b2@?AvcJo6s@-$h#~ zYHBUT>x1S){QtSRoZMe9-GJUkmQ{M0ZO^r|bv#p}>+gK!)gA|2{!)U3-WKVD$d=SQ_X32ptH7Sw z@^T`?q22=$qMSn;dm+!^wx0O$r|)09P@V-*JU|=|@{8PAGf=^>fEhD11_q zqbC&ZljO(=g-=Ox=!C*wNs=gC)NrD;UlVQGz#jCSp!5vig(c!BX_V{ZneS&6vyG(j zlaH@@-XWro{297w)FuR3~g%@IrG6}|?In)}3kQnkfZ zy=r@`SvQ^l*6@MhCaY9U-1%&_w~>cvoUt0i=XINHWep^Wzu7pF)Un4ueYC~a)#BVL zwhr&g4%^D3Iy*dlwAEHJ9>DE@t}6^Bb)4s(o;_;o>fs{Hfuw2zdwbh#Rin0ms_Rec zIJer{ZmW)fNDHj%OKNnjDr;++6%w^KW2?%8qdNcD(qZdboYuzfq=v(x%R6n&(WED= z>q@GIjCc8Hx2d{J0%A5cCRIJ~a5dUZT~4E|X5H6ULtKmRrwa{Q%|Ytf*78O1`6c!3W^lW`X1~Qr z4bf-VkI=m8yk!)m+(T=lLl%qYQDkaeLB05x(11H@+~$OMu)ywW+(%3topwDXs@p}U zj}BWT?nK|i4q)BXi9kA8+U8_N#R;8@3dc+FKso1T-noSl3#EIqC~>O1lvDE5`8`gC zFVhQ(Z(1BDhvv0^=N6-V8vi62ae81h-Vx6niVvB&TP68VC1ZRV^i z|Nic02fibnv(U*NuR~9gx$DQ`AMh>gt)~y_Y-auE_s)Hn&oP)o3dus7sveJ3E3+sy?s319s4!g&h0S+7})k~;eILH?`)r-p!aw# zACG^`j_RJPIt?#&opt^FExV;~H&t6tvY^=3OvFFoT=1Uj+PMmly79pF%N9)Pf~}7X zJZSYee%hrGFQ$3Tvqgg!>GJ>W6Y+754r<%||BV zCl$Q)wN`VEt?xlDEuOn|Z{f+`r?+)7e#*x1u+^L4>Ysn^)&sx%eL5FR#!uUx@Jgb? z7%ErYGy3#v>agi-nTpxD?!D@zL}kqQr*Ery=J%=GKNYjjecr*GHbJe3}Cg#{- z^z>&J)j4lCxG~Rb=GUz;`p!9eD~o;$W~y?*v$vC?Nf6Jc$b?wRLtMt7>R?$>P9 zmx?@=;LY>AquqC!jZdE}Vo??l(T-Cec|9KFQ47LeF~_sFZnyc=$sz*Tmg8Y~x6l0L z2@;PukX0P6av-MDyLT0qk+~An3d-4Q{pS#`s<%PI0 zIZ^z@$r9Sb++K{2B>V1ng(u4VtjxBAkj{He!xJaKAR?EqDls;Jb$R376C{2L2om=M zjP~GVSFvYV_xK4SKfxc45>{nHWUQU+G9uPa7;{jm!x7!(+eIVaL3{1WYFDGBU0q8W zzKa_|0iW#Deudi&_e6~1L|{qr%YFL@wf@tvq;L3@#fyq;pcnU{O@SxSes(?6K5C2?h^-{(c@{aIE2Px%(=e zK)HxJMi|{JRc-5=5^TsWDl)~@m`%< z(zFTCBLLl026{a{T<%c++RLq`dsb=V54mE3>#(`u~jN#iDc%9sM3~PUq$O1m`SpZd}B9-A4Cf4)xe@aVe*U?TPn?2a6VI z*no3^#nDZz*X_n$tOwHAf7$b!bvjX>=5`S$Uem?0Q?CnRuZhw9+*znD1SA*_TZ}J5 zga`V6Uk}tZx=E|gbsAk{NC5tEk;Ll&uoA7xa$|*^Q0gLXRW2f|wFvjUJ_WA0ZR0%U z04Hny>VwAsDvRcgKmF2|w}1J|+rRYXFKyqpecSgdK;y}N>(F-d4wl~0Wj8k3e@$&? z6T$68RwPbrI4Ys%o%14_EW>zArYN=Bl3m>+5_*8Mx~mST{s8s3Ims??nluX7BkZ-! zRh+zW8fT*r9u8@=HBZ$5UQToO4TqAp9GI zPYMF}%D1#7bh);Q?Cp}hdpTgwT*B_eUJofra#WI^Uk=qH;)!IyV1?R#Bl_v(Kn+)Y z%mdnngpyrSU@cfqE;cyKn7Uo1>VM zKE{qY5%w{T@pb$GDi2b%vx{fYK~6G}JRw$(8=t)y2Q!vHma{=d33QStG#8Th@K^$p zG*gY0y8mRny|jMBQJC3#6uKp0-7Tpuu1(#-tq(n2paVKMZ7JH?oSAX!1cSy)rj8vZ z2iY)wm2K7Ood^~r_<00b7g%``FbQ&e4dGX4YA#x_OIu)HtD`35uX_!7sB_fJZo=RA z1miaG>>bHDc<~fz<~87}r};>jVf1Db_TZ}#)i7iZ(=Zi<{6~HmeS1+oUv98zMiQ#{ z4%LW<_?x!bP;;v#sFcczAQeG`XSoP+R@zFSPfanZ5RQfOM8Mj$*coR6dSVoQ+H%p! z!Y_|;=`*RT5+Z0vA$=qyBVxtS0tkeLBgIjrWymCmtaRe2nk@`hI{p#~tih-hrfpdf z*rM{lL}7*IAs=_~*rB9XYELrzF#SCCgjYRzf8odLkt4yq(i|Lm$;V_9B}L z9U5gN%RzqfI~LU#MS%>3=5dbUF5A7VL37(g*nw0RX@Qg@1)&MTFcpMMgB(7k$bANk z?aN^daBCHrC`?N{D1`VcRZ4t2HIzkxK&=dA7zyw#D21MMrX&~|a*5SKumU9ga_3_9 z;A@!ucVH_m$+Bt~0LYpgmVydV08q?SQY6o%9-9{%l~p@oznL&>{LwNkh`pQVkSU66iKarj)JeA2DN>5)E>dW%NQRk02j1 zBB;}`|M53%e{xw@S4~-44l639q>o{1MrQGk&WpuTIqL{iEvh*I(M?<95*9^Itb9_Q zh3S&{nc~eEi%#p-?OTQnMwcZR4mzFR5C>hi<*-@2cTZz z%IaY8m&*fxIxMjtB84TtShAX>Qp}REDJo?s1s(E;Nkmly0z*rx2$18TIQh#e4ux$Iii)P>(3pY}V-!xdJSwIrD+P$Iuv}Px zIE7*%C%qy-83{>OSSrN}iO9WKiV8(@Cd{%h<7q>)ad~EZa<(WU#o`<~K{2g7IF2e0 zykp6fCct!NSTC%cOd8}cTtK>j#YXi+tZm~2Ec>fvmVFBTMv9eew+TTJkQ?Qw^ zSfL`j5EXL86uClFOsjyop^~B^TT1DhLRzxL$juS(tyom>iW=%t-B1sW=n2Dp%X3NX z04*xMQFh8d5ik^%3b6ozk44MYhlL6&CJL$#NpXQzDy*;$XcAbafh7|Zy#fUWVN+Zv z_{D;rX6BoNmKaZ8>eA`SyR#v)a>pVesnU>AF7}fT3Mp|2$wszN0wQVg5tU#>S*nmP zHQ5Qu#vRQ&`-?V=m9}CZ-;F(Hj;wM%$lFIK0Bc&)TK_f|?nWN(Hc)#`!c@ z1#%`I6e^T0{PjRu}mC+3~z753dr zjQ%9b$5u372=W!u#!Q^|nX4uytrD^-^b5ty&Z9y`vITs_cDX*vS32Q56jm&1MtOs} zDdb4AdAVU3fTX%x}l@9W zM@|%3bjt)P7ox?ai9zXn;puTufSxRWAfYAVDg1oPzt#brbkG9YMq79 zrg$NhTgWX$ERg;iSbG-qCdO+){W@9*a`A$fTPWoGg&as6(B~@1=~v99G;?TFQ=n?) zTv@!ZLgtWJ$Z_^YZCcC7dF6sQ7c7`uxZqPvsTnWyA8ULNZVc7KRrXvxMIKdkvc}z;C`p0(ZW+kY~C; zQfai{&o9hRlWQmC7g8))v2Y=rk8LGNx*N{bEu7o;8qS$t1t>WD7|ED?JYThdAt74O zDx1?XakF)L)2-R`INLH*`}yuk?9EYW+6Xs{wK8VP?h&@%hGy@ zE?%^F^P0}1Vxe-(7i{^govM6}G*1foXlXd_&&@Mc&dinO%?B`az#6*iwG4eenvW8d z6v}f@p5q}L3M=O4=J_S4pv@KL5t*M0$SUEDj96``l&gsZTB`Ks=0jd1$_Ur-isrpJ z-3Q|?3*NsbsfJM2(V53UrJXaWuo(fxb5*ulZ06-t1ozdcMm8f#;Vc@Cxl&nyHX|FoKzQwlEVh zjb}~~wEpcc1XXE)x^N~X;o?ljsi{1eS*ZnAV5velZPf!l54kXto}QVWsqYmJt^)fV z+*a4#dOAMUtjttap1O*3>Z+9)U!MdW;Ysi5_*L#*%*;$j=!Y{I=}%A3!^TVtQgeKr zE|Fj`-EEiOf|LZ^zs-}qg=Y+&=Mw!&E(G~e<_}h`s^tGoD=RBAnW{|2_g6-~pD})= z@jc&U{7m3;`;Wz`*h8r@_I(!h;Vs=raqJHBxx6|U&CEpbnVa^pLxS!qnJt?RrdMde z{)meek9mN`lVe;YBuOinsj?bQEu5w+;Z;h01k+>F=AtnUYD|_}3h#UlY8S^`K~Z(Seeh0*}MJgG=3O)KQnGri3WYQ|S1Ex+Q$?sC=!#sGK|Es>r$fHk z7m;SB%ttN31310zHJq;DrcQwHJgH>UEYopPI2B{YL5(qAVA-FXnk-D2$>NlGXhgpA znzi@Id-47HljB)y{OhJB^Hb3zY?8zQH=Q<~T9~Q;O8S>W5Hxb_9v%8 z(Bi3dl23_8fMjlx?BrB|T1iBcDu3I+lT9|5)CWP7k2yr^IRU$yJ3?wsL7^<5o4aY{l5082?xIlD{Ji*LRM; z2ID4EvBBA#w4P4nfSD&d&Adob5CYP0k{=%r$5UhDV`I^HJeC?CJNj1jeBIk7Hg*-~ z8sl=YVY9uVG;YQUBmmJjV{iouGfAlhw)o>?5TQP%CXLKE`H+-Retb+o(Rih;fJ=a! zPem}6k?7c`b#Rby(zfB6M;V@r*CJ2a*tQsd10I1DjhXS%7|#JRS3aR8byudjoLSDLKi63#Q1hN@v`JeoLbe1#{AK-(UP48 zV=3}17@MLo;yyYyHrke8I~%rW+7`v5I58TIRY;2eaFk$;`sAWf`!4cDdX|Ca;wqtc zKU7k8EJNd{IrYL(soQ@|@)o0rGof;$(P)|}PJ$mKbs3e6j?I_NC6$myNJN~lBPgQY z=m@wYqhF@U_K6oam9&cej$tTLdzRtVX1uqyj7tSYGg27!Mwnrrf^ak*DX}!2Bn*zg za|9!~(O?97BZS~NO!0DzGsVjBj?s5ui-)C7YKk^)CXb-+k7^o^rmz8mP_P<}5alFM zD=8{eD%m2bBy%tdEP`YmRydLY(Gqq5OI6M2{D@f($C`wrdhpde$SsPybiZYaSM&6x zZXH~;8~;-y!wVy3I8T}yNez#T40C8RJVP29@rOr-bL3j#w~{=S{C^4bb;$$o-*}i6 z__CKz09~Zhhuw3;+sRCjRM0sL+)z9m z4Y>${!JuRQyNC7Y*`5f9bde?=Y3` z9vnh?XfPZyB%f?FxN2w+09OvqN@XeFm$9W*n1~FXu0k1evQEt{5|qK*P>6bEQacE3 z%L)t8P)dN&P+`!u7$hH}#m?!`7k;*P@Bsd;-J1JR z2fd*|9?k$h} z+z#?YkiE^qLE4h_vBQ|J7YEHievnr^nTIG3Mg!@=fx&?REDRI}Ay2VSK{%Ki7}QL1 z<)n%tA`3}LaWG8@F&fASWYD4nphN@4wkx!FK+${Vhw4W>l(Uh0H2d`BuPKxM%T z`Lc%>w-&J57r`q(UUYwVEm5^{0(8!i1q7q^FxHD&5HZ`2l@vFp4n3M*dnP;lX}O%KtI6!;ebzl zKu$}+K#C>1m>+P36b$rZ(iWBm;{F^d1!RALLim%L8mM53;y^qQ_45q`*L3uK|NefB zq;Zf(SZeetsy3xFJc=9k$1?TewT~|$#kX*U+&`e&wCqAJCeQtDaD`pY`_v_(kthr- z^k>9iV4z?#+g^HqJD4J1y3yHe_Ns7^i7kBq}l$s-|y@13v51xO5c2c%wmPI{e4U& zs1kzT$MBSxqa_u!ZGAV2iZkxr_6ZjD$U5)1ytl8v)ED=MecsJgPcAk7Lb1;WH|!Hy zOgcq0F(XTTeZR5^0Q!5}b53Yc`QNb^M5E(WTwTMqxJ-hYF+x*DyWy0P~-M}9uu z>wRPO(+uLMw>I(#fB)ybee>YuNRyeIT74%4=$C+HA5`kg9GRc7zI4YCS-;a1Z**{FvGN>ZW6uibjiey$Gq4R>zD*)ufAs@ySO zFZHZ xUT0Oma)N(yV2+#NU6wk7px49y@e!FCTOMoBZ=`#Xsc9l3yPHpP$d2SX| z-tb;si}^)1{tSc&MTn4cI$o5eSDEotrLs8qn?WH zo*we3KAmhNXD+kK2Kr(shYnp%u{JnK{UuY5~i9x+u-q64-)Db>Pofk+;a9y#=mAqb%_E}(kycvJ)w?R+!=SJl$C%qu|Ym2p8<=SsH;NtR@!tH zyP{67t8)seuq&<7&L(M@D$e&C)^k6abv6gv^iJyjLu`wt;%ck^vR*)&G9|+cDxC(P zQz@1SlKrQ>JJYr->RM?_I@@;s-6ho~ef2l1VPeTeGTYg?=m`U4P##&ps4IYY+_~BT zTWqp!2_>GX!{5A>ty&^O6Co9J`c@{^+)5G|r$nzrG3d-VG#dkUlNLok6GB(o78#N?>sWmS#AqKyLE;N;^4|m$4QU`6&!Ltq>1g0Y((SkNbomC)oJhSJP zzuSDq89k=zyv?`#qC+s9$i~Qe9jMy-<*cOhG?oyFVFyl7on}cAQD=qIBA2mcWMXTR zU;(#al_Eq-R(XX?@GmgxDP8FnRb1*=p-R-sZpj%AS|zt$3s< zcH<7OQv+18Wo38u{vz7l9Vw~iIs{e1J;Eb&)s2&6*Hu}$35(<%c@JA}UaySV`I%je zdU#(Jq3cCGP%Cw0JF?m5OSaGR^_4GVSq?foM76h|snASq6omHzae zqOHt>QOc&IF@r`)p2+tF%KuM$Zvt;;Ro(sXbMBByacIQGASOTw8V86WHfYe0N}_mM z0b5H4(!S}(wy)8T|5t6A*#G^%x21|LSgaL<7Y!N)ClEwIrUb+QA<4P(d~XIw2xQKk zhjY&J|Nho~o-?0&FHUc5Z%)oV&$HKWt-bcz!?X8(_S!qm7oGMDhrhZ{87Ls$!04mB zbG&3p-_slPR`m4tJf%kt>)5x?S4!C`boS$^UUv&aK=QrfuHN1rM6L8mt#D_x_Yi}E z_y#?dy*-E^-X3^*MtjpeDAp5%2=q0Y=vgk;Gu9jH$tLa}C1{2T;tzJ}Im&m)ODFnK zscBkpsfenGl7Imaq#Vg%KwodFC)RtTvW+QIjlSN+@5Q)dT%YW5f36hKX}%PV(>?4K zX(c(v{+~T@ihJ)e{X8kxkx!#$kRt9QrGr zD=k8w(D5Gh`~T?X^MqSY4lfOQZ(w+MMNfCSC)R!z!)zN|xH{tdTW=(H#duFecTZ1u zUytL*fwbGhT#oWR-V@c;5m!+M?i7K-p6H2n^P^kr+fBsXU3~j`0=pmUNq3`stsXt= zdGrLUX)rG(UcBYdVmq^`r$0-|x??@;^2fVW8n~dRTAJ`l!W(pt@vY{rr@Omn93Z-l zbkEeCK0PTw=#VD(G!GKRBv{;p2i=tA?$>y{Q9N^)W23I}^qmk>-4$XKR{)n%BhGP4 zNy=gfy5j(aNQGCYnIfSsa3{N8E3FiP59CKG2i=tlfp@n3il}gzIzV2!yUO$Fr@Olr zZ~2SHy4@9KCpA=mo;LMv(HnEjbn}=g0HkM#?||L)g-R*8*>BPk;jo&=rXzFmZctB^ zQRn`492NSZ3me+uSobJ5r}!!o5q(5n@F_*rO|EyjAM#ka2$hznb@wbU1#a#_&YyL; z*uu7ouI}zGbnWWyN_EG&K#X@=Skl7Cwk~u9VS(xH-vZd(W&d^IKWGO^GK7zHBfe5{ zxed6@rsK{&0?0g*N%0X@m}-gS8^-NrjX+3yL2yuxgia{{a2hd=J0Gc$PJtj@2no7e z_jp(AzJ=7T_utpJkP*-2@Fct3bvW6b(VFav?RXu@|Ksklt_n%(^BQn925X-W9PXMW znng!^u6v{_&Yck0(Y~V!36sYwI~RXnHxUQKM3s?}mOkk^#@E|K3Gv)Y-Vos_AD;xL zb=gfQrQ5!Co9wETCYETAqDXd)b)DAot=ifzKGxaQ)ylh`|s%L>O=}*ntNg$ z3{GDk8YkucDYM_jYP-1Y?BhGq6?6t&@y;%;#LZOFl{nTppwsjj*9 z%b(7_S$f79@B7TXx&)6YcaX4VC38lt!aBR&ujdcmkuLUq5OYl3P?8v=Sgf-v)j7*3 zCMeliWeD)DE7=+6X0$UVLrR^o&KV||bdPas_VAG_NhH^d(d1k0$4q^IDN~P_6lqG* zl1do2Gc97D0E;B$rTP#D;x!)Ob&|Qgl=04L1(^`)5ONibx2U)3IQsAJ)J9M4Qu*+^ z?M&gW)PU!BhWqzDVSx*XQtP|#$P{h^QF#_M1@d?V8r1K3rW{Aqi zZY%9N>DiN=v&HWJ8=eGr1QO~$ml5F|Sf5t7^3wt)6>GBd)e%pId9)MBXfoQFB63At z;qjOeiArk~GWnnGe1(MT+I}JseTqB=Ttsf0;>vLoKvp|y_9GEeM% z1h}`M>$j84=)}+H=om4e85E|OUQL7y8nXmcc^%T7qh9;6(@{BlLqC=4-Z*fHXl7n{<*GC9t}^!#)7pJ387) zdHXHija0Pjdz@fYYbRu+UOdk2NCy;7{O#o9Yk@T9n`5-<}+86up7+OKGQ((S2^)BL4j z6`1Z=;FZXP=t9as6qdh==O0jEJvO+MzSyTtC~+%}*Jg0yFg6RHX{@>*C$*{eI9IZQ zQa;B-3l1oWkf6Of3{r9&dRiJSZlA%5j5-Tdh=8vmKfrga-JOSW+by@hn{JPFXe6`U zo2#RJ#A0_H!|gK^g}y0*2KgT3`x4)NzJys4@tD^JY)`cjmgGC$ULlr~roU1$;sg5H zs}$be@giYE?ddkuYKyh=GrO(5t*zaENj7)r)W&Yz{^b>$?SXVGH*=ScDNEnm-sXS^ zINI*oh_r1?LfY*=qP*-l_i3nez=hJqP@$VKC{+YoT(d$}Zbl?EN|t(ue~@ag3}Id| zhX_ekyohQ;k!l}rd#WvHpJ{PPZW36!y-JXFBRNZP(t-%Yer=cs42c69kY;`=O@M4e z7At1{>sp{OqY6cxYn!cD{Qu9Psl9xxey0V1~IK6HZQ6&(wel@3FE(aY?`CJVG(twVeXZ)MvGm|W{P-xu2S%E(BI>MJUQtn=KiAe;1s$bRZPh|@g)v$y zK((b?tMx;mztZ(E*FjsVmBJH&$Y8iOs15Lq z@=d~nj33EBX0Pukel3w<%URj0wRNC1jwVvyk7N5ncxMaLoD+)hevN?(ej;?gs*Q%W=NY zj17~uoNNtRj`*ttyuZu2?om5@09G;_i}%Kq+Ohll*vf7REpY~LR(2eQKixo(=8-kqFbQO z^m6%|ZlNmiO}9`k_!=L%2k$tyf#-san(3CZ{fpY0FOGwqC0Ts|p4z*MpUkj9=bxe13BT+6+Y<`XeNu|OqzTYk{B%6(tNxn-rUkm9L;H6G3BX!W0{@! zGV*q+s*dvBontau0x-yJCN8l02F&Byqs` z#WwCwk}cID84QLnbuc?4wnP6r^xAlQJ(AP79DA z_id$zRa&1&xvFgvWR~8;&NDm|mH@3(M6jn?l0+Mr*7}XoD%JEq-7?#*bT53y4&0Bl zR4G)TbaR|5iBl@lN}6tC%HaVPG^nUoenk?cw;~Y=!*e~}Ty0V$p2h)6$`GV1CLuw~ zEJfn~D|Ir0j|}>FbCun;j2hDnZZhORT3IaKx~>`1v<&baEhUiNVN9 zrivm*HRXX!L*mnj9Wq9Ra@EF;a8;%y=>zExh1$RyCj^%*p1I%=Y0O;L(glcK9o zL2OdRHDP5qT+^{;&+D3wbBB?jR7kKc1@_|EOuspuqkB@C082MjD=p1Ua%;PZf<#xn z`auhd(y<=OMv95_<)b7cR7p=Zk>C7|H&q%(I=l}o(yYP8EpiOsR3ThCOnGyP@Dx0f zOOJ|s{py@S+glsT)1e6WD>M4ub zOf^o>D-9r!aiotn%k`Zq@ffQ)?W*VRMg!%j zgayVp#P4`hl?f(*td=d19ZDLt=*K`=`VedMCZ!EL)kMnCkZ_xfAnlf69OL!BZvlNFebtBd^-+=4cKF}y5 zO*2ARlu#6?{=9K!%oCX@i3m)B7?`{*Ql^B|B4d%HaM@ziLllSSk5(?;Hlkmg z!12Z^BbvI&Feu$LL{vT+nkmmGqYe{XX;ws64Rsf^Y>RN!&G2ODjX)_OExy(5S6HaabF)RJC2 z7~T9-qfpqS>Bkb?)O483QIwDLz8};I1rG5YBhEg4#~a7&jwYL5aX;2r)!5M3*w8T0 z7&MS84MAf?Lt}$2O7uqs#J}7CA>PnH+`As#(8X`3*eU_y^L&~6+m~5P3iW6T7 zzBp+}H&!c%D=CDbq4-}6(15zp?JOX|0j54Rj6y|Ut?2G$?@X#;#U(}x8Y%!;wIt#6 z9x6XTcmwBozy+y+AG3``rnDs+$4P?JO-Uu_v?@O8Sae4j(IpE6U1Rw`+f_)VFv`c+Ct35hkxR=03q1YOnmcN$#cD!gs78 zR{vMTx}3Dj1~r2X3_&PQthrTJ=I>JtJAiF%P$@DU)lsVG z^$iX6sfH^3gcm*}Ak-!ymUB*qnYq56+(3)iv)X$@tF4K#asv|Tab!ZCC+oL@u!gh+ z4(q0YurR#A(lHJdYY|6KU!j=O4X^YnaHD%DvHBnIl8-^^MG80DWm)Vq!GxVcxQi|NJ zih-r@8sn%&*!w(gxPF!}Uj1PcWc=t&+7#CyfhR-tE&WIx2+LLgT^P$(tfSoRu6Lj0 zkb#<0_3n}$T8d=-RuCun64G$2-bJdYj(+4QVJ*tGb}shuB_NUHJ62znsITXLIzg%v zsGK0Cr;vODzq;m|PN2aimI=%UR4sI(K5-HfN}H77`Zys1qgG;|zCw_c0wXP`WwZXV zJ^@PqeKdwj*H;q)+}MZ2nn?83#}XE^*I!E=V6H;Zud)D>;EfTbtWvTPf!B&twn>^L zl{Piv^_EqJn5j7|wVq5EGlf(#Rh>vF=lLq7^_&wxcLne|@5h)1KK2a*d9TMcbM^j(w@@G<5EE z-)v_STP9HNU0rxCyf`*+PVZfyHzX7P9HKaNiz4o}*r07`Pxj?t45?|w% zAj>cMK{CQUI*_{+r9(AtMtKR|lFFD%NCeM+D1j+=|0qIkfpakjux-dgTGAduo-zuP zDQQA(1i2=a(80-~a5i$Jh34cwE{;%x?K)+i+?VXF>5LXE$KHF=zwx@h+so#}d*iy2 z{lVuS^l@y=aYw5cmM%nc!Y&;590~94}9X4h1aJTl5nz76sjU zEdymjZ~kt{*OQ!%5_XHV5>JDBJk($ysNCx=c6*1V{+3XE(=E%- zsn!Tw?bVNM%xDj9tz#2My1XQbc2xb+ntiIfOdb5?+Zd#Yu^+*`2Gwb(;L%@dbb0`Awl2 zLuRbQxz@f`9W3E+cPo!t675f49@Xot2t5#OCCO2yu+A>ykYa+aZn zmH4a-Jdox;P(p=085QEajpnJudL}GW8 z3CCEm?=a7;)ac!JpzH?7Auo< zx0eNfL`vNxuhpjI<{mBAV(Mru^-^yQ*ZoT_CnuJaRu`^~As0IV#pZ7P*Ic%XVOvWH z*j-#$h<+v2LD8uVT*v+H`!i*gqX0KNL&(XThCNqV&^LtKwR8#RZY7I%kMYF@Ic<-` zJdjY0>*kbs9UY&a=1!C#Bcwzvj#KNd%TqwvvmdVUVy=x@E+W4^!3#+m-~o1K$wr8d zc?Rylz<6(2Wc;ox+Rv3)0Esh&~4O z2pui4WK@mvV0Xf|^bchD3vJZq>#wmbN zqKt%ZrP@e(O3Nscs{3&(mx z5f7AMMbvJ(t+%4Vb~F|HVk#fvwAEE!YV)FOq4*KyYVqJ3Rzq98l?V9th{x9et2@Tm zAH?=v0mB*?wc#-(z}4ca|uyFZD#B0T2|iFd>s`t0w}pRTGBiRF!6Ni;6G*ion*K$eBRM{J-hW98=m@n2Qqi&go0hBemDx4fFYf@U4 zkvI3F1=~WnS_-e&tWdzleh(D#Wf~Lp5iP@jWyUIVkmX{nQ3BXapq4K5HQ%B^QhAC8 zXTnO^T=r;!HhlM;dT7In2PjC4y^I>5+|cd{GVB=`yQTpoZ2>Jj$G`^Ls2Tyjmdm!P zjis3pKWDpJC9i@1e{j#~<>HUk;;!XZ-cCxy9MJb14EkizZ3#-*?)C(7RpV;Kk0owx z2`!E9z68W;EbntI8o ztmVk2)3ML28}0-sDQOgulQd_A&)xb2QczuiTPcL}=E2%jP;oI*be^4CrswrD z3AHOvN*(4Y+=rzOxg~XIN-O4ZNShajbtG-UR-{>H{S7Ar7`Bb+fX5mYMYS~pK4n(p zLs2VHj7BQHM5Rh8+=JYH*~5A` zp#TkO8A8XGITs4isiGUfQiruYB(E$Ga*Kpu>u0t#gf=c1HuZ1v}`g z+8C7)Dc<(BOC)1V2eHcGfW=yVQ+Z#v?`D9$sj;Em*)T!PA5F>GVHBA*2W)8$uzf_1jgl zrOB=YWpEi+86l(ti^n*Sl!T!{9<$ZT*rn@}cf{&H;rZz(u#H6~3HQMNA@!fWt>v+_ zk%ba=Z)9eC%dP}fxrS=1r0do81(bqolCH|F{^I?;JbmIE@Qk92v2}Ti+yYI5+A z+`daK^CxM9lzDQ7S$B``I*xOs@YTunu}g3)wNBXTUdq7YXA-oH4Cr`9-S8nwXpQ<_ z{dDeQH_X-8hw`jFyY9MM8N#kSu43*Di5ezU)+zHFD0J6vNUq_1#Qd2TtXXsAh7C7w z+5T*TdDN{dM_l}4y}jd{I2^l04f!X(n~2}_$rZ<4Rn68!V(VOvW?HZ#ieDAr8;RjW zY$MT*FI5*;4~~vR<-^ynT`_;i#TR|_F3oQ(AeA?$4%X3l$G5JVdyJ;}nme#su*KCS zH^gt=^6*F^zT=~dNX-qZ?erX(QWy~U0-EfV_uo#VRCUjm4ans|u=oZwD0R$YRo?pX zHH+qtx{CQLK6(GQ5_=O>Tdv=5<(ft5`5Y!TKlY((p0e@v=7jVAe)p0O)O`3aKl2&g z>H5-|Pk)@tSJ2U;dAEN{7;eADo#y7bH@Gw1Ic||V+nvGHZ}U0BEp+qUE8Xkt^IA8T z&*^+#AO7m@_2Ksn(Ec+Yo;UFEf8US^KZCFclfCjG3*1}WdG^)cbNHUc_nqzn_g41~ z{=UO4bMJB&@_Cnima+@TQg@MC!A#Tp+Bx&O+8AaEtkzXK}sR?iO*aa8XvePx7mfH)DZ!xFz;i z7LiTf$=|o4+j&Sk$22()#M`mL`Ig3a!T)aeLARRE2i+>JmG%{u_IF}6*>5>^RqSs= z(qeRy?a$>}+Uj#I+WJ)L?(IlE7tC8goWoaPx;~HZ?+|hpW#??{cMe=6JKH8s;M19^yTHbD7>Hk)~=i6V=-on@4zr%RNz0^v?+tBy|zVE;~ZzbjW zET@FLo4*&4rx)>gH{ajo?-IgAmkpPa<_oxgJJ;t}DL?1ussXAEsuQmZzfl=@19fSh z)gS-&w=<-UH#UDLG^%PbspcX*S1oaQpGtu9OBC6k*)~-@8UImQ^}JI5Oi!(HAK#l|B5L+ZQWVo%UzY2F zy5P&~(d#Z}1bX47pK_~!7XmkL)IAyAv6JcTS1%OcTISH^4ZEL(1je=(GQ+l(NvU}$ z_6-_$+e6BzCiB)ZQ-oXw+>F=wo%d8o9b*Tms#x`FF1@5G#l)2$Y}NL@7z4`-pAIoh z2Q6Y?8v8K96?dQ|2pswz`(wdYJrly9u7&?YC{_)8(fMiiYjjr-w01`bVZ!TnMZqBY z1Eaj%6OEfv7=@cefNXfGyCwe2C(Iz9s0j6tqX2MfUtqRF_7TT^boDr6! zy}B=m&vM#3>71n79nxaKsu5Q`bI~8H{eyF747uvqtIxY|@!ZNG&h7Iycb5;j%8J>q zoK?Y2HSx-LY{1nU=_^5O)0_s^U^ib4DmKk?dgVB;1#2~0;ElwK{dI^)Gn*weS>V@D ze%w_!UQQ6W!Ux`LN2F_KlqTmxZXq2>n}^AU-AcYOHa<5MWW&Bem@JgEFn3k6MRFVG zpfhx5djuh)&^v$GEt?zmJ+!2##0GunLNE4i)MS<-o*#M-Q>2Aq z_rcG+P66`%Aa?sACW{J!e*~Bbz=F^R1ZEDeAoxMRjMfW69}<{p$|ag6EucLN2U9Q@ zyqNZgnb|E#m7qNqW=gUIZJWu|Cc4Ekp9o^t&QqR@W{8dW)u}i=$pQ2iiZonA`kBv2 zUa&+GBc`W_OPM)PM0tjo=1812G4aWcn0AE9pUhAiT#MzYs=7>b=!2% z`0#6#Etj|E(&l&?>yIs8TQW3OSFL@)_;~uPBJWP8osH{Yv?%AdI#1Wb2>KG*+B|v> zE$mR8_J($A51AyK2o{0V+p#=kFJ%@Q>!Ur6^~#EIIW2S%j@Y!UX48u%kyVv?yy$G+ zBIH56o|xxxEa|&Z5}89SfrGN?C6fn^rv_UGf`wV1m8{YzlXdx#;HyFGs>{*~`*;AQ7sfBU>Z*SU zVC1y}e~W}ahwvl8EqWLnX6Jpk@CJbwmIGTHS04?&9>mtqJH)JRY{h49f+JN@_fdrKR-13+Pg4*B%SD1o7miMbA0TvR|?38=i$2i&ftzVXKY>cLwp% z8!zAMIKOY<)!+0C>q|4pz~2etC!YCM4{tmwKJ`THC7eEZ{`x!M;;9gu{o7F?dd_uH zASryScodrym*4o%1Z*_0 z>64rZ=q`UoO#dM!-Wkq&cw(M`lYySRPl@Mx@u;DGY+|0jJ{j;tzWit6`6uzvNMF8f zVxIF)22aq8{8T)3K0!RP;d_G9v($mk%j8UM@o4Bjr3d-#i=N0~rBAwqhxFx7>W$CZ z;quJao(g!>uiciztHL#=e*RNI9~Jq0?WvzrzH+0!>{PHF<8000ri+c*vCFR65sU>D zU%BS0^K~d>DSnLdVqZXaV%}pp{PfFLv)BH@t9J3yJbu-Rg)f$8-_#d84f~@x?0N@E z!8`vdp1!mp&zEJ6ElTzW&jb(W@bW-d&DPBeS6ubkuYBdU!$Gicu&e+ct~d4vJA#LD z`1NXR2YZZHEnUCqj`~mODOD=nuwK|7JRAHZhxI6}*(D9U=ei`eeiJ6B+Xb^#=Zv{| zWZyUt?9}_<)sF@D1@TQ+FYRRC>H|S9o%DOv6kRwF>=J$XqrumBKxSz?T5cQ+=r-vQ zx%`m=s(%Cw;(B2Z#?=q!(SJY_>TVojO}{-3Iomx~_76xiBdU2vhVi!YPr;w$0qzm| zreRzq{j=}E0;;jk;pJeXfagAtN4{HOYe#}68@l|sfM(kU|8O**3$_;A@_hRD{UdtS zXwVW4?S7QU|2@fOs0vk&$8+y5poWT#vk#2Mr$5Xie^<8Hn{zV7URDx)Zyx#ECOX9iYGyEwq&~su&yma4>G`I*em-aSu^J`GG2E(P zv}6a<;!#?bt8bpeQy1}^a}YSqFW~wHmROV#UO?u%4AMcT9!w zs4*XP@wMWW9VX|cZCOI2MsHtAAK`6d7bZaEB^omntDGBe(gubnL(bT>u<8tg$=Dd! z^IVUw{mSJUwP>eHMI5_~eNox)eM$mSta`C=Eqz9@^9X=jo5N2QIqfjj!(ENdR;dR* z__Fy^nyHv0dk;mtpQS&~dd|sXXQn~1U(URRM(WFlBMF!F(Ak&@Kefuhm+gQ>+1j`~0bJ#{%nM^CZ-eV7U&4@$A}MdNQ-CWuP@)E3@hJ z!>Mv=nu<=h@##!S@i9R9)Z}qesOKD&p_b@?%#d%{l=wE$iKktTpRS`&L(Umvni!f9 zrIYKk81S66uTFKpH3;f_J*Gro$lya3I_D`gZMQ1)1#2JfabxnAzWfv?HqU(JoT^xR z2smL)NiUu51HnBy66114GfYVkNhMv*gD2Tm(W(a+CF_dz&sMm};9K=2l0^5qBPBZYfC*0{H zL2PLiyH{U^lEpYyIIN}Fk&^FWs_^s}$ZG?1`ARW1<}RdBm6A2o;i@iLEP$Ua20BM; zFWd)dT4Jkvhj{W03wTvAaGYM58r%5l``PS}h0(Y@l|s^UzIL1*pj$iY#+EX>c==#S z9F6^|F?CZfAPXSBfr{TRJpc&ZHLWQp)oK{_79=C~LoO8;ZA_<%c663E2Uhegp;#1@(ywSQ{D z2CXq;%4*JWqtaAdQi^^ID$`3JhhAGur*C~>h@k)Uts?m^Fu5T9R0$e|m-&RvdOflc z>8p#m522^g-;;LVERr2j^~8#Q_%*dZE{l+Kh7@|FFMps2MHN}7cxcQ&oko_Lm4SLGzB=-Zs_D~i&Ee&OT^nXnP zygCFf_);n0Q_j8H>xaxu5%gzepnsQv-XSQf7|S4EBFW58l0}*iWf}gH3&t(U`RRF@ z*ge!;&mmp+`;VeX3k-@H+2^An@ZX7Sswo$NYs}`63ajjnnZw{s9;e) zUJ|$y9R<~-YhRp6K*9FMUDY1u1ym?c1+R5;PMcLVXV$Dav*yg0HDlJSxFeLJ8Xt(C z3U<-iJb(Zu8taa_WSkDwHoo*07R-sqtKwBvGiJ;>ZT4xi;N(i5*bD-zX3VOtj#pL3 z<1^yvs){(U6oO9%74EcIbJ8=!Iu^!sDmWSUhimS3Zuav&wk5|g!?_@-hwZ!SNy2RH)+Erwq1IoOsjb|Y)Jmds zh%{4v;aV8h7c($?xVRk#Du_HTmS~Iy3s1J#ZF+{@oXE2Y9RKV& z6u;i*$aV}5S0{O9>%eS=I(f%sH=2BD!Je(0X&w9})>+L!DCbOTMrQfPS-UgE#u@?) z;Ukfg&0aj|wPkmo)@&4m_S-hydCPgd7 z;Cxf?NlBqw4`=N2oc18r0q4%g6Epvi<_0(^%%7Jr_G7dP2KMht6DeZW1b-KCo(KvK zNcL=}6V37w@{eX69|{$6B1QFz*+KA6o|(bQ8rnFHKh`mgnxEgt(Z`AxzCYBAk=~xE z7@MjMietYA9;?k+3KJ2fTz1~$=_3Okkt$ux%?56bV(Xz2&l`PP8&q0)4J1z*L31Z z$6U}m_F$DqB}RGSh3rNdSp)%3`14{(NqAZ;a|^#8F?RH8JH$w4FB2=NU@nV* zy^f;J0F8!L=X8$h@XpL>tnJhq&Rtc9I%NKM$c*i)Rxr-d{voHZd3avv72}K)q%{*k zSGEMPk1b2^iZbHfWfA+sM&-cBj43+Efx=21y)uc~D(^H*nS(hW3v}9M zg-+X4i>4$~4lWXVEZ~q#SzFvheziXi(w#nr3?(@2zK~`4C$R)U@nMqg3Mn4)Y92Rp zlBByd;-~Pu{aN_cHYJ0KH&TOiI-{FCPBc22Q7ZdLWA3cahp~>ZzDzvISPHIMq~-js z8c>G*xfluI{1HteGFEs09P&}T-X3v=2Ls|NrufK9$Dx46SjTndNWd)XGhvkRoJ0In zCm4#exB@*hhxc6*M#miE>7I*G@=^5#{qDP5JiGEj6Ux z>n<#SB24G5UCNs_GWhZlCWzb_1ajb75J5F<{yxc7dx$RYA0lo$uZq=tdP46HvAlkw z&2pa+_DE3W5C39mn1K=ce%Uz}o^nqC?Nq|;04#~qVN^cq28F*bgSgJtG@XG_|3-4M zINob1+D{7^y^wJ41NXKx`N-K3XLxyfy|vvipzYWr#g~g{3QsQ*sylFMd22OKhAcH| z;o(AF8dxn>_;iRpPpz_$YAv&IHgW$mlcu3MW#|mbGM(Y*RGW;ENx_rgdICFH#m;qc z?*z-B+fEF)EJCIt++`Y$Bk_+w5qmz07#4=|*gwQ@pJPR!q0*MIE#7J$^Qe?zd`*y~ z2$OO@MXO$(rAoi#5ZfPV?Pi2&^>ThM#Bo-{aW#$7{k{3PlzYOdY~C z$>N~T&qXS~WFc^jS|S|NT-SlD$s!4nE^h_RE1M!Tw5^%=4|;pjKiI=nR%R-T$?S_f ztkkUDtH1NJNbXi-C}vyT^N}o0dW6Wo;ySY(>;OE5{rfy@jj%n?-12aKf!UgT9C~4$M-3;p zdpc%vo2}`yl+$Cy?rtoSD&2(b=2w#jYUb4sj*X_HVxb49TjW9R6tki=4EQeTaq;=% z`IwJ{nDK)&4BEpoK0ld3FtLPMk62W(H2Xigm5h1W@-e<97nI6C*xQiq=sE#XIZ~uc zC?&;)bVnIX6#=fy0k}2vJ8Sm1*oJhJW@e92<>62j+bQp8P=H9~(lKGpUKjg#js(=0 zpCjRLKnH3~GAt@D$zm6X+(l=fcLEo%_^yWTbUtED7J+sA26&+a@Km>lG7_L`Yr6SS z4A4nJmQJR#(Os6B%BR7brAhTHC&ilW=5nb&$;5h)Cb1kvT#-Q!lirZaHl#ZMAM@5> zTIk$S9#V$r)NAhfj5z%sbRj|`%W(fW;3Gh0r zZzvF3Y2f~#B5r8hwo%(kDK^Ff&fd%(wWP@HX1+>Y=EN-KEsuPK(tv9ug2I1~(`3&^d<`-%M zi^*qn=O#z<=no?Zw_sC`JF5{9Tu>MREZ#U_|2{<5h1;wZ7^f!_fr_H5xi%}mJco8x zV~JkMWzZUu#nEO>p*Hm6w3C_^^sxfj8apyWZ{5mPSckq(`c*03_aq$%xgh-h1EjdtUY{VxW=%5raUL_ zSN=OQ0#rS1R8}C`x3a)(YqE31Fzo&vgG4)oWimWOwm|bJb|5n@%_xUEkVVxXgU#$d zrbSjYUxk+m7wuV-Ram=>YO|6x%|06#+kaI?eqD&n7SZ)+Uq_-rDmnJDMy_6qZ{lsc z-;Rl$oboG7E)ND{npY#*ny)ciDUMhjIZwW>$R;z2q{(ta4E+wc-#;vbXWO4hKFcaH zTZb_#aWmB-ls@W;WY5>AjsBo!KIYys8Psw{&S4sYEc-vXaJMqkh<`EEdwv751!fdg zb88ly`(zU|iBDH%&o2gfY!sFYb}KWFS9vr5uSYI(p$xv+9?V0(iSdTRr@B=kU~VpQ zd14BB%y}SBs5Sl=P&eAniye}fNyc(;u!w*%vrIiCIB0xr zTednf3l8qIj~6BBwlHhpAa^yZrLG^%f%Y$2f+6atTFb~CI>O>O%)9bv^RBbtpfoH~ zua&AR4sG03N0os?cMR}ln>UiKnk`g0zw1`a)oIHvHfV#9S`4GuNMKE~sp{Ecb-3rb zm0Kua*}b~lTn!(nZz{psrmJqq`J(2uM;Ech>$FFgTXs7yg#6}O%g< zYrbnjk83%EZKI_b6F7NRx;sM7E2#)7Qs*dVD2VXc`re$)v)lsB@4y%BouwErsJFs_ z`6y*J!d(1)tE#cn^$L=`v(l^|Wali;%0p3w561b4AlxsD+Lm(P=Ns@Mlr>AXO_rOR z&(Vi_Xv{Xq0&e}31$SdiHRr~}n@|>id{UEiXc$J*hrg-QR#0SCy)ry4R;t;>ih}wn=|!>E7FMBR ze)}rDy2Z62%henl1WL`&u2o95hTj+5O<{>?sW3AN6kP0PyH!cGrr-q_h(r5SdCRW5 z8>=w`LYq=; z=cS%wJ1Y0LluH_$ZwE1LLq$CyQpWcSR8s1AgP7TTir3IV+_s&HE&3?U8=Fq4=+^Oe zGo~G<)aLNsMSD!CD%A0mk7;u$HGj_s6@F(aw^((vjyKU2eqX6L`$~P2*^GGZo>Hp$ z-Yc0YplR3eU#@F7Egc2$>}l8V9FOsGuHggp(ac?ZVb(FcuORFm9%!`OHGfV>~|Tit+xT zkh0CB=|yKDCC35WlOm_=9QW^h!q2?71J2+1;ZG3<-8$A@<%j1ue&-YXN?ff1^x?%$ z-}&J@vM`Cm<=clBJA6ms#qQpol3)#Vp|iIrrCq%}g-2eIqqnEf(iXXSdrGmBw+}Dn z;_WHSrmZb>@b(n?2u1GQp28EPz`5IpGbLN(+U+U4qbqXk_LNd?-JVj)sXId{a_RPz zQV!i2N|8Iar!do4qgI>B=et?g zYRHu5W}Sso&-0zDYZ>R{J6C(K7FQfY{$XB`;Q0>JU();Z9QWybIL%Y8mZFeXqpS$qw_gvI`bT(jfJs9fm?JDQ?5g_@u(0Kx z2%qET{0XfFDPqYwI2%i$dvk5py;*gGN7J-xGm|Be!!{#I&3ycKb8X(dFJlAmX}s48 z)`YIjwS_!Wb!-k9*%F(V^75l*P#4;9 z%W!Be!ESSc+NNt_cjh8aT2D<2X%UXGxMZ8mYVJ>1-{imH>s{%QJ19Jf%^F(Wz;xeuY-Iojan0TLx^Kvm)dDrEt z9M|PD8DO2ck3$#Cb(s@LRN)v$My|_e|1w;cbksU zYOc#mrtG>rH#TM0Ws)-$*X1r3Uu(Dt9hbY9*=Ehcgl@~-6vm02mNl)~L+vW%j~w|d zGmQ#l5|?GSx|d;Zd5`4|8h2K3OnWQWIk{UicA558RvYwky_KJ5ovQq$^ZlMr1x%n^ zE{cZa#m>d_ZvSgIC;!2#e-Y>81=G&S_?1lTnhannj>&>e!7Uls)SQw9EaPbG@?4VX zt(L)g=V9-Vj4$g{+>s}Ocm@u~@flT)eV4V_k$k&$u|^|uHfHX3Tf1{Jc*z-e>G>Y_` z#AdJp4G)-@i{nD3D}JgFD<6d!ZjQilymb7mftUUZI2Ui_^=t_ri#$2L`OmyjKB zTk?*wbTX&nT>J^j<$nj~V%uMssho@I%!Zp9Rge5c~tm+e&C&$_UTOYyczT#DCcT#B`j^5=9YhPA+*cG6<(|pZogC+gb5bW_G|X`!)*81-J&1>k{fFPh6z#?4KYVpL|6%3` ze?ITw5nKExcf_*3!xzd`nYDcv$%mzx^}+6STK_iAqPdAYhezGhhC;Q_Z@8Nkz+G8? zVGrPy+QP}ag)e4a`ZvH^_%r`ky@lWWOY;`~oC>*l7R%!n&)j@J;AwB+65hg}$nh3l zt7k~$e5cu?$EgUtRGw*XVQg^6Z-}?Ba&g*QSdPiwTlkV`Z(*u&7fuE*xoL0Vsd)=~ z?_c*z_Z7bQSL7?qVgY#;)5V#RuW%MVbzfmzED%2hUtwGY>DwB5O1{Ebe8%A|^tR@` zsJwgdq2_PsD?A~(&{w!Tcuy$0z*jh8;B|1;S1;5CmI7bliO{{72=aV|b6BR}D{Sc6 zm*Xou35R@zSppUL3X@NJS-Doq_g8+xAhpQV`w4^PU3p2Y{Dg&7Hbs8IOu~WAI$?%J zq#2T*u%Ve%%J>QAxpszF^AV1a86V-&Nb?XjENc`p9>Qg?@(+%%8UNr?*beUL~6oZ}T-3f)Q>@Yp<` zV68gMy4dFW1pkThmwe9k3C$pH?U-v@&+ysE$I#H;RW8nCcA_; zu)qc0z_n$)fjzju8yI*AZ{W?y&GQBZR>m8+wxl<3EmgCeH}J(Jy@6|~crVWzxRxqa z#vAy|(%!(eRF-^i;4?^9o;NV7u9=L<_Xe(|h0gZ|uAPcEaBYz{aBZbcIqGfF!H!(8AD%maN&&cNb~oPp0~ z(OT^koq@%dbq3bbe)*V8!5LVLS!ZA>+oaCGwOMCi;I=Aqa%W(eLTBLGDLMng5jq3I zVX;i+3~U_U8JH*H6r6#LfrXuN2G%olGG}1JQ&Z#&oWW1-4E%{4XW&q=sW<~G*)Pi( z*jx7JaRxS5keB5Q{IO|gV3rO3H##SJ+8LNuO>;3+!$*}Ie` zXeFkdf#o8~REiv{Ipx{A;!ZmQr&w1$?F^iEHnY6=e8uUpjYX%OfpgAWo^}Q{H|A+) z;Av;z@YG{QQ#z<<+8H>|0nF3q9RG69Ii7X~<_)se-$#y=x^e|Bm`UyKH|-3pjtkrC zTvp;#<06CU{GVxOU{1!#oG4ykBIezH+0MY#Q5j~MZ`v7{dG{r3*f;GA%x*&mf*;_H ztrLu=oq=D(OL_X}V!YaPV6^;{dEWgeKDv0?8Tc1Csd(BMm^bjhc4y#!D|75{-U-G3 zMVx`ZRPwyvX9`XwF6+Jv@K@;!T-sGR_cY>(oPqPsBK{>f1Bd4jn=^1X4!hYCh;az! zc;M6K@I7tLtSSz3E8`IScsn}_voSL#3crTKiut^nLx-!XW>?|tJ1fn3#4bJqr(n)E zj#nk|1;)*o$%7b7GwjTYxK5Mv9eFuf{W?5?x1mJ|*J0i#{P*?{HOch>OF=@6VfXZYnf1aHJ~&dwQTDcG;vAvkkDao!ojEYth-IRt;~!svYAUyVcX zMJ!G%akg-cjz(-|=cY*-{^9D=ohVb&oSC*+Aw75-&A1eZNfn3XlZGKb)T!-Sby zoYGOk1rEU+AT*If@cSn^KKMVKL-1ewVh|lO%-J9+7{A)%gL!`ZnvM_tukR52-kjru zan<=H93MRG5Ud)on5E&Ynr5LA3xT84O8pi%TO+6FX@_7rd~JxV^BZ$~@UPh+`0sKK z|5fX%lj-D}JbirdZ_x3<(+A&5F28=|8z(nhaOA!vBt8WrP0tiy6r{i z&xG_OL2iWIC`L!Mxys38up^{sTRtYJkBqW1$E8v^;YmV9*>pV_JR4#a@gVpCes^ZV zw9{vjuyJ-v_o)rI?_>Y$KEif~VcMywdbs1>+wScg849Y?C)%HFIWj&JBtrUNP?;R; z8%p*E6{+!5dLXDb!dE!Hr6Fjr>#vf?`k>LSZzKx5;_*Oeviq-LZ2o2LZ$|Z0=I$0z zUH1M~?l}%BL;nV77L{`pd$UQqjV!{Xnfp8NxE#&7zl;0focr(5H6P5mzni5Tx%c<5 z<|Ft1K6fnd{(jbk=F)%U4(HuJz=mqM^atIcy!(gH-*M7nF6Lpvf`YI|EZzCI$1Lsn zVcQ5BE8u+sn~WBOJxSPbLD5VTlc>?G`XLD(+B zj)h_ML95|*leQyaSR!b%umoW`fl_wa9kg3mJ%#c`3+v)slMV}O1a~M5J05geSQB9{ zgki_nmQ_W&nXrRl*iqijD6AD-4uoNc@rhAb8@T7fu$O{87S;i7e;D>+u-C#m3ELNj z9pXy7UGTCJ37xy})ZA}jJ>Yu7u!BezZVzGIVb}pqG*H-H!n(q+=g~@G`;gaB5cV8l zZDH7Rq)52u32Q9~J3v@V7`7j42zL(8Sd zqW*fC*8i#;Wcglz_M-8<1Wn;t+Cka?Pdf}vWhIxE~1$Z7O$wPo-wm}_A6eskM-x@D1qIF z%wz6eH@jlStAFdv^WOHZi+=C2UQUquW?AeH-JICW*S_KH@BaO(*MIKw|JD=q26q4+ zXFc5DAsOlv9CcRkL2TV9jT5Zv;As%zMj1f8r`;z3#j}OaSZycz;RY zOO%|4Tx{0scLv7;*WX7Y@jzMN!_K{8hj9D)+|l5nGB{U#(mld%&)_=yXzCv>gNwbf z;*@*LZ5Qx`KFY>pC4nynu~${}xoz%A0mu4iCbpFU#?P8n(eIvcPgs%<1W&kQJcpy4 ziOl$75P$C*s{7rOZkyqb)5TDKh@^P4ciVRu;d&Pq4 z0k@rf#ywX3o*f*5cen($V$*wGS25_Ga*u}K5uUQUTtFQt6#POE|BLfpG3cIlkA&DE zqHm@AK3@V`@r6s?Fl)#?!y6H=ML+Q$=8;_tJ{VN|&D&m4!5-u8p%8qM4ZuqQD{uI~ z8)j9ExM$r@LgZ1l8w%)N?L>#?g2=cBf{MHU?2Xj~Q!gHK_qjGKcEI)0ak-afqvBuQ z`}*opw+rHkqwC#U$?x;&ZdpM8w1481P-#>fI=}Grc0gZD) zZ(Q}Nan}ItCwa7c#P`%+y>T2Tgz@0P0@_#*yYKxXC8-U$YThlj_Rsuw(ltT*aRCjs z@0^w7xj9}y`o7qnUd>K|EnNL5kL`Pe#Qw@iNh)b>Y$C<~_qnsvJa&`85A$f>B_#f> z_mrnS^2hA**#_#qJihM`68qGmv}@<$-aOK`32|>rb5gdRc_-+sIxXY$V+T@p)SNkDc5La7!Gx0r_P~q&`8M93-@GkXq2RpmXBj{4h`b^ zkUKs_j$v|dj9j0Z{9zt)8UlH=x{?#=KSIgVcywZP3&me$b%c)1xD7pIP03a{@g=X1 zHaJP$^`&~0I1bz*xFHB%iQ)*Nf-_PLLN+pB>Rs9VO}G z^oPf&g6>o&g>x@WZo=hDNYb+&qhQ6_l57=Q2BNMreg=;WmxH9}m5)DCs)OBGlZbTo<`n zN`nEPHRdaTeIl%?0()32EKK4ML{4odre*HVyn(RQQLn9=r9 zHtK?}62mUnLw(wBeUuY4zzT1q1ik=mCo5`3O3)5b#-3$q@^A^-i^RTz2lr4J+B5C| z1*SN@m(c7fI&1wUXot~oJ3YQrC1^*`@TYWbkC&lsE)jkd%}a$JL+euE8b+21KSAZ# z?4F~8rFx&W-APhWD*P0ctyH-Be5JzsX^o1*Pr2u5cglxrK(&R6s>iFU`k+<%16XJ? z!_!i@sGr}{o&>k)HM1;``1j#9dX{9T& z*{OZ<80jv2p{zD0NjEd*Pa;RM%Hi7SwPbN=Y)~w#gNa%8=0=u!uca}a^lUbBBCEy& z+n8ecqU$*%J@V~m(9%Fq=?Op%eEXmPv8C|$WvJIo&w}}oc}=w0>8+V2N4-4Z^}IYu zi*Uj{P=rm=2Mg#6$i69)FFuby?j9__Yos`W6-(g<=@~qP-ow`R?Bn&-W~Q!^^#3%e zs`UAEDjvxnF;>gxcn)i7Z>46&_QFcCG&+F{_4G!ddg&vS zq=(EF%}Cj8SmpQ#`e|n16eUCV(p;}89w(>L$c?a)Gh6~YMqBU{_Q}O6M~CPqYrZ&F zu3k;-!nVQ=Fi}XI#{Q>>U#IbnneK{T?;u;qom?EFD3d3*Ct=5lL)auUnR~Fbu!Fqg zl+1kWIC4EU#cbXY%5D~`cbwytrzGiAPN^k{(COd{IY?f{f=HXKBBW+`q(g)p;=Su; zr#HLG6Xn*p$yDxnWDtDbWDe6Zd8B`DEaVAfWsxrU=K>@X$K+}jsd*N~9wA3)O(gRG zu}PN7f=66qk|O#+!Zk0Drkse*X~@naMtM6e2`@nD=BuH2E=8#bz>h#3vk_}9Rqq9c zklM$rf?Ayvs+?x2n&A|$p8-3L zB~>3I-bU`WXQ(Gkvn*9JprUs3t8tYim!hf#5LGsfBsX#QGvoDC)sQT;8S0Zzdk7V; zN(5uy&>~r?`rcEcK1c4$-YrPfUZ}fEI6P?nbl7`5x+)-Lj`p4M0CAwEvBml z^ZBFEm3l<`_>IypnVzoKs+!T(6S|nLGU-PLp6+5%4oT{x#2|!Tt@d%RzDn#>?1bTs z96`DX)*DteGzNKXMKQ$9I{=_7i2YV&3F4~{QZ*pHCPUPi?GfT|;|xGA(61os6V%X>6-PnH>&kzG(PY?&__n_-Kt$F+yc6 zA2GsgihmkJ#Y^e+PZKYr5aG+Ke_l-1O8HUJI$QD{whd%usJ!R`3Uue*i)h;U2ou;!SG^;5yMSb zn6rd(_;cy~!Pk@n$jX*7(bZ2Ae|fsrNIJ$UT7p>2uO6i6r-EC`(DkHdiDvMBLVC7U zQ2Y(>i+&=wwG3S?iDr|&9@4WdsQByQ7yTGZfV_UW^f8m4r4Iyg>g@ozp{I%7IuF35 zJ~DkZ-r{ZMF2W4jbFY&)1}Qzlu&$I5(rr1I0ec?nO_thi^_PV?%xrpAPQUdT+QAGH zuQ04zY#$<@|b~!~p33nX5#{;dPIL>d19ML!?!f3>$H%!S8p^@WDHcE;RDpgv2 zl?=Ym7kQ*1O`d6-re!(95>Uqkb S%2pk-$9>e*9%9p&@&5<559$m6 diff --git a/iphone/Barcodes/design/ZXingRounded.psd b/iphone/Barcodes/design/ZXingRounded.psd deleted file mode 100644 index 7e6e1ad49621ce1fe901c50677d7663f3e639308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296656 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≫>a|ZwAjH*0p_qbZjt#&5&|s=Qn7nh1_=ECA>R+~ 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\eZFPGp?}7$SmW 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 diff --git a/iphone/Barcodes/design/ZxingLarge@2x.png b/iphone/Barcodes/design/ZxingLarge@2x.png deleted file mode 100644 index 1505ba21de3392fe2db46edbd47f1f0919bb285f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41911 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 Bys-cP diff --git a/iphone/Barcodes/design/clickHere.png b/iphone/Barcodes/design/clickHere.png deleted file mode 100644 index 7f5f19ca03a9cd0790247189cdb97fc86fed96f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6848 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 - - - - ActiveLayerIndex - 0 - ApplicationVersion - - com.omnigroup.OmniGrafflePro - 138.17.0.133677 - - AutoAdjust - - BackgroundGraphic - - Bounds - {{0, 0}, {1118.58, 782.89}} - Class - SolidGraphic - ID - 2 - Style - - shadow - - Draws - NO - - stroke - - Draws - NO - - - - CanvasOrigin - {0, 0} - ColumnAlign - 1 - ColumnSpacing - 36 - CreationDate - 2010-11-16 13:54:36 +0100 - Creator - Romain Pechayre - DisplayScale - 1 pt = 1 px - GraphDocumentVersion - 6 - GraphicsList - - - Bounds - {{73.2899, 244}, {622, 308}} - Class - ShapedGraphic - ID - 4 - Shape - Rectangle - Style - - stroke - - CornerRadius - 30 - Draws - NO - - - - - GridInfo - - GuidesLocked - NO - GuidesVisible - YES - HPages - 2 - ImageCounter - 1 - KeepToScale - - Layers - - - Lock - NO - Name - Layer 1 - Print - YES - View - YES - - - LayoutInfo - - Animate - NO - circoMinDist - 18 - circoSeparation - 0.0 - layoutEngine - dot - neatoSeparation - 0.0 - twopiSeparation - 0.0 - - LinksVisible - NO - MagnetsVisible - NO - MasterSheets - - ModificationDate - 2010-11-16 15:15:39 +0100 - Modifier - Romain Pechayre - NotesVisible - NO - Orientation - 2 - OriginVisible - NO - PageBreaks - YES - PrintInfo - - NSBottomMargin - - float - 41 - - NSLeftMargin - - float - 18 - - NSPaperSize - - size - {595.29, 841.89} - - NSRightMargin - - float - 18 - - NSTopMargin - - float - 18 - - - PrintOnePage - - QuickLookPreview - - JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls - dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAFdkMFuwyAQRO98xfxAMQsGwzm99Nb0 - 0nOEiGoJ14nt9vu7dsCuIi7saOft7N5xxh2KHxF5dF5jSvjEN5rTTIgzaHtzxIuSFkqa - oBS1buuXdrNIH9glrmje0xTTbfm5ZEw9g127ohWMdvyX2oegoalbHXFA8zYQXkfO0Hyk - fFn633Qa8zj1Q1qmPgpmkNKyYxusCezHAMeg/0qG8ySN9bb2uFA7tJW+9Ty7KMKqjRJ3 - BdrRymVKdemW7UT24Gqz9eyTH7WIR7rSkeGd1JpMh6J0j/i8daUeymNyRFVEyVLrmu25 - 3h0o6+SKgC0bi5LD1Zs83zHi60i/3/aK8x/fY3JZCmVuZHN0cmVhbQplbmRvYmoKNiAw - IG9iagoyNTgKZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCA0IDAg - UiAvUmVzb3VyY2VzIDcgMCBSIC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3ggWzAgMCAx - MTE4LjU4IDc4Mi44OV0KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERG - IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0NzMSA4IDAg - UiA+PgovWE9iamVjdCA8PCAvSW0xIDkgMCBSID4+ID4+CmVuZG9iago5IDAgb2JqCjw8 - IC9MZW5ndGggMTAgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lk - dGggMTI4MCAvSGVpZ2h0IDY1MiAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFjZSAx - MSAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvU01hc2sgMTIgMCBSIC9CaXRzUGVyQ29t - cG9uZW50CjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dAxAQAAAMKg - 9U9tBn+IQGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED - BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA - gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY - MGDAgAEDBgwY+AYGNjoAAQplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjEwOTQxCmVu - ZG9iagoxMiAwIG9iago8PCAvTGVuZ3RoIDEzIDAgUiAvVHlwZSAvWE9iamVjdCAvU3Vi - dHlwZSAvSW1hZ2UgL1dpZHRoIDEyODAgL0hlaWdodCA2NTIgL0NvbG9yU3BhY2UKL0Rl - dmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUgL0JpdHNQZXJDb21wb25lbnQgOCAvRmls - dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt3ftfjtm/x/HvjGHkfE4nIlKJRImI - aERERImoFFFyioiIiBwmh4iIiJzPZ2bm+9j/2v6s67rvlPGdMdz3Z9YPr+uHvb/7u7nW - 8vw8Hu/HWtc63P/5Dw8CCCCAAAIIIIAAAt8s8AMPAggg4CeBbw4mv/1F5x/6Iw8CCCCg - JuDEjt9C7ateLF1w/7k9evT4yTw9eRBAAAG/CjhRI5HjZo+E0FeFlY//kCf7TPCZf2yv - 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 - ZW5kb2JqCjEzIDAgb2JqCjE3NTA2CmVuZG9iagoxNCAwIG9iago8PCAvTGVuZ3RoIDE1 - IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29k - ZSA+PgpzdHJlYW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZF - kGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+ - 8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoP - gVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1 - Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGc - TvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8Q - TSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd - 70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9 - t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01e - fJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359s - fzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7x - kthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkO - b/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1S - NZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1u - HKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5kc3RyZWFtCmVuZG9i - agoxNSAwIG9iago3MzcKZW5kb2JqCjggMCBvYmoKWyAvSUNDQmFzZWQgMTQgMCBSIF0K - ZW5kb2JqCjE2IDAgb2JqCjw8IC9MZW5ndGggMTcgMCBSIC9OIDMgL0FsdGVybmF0ZSAv - RGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AdVZZ1gUS7Pu - mY3ssoQl55wzknPOkrNIWtKSWXKQqCggKoiIgCKiKKCgoCQTSUFFFBAUJSkiIqgYUILK - HfSc8333+e79d//cfp7teaequrpnqnq6qhYArmW/6OhwmAmAiMg4mqO5kaC7h6cg7jkg - AAgQgThQ8aPERhva29uA/7V9G0dkkTYqt63rfxX7nxnMAYGxFAAge4TtHxBLiUDwVQBg - I0o0LQ4A1BpCf5wYF41g9ACCWWnIAhE8uY2D/+CVbez/G2PQv2WcHY0BwHACgKf386MF - A0ASReiCCZRgRA/JBAAsOTKAGgkAizuC9SghfgEAcJUhMrIREVHbuA/Bkv7/pif437Cf - n/8/Ov38gv/Bf54FGYlMbEKNjQ73S/5983/ZRYTHI+/rdyMjPX1kuO22bdiR39sAPxNr - 5MqL/H5Fh/+2GSIDcQdGujghtG0sG+lva/cX1guimTkiGBkL2UfHGW1j5J1BQdFx9s5/ - 0dNTQoxtEUyP0EsCY03/1nM61M9q22YMCL2ZFu/ogmBRBHfFJjiZIhjxKOh1Soiz218y - XwMCTf6iw3AQ1czyjwxMpsZZbs/FithcOCzKensNyFywGrAG4SAQxAMa0kcCOWADjIHJ - X70cCAJ+CCcB4cWCMPAGwRHIiChkTBSCBf+SM/4PitnvccHIuP+uURBQENn4f+b8M5sg - MuffOqkgAMF/0/2QObZ526uL9aFm/2vOvyW29f1ejWKD4qLij7/XhBZHK6NV0UZoXbQe - WhMIotnR3EAOrYLWQBui9dHaCE8TmIHXiObgv9e4rT+iOSihLCpZyzUE4W4/u//fXOD6 - W5r6z/1/rABQh5bblv9eAQBxgUnIPgDAOCo6mUYNDokTNER2bqCsoGUkRV5WUFlRSXGb - /f+mbX+z/iz2i+PvbxHE/uhftNAUAHTqkX2O+RctJBqA+jUABNr+RRNZRtzfG4BLMZR4 - WsIffejtCwb5GjIiHsoF+IEIkETeszJQA9rAAJgCK2AHnIEH8Eb8JwTxQRpIBGkgC+SC - AnAEHAPloArUgAvgEmgGbeAG6AZ3wQPwGIyBF2AWzIMlsAK+gU0IgnAQCWKBuCABSAyS - gZQhDUgPMoVsIEfIA/KFgqFIKB5Kg3KgAqgYKoeqoTroCtQBdUP3oGFoAnoJLUKfoQ0Y - BdPDrDAfLA4rwBqwIWwNO8O74WA4Bk6B98KH4DL4DHwRboW74QfwGDwLL8GrKIAiothR - Qig5lAbKGGWH8kQFoWiodFQ+qhR1BtWI6kT1o0ZRs6hl1Doai2ZBC6LlED+1QLugKegY - dDr6ILocfQHdiu5Dj6JfolfQvzAkDC9GBqOFscS4Y4IxiZhcTCmmFnMNcwczhpnHfMNi - sexYCaw61gLrgQ3FpmIPYk9im7Bd2GHsHHYVh8Nx4WRwujg7nB8uDpeLO4G7iLuNG8HN - 49bwRLwAXhlvhvfER+Kz8aX4evwt/Ah+Ab9Jx0QnRqdFZ0cXQJdMd5juLF0n3SO6ebpN - AjNBgqBLcCaEErIIZYRGwh3CJOELkUgUJmoSHYhUYiaxjHiZOEB8SVynJ9NL0xvTe9HH - 0x+iP0/fRT9B/4VEIomTDEiepDjSIVIdqZc0TVpjYGGQZ7BkCGDIYKhgaGUYYfjASMco - xmjI6M2YwljK2ML4iHGZiY5JnMmYyY8pnamCqYPpKdMqMwuzErMdcwTzQeZ65nvMb8k4 - sjjZlBxA3kuuIfeS51hQLCIsxiwUlhyWsyx3WOZZsawSrJasoawFrJdYh1hX2MhsKmyu - bElsFWw32WbZUezi7Jbs4eyH2ZvZx9k3OPg4DDkCOfI4GjlGOL5z8nAacAZy5nM2cY5x - bnAJcplyhXEVcbVxTXGjuaW5HbgTuU9x3+Fe5mHl0eah8OTzNPM854V5pXkdeVN5a3gH - eVf5+PnM+aL5TvD18i3zs/Mb8Ifyl/Df4l8UYBHQE6AKlAjcFngnyCZoKBguWCbYJ7gi - xCtkIRQvVC00JLQpLCHsIpwt3CQ8JUIQ0RAJEikR6RFZERUQ3SmaJtog+lyMTkxDLETs - uFi/2HdxCXE38f3ibeJvJTglLCVSJBokJiVJkvqSMZJnJJ9IYaU0pMKkTko9loalVaVD - pCukH8nAMmoyVJmTMsOyGFlN2UjZM7JP5ejlDOUS5BrkXsqzy9vIZ8u3yX9QEFXwVChS - 6Ff4paiqGK54VvGFElnJSilbqVPps7K0MkW5QvnJDtIOsx0ZO9p3fFKRUQlUOaXyTJVF - dafqftUe1Z9q6mo0tUa1RXVRdV/1SvWnGqwa9hoHNQY0MZpGmhmaNzTXtdS04rSatT5q - y2mHaddrv9WR0AnUOaszpyus66dbrTurJ6jnq3dab1ZfSN9P/4z+KwMRgwCDWoMFQynD - UMOLhh+MFI1oRteMvhtrGe8x7jJBmZib5JsMmZJNXUzLTafNhM2CzRrMVsxVzVPNuyww - FtYWRRZPLfksKZZ1litW6lZ7rPqs6a2drMutX9lI29BsOnfCO612Ht05aStmG2nbZgfs - LO2O2k3ZS9jH2F93wDrYO1Q4vHFUckxz7HdicfJxqnf65mzkfNj5hYukS7xLjyujq5dr - net3NxO3YrdZdwX3Pe4PPLg9qB7tnjhPV89az9VdpruO7Zr3UvXK9RrfLbE7afc9b27v - cO+bPow+fj4tvhhfN9963x9+dn5n/Fb9Lf0r/VcoxpTjlKUAg4CSgMVA3cDiwIUg3aDi - oLfBusFHgxdD9ENKQ5apxtRy6qdQi9Cq0O9hdmHnw7bC3cKbIvARvhEdkeTIsMi+KP6o - pKjhaJno3OjZGK2YYzErNGtabSwUuzu2PY4VCQ4H4yXj98W/TNBLqEhYS3RNbEliTopM - GkyWTs5LXkgxSzmXik6lpPakCaVlpb3cY7inOh1K90/vyRDJ2Jsxn2meeSGLkBWW9TBb - Mbs4+2uOW07nXr69mXvn9pnva8hlyKXlPt2vvb/qAPoA9cBQ3o68E3m/8gPy7xcoFpQW - /DhIOXi/UKmwrHDrUNChocNqh08dwR6JPDJepF90oZi5OKV47ujOo60lgiX5JV+P+Ry7 - V6pSWnWccDz++GyZTVn7CdETR078KA8pH6swqmiq5K3Mq/x+MuDkyCmDU41VfFUFVRun - qaefVZtXt54RP1Nag61JqHlz1vVs/zmNc3W13LUFtT/PR56fveB4oa9Ova6unrf+cAPc - EN+weNHr4uNLJpfaG+Uaq5vYmwoug8vxl99d8b0y3mzd3NOi0dJ4Vexq5TWWa/mtUGty - 60pbSNtsu0f7cIdVR0+ndue16/LXz98QulFxk+3m4VuEW3tvbd1Oub3aFd213B3cPdfj - 0/Oi1733SZ9D39Ad6zsDd83u9vYb9t8e0B24cU/rXsd9jfttD9QetA6qDl57qPrw2pDa - UOsj9UftjzUfdw7rDN8a0R/pHjUZvfvE8smDMdux4XGX8WdPvZ7OPgt49nYifOLT84Tn - my8yJzGT+VNMU6XTvNNnZqRmmmbVZm++NHk5+Mrp1Ys5ytzS69jXP+b3viG9KV0QWKh7 - q/z2xqLZ4uN3u97NL0UvbS7nvmd+X/lB8sPVjwYfB1fcV+Y/0T5tfT74hevL+a8qX3tW - 7Venv0V82/yev8a1dmFdY71/w21jYTPxB+5H2U+pn52/rH9NbkVsbUX70fx+xwIopIeD - ggD4fB7JITyQ3OExAISuPznFbwkkXYEQGQTjkVjYDZyFsJAZdBT6CNvAV1ESqNNoCXQn - xh0LsNdwSXgzOh66NcJL4gj9EGmYkZUphPkGCxdrAtsEhyVnO7ccTy2fDH+ToIbQfRFf - 0Q3xo5KKUmMygbLL8vEK35WSlddVolTn1O00rmjRa1N0rur+0jc12Gd4x2jdhN/U1CzU - vMii1XLSGrIR32lpG2F32P6Kw6jjN2cuFx1XR7dQ9wyPUs9Lu3q9JnZ/8IF92f2k/HUo - tgF+gXFBWcGZIdnUnNC9YbnheRH5kQejDkUXxRylHYs9HlcRfyyBlmifJJdMTH6XMpBa - m5a7JzjdIkM6k5T5KWs8+3pO1d59+2JyKft9DgTnpeZXFzwt5DsUdfhRkU7xkaPNJePH - 1o7zlBmcCCo/VNFRuXiKt8rxdGH1/TNrZxnOidfqn/e4kFhXVn+jYf4SudG4KenylStL - LQJX7a+ltza0jbX/7BS9bnUj6uaxWzdvz3cz9qj1OvT53aHcde3XHiAPTN6ruO/ygPTg - zmD2Q7Mh5qGZR5cepw1bjXCNLIy2PMkYsxwnjz9/euKZwwR24sbzuBfyL95Onpvynxaa - np2pmvV5KfBy5lXlnOtrhte987FvBN88WKC95UQ8KuAd47uepfhlyeWp98UfLD5sfWxf - if2k8Gn5c/eXuq/FqwnfPL/rr0mvC2yIbBr9yP1F3NpC7I9DIkUrJAKcg6SRuK0L5oLj - 4Ococ9RNJMYfwURgmbE3cXF4NTpAN0a4RDxEn0UqZRhkAsw65BSWTjYUux1HDecatzPP - VT5u/lyBz0IBwuOiO8X6JRQkj0p9l3GTbZEnKvgqXlZa26Gjkqh6SW1ag6CpqOWqnahz - RPek3kX9ToP7hhNGi8brpgQzbnNpC11LWytf6xibnJ0ltqfs6uybHa473nV67Dzh8sr1 - ndsX901P1C6iF+tuPm8hHyFfAT8+fx4KVwB7IEsQYzAhBEMF1M3Q1bCV8IWIZ5EDUa3R - Z2OO0FJjA+Ks45US2BM2EqeTepJrU/anBqdZ7ZFPZ8uAM75kvstazF7J+bmPnCu3f+eB - yLyC/PMFfQdfHYIOCx0xLgoqLjx6rWS2lHRcpyzwxP7y+orByk+nOKr0T1OrS8/crVk/ - J18bdP70hef1rA22F3Mv3Wr8dln2SkBzRcvYNcZW67a89v5O6LrWjeibNbeGb6938yD+ - YNPndYd6l9YfMeB5z/i+zAOWB5uDrx4ODDU+Ovo4adh7xHhU9An0ZGqsY7zkadQzqwmx - ia3nEy+aJw9OBU0bzPDMfJ998vLKq8K50Nfm86JvoDdTCx1vSxap73SXmJfml68j9g/9 - aLIiuPLz0+Tn618qvx5aLfl28fvYOnHDbDP5x4mflb8ytyx/2x+D5NSqSL54FqxCclAo - dBkGsBN8GYmys1Cr6Gj0KiYHy4u9hQvEs+Dv0qUTjInS9OIkcQYxRnkmdWZzshtLJGsu - 2zn2fo5PXFzcFjzJvJf45gR4BE2EQoULRS6LjoqtSBAlhaRUpQ1kLGSt5MzlDRXUFKWV - eJWxyos77qnUqxaqRanba+zQZNVc1Xqq3a5Trpum561vYCBsiDFcNBoybjEpM003o5hb - WMhaMlmuWk1Y37Cp3plrS7WzsJdAYoV5xz6nM85ZLt6u2m5cbt/cRz2aPAt3Ub2MdvPs - /uI96HPWN9XP0V/S/xdlNKAuMD3IKVgyeCPkAbUyNCJMN5wUPhnREJkcZRpNjp6OqaPF - x2rHbsV1x+ckGCfCibeTUpOVkXO5ItUqdS3t4p6YdM8M80yVLOFspuytnPd7n+/rz23Z - f/LAgbzo/NAC6sGQwpBD1MPUIyGI1/gf3V3icsym1PC4SZnTieDy1IqiytqTnaceVk2d - Xqr+XgPO4s7x1zqdP3xhsJ7YsPNi0aXnTZKXk68MtUhczbk22SbaHtJR2zl5g3hT+Zbj - 7fCuzO6inqreS33td3ruPugfH3h17+P9X4OMD0WGtB45PY4aLhxpHp0Yg8alnzo92zNR - 93x8EjOlOh08UzH78dW+15LzMwu3Fx8vC31o/3T+68ya1w+2bfv/qS1tnwlYNQDKdQHw - CATAwRyAwr0AiI0DwEEAwJ4EgLMmgPN1AWzKD6CDg/+cH0QgDHSBJ5JLHgMtYBisQEyQ - IuQA0aASqAl6AL2FsbAobAxT4By4Bu6D36DwKBmULSoGdQzJ1mbQaLQ02h6diD6Fvov+ - iOHEGGLCMGWYfiTzEse6YfOxN7GfcRI4H9xx3AieAW+DL8Q/omOh86CrplsmaBD2E54S - pYhZxGl6bfpy+g2SF6mLQYzhIMMqoy/jIJMWUz0zL/NhMpqcQv7MQmP5zBrPus6WwY5j - L0JykIucOpyPuAK4NrlLeBR4HvCG83Hx3eVPEJAUmBQsErISRgt3iaSL6ovBYv3ihRIe - kuZS6tIyMkKy3HLs8qwKLIpsSpzKfDtEVGRVtdTM1R00XDUdtUy1FXQYdd7otupl6psZ - 4A3uGGYaORgbmewwlTDjM2exIFqiLDetvlgv2szsfGI7YHfdvtGh1rHL6bnzqiuzm5y7 - hYe/Z+quYq8Lu697D/nM+K74Awp7wI5Ax6CE4MqQfupqmHi4Z0RR5L1oVIwuLTn2atxK - glZiUdJGSnIa657HGa1Z3TnzuaQD0vlyByUOiR4RLZYsUS41LttVvqey9tTHau+awVqN - C2caCJdoTZPNllc72uQ7Lt8wvfWpu63veH/h/ZKHBY99RtXHmZ69e9EzXfoy5LXGm9a3 - G0vO7ztW+D+nfO35trS2uNH5wx2JOhZ/fz9IQAKp8gSD/Ujl4D5YhhiReoAbkv1XQbeg - KegXLIBk9gHwASSTH4a/oXiRrD0UVYxYfg5Nj1ZD+yEZeTt6HkPGGGAiMdWYJ1g6rB42 - HtuIXcCJ4HxxVbgZvAg+BH8Zv0FnTldK9xbJj48SlonmxAZ6RvoE+mmSOamFQZDhMMMW - I43xDdMuplFmG+Z+sgm5h8WMZZDVmXWGLYxtnT2Pg5fjCqcF50uuNG5u7g4eT56fvLV8 - zvxo/jaBcEFRwWmhCuFdIvwic6L1YnHihhKMEguSfVLnpPNkaLLecnbypgr6irpK+som - O2xUPFXD1dLVizSqNRu12rSv63Totuhd0C83yDdMNAox3m3iYmprZmFuYmFoqWelY61l - o7FTzVbFboe9koOCo6aThbO7S6hrmtth9xqPVs97uya9PngDH7KviJ+qvxnFIyAycG/Q - qeCOkKfUb2Gc4doRvpG5URejR2M2YoXjrOLjEmoSx5IJKcapWWl30pkzAjK7s8VzSvYR - c/MOMOS1FNAKVQ5tHOktLi4JLNUp4zzxvWLi5O2qzurrNbfPDZwfq1to+NnIeVmt2eNq - euvZ9sHO1ZtCtx26c3o773wdULmfONj7SHy4YPTLuOez7hdiUwdmFl9Zva5fICwqLMm/ - Z/+wsFL/OfirzDf0GnrD+Mfcb/uTkdNjF8gBF5E60S9ICnJB6j4NSJ1nDRaCreB4+DT8 - EN5ASaHcUQdQHah3aD5kt+9FdyB7XRzjjSnHPMNyYj2RmsornDRSQenGM+Ep+A5kh8fQ - jRDUCVVEAjGV+IU+kn6JFEp6zxDDsM6Yw8TEdJpZGbGyN3mNpYRVmXWELZ6dm72HIwKp - JQxyZXCrcX/kqeel8inwrfH3ChQLBghpCpOFP4g8FG0SOya+R4Iq6SXlKG0jYylrLWcv - 76kQrJikVKh8bkeXyrwaSV1Tg6p5Umtch1XXXe+0/ntDPaMKE7RpjNkbC4rlknXmTiHb - YfuDjhxOAc7NrrCbs/sFj61du7w6vPl89vl+8vendAYyBYUEd1N5Q1PDpiJMIpuiBWOO - x7LElcRvJLomNacwpUalPU5XzTiZRchOy/m6j5a7eiA9b7SADzk9Wg5tHbEsOlo8WSJy - jFp68fjHEwrlURWNlcun5KuyT784o1VTfY6p9sAFYt2JBqWLTxozLytfeddSey2kTb79 - e2fXjYJbLl0C3W97m+7E9asPrN/vHEwekn/0erhi1HmMND7wLOe53ov1qaszkS+lXs29 - PvVGaiH97dA7jiWP5aL3nR/GPi6szH168fn2l9Nfo1cNV7e+3fweuyay9mQ9aYNvo2vT - a3PtR/FPiZ83ftn/mt2K2rZ/bNAO5e3TA0D0Rkj5cXpr64s4ElQWA/CzaGtr88zW1s8a - JNlA/gPpCv/zf8W2MBapuVee20a9VyqFtq//3v4LUth2VQplbmRzdHJlYW0KZW5kb2Jq - CjE3IDAgb2JqCjU5NjAKZW5kb2JqCjExIDAgb2JqClsgL0lDQ0Jhc2VkIDE2IDAgUiBd - CmVuZG9iago0IDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVkaWFCb3ggWzAgMCA2MTIg - NzkyXSAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gPj4KZW5kb2JqCjE4IDAgb2JqCjw8 - IC9UeXBlIC9DYXRhbG9nIC9PdXRsaW5lcyAyIDAgUiAvUGFnZXMgNCAwIFIgL1ZlcnNp - b24gLzEuNCA+PgplbmRvYmoKMiAwIG9iago8PCAvTGFzdCAxOSAwIFIgL0ZpcnN0IDIw - IDAgUiA+PgplbmRvYmoKMjAgMCBvYmoKPDwgL1BhcmVudCAyMSAwIFIgL0NvdW50IDAg - L0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzgyLjg5IDAgXSAvVGl0bGUgKENhbnZhcyAxKQo+ - PgplbmRvYmoKMjEgMCBvYmoKPDwgPj4KZW5kb2JqCjE5IDAgb2JqCjw8IC9QYXJlbnQg - MjEgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDc4Mi44OSAwIF0gL1Rp - dGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjIyIDAgb2JqCihNYWMgT1MgWCAxMC42LjUg - UXVhcnR6IFBERkNvbnRleHQpCmVuZG9iagoyMyAwIG9iagooRDoyMDEwMTExNjE0MTU0 - NlowMCcwMCcpCmVuZG9iagoxIDAgb2JqCjw8IC9Qcm9kdWNlciAyMiAwIFIgL0NyZWF0 - aW9uRGF0ZSAyMyAwIFIgL01vZERhdGUgMjMgMCBSID4+CmVuZG9iagp4cmVmCjAgMjQK - MDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDM3MDQzIDAwMDAwIG4gCjAwMDAwMzY2ODcg - MDAwMDAgbiAKMDAwMDAwMDM3MyAwMDAwMCBuIAowMDAwMDM2NTI0IDAwMDAwIG4gCjAw - MDAwMDAwMjIgMDAwMDAgbiAKMDAwMDAwMDM1NCAwMDAwMCBuIAowMDAwMDAwNDg0IDAw - MDAwIG4gCjAwMDAwMzAzNjcgMDAwMDAgbiAKMDAwMDAwMDYwMiAwMDAwMCBuIAowMDAw - MDExNzY0IDAwMDAwIG4gCjAwMDAwMzY0ODcgMDAwMDAgbiAKMDAwMDAxMTc4NiAwMDAw - MCBuIAowMDAwMDI5NDg1IDAwMDAwIG4gCjAwMDAwMjk1MDcgMDAwMDAgbiAKMDAwMDAz - MDM0NyAwMDAwMCBuIAowMDAwMDMwNDAzIDAwMDAwIG4gCjAwMDAwMzY0NjYgMDAwMDAg - biAKMDAwMDAzNjYwNyAwMDAwMCBuIAowMDAwMDM2ODUzIDAwMDAwIG4gCjAwMDAwMzY3 - MzUgMDAwMDAgbiAKMDAwMDAzNjgzMSAwMDAwMCBuIAowMDAwMDM2OTQ5IDAwMDAwIG4g - CjAwMDAwMzcwMDEgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAyNCAvUm9vdCAxOCAw - IFIgL0luZm8gMSAwIFIgL0lEIFsgPGZjMDVhMmQzY2Q2OTIwN2NlZjU5MDEwNGFjYTFh - N2EzPgo8ZmMwNWEyZDNjZDY5MjA3Y2VmNTkwMTA0YWNhMWE3YTM+IF0gPj4Kc3RhcnR4 - cmVmCjM3MTE4CiUlRU9GCjEgMCBvYmoKPDwvQXV0aG9yIChSb21haW4gUGVjaGF5cmUp - L0NyZWF0aW9uRGF0ZSAoRDoyMDEwMTExNjEyNTQwMFopL0NyZWF0b3IgKE9tbmlHcmFm - ZmxlIFByb2Zlc3Npb25hbCA1LjIuMykvTW9kRGF0ZSAoRDoyMDEwMTExNjE0MTUwMFop - L1Byb2R1Y2VyIDIyIDAgUiAvVGl0bGUgKHJvdW5kZWQgcmVjdCk+PgplbmRvYmoKeHJl - ZgoxIDEKMDAwMDAzNzc1NiAwMDAwMCBuIAp0cmFpbGVyCjw8L0lEIFs8ZmMwNWEyZDNj - ZDY5MjA3Y2VmNTkwMTA0YWNhMWE3YTM+IDxmYzA1YTJkM2NkNjkyMDdjZWY1OTAxMDRh - Y2ExYTdhMz5dIC9JbmZvIDEgMCBSIC9QcmV2IDM3MTE4IC9Sb290IDE4IDAgUiAvU2l6 - ZSAyND4+CnN0YXJ0eHJlZgozNzk0MQolJUVPRgo= - - QuickLookThumbnail - - TU0AKgAAAPaAP+BP8AQWDQeEQmFQuGQ2HQ+IRGJROKRWLReMRmNQ+BwSNx+QSGRSOSSW - TSeCx2USuWS2XS+YSOVTGaTWbTecSCZzmeT2fT+YzugUOiUWjRKhUelUumT6k02oVGpS - en1OrVesROq1muV2u1uvWGxU2wWOzWef2W0Wu2UGB224XGaWq5XW7Rm6Xe9XuOW++X/A - RG84HCXrB4XEXHD4nGWjF43IWHH5HKVjJ5XMVHL5nOUrN53QUPP6HSTzR6XUTXT6nWS7 - V63YVS/bHaWnZ7XcTjX7neRfd73gUjb8HibKBcXkcaPcnmSHf83mQEAAAA8BAAADAAAA - AQBJAAABAQADAAAAAQAlAAABAgADAAAABAAAAbABAwADAAAAAQAFAAABBgADAAAAAQAC - AAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQAlAAAB - FwAEAAAAAQAAAO0BHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQABAAABUwAD - AAAABAAAAbiHcwAHAAAZ7AAAAcAAAAAAAAgACAAIAAgAAQABAAEAAQAAGexhcHBsAhAA - AG1udHJSR0IgWFlaIAfaAAoAAQALACYANGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAYmRzY20AAAG0AAACQmNwcnQAAAP4 - AAAA0Hd0cHQAAATIAAAAFHJYWVoAAATcAAAAFGdYWVoAAATwAAAAFGJYWVoAAAUEAAAA - FHJUUkMAAAUYAAAIDGFhcmcAAA0kAAAAIHZjZ3QAAA1EAAAGEm5kaW4AABNYAAAGPmNo - YWQAABmYAAAALG1tb2QAABnEAAAAKGJUUkMAAAUYAAAIDGdUUkMAAAUYAAAIDGFhYmcA - AA0kAAAAIGFhZ2cAAA0kAAAAIGRlc2MAAAAAAAAACERpc3BsYXkAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAABIAAAAMbmxOTAAAABYAAADoZGFESwAA - ABwAAAD+cGxQTAAAABIAAAEaZW5VUwAAABIAAAEsbmJOTwAAABIAAAE+ZnJGUgAAABYA - AAFQcHRCUgAAABgAAAFmcHRQVAAAABYAAAF+emhDTgAAAAwAAAGUZXNFUwAAABIAAAGg - amFKUAAAAA4AAAGycnVSVQAAACQAAAHAc3ZTRQAAABAAAAHkemhUVwAAAA4AAAH0ZGVE - RQAAABAAAAICZmlGSQAAABAAAAISaXRJVAAAABQAAAIia29LUgAAAAwAAAI2AEsAbABl - AHUAcgBlAG4ALQBMAEMARABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG0ASwBvAGwA - bwByACAATABDAEQAQwBvAGwAbwByACAATABDAEQARgBhAHIAZwBlAC0ATABDAEQATABD - AEQAIABjAG8AdQBsAGUAdQByAEwAQwBEACAAQwBvAGwAbwByAGkAZABvAEwAQwBEACAA - YQAgAEMAbwByAGUAc19pgnIAIABMAEMARABMAEMARAAgAGMAbwBsAG8AcjCrMOkw/AAg - AEwAQwBEBCYEMgQ1BEIEPQQ+BDkAIAQWBBoALQQ0BDgEQQQ/BDsENQQ5AEYA5AByAGcA - LQBMAEMARF9pgnJtsmZ2mG95OlZoAEYAYQByAGIALQBMAEMARABWAOQAcgBpAC0ATABD - AEQATABDAEQAIABjAG8AbABvAHIAac7st+wAIABMAEMARAAAdGV4dAAAAABDb3B5cmln - aHQgQXBwbGUsIEluYy4sIDIwMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADz - UgABAAAAARbPWFlaIAAAAAAAAGp6AAA8qgAABgVYWVogAAAAAAAAaHAAAKr4AAAft1hZ - WiAAAAAAAAAj7AAAGF4AAK1xY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0A - MgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACt - ALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgB - PgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6 - AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC - 9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQg - BC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYF - lgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9 - B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJ - OglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtp - C4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N - +A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5 - ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT - 5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdB - F2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwb - FBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8T - Hz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2Yj - lCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/ - KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEt - di2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLU - Mw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4 - yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7g - PyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVF - mkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxy - TLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT - 9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuV - W+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj - 62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xX - bK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1 - hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7C - fyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmI - zokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj - k02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd - 0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjE - qTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0 - nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBw - wOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXN - Nc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx - 2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/n - qegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ - 9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAA - AmZmAADypwAADVkAABPQAAAKwHZjZ3QAAAAAAAAAAAADAQAAAgAAAAgAJABXAKQBBgFG - AZMB7wJMArQDJwOgBCcEugVYBgAGtQd4CEYJGwn4CuEL0gzODdEPFBBoEbwTGRR2FdkX - SRi4Gi0bph0rHq8gOCHKI2Ak+iaTKDAp1StlLOwudS/3MXky+TRvNeM3TzixOgw7Yzy0 - Pf4/RUCFQcVC+UQeRUVGakeRSLZJ3EsBTCZNSU5tT49QsVHTUvZUGVU8VlJXalh/WZZa - rVvDXNld7l8CYBZhKWI8Y05kYWV0ZoFngGiCaYNqhGuGbIltim6Mb45wkXGTcpVzl3Sb - dZV2cndQeC15C3nqesh7pnyGfWd+SH8qgA2A8YHWgruDn4SFhXGGY4dfiGeJe4qhi9eN - HY5vj8+RPJKQk7KU1pX4lxuYQJlmmo6buZzpnhyfUqCNocqi+KQOpSamP6dZqHepmKq8 - q+WtEq5Dr3iwsbHrsx+0ULV+tqu31bj9uiS7SrxvvZW+vb/lwQ/CNsNRxGHFY8ZWxzvI - EsjcyZvKVcsNy8XMgs1GzhHO38+t0HzRStIZ0ufTs9R/1UnWEtba15nYUdkG2bzadNsu - 2+jcpd1i3iHe4N+f4F/hH+Hf4pzjVuQO5MPlc+Yg5svncugY6LzpZOoP6sLrdewo7N3t - ku5I7v/vuPBz8S/x7PLB86n0kvV29lr3P/gq+R/6I/tC/Ib+C///AAAABwAeAEoAiwDj - ASoBbgHAAhkCdALaA0cDvQRBBNIFbQYRBr0HdAg2CQAJ1QqtC44MgQ2WDswQABE8EnoT - uhUDFk8Xoxj4GlQbtB0aHoYf8iFkItYkTSXHJy8okyn3K1cssy4LL2AwsDH4Mzw0dzWt - Nt44CjkwOlY7dzyQPZ0+rD+6QMpB2ULpQ/lFCkYaRypIPUlOSmBLcUyDTZROnk+pULJR - u1LGU9BU2VXiVupX81j7WgNbC1wUXR1eIV8hYB9hHWIbYxlkFmUTZg9nCmgFaQBp+2r1 - a/Bs523YbshvtnCkcZBye3NkdEt1MXYWdvp33njCeaZ6h3tnfEp9Ln4VfwJ/84DqgemC - 8IP9hRKGLYdNiG6Ji4qni8SM4o4BjyGQQ5Fmko2TtZTglg2XPJhlmYeaqpvMnPGeF58/ - oGmhlqLGo/mlLqZmp6Co2qoUq06shq2+rvawLLFkspuz1bUPtku3ibjHugG7OrxwvaO+ - 0b/5wRvCNsNMxFzFacZyx23IWslDyivLE8v7zOLNyM6uz5PQeNFe0kPTJNQB1N3VudaU - 12/YStkl2f/a2duy3IzdZt5A3xvf9+DU4bHijeNq5EflJOYB5t3nueiU6WnqPesR6+Xs - u+2S7mrvRPAg8P3x3PK785z0jvWU9qz31fkL+kb7efyZ/Zz+gP9J//8AAAAFABYANQBk - AKQA9QEtAWoBsAIAAlMCsAMWA4ED9QRwBPUFgwYcBr4HZQgTCMYJfgpDCyoMJg0mDiUP - LhA3EUcSVxNuFIYVpRbHF/EZGRpIG3kcrR3jHxsgRCFqIo0jsCTTJfAnCyghKTUqQCtI - LEotRy5BLzYwKjEcMgYy6TPJNKo1jTZvN1A4MzkUOfU61zu4PJo9fD5eP0BAIkEFQelC - zkOzRJhFfkZjR0hILEkQSfVK2Uu8TKFNhk5pT0hQJ1EGUeVSxFOiVIFVXlY7VxlX9ljT - Wa9ajVtpXEJdG13zXsxfpGB7YVJiKGL+Y9NkqWV+ZlNnKGf6aMtpnGptaz1sDWzcbatu - eW9FcBJw3nGpcnVzO3P/dMF1g3ZDdwJ3v3h7eTJ553qbe0p7+HysfXF+Wn9HgDSBIoIQ - gv+D7YTahceGs4ediIiJcIpqi2mMaI1ojmmPaZBokWaSYpNdlFWVTJZBl0SYU5lnmnub - kZymnbqezZ/doOuh96MApAelHqZTp4+ozKoLq02ska3aryiwebHOsye0g7XctyS4aLmm - uty8C70yvlK/bMCAwZHCn8OtxLjFwsbLx9bI4snvyv7MD80jzjrPU9Bv0Y3SstPZ1QHW - KtdT2H3ZqdrW3AXdNd5n35vg7+KF5Cjl3+e/6dDsIe648af03/hc/BX//wAAbmRpbgAA - AAAAAAY2AACaPQAAWWUAAFFHAACNhAAAJdYAABcKAABQDQAAVDkAAoo9AAJFHgABjMwA - AwEAAAIAAAALACIAPQBaAHcAlQCzANEA8AEQATABUQFyAZQBrwHLAegCBgIkAkMCYwKD - AqMCxALmAwgDKwNOA3EDlQO6A98EBAQqBFAEdwSeBMYE7wUYBUEFawWYBccF9gYmBlcG - iga9BvIHJwdfB5cH0ggOCEwIjQjPCRMJWQmhCewKOAqHCtcLKQuBC94MOwyaDPoNXA3A - DiUOjA71D2APzBA6EKoRHBGPEgQSehLyE3IT8hR1FPkVfxYHFpEXHResGDwYzxlkGfsa - lBsvG8scbB0ZHcYedh8oH9wgkSFKIgQiwCN+JD8lAiXHJo0nWShHKTcqKyshLBotFi4U - LxMwFTEYMh0zIzQsNTo2RzdROFY5UjpFOy88DzzmPbY+gD9GQAhAxUGAQlFDQkQzRSdG - HUcTSAtJA0n7SvNL6UzfTdROyE+7UK5RplLAU9pU9VYRVy1YSFliWntbklyoXbtezl/f - YPBiAGMWZDNlUmZ2Z5xox2n1ayZsWm2RbslwA3E9cnlztHTwdjp3kXj6enl8FH3Qf7aB - wYPlhg2IKootjCeOJJAkkiiUMpZDmFuafZymnu+hXqPMpjiooqsKrXKv3LJJtLm3Lrmw - vEW+8cG3xJfHjcqUzYvQX9M31hDY6tvC3pbhaOQ45rbo+utU7bnwHvJ69ML26/jp+rr8 - WP26/un//wAAAA0AJwBGAGcAhwCoAMoA7AEPATIBVwF8AZ8BvgHdAf4CHwJBAmQCiAKs - AtEC9gMcA0MDagOSA7oD4wQMBDYEYQSMBLgE5QUSBUAFbgWhBdQGCQY+BnUGrgbnByMH - YAefB98IIwhoCLAI+glHCZYJ6Ao9CpMK7AtHC6sMDwx2DN4NRw2zDiAOjw7/D3IP5hBb - ENMRTBHHEkQSwhNGE8wUVBTfFWsV+RaJFxwXsRhIGOEZfBoaGrkbWhv9HKYdVB4EHrcf - bCAkIN4hmyJbIx4j4ySqJXQmQScPJ+coxCmlKokrcixeLU8uRS8/MD0xPzJEM0w0WjVs - Nn43kTihOa46tzu7PLk9sz6oP5pAikF3QmhDXURVRU5GSEdESEFJPko8SzpMOE02TjRP - M1AxUS9SOVNIVFhValZ8V49Yo1m2Wslb3FzuXgBfEmAjYTViRmNZZG5lhGaeZ7lo12n2 - axhsO21gboZvrHDTcfpzInRKdXR2o3fVeQp6Q3uBfMV+EX9kgMGCJoOUhQuGiYgOibOL - co00jvqQw5KSlGWWPJgYmfeb2Z2/n7qhu6O/pcin1annq/2uGLA2slm0frakuMy69b0h - v1HBg8O6xfTINMp3zMPPJtGL0/PWWtjB2yXdiN/p4krkqucK6S/rLu0W7ufwqvJn9Cv2 - BPgE+kP84///AAAAEgA1AFsAgwCsANUA/gEpAVUBgwGrAdEB+AIhAkoCdQKgAs0C+gMp - A1gDiAO5A+oEHQRQBIQEuQTvBSYFXgWaBdgGGAZaBp0G4gcqB3QHwQgQCGMIuQkTCXEJ - 0go3Cp8LCgt7C/MMbgzrDWoN7Q5xDvkPgxAQEKARMhHHEl4S+BOUFDIU0hV1FhoWwhdt - GBsYzBl/GjYa7xuqHGkdLx34HsMfkiBkITkiEiLuI80kryWVJn0naShcKVIqTCtJLEst - UC5aL2cweDGNMqUzwDTlNg03OThpOZ061jwUPVg+oD/tQT5Cm0QERXFG5khjSetLgE0h - TtFQjFIXU2RUslYCV1RYqFn/W1tcuV4dX4Vg8WJiY7plEGZoZ8FpHGp7a91tRG6vcCBx - l3MTdJR1+ndWeLJ6EHtvfNB+NX+dgQqCfIP0hXKG9Yh+idOLHYxojbOO/5BJkZOS3JQj - lWmWrJfvmS+ab5uunOyeLp+CoNuiOqOhpRCmiKgLqZmrMazUroCwMrHqs6a1aLcuuPe6 - wLyLvlXAH8How6/FdMc3yPnKusx5zi7P5NGb01TVDdbI2IPaPtv53bTfbuEp4uPknuYp - 537ozuoX61nske267tXv5/Dj8dvyv/Og9HD1QfX/9r33c/gj+NT5ePod+sD7XPv4/JL9 - J/28/lD+4P9v//8AAHNmMzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH///ui///9owAA - A9wAAMBsbW1vZAAAAAAAAAYQAACcpQAAAADDsZwhAAAAAAAAAAAAAAAAAAAAAA== - - ReadOnly - NO - RowAlign - 1 - RowSpacing - 36 - SheetTitle - Canvas 1 - SmartAlignmentGuidesActive - YES - SmartDistanceGuidesActive - YES - UniqueID - 1 - UseEntirePage - - VPages - 1 - WindowInfo - - CurrentSheet - 0 - ExpandedCanvases - - - name - Canvas 1 - - - Frame - {{293, 4}, {694, 774}} - ListView - - OutlineWidth - 142 - RightSidebar - - ShowRuler - - Sidebar - - SidebarWidth - 120 - VisibleRegion - {{0, 2}, {545, 605}} - Zoom - 1 - ZoomValues - - - Canvas 1 - 1 - 1 - - - - saveQuickLookFiles - YES - - diff --git a/iphone/Barcodes/design/zxing-512-rounded.png b/iphone/Barcodes/design/zxing-512-rounded.png deleted file mode 100644 index e42cb6e3560de0b8ba6cf6570c1e41e9d8d9b506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54769 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%0ARfL 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 diff --git a/iphone/Barcodes/en.lproj/About.html b/iphone/Barcodes/en.lproj/About.html deleted file mode 100644 index bc1dc4a41..000000000 --- a/iphone/Barcodes/en.lproj/About.html +++ /dev/null @@ -1,23 +0,0 @@ - - -About Barcodes - - - - - -

-ZXing Project Logo

-

Barcodes

-

Version 2.0

-

© 2008-2010 The ZXing -Authors
-

-

-Supported barcode formats: -

-

-QR Code
-

- \ No newline at end of file diff --git a/iphone/Barcodes/en.lproj/DecoderView.xib b/iphone/Barcodes/en.lproj/DecoderView.xib deleted file mode 100644 index bf75d6633..000000000 --- a/iphone/Barcodes/en.lproj/DecoderView.xib +++ /dev/null @@ -1,450 +0,0 @@ - - - - 512 - 9E17 - 670 - 949.33 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - 274 - - YES - - - 266 - {{0, 431}, {320, 49}} - - NO - NO - - YES - - 15 - - - - 1 - 5 - - - - 1 - - NSImage - filmroll-2.png - - - - - 5 - - - - 2 - - NSImage - photolib.png - - - - - 1 - 5 - - - - 16 - 10 - - - - 1 - 5 - - - - 17 - 9 - - - - - - - 274 - {320, 431} - - - 1 - MCAwIDAAA - - NO - 3 - - - {320, 480} - - - 3 - - - - - YES - - - view - - - - 9 - - - - actionBarItem - - - - 51 - - - - performResultAction: - - - - 53 - - - - toolbar - - - - 57 - - - - pickAndDecode: - - - - 60 - - - - pickAndDecode: - - - - 61 - - - - pickAndDecode: - - - - 62 - - - - cameraBarItem - - - - 63 - - - - savedPhotosBarItem - - - - 64 - - - - libraryBarItem - - - - 65 - - - - archiveBarItem - - - - 66 - - - - showArchive: - - - - 67 - - - - imageView - - - - 71 - - - - - YES - - 0 - - YES - - - - - - 1 - - - YES - - - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - -2 - - - - - 34 - - - YES - - - - - - - - - - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 54 - - - - - 55 - - - - - 56 - - - - - 58 - - - - - 59 - - - - - 70 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 34.IBPluginDependency - 35.IBPluginDependency - 36.IBPluginDependency - 37.IBPluginDependency - 38.IBPluginDependency - 54.IBPluginDependency - 55.IBPluginDependency - 56.IBPluginDependency - 58.IBPluginDependency - 59.IBPluginDependency - 70.CustomClassName - 70.IBPluginDependency - - - YES - DecoderViewController - UIResponder - {{387, 352}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ScannedImageView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 71 - - - - YES - - DecoderViewController - UIViewController - - YES - - YES - performResultAction: - pickAndDecode: - showArchive: - - - YES - id - id - id - - - - YES - - YES - actionBarItem - archiveBarItem - cameraBarItem - imageView - libraryBarItem - messageHelpButton - messageTextView - messageView - savedPhotosBarItem - toolbar - - - YES - UIBarItem - UIBarItem - UIBarItem - ScannedImageView - UIBarItem - UIButton - UITextView - UIView - UIBarItem - UIToolbar - - - - IBProjectSource - Classes/DecoderViewController.h - - - - ScannedImageView - UIView - - IBProjectSource - Classes/ScannedImageView.h - - - - - 0 - ../ZXing.xcodeproj - 3 - - diff --git a/iphone/Barcodes/en.lproj/Hints.html b/iphone/Barcodes/en.lproj/Hints.html deleted file mode 100644 index 15603d931..000000000 --- a/iphone/Barcodes/en.lproj/Hints.html +++ /dev/null @@ -1,17 +0,0 @@ - - -Barcode Hints - - - - - -

The -iPhone camera has a fixed focus depth, which works well for many -situations but is not ideal for scanning barcodes. Specifically, anything that is too close to the camera will look fuzzy -and will be difficult to decode. For best barcode scanning results:

  • Take the picture from a distance of at least 2 feet / 60 cm
  • Use the Scale and -Move screen to place the barcode centered, almost filling the screen
This will give the decoder a large picture -containing mainly the barcode, which will be the easiest for it to -decode. - \ No newline at end of file diff --git a/iphone/Barcodes/en.lproj/InfoPlist.strings b/iphone/Barcodes/en.lproj/InfoPlist.strings deleted file mode 100644 index d22c0553a..000000000 --- a/iphone/Barcodes/en.lproj/InfoPlist.strings +++ /dev/null @@ -1 +0,0 @@ -CFBundleDisplayName = "Barcodes"; \ No newline at end of file diff --git a/iphone/Barcodes/en.lproj/Localizable.strings b/iphone/Barcodes/en.lproj/Localizable.strings deleted file mode 100644 index 9e7bebedf..000000000 --- a/iphone/Barcodes/en.lproj/Localizable.strings +++ /dev/null @@ -1,174 +0,0 @@ -/* Add Contact? */ -"AddContactAction alert message" = "Add Contact?"; - -/* Cancel */ -"AddContactAction cancel button title" = "Cancel"; - -/* Add Contact */ -"AddContactAction confirm button title" = "Add Contact"; - -/* Add Contact */ -"AddContactAction title" = "Add Contact"; - -/* Call %@ */ -"CallAction action title" = "Call %@"; - -/* Call */ -"CallAction alert button title" = "Call"; - -/* Call %@? */ -"CallAction alert message" = "Call %@?"; - -/* Call */ -"CallAction alert title" = "Call"; - -/* Compose */ -"SMSAction alert title" = "Compose"; - -/* Contact */ -"Contact Result Type Name" = "Contact"; - -/* No barcode detected. */ -"Decoder BarcodeDetectionFailure" = "No barcode detected."; - -/* Decoding ... */ -"Decoder MessageWhileDecoding" = "Decoding ..."; - -/* ZXing */ -"DecoderViewController AppTitle" = "Barcodes"; - -/* Cancel */ -"DecoderViewController cancel button title" = "Cancel"; - -/* About */ -"DecoderViewController about button title" = "About"; - -/* Hints */ -"DecoderViewController Hints MessageViewController title" = "Hints"; - -/* About */ -"DecoderViewController About MessageViewController title" = "About"; - -/* Decoding image (%.0fx%.0f) ... */ -"DecoderViewController MessageWhileDecodingWithDimensions" = "Decoding image (%.0fx%.0f) ..."; - -/* Please take or choose a picture containing a barcode */ -"DecoderViewController take or choose picture" = "Please take or choose a picture containing a barcode"; - -/* Email %@ */ -"EmailAction action title" = "Email %@"; - -/* Compose */ -"EmailAction alert button title" = "Compose"; - -/* Compose Email to %@? */ -"EmailAction alert message" = "Compose Email to %@?"; - -/* Compose Email */ -"EmailAction alert title" = "Compose Email"; - -/* %@ */ -"EmailParsedResult Display: Body" = "%@"; - -/* To: %@ */ -"EmailParsedResult Display: Recipient" = "To: %@"; - -/* Subject: %@ */ -"EmailParsedResult Display: Subject" = "Subject: %@"; - -/* Email */ -"EmailParsedResult type name" = "Email"; - -/* Geo: %@ */ -"GeoParsedResult display" = "Geo: %@"; - -/* Geolocation */ -"GeoParsedResult type name" = "Geolocation"; - -/* Open URL */ -"OpenURLAction action title" = "Open URL"; - -/* Open */ -"OpenURLAction alert button title" = "Open"; - -/* Open URL <%@>? */ -"OpenURLAction alert message" = "Open URL <%@>?"; - -/* Open URL */ -"OpenURLAction alert title" = "Open URL"; - -/* Cancel */ -"OpenURLAction cancel button title" = "Cancel"; - -/* Scan Archive */ -"ScanArchiveTitle" = "Scan Archive"; - -/* Scan */ -"ScanViewController title" = "Scan"; - -/* Show on Map */ -"ShowMapAction action title" = "Show on Map"; - -/* Show */ -"ShowMapAction alert button title" = "Show"; - -/* Show location %@ on Map ? */ -"ShowMapAction alert message" = "Show location %@ on Map?"; - -/* Show on Map */ -"ShowMapAction alert title" = "Show on Map"; - -/* Compose SMS to %@ */ -"SMSAction action title" = "Compose SMS to %@"; - -/* Compose */ -"SMSAction alert button title" = "Compose"; - -/* Compose SMS to %@? */ -"SMSAction alert message" = "Compose SMS to %@?"; - -/* SMS */ -"SMSParsedResult type name" = "SMS"; - -/* Tel */ -"TelParsedResult type name" = "Tel"; - -/* Text */ -"TextParsedResult type name" = "Text"; - -/* URI */ -"URIParsedResult type name" = "URI"; - -/*Latest result will appear here once you have scanned a barcode at least once*/ - -"Latest result will appear here once you have scanned a barcode at least once" = "Latest result will appear here once you have scanned a barcode at least once"; - -/*Back*/ -"Back" = "Back"; - -/*Button title when no action is available for latest results*/ -"No Actions" = "No Actions"; - -/*Button title when multiple actions are available*/ -"Actions ..." = "Actions ..."; - -/* Place a red line over the bar code to be scanned. */ -"OverlayView 1d instructions" = "Place a red line over the bar code to be scanned."; - -/* Cancel */ -"OverlayView cancel button title" = "Cancel"; - -/* Place a barcode inside the viewfinder rectangle to scan it. */ -"OverlayView displayed message" = "Place a barcode inside the viewfinder rectangle to scan it."; - -/* Cancel */ -"OverlayView license alert cancel title" = "Cancel"; - -/* Scanning functionality provided by ZXing library, licensed under Apache License version 2.0. */ -"OverlayView license alert message" = "Scanning functionality provided by ZXing library, licensed under Apache License version 2.0."; - -/* License */ -"OverlayView license alert title" = "License"; - -/* View License */ -"OverlayView license alert view title" = "View License"; diff --git a/iphone/Barcodes/en.lproj/MainWindow.xib b/iphone/Barcodes/en.lproj/MainWindow.xib deleted file mode 100644 index f265131fb..000000000 --- a/iphone/Barcodes/en.lproj/MainWindow.xib +++ /dev/null @@ -1,362 +0,0 @@ - - - - 512 - 10H542 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1292 - - {320, 480} - - - 1 - MSAxIDEAA - - NO - NO - IBCocoaTouchFramework - - - - - YES - - - delegate - - - - 9 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - - YES - - - {{229, 113}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ZXingAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 15 - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Barcodes.xcodeproj - 3 - 132 - - diff --git a/iphone/Barcodes/en.lproj/Message.xib b/iphone/Barcodes/en.lproj/Message.xib deleted file mode 100644 index de0dc8a28..000000000 --- a/iphone/Barcodes/en.lproj/Message.xib +++ /dev/null @@ -1,424 +0,0 @@ - - - - 768 - 10H542 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 274 - {320, 436} - - - 1 - MSAxIDEAA - - YES - IBCocoaTouchFramework - 1 - YES - - - {320, 436} - - - 3 - MQA - - 2 - - - - NO - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 13 - - - - webView - - - - 17 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 12 - - - YES - - - - - - 16 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 12.IBEditorWindowLastContentRect - 12.IBPluginDependency - 16.IBPluginDependency - - - YES - MessageViewController - UIResponder - {{1, 33}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 19 - - - - YES - - MessageViewController - UIViewController - - dismiss: - id - - - dismiss: - - dismiss: - id - - - - YES - - YES - delegate - webView - - - YES - id - UIWebView - - - - YES - - YES - delegate - webView - - - YES - - delegate - id - - - webView - UIWebView - - - - - IBProjectSource - Classes/MessageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Barcodes.xcodeproj - 3 - 132 - - diff --git a/iphone/Barcodes/fr.lproj/About.html b/iphone/Barcodes/fr.lproj/About.html deleted file mode 100644 index 8dafd3b3a..000000000 --- a/iphone/Barcodes/fr.lproj/About.html +++ /dev/null @@ -1,23 +0,0 @@ - - -A propos de Barcodes - - - - - -

-ZXing Project Logo

-

Barcodes

-

Version 2.0

-

© 2008-2010 The ZXing -Authors
-

-

-Format de codes barres supporté: -

-

-QR Code
-

- \ No newline at end of file diff --git a/iphone/Barcodes/fr.lproj/DecoderView.xib b/iphone/Barcodes/fr.lproj/DecoderView.xib deleted file mode 100644 index bf75d6633..000000000 --- a/iphone/Barcodes/fr.lproj/DecoderView.xib +++ /dev/null @@ -1,450 +0,0 @@ - - - - 512 - 9E17 - 670 - 949.33 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - 274 - - YES - - - 266 - {{0, 431}, {320, 49}} - - NO - NO - - YES - - 15 - - - - 1 - 5 - - - - 1 - - NSImage - filmroll-2.png - - - - - 5 - - - - 2 - - NSImage - photolib.png - - - - - 1 - 5 - - - - 16 - 10 - - - - 1 - 5 - - - - 17 - 9 - - - - - - - 274 - {320, 431} - - - 1 - MCAwIDAAA - - NO - 3 - - - {320, 480} - - - 3 - - - - - YES - - - view - - - - 9 - - - - actionBarItem - - - - 51 - - - - performResultAction: - - - - 53 - - - - toolbar - - - - 57 - - - - pickAndDecode: - - - - 60 - - - - pickAndDecode: - - - - 61 - - - - pickAndDecode: - - - - 62 - - - - cameraBarItem - - - - 63 - - - - savedPhotosBarItem - - - - 64 - - - - libraryBarItem - - - - 65 - - - - archiveBarItem - - - - 66 - - - - showArchive: - - - - 67 - - - - imageView - - - - 71 - - - - - YES - - 0 - - YES - - - - - - 1 - - - YES - - - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - -2 - - - - - 34 - - - YES - - - - - - - - - - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 54 - - - - - 55 - - - - - 56 - - - - - 58 - - - - - 59 - - - - - 70 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 34.IBPluginDependency - 35.IBPluginDependency - 36.IBPluginDependency - 37.IBPluginDependency - 38.IBPluginDependency - 54.IBPluginDependency - 55.IBPluginDependency - 56.IBPluginDependency - 58.IBPluginDependency - 59.IBPluginDependency - 70.CustomClassName - 70.IBPluginDependency - - - YES - DecoderViewController - UIResponder - {{387, 352}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ScannedImageView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 71 - - - - YES - - DecoderViewController - UIViewController - - YES - - YES - performResultAction: - pickAndDecode: - showArchive: - - - YES - id - id - id - - - - YES - - YES - actionBarItem - archiveBarItem - cameraBarItem - imageView - libraryBarItem - messageHelpButton - messageTextView - messageView - savedPhotosBarItem - toolbar - - - YES - UIBarItem - UIBarItem - UIBarItem - ScannedImageView - UIBarItem - UIButton - UITextView - UIView - UIBarItem - UIToolbar - - - - IBProjectSource - Classes/DecoderViewController.h - - - - ScannedImageView - UIView - - IBProjectSource - Classes/ScannedImageView.h - - - - - 0 - ../ZXing.xcodeproj - 3 - - diff --git a/iphone/Barcodes/fr.lproj/Hints.html b/iphone/Barcodes/fr.lproj/Hints.html deleted file mode 100644 index 15603d931..000000000 --- a/iphone/Barcodes/fr.lproj/Hints.html +++ /dev/null @@ -1,17 +0,0 @@ - - -Barcode Hints - - - - - -

The -iPhone camera has a fixed focus depth, which works well for many -situations but is not ideal for scanning barcodes. Specifically, anything that is too close to the camera will look fuzzy -and will be difficult to decode. For best barcode scanning results:

  • Take the picture from a distance of at least 2 feet / 60 cm
  • Use the Scale and -Move screen to place the barcode centered, almost filling the screen
This will give the decoder a large picture -containing mainly the barcode, which will be the easiest for it to -decode. - \ No newline at end of file diff --git a/iphone/Barcodes/fr.lproj/InfoPlist.strings b/iphone/Barcodes/fr.lproj/InfoPlist.strings deleted file mode 100644 index d22c0553a..000000000 --- a/iphone/Barcodes/fr.lproj/InfoPlist.strings +++ /dev/null @@ -1 +0,0 @@ -CFBundleDisplayName = "Barcodes"; \ No newline at end of file diff --git a/iphone/Barcodes/fr.lproj/Localizable.strings b/iphone/Barcodes/fr.lproj/Localizable.strings deleted file mode 100644 index 192a77343..000000000 --- a/iphone/Barcodes/fr.lproj/Localizable.strings +++ /dev/null @@ -1,152 +0,0 @@ -/* Add Contact? */ -"AddContactAction alert message" = "Ajouter le concact?"; - -/* Cancel */ -"AddContactAction cancel button title" = "Annuler"; - -/* Add Contact */ -"AddContactAction confirm button title" = "Ajouter Contact"; - -/* Add Contact */ -"AddContactAction title" = "Ajouter Contact"; - -/* Call %@ */ -"CallAction action title" = "Appeler %@"; - -/* Call */ -"CallAction alert button title" = "Appel"; - -/* Call %@? */ -"CallAction alert message" = "Appeler %@?"; - -/* Call */ -"CallAction alert title" = "Appel"; - -/* Compose */ -"SMSAction alert title" = "Ecrire"; - -/* Contact */ -"Contact Result Type Name" = "Contact"; - -/* No barcode detected. */ -"Decoder BarcodeDetectionFailure" = "Aucun code barre detecté"; - -/* Decoding ... */ -"Decoder MessageWhileDecoding" = "Décodage ..."; - -/* ZXing */ -"DecoderViewController AppTitle" = "Barcodes"; - -/* Cancel */ -"DecoderViewController cancel button title" = "Annuler"; - -/* About */ -"DecoderViewController about button title" = "A propos"; - -/* Hints */ -"DecoderViewController Hints MessageViewController title" = "Conseils"; - -/* About */ -"DecoderViewController About MessageViewController title" = "A propos"; - -/* Decoding image (%.0fx%.0f) ... */ -"DecoderViewController MessageWhileDecodingWithDimensions" = "Décodage de l'image (%.0fx%.0f) ..."; - -/* Please take or choose a picture containing a barcode */ -"DecoderViewController take or choose picture" = "Veuilez prendre ou choisir une photo contenant un code barre"; - -/* Email %@ */ -"EmailAction action title" = "Email %@"; - -/* Compose */ -"EmailAction alert button title" = "Ecrire"; - -/* Compose Email to %@? */ -"EmailAction alert message" = "Ecrire un mail à %@?"; - -/* Compose Email */ -"EmailAction alert title" = "Ecrire un Email"; - -/* %@ */ -"EmailParsedResult Display: Body" = "%@"; - -/* To: %@ */ -"EmailParsedResult Display: Recipient" = "A: %@"; - -/* Subject: %@ */ -"EmailParsedResult Display: Subject" = "Sujet: %@"; - -/* Email */ -"EmailParsedResult type name" = "Email"; - -/* Geo: %@ */ -"GeoParsedResult display" = "Geo: %@"; - -/* Geolocation */ -"GeoParsedResult type name" = "Geolocalisation"; - -/* Open URL */ -"OpenURLAction action title" = "Ouverture d'URL"; - -/* Open */ -"OpenURLAction alert button title" = "Ouvrir"; - -/* Open URL <%@>? */ -"OpenURLAction alert message" = "Ouvrir l'URL <%@>?"; - -/* Open URL */ -"OpenURLAction alert title" = "Ouverture d'URL"; - -/* Cancel */ -"OpenURLAction cancel button title" = "Annuler"; - -/* Scan Archive */ -"ScanArchiveTitle" = "Archives de Scans"; - -/* Scan */ -"ScanViewController title" = "Scan"; - -/* Show on Map */ -"ShowMapAction action title" = "Afficher dans Plans"; - -/* Show */ -"ShowMapAction alert button title" = "Afficher"; - -/* Show location %@ on Map ? */ -"ShowMapAction alert message" = "Afficher ce lien %@ dans Plans?"; - -/* Show on Map */ -"ShowMapAction alert title" = "Afficher dans Plans"; - -/* Compose SMS to %@ */ -"SMSAction action title" = "Ecrire un SMS à %@"; - -/* Compose */ -"SMSAction alert button title" = "Ecrire"; - -/* Compose SMS to %@? */ -"SMSAction alert message" = "Ecrire un SMS à %@?"; - -/* SMS */ -"SMSParsedResult type name" = "SMS"; - -/* Tel */ -"TelParsedResult type name" = "Tel"; - -/* Text */ -"TextParsedResult type name" = "Texte"; - -/* URI */ -"URIParsedResult type name" = "URI"; - -/*"Latest result will appear here once you have scanned a barcode at least once"*/ -"Latest result will appear here once you have scanned a barcode at least once" = "Le dernier résultat apparaitra ici une fois que vous vous aurez scanné un moins un code barre"; - -/*Back*/ -"Back" = "Revenir"; - -/*Button title when no action is available for latest results*/ -"No Actions" = "Aucune action"; - -/*Button title when multiple actions are available*/ -"Actions ..." = "Actions ..."; \ No newline at end of file diff --git a/iphone/Barcodes/fr.lproj/MainWindow.xib b/iphone/Barcodes/fr.lproj/MainWindow.xib deleted file mode 100644 index e0a569241..000000000 --- a/iphone/Barcodes/fr.lproj/MainWindow.xib +++ /dev/null @@ -1,171 +0,0 @@ - - - - 512 - 9C7010 - 658 - 949.26 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - - 1292 - - {320, 480} - - - 1 - MSAxIDEAA - - NO - NO - - - - - YES - - - window - - - - 5 - - - - delegate - - - - 9 - - - - - YES - - 0 - - YES - - - - - - 2 - - - YES - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - 3 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - YES - - - YES - - - {{229, 113}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ZXingAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 11 - - - - YES - - ZXingAppDelegate - NSObject - - window - UIWindow - - - IBProjectSource - Classes/ZXingAppDelegate.h - - - - - 0 - ZXing.xcodeproj - 3 - - diff --git a/iphone/Barcodes/fr.lproj/Message.xib b/iphone/Barcodes/fr.lproj/Message.xib deleted file mode 100644 index de0dc8a28..000000000 --- a/iphone/Barcodes/fr.lproj/Message.xib +++ /dev/null @@ -1,424 +0,0 @@ - - - - 768 - 10H542 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 274 - {320, 436} - - - 1 - MSAxIDEAA - - YES - IBCocoaTouchFramework - 1 - YES - - - {320, 436} - - - 3 - MQA - - 2 - - - - NO - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 13 - - - - webView - - - - 17 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 12 - - - YES - - - - - - 16 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 12.IBEditorWindowLastContentRect - 12.IBPluginDependency - 16.IBPluginDependency - - - YES - MessageViewController - UIResponder - {{1, 33}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 19 - - - - YES - - MessageViewController - UIViewController - - dismiss: - id - - - dismiss: - - dismiss: - id - - - - YES - - YES - delegate - webView - - - YES - id - UIWebView - - - - YES - - YES - delegate - webView - - - YES - - delegate - id - - - webView - UIWebView - - - - - IBProjectSource - Classes/MessageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Barcodes.xcodeproj - 3 - 132 - - diff --git a/iphone/Barcodes/images/Default.png b/iphone/Barcodes/images/Default.png deleted file mode 100644 index 2740b6ce14dfcd2cb22934e15ebb65886c2d8703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48476 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 diff --git a/iphone/Barcodes/images/Default@2x.png b/iphone/Barcodes/images/Default@2x.png deleted file mode 100644 index 505c4a40a97f4211bf5c85bccedc9f530e516ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122298 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%0D|suTp5^{ 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 RHx%R}C#5V|D{dO{{{TZG7M}nB diff --git a/iphone/Barcodes/images/LatestResultBackground.png b/iphone/Barcodes/images/LatestResultBackground.png deleted file mode 100644 index e34dc5c8a51ba0a38a4f8585f20d471911138d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9901 zcmeHLWm8>Evpr~V5AN*P)l{#U z>FMsZdPgZKNFu`F!T|sPL}@886#xK?^K+gH1O55cl#tH{0I<}pMMagQMMa5~TpTT| z?aToHPp}1TODzo9hKr2Yv-(hq!)&%B*U6*?DV^CQZI^^HYGT^R$UxFU>iqnCa&&27 zaSRj;3K~+8|3;?lD z=s6LJY?RQII>3lbhMfTkFpnz|kd2KMYjg_;*0vr7N9Aja4f)tgu|NC3Go9`+&nAck z>vaMTEPc2sf`Sl26F&-u{b?kIJOT-z=VlGWg#|?O2H#PW_=5qQQb<_qQBjrGT9Nyb z-amd(J#NWsqWDQy;m@ zL^iA$vKm5w%fA;6IH4?zgW?h7e*M*Um>T@Ctj9$^>g|I#tXGR$3%yN@@&^KURuY`s z2qGqE#IOq=2HYQp3T%5YnE4924|O<_+Dr~380sU5?H&2Y%B6GPaO+2nGKvz)%45L6 zD_a&Z>)|F(IWeFwVD2q}yV+~4GWxE-;=^{bhobrJ%^=n!WT$W^zGo>EQ@v*75 z^{kuuJoOe(1yG7eT}%Bi00TG&Ne>GEdbwzMG9(a@qR`pJzB}Ys<(rd>8)ztLD@!|P zy?y+$4`_I&zmML%bVU90eq`7K!6b-nG_Wc`to8!Z!Rd^?WCwk@l6a+pycWilg0v=v-wOtJ zg2ac|&xe~2gx^B5g0|m+K7#h>gSf(u3BoeM91o$W1@8`$hY5BnU&o-yP*U{ZIc1zW|l z2!0xbIQYv1*+kJKt5$#6_zeI1*N6eyk(BSB6&@f3P0uAu%e6QgKU3ETJ?xkMs+AeX4b`cCU7Ma5mxKd|4;T zP_%j&^H7O?f`0OC_(UlTN*gqSNHr76x){$4E+JoOy;7<<**Uy9pP8XKqC!E%O>sft zk1#RPsAL4G++wa-5*32-Gn;0EUgap7`HaCN(aoN%3>T@GBoImbCWIKjGPxP&=>b#8K& zcP?rxX(MPwZ&P&M+%`Bc-k&)rxZ1m6zu`L!^D6No@KW`%_59+c`SkcS{#5v+aCHY_ zxM{e-yNUp%U2X0dVi=)Lqvyl@gaKlDQVmmDQDZY|Q7%)plK!DHBf(%&V_+w5q@gD{ zBh6+2lJilBpv<7aqS2rpqiUmmMOmlGq+BI_){9Y)6QvhBYt`ym_Hc%E=DdE}vEOl| z;G&?XP$9=9r=*ZhdQM_VvLw%wGA>~+?k`r5;ZF@OQ7;iKrYj~I>1DNHRm(_b9jM3F zmS2%tVXIf%KiWswN87{QGZ<|cTN}0mEu<6-s67ZfM#dOl*q)%tE z)ve~Oq$)eC^w4qCFqGO<{D^s{gFp=dgy@7oiP8)x4Mc|%#bCr*Ni4;5IR6SQ6 zSLalXRU58ItxenUc=YpDe8$1= z=X&O0;tX=G@OVD3+w)z13X3k5?UaqDE2>Ph%{lepL~k)^(e{9P;J-lTYvnH^JkRA) z)SS|pTG0R15qF;XpmH~Qhr7v8$7}t-@91#pbeSa(Bj7K<(2Z@#x#_)0S!F z;f?N1llt$^-Jd0ZkiewCL80~Do!&6w_57XumcI5r$q+2jTTvO&)bhXcE+?f*(bE;v zm&V_X4+on2*ZZ?buTZ;D2@>~)Ylpk3-^+^2wyiRbfJZCX)#;`zbnLb|_VgGXyv_V^ zUty8H>{9GL4ED%P%a%!L$-2qgNt-DAki(TrRhX1DkYbVLPWz!yQhZ+wTVh_)1vG6f z{X9fzWTFn?G4j}sK%=Msza&cm6n(0sb^`nV#BFmwCA^-r0R{$GW;V0h^$j z1g9i(^SZV?3w|qf)zsv+ygNYvQ8sHmXHIu^Whv8E@%C{mvzD{q7(>Rc(>C?5yI42u z)`4?{GqaxRXEysBskTqmO13ViGP+W0b{�P7&&oilyHVn@&MXQ=2I5%FfB>2iv-# zx;~Ef>k4gMt6$fffCNDPrQNxk!lkYU={(WRX@XN;2#<-2`+L0mO~Pq{R%gXigCW1z z7klJ+!bYSDBm|WfDqsI%;+@rwR z)8!?>gNJUCE*gCltumj=*ZaSPD?7U$9UBu&;!O68huxO`hEKwvfrWTzqA!|2%>%(1 z0ee4z$FS3}r{A=OJ{sqmr9I-lYp=OIf1AD=>zj534A`3*vt56=kX%tL&&%nl3XpdY zx3d?2nR)de0;evH2nhx}`Vx+i@Ff7ZSpcCmg4~0Su;ltdC^(S2iCW8u*E}C#3m05waqCext*!BlJ(k~p43zD1S~6l0XiByyJs`xZOv!e5cTs*1 zxC-)Hc`JT(r)~!G4{{dP?#m!qna`f?GH%=ULVZg7QiLRqHHcqA5Y11hi5fs3lxmen zo+c;fpT?S?la<;*#kEc<%9H%_iN==i#am%v!|%n!h33T%3G%SyKog6PVUHKX{ZTnl z;X1Ksf?{`QG4AFkPBsj!pxTUbo9B;~(Q7y3yEislOPtB5rIWme)&wn0jesKKceJ*d zR+?i_3Y{zixaRrql9q3cu}vRm7+ntTWG4r8x}1(v9&GnzcRaUG>jgmf^Cd!JWVwyX z)=N;}?bf8xy=Vi;K|zLO8eu7-Zmd%*eM~do2zCQLRlHz;_fEzDuZpowh$bR|5AQ8QQ zou8dy)LZeD^^@yETKn(8O4v=lp3~pbzv1m7?Qq|Q-^78dB4_cUq~dhs;MpO?iLKS} z2f@2rht#g~^5lPs`oxSf>NuU9Jvn%UI3-%e_{8$WY0a_Cz{h#^Fj5u1VRR5kA|B$l zuuZ88IK1lxO^JZ@?-ue7K2u5O5?RA~6IL6bK-M(**bs%c7VvlR%0>%}-1()TUg8MOr38C|A!| zn#N75m_qDS?WUkDqklsyP4-T*RlP5TF4aCyRJ0rmWa~ET9@7~&7)5R3#*z`_Ve%gEd!mq`A6TVVkuX}t)gnB>=dwCTad~S z&+Yv-?C`D%u^G#iY2D`ayY{_|kgNFEGRI$y)8@|mcZH+&#n_`Pj+Su8-yS!_??!Wn z?h)Q;i$pA2UQ>_V;}EG|vO<0nA|Y@H@H}%_FZ=xQRJ(<}HM6NQ?cB4TXRCy*i>f|E zXUe2PR)CVn8^0R&&GQ3+Ml1W2Bd#k0(oR%ecmU?;oeA zrw7F38|h4YJb?6sln)gNgBNFvj{8w9g+dWltX6_(MsHTVH@=VfbsnQ6#WSUDG@AFK ze7+L1LcDy<_H5d0L2tpkV!cMSChON>wWATST_lShJ1(mO3k{n*XHmMY*02t%c8!j_ z)@E(_Mux3yQ$uZ(cqBHki($+&>=ZC zRew}VvPyDFqH7!J0<6E`%hM_Ql>kt0Q0LL>H26th zLVtqj{J=aJN#xQa(YpSQ%lNPPt5)fZxu`AB{Ex!X)#RK~LJj#GgNkJF>m{BX zL0{wA+~wLElbMo3`J}Yu-v~`odJ}EmRw!2qXO-8uy+S-ypHg?vuWH6G3UezqWc|)P zye|Zfh=@GhFL&PzLt>D{!y5^?`QvaI@vRASutWZq5pKcX~9i?4;YJuy59 zuflJfuh;h#Q4%oHG3e3i(IntKqKczWqWetVcEZpIlMYl)W?5N9>VYn2pei`}A9ga? zqrSXiYG&$9^WzHy?0OsoO>#|N-LTy^j+#%*PqJ{f5HGMTaJjMZGR~M&n0MJM>xgv< z={c*rwU}1N&wNdIjXc)7X9^bU#*W)=D(D)rvOB^edMrheD9=jBxZs}V4&hX5uXEqD6+_HE zxqP8OiXud1NTpY1U;jw+}PYY^E5yZ#e*3T zASfjSUJil`d6U}T63`0APV^4MOM253Zu#u2vFHQM?!m6W$die}dkQ=gtN1b0W3>E{ zQJ_Z-NE4kiBK^&ud~T_^4047Tac5ma-Vep+_paHE2(SYor&{KI9d!E ze3GBaVeyTbRsDv`chE1m=O67d&!d#Qc4~a;0}HbY(d-o*culK~zfawcnve9SnK*|z z<=Ej^HtcsyY-}xz9ZZa^$}LMwtIdn*R3|hB9U{7tLV}BaC5JV1$d=h=t{Fez#%oOZ zbWnB)ctQ}>|BlS7=)oBzBW87SoG#yrODLUpG|t{$MeR;(Q^qQiH2r20wp+Eci)Mp1 zlmtujw_MxWV>W{goVBB2&{gIh)%6C6d9Mj$8crR_9{-qukr9@Dfo7NQy31r|@4RC2 z|h|Au&BI{Ya1HM{TXj2lr#;IOi>{_rT*2(D5ZXan2NL7z`_sXNE}% z&PDh{08uK(5)m`Fddu^X{S{?HNV)*1{6&eN%)?5+tmRVNgV;wOe>aw9h;P8fgg-HJ zlrEcHMfmtH+cwQ3l3B#ibS%m|thyLDOUh%IK$3qHhK%jyXtcxV`Fxa2UwNIndEG+xSX z$za-JihXK(GE*8`21};Pa+Ip{Vzn|~2g$V2PF!hy)sPA=6Q1R9J9i2R#Prmn0{-B3aH)vLmb<^)Y0?k@M)8}#OQcmKMtY8?JIwcO&KfQtE^Y-;VM#B^@}UN?}aj1kAg0VR>Wmv zqBHbbQt@FZmhXP^v0RD`)@9TOUw8D$y7+TfiCndLi7!W(6maX^YBKK?!!B?|f7rGW zeOF$|mdI3MFwrG&Ct*YKc0SD;M-jhY_>e>NSAel<+|T>^={{}Fut*b8v!#3em9T@d z{@#q=I>fQacFxxIT=H5mDv#5DE$4$UsGc#s+n`Z8sM3*LQSo80XjdysJOmHz&znjE_M#w`L_|s!%k=V*?nhFEJARUB+kjQUD z>%UvDX3XW}AG0~OM5QPif|j&)d>nXew~*P7qF-k$F)b#!!QGZmko&Bltizws>Z zF}pqO3`T#@M&!4QAl*j0<&3tqk94Okq5Si&kO2~$DFq8Z!>`gInLS@%&qlz<+nw!V z75De9K=@gwSI)E5Cb}l0zTmSVqJY=2j*IqF$1tNgn*7OGnC5FEK1o0jk(^Ml{6o&q zBJmup{XO50di6?;xBW0IgU7Z#H3ej4suvI}Tg#N-N9S$#%f;MuWirjynz^}oPhyUR z`8TZM12f)j4oDQCElOCc-s5eX!qQU9Xkhg<)e7Nix1SGVXENED>G-(3!)4@{aap+5 zPJbBulvVA>eIz7aLz7aBBqYis3sm8FMOD@7dK5aUeQ&W>Pf6lk|I+g+oO(L14 zYTdNWdh@ZJ&j_+?RI;%5dXj4#m?5&j1N$^ag+$w)*#ow@25c@bw<^YcTkC#4p_^#f zO654Gfn$*G>gyBEX-bi~KAD}JU8$F^Ek}a~hr!4aVrI$uX21G-WBFC0h#gDN_t8nj zmEMj$v(4{*#S&Ip(9cxC-Tm%|ND$%X38E|gXHW^vz+i~TIqos!=ySfbfF2c}2G!!T zedb_wujneQ4i;x-3L2V|a(F$y4YxHzwKK^64A#s8F@eJnE3tzM3#6o_F|F4c5AYq! z+|Xynh;LJJ9-YuLY8x8%C^@{9QD@#;Lw?>UU5^-s^U40@%;&PJ#Xttl-rnAHK)%$o zy1M$=B%^q%dfWe2N2GOv>>sY#C+>(@RaH%mL)>lZPiY;u4TkKt!L_wD4&bbdln%~2 zSkdG}7}Is+XV_un2$8fTfnMhR$TD?dgc@Kw)Y*Nj+}5BC!rV9?L*9;dfU$-FgQP@H zc$FDD9jU3QVV-+`P^I-!om03ZirUDwqv{O*hm-Y*gVt5I@mNk)`ganjQceuq$+o0x zHZCH9L}7-p${!qMH5ab6_G6bFvrz5J3eQmr{%4ocJ3Krb`ud~4x{Rj;=U>$Lz@a#7 zq9??Y1qwOC4kM!li_S3vO+cHE3h9eqHOJgSKF#zDh2F`=h?g5_5n4_If<6A#7EAEZ ztOl?meMppASQLkER23*fy%~V*1G`=;EHFsB&((=2T1XTpN}*P6Jmyt#09Y1a+rqUF z4h%B;(_j)h<~yoT@8{}DcA3b3aR2%4zd-qal@+1esZ0zE6S9}>_5YL%Ba}+H+D~KS zR`CESdd%qNmCq6b*$F$pxCjl#NdgRyh>+}jW4Vn6fD77#W&A{p$BOK)?(Edt9D8_p zK*soy-XFWP!~I#|N_wZKr}Nn{36gA*ja&EOhbqX{*VoeqE^eM!nzqOINIy3dY!^yb zbZN}6x3%pkM2sDtou9|J#SGImG|VH6JBTOX{VtF-fppx#xXvZw>K8g8oW` z-kQG+a+1lW^rTQHfijHx?LVW3cD=cHT3rt(Awohz-s-EdzP5Vf+Wcb`agzMQ#m2-> zvS^OQNLOPdiTK@>fdc zDr>|dapsJgZ+x=q#;3-)^8<}gRqM7mtTRTGLS!bf!p8`>sea&gBYaYDD{Vdw2R>aC z#h%mc4&Cog5VDuQ@%d^~SI77Bldi*DpL(83__{(Ty3R7H-RGXio#?UH*x2CmH2HEdw=Zz|SIhb-|=h$<%s4KZoD$)X6TIBvbt}yrJ zHw$nLo|?Ku@n}p$0&bV$(oYTK_XOHER}^^K6IfZfLRaLg^Zpxy!=WQcyS3x35C`>7 z{D48aO}gLh1di9ZeYlLRW-J-_R3G0h845mL4Iq15EZ2!Tf*sH4u1M^wOpk`@@{?EX ze7>Rl7(vh1n}dl;-CCo*PDR1D#{0SO?&yNhHX}!rtZ&HR4IPj9vufz6xwD~(P-bba%IZIt)-U!Q;faXK{KU| zZn{ixW@ZZ?IZ^>q(@c_yUD0@$9t48!oj13~bDDd=fZuuy3lCJ;mdQ(n`|aDm)V+}u z2xa!)TN+<~7-!lk8rGXhi>s@vi&G}kTwa_qc1(XKp&07(b~f>C9g+RFPoT7rr4dt44jv<<<5;7sz0h-d(SFya{tj6$72zWd8XL}5g7FQ6f5itt>Kj~n$_y7O^ diff --git a/iphone/Barcodes/images/LatestResultBackground@2x.png b/iphone/Barcodes/images/LatestResultBackground@2x.png deleted file mode 100644 index 5654f3e4498b237d103cb8a44de9a84d28136074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16527 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%0A@? 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 WO%L-RbN2&~NU!BoUzN)k2mKHE!o2SQ diff --git a/iphone/Barcodes/images/Scanning.png b/iphone/Barcodes/images/Scanning.png deleted file mode 100644 index c69fd092b888eeb41bfa46dd6a02926283eb6bfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4337 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 diff --git a/iphone/Barcodes/images/Scanning@2x.png b/iphone/Barcodes/images/Scanning@2x.png deleted file mode 100644 index a9d574a163279efe877ef3ac06858f5850fde786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7223 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 diff --git a/iphone/Barcodes/images/ZxingLarge.png b/iphone/Barcodes/images/ZxingLarge.png deleted file mode 100644 index e2904a9e79154329a717309f6459c65b211915a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19016 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 Bys-cP diff --git a/iphone/Barcodes/images/business-card.png b/iphone/Barcodes/images/business-card.png deleted file mode 100644 index 1cf65fcbf73a3acbc9d9b527e1f5394df784c476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmV-U0kQsxP);lA+>Ky2XYV z<)jE`aVh#@&yIi_KY3_R7da;s5{u diff --git a/iphone/Barcodes/images/clickHere.png b/iphone/Barcodes/images/clickHere.png deleted file mode 100644 index 7f5f19ca03a9cd0790247189cdb97fc86fed96f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6848 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 diff --git a/iphone/Barcodes/images/icon@2x.png b/iphone/Barcodes/images/icon@2x.png deleted file mode 100644 index 82fad7b25385f5f6cf2592e8a04034b273d829a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10959 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

mslMH0ws$G3VnmsZ%&#ifCvmjS@ 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 diff --git a/iphone/Barcodes/images/link1.png b/iphone/Barcodes/images/link1.png deleted file mode 100644 index 2759a3512b5ea80201bfebb27fcbe47b284f207f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmV-I0=@l-P)5t;Pz+6eFFmF`aU-Y$ zG~9Y49D4#r=mup1!~}5d2{uTWpkV^S09DcnNGE7*WJ^!(52A_;~l{pbe(g+6tIIxcQU|tmxJO$lOXHg|>R!aU} zi5GvYCy$CX@w)`znhdnaI2kJs_)O+Z0K;x(Y!>31Af}V9$l*cJX}AXGh-_-;qS{Q{ zwej8R>(=>$bAtg+U(MTn6vblP6K1*h*Ftf05&_lJXQL065PMAxfda%>EkmGM=9`<-)a5o6YC#uU*2_AAUA8Ly=BELp)G z`9c0429`DmkDm%ad%uU|LtxPR_B_UGT@c4;RjChJcBK^yfg!-)>FVdQ&MBb@0MZC}mjD0& diff --git a/iphone/Barcodes/images/map-pin.png b/iphone/Barcodes/images/map-pin.png deleted file mode 100644 index 7cf2b82070682f850c2562ece1ed2180b0586df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmV+e0{s1nP)Ou>!GzqysG=8A%6pK;Aif&d!B{!}w-)4)NXY-TM)=ZL8RVAh&)j85b~KUZ-P*{tr09mq#Pvx@(qz_f<3uC3uYuf z*CJj54^gZ`alq!IAmcDt;oAuwafsA3a^)w2xT^4fV(s&4v;*o}+pCbSJNjTvrFj&eX;-7Ua*$EX zS3;Ip78Li`)r`GWB%2zlmK38wpPnb{5`I^eskV1|o>^5> zqq?r{19J;A3Ub^c?W>w=I(bVCwW0T=k3i7(MWd=YSskkf;oSBcQ>L!wQyqiw-yu@? z{whjtbyESOF2g1oES!*NwRlixHNtR7y#&~)EYcIvb6vJ002ovPDHLk FV1k8+;qm|g diff --git a/iphone/Barcodes/images/phone.png b/iphone/Barcodes/images/phone.png deleted file mode 100644 index b473d8fb0620a4e635ac97f369e244e0f773442d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcmV;S0bc%zP) z5dQ(<|4@9JnwHoA@oFG;1>z@2mTU)NW=ahQ8E_tI;3Xh71L9XmmIP92K{%3OFiX6V zf~$pGgPEXo0-Crk5L*KAGAREJrNQ$7%?JOXV)j71g&Gmug2e(5&IDpMYFGeDif_>j z|3mG3kdMU&RJ8yU7st>nsGxRE)&k<6NEUnsVs&a;l8hx!@KD>5`Dm8xrB-T!0Zt%3 ziDt72~CtGSJ5ySj3h=<#4jSkl2_15YdfhHz(6KiX2gcSLBszo zxhYH+OEN~spkPv=MgjR2i{a;?bqQ4fKM>bJE!qgJzu}DpfB*vkYAuxI@W?+;00000 LNkvXXu0mjfwP2sy diff --git a/iphone/Barcodes/images/photolib.png b/iphone/Barcodes/images/photolib.png deleted file mode 100644 index 6f330c5cbebaf81d35e7332cb1126d4071366d9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X@;qG}Ln>~)nHtD-K!L}(_sc)=i`Heor!0((ygdJ+gJYM# z>~^lu+?lUVSKV1EpFM|XgO7kL>+WS0=2AxdYArJ!rhX7lS0{2 zCnPTry?8PqP2#{0BhCK1``JuR`sC1QJtNj>(u?CbUt`xdE}&Co+6irAOET2@S=lyZsIFp=TgbB>w2 zb4Pdgws$)G<~zU{;)+R#j3|hP2nU+kC!6n{C0s}J6QYlyn`8c& zD2d#iA?)PN)HrDw#CV3dg<)zvuq&6u?MbdIaWA5}C~l#e+Hhk9{eHjbcDq7VRk2#F zM6p=pxS}XR(=_gvB#Hf2tHpiQYE>*23x;A|uh*W0wE0uxKsuck^ZA_pNF>6-?K&iosyO%cT;L1%p8ri^t0w_7d;m4*D}a>;F_ zQURP4_=jR(|rbCk=IZC>3n*k=y&8J5`9eQ#fjJ}WRCc4v2REP`DKg!L=OM+FaGSf ra&N#ziy<523lfJ5nB=zLZvh4XF6{MLl+l`)00000NkvXXu0mjf;@&=I diff --git a/iphone/Barcodes/images/text.png b/iphone/Barcodes/images/text.png deleted file mode 100644 index ff9a8b7cc88ddc60f2edf8630b04fea92480a981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 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%0ARfL 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 diff --git a/iphone/Barcodes/images/zxing-512.tiff b/iphone/Barcodes/images/zxing-512.tiff deleted file mode 100644 index a7a6159ded433026637a32c4e04e3c78dae3e727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47058 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
bJyUbdFHf&`;D`p&L7rt*8#&E|@~@f!Kp5jY8)e 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 Z7ytn5#MizdO0U`LFaZDm_4Vd8{eQEy;P(Ik diff --git a/iphone/Barcodes/main.mm b/iphone/Barcodes/main.mm deleted file mode 100644 index 128f50878..000000000 --- a/iphone/Barcodes/main.mm +++ /dev/null @@ -1,17 +0,0 @@ -// -// main.mm -// Barcodes -// -// Created by Romain Pechayre on 11/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) { - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - [pool release]; - return retVal; -} diff --git a/iphone/Barcodes/scans.db b/iphone/Barcodes/scans.db deleted file mode 100644 index c3563f9f688787504bffbec85903f76dd110f960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU|0C7 zy1ND`1O$2dItE25c)La_`1yw@_=WoT=qQw=R+K1&xJCf^aIxZ&#M}Y}pkY1=F0O8l bp*|rB26_gXpu7pp^rK)j1V%$(1cm?rwe}|9 diff --git a/iphone/Barcodes/sv.lproj/About.html b/iphone/Barcodes/sv.lproj/About.html deleted file mode 100644 index 7093b45e1..000000000 --- a/iphone/Barcodes/sv.lproj/About.html +++ /dev/null @@ -1,23 +0,0 @@ - - -Om Streckkoder - - - - - -

-ZXing Project Logo

-

Streckkoder

-

Version 2.0

-

© 2008-2010 The ZXing -Authors
-

-

-Stödda streckkods-format: -

-

-QR Code
-

- \ No newline at end of file diff --git a/iphone/Barcodes/sv.lproj/DecoderView.xib b/iphone/Barcodes/sv.lproj/DecoderView.xib deleted file mode 100644 index 6acc4ea56..000000000 --- a/iphone/Barcodes/sv.lproj/DecoderView.xib +++ /dev/null @@ -1,450 +0,0 @@ - - - - 512 - 9E17 - 670 - 949.33 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - 274 - - YES - - - 266 - {{0, 431}, {320, 49}} - - NO - NO - - YES - - 15 - - - - 1 - 5 - - - - 1 - - NSImage - filmroll-2.png - - - - - 5 - - - - 2 - - NSImage - photolib.png - - - - - 1 - 5 - - - - 16 - 10 - - - - 1 - 5 - - - - 17 - 9 - - - - - - - 274 - {320, 431} - - - 1 - MCAwIDAAA - - NO - 3 - - - {320, 480} - - - 3 - - - - - YES - - - view - - - - 9 - - - - actionBarItem - - - - 51 - - - - performResultAction: - - - - 53 - - - - toolbar - - - - 57 - - - - pickAndDecode: - - - - 60 - - - - pickAndDecode: - - - - 61 - - - - pickAndDecode: - - - - 62 - - - - cameraBarItem - - - - 63 - - - - savedPhotosBarItem - - - - 64 - - - - libraryBarItem - - - - 65 - - - - archiveBarItem - - - - 66 - - - - showArchive: - - - - 67 - - - - imageView - - - - 71 - - - - - YES - - 0 - - YES - - - - - - 1 - - - YES - - - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - -2 - - - - - 34 - - - YES - - - - - - - - - - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 54 - - - - - 55 - - - - - 56 - - - - - 58 - - - - - 59 - - - - - 70 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 34.IBPluginDependency - 35.IBPluginDependency - 36.IBPluginDependency - 37.IBPluginDependency - 38.IBPluginDependency - 54.IBPluginDependency - 55.IBPluginDependency - 56.IBPluginDependency - 58.IBPluginDependency - 59.IBPluginDependency - 70.CustomClassName - 70.IBPluginDependency - - - YES - DecoderViewController - UIResponder - {{387, 352}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ScannedImageView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 71 - - - - YES - - DecoderViewController - UIViewController - - YES - - YES - performResultAction: - pickAndDecode: - showArchive: - - - YES - id - id - id - - - - YES - - YES - actionBarItem - archiveBarItem - cameraBarItem - imageView - libraryBarItem - messageHelpButton - messageTextView - messageView - savedPhotosBarItem - toolbar - - - YES - UIBarItem - UIBarItem - UIBarItem - ScannedImageView - UIBarItem - UIButton - UITextView - UIView - UIBarItem - UIToolbar - - - - IBProjectSource - Classes/DecoderViewController.h - - - - ScannedImageView - UIView - - IBProjectSource - Classes/ScannedImageView.h - - - - - 0 - ../ZXing.xcodeproj - 3 - - diff --git a/iphone/Barcodes/sv.lproj/Hints.html b/iphone/Barcodes/sv.lproj/Hints.html deleted file mode 100644 index ae70c0919..000000000 --- a/iphone/Barcodes/sv.lproj/Hints.html +++ /dev/null @@ -1,14 +0,0 @@ - - -Barcode Hints - - - - -

iPhone-kamera har ett fixt fokus-djup, vilket fungerar väl i många -sammanhang men inte är idealiskt för att känna igen streckkoder. Allt -som är för nära kameran kommer att se suddigt ut och vara svårt att -avkoda. För bästa resultat:

  • Ta fotot av streckkoden från minst ca 60 cm
  • I steget Flytta och skalanpassa, centrera streckkoden i bilden och skala upp den till att nästan fylla skärmen
Detta -ger avkodaren en stor, skarp bild med nästan bara streckkoden själv att -tolka, vilket gör avkodarens arbete så lätt som möjligt. \ No newline at end of file diff --git a/iphone/Barcodes/sv.lproj/InfoPlist.strings b/iphone/Barcodes/sv.lproj/InfoPlist.strings deleted file mode 100644 index a53bf351e..000000000 --- a/iphone/Barcodes/sv.lproj/InfoPlist.strings +++ /dev/null @@ -1 +0,0 @@ -CFBundleDisplayName = "Streckkoder"; \ No newline at end of file diff --git a/iphone/Barcodes/sv.lproj/Localizable.strings b/iphone/Barcodes/sv.lproj/Localizable.strings deleted file mode 100644 index d9cccd018..000000000 --- a/iphone/Barcodes/sv.lproj/Localizable.strings +++ /dev/null @@ -1,141 +0,0 @@ -/* Add Contact? */ -"AddContactAction alert message" = "Lägg till kontakt?"; - -/* Cancel */ -"AddContactAction cancel button title" = "Avbryt"; - -/* Add Contact */ -"AddContactAction confirm button title" = "Lägg till kontakt"; - -/* Add Contact */ -"AddContactAction title" = "Lägg till kontakt"; - -/* Call %@ */ -"CallAction action title" = "Ring %@"; - -/* Call */ -"CallAction alert button title" = "Ring"; - -/* Call %@? */ -"CallAction alert message" = "Ring %@?"; - -/* Call */ -"CallAction alert title" = "Ring"; - -/* Compose */ -"SMSAction alert title" = "Skriv"; - -/* Contact */ -"Contact Result Type Name" = "Kontakt"; - -/* No barcode detected. */ -"Decoder BarcodeDetectionFailure" = "Ingen streckkod hittades."; - -/* Decoding ... */ -"Decoder MessageWhileDecoding" = "Avkodar ..."; - -/* ZXing */ -"DecoderViewController AppTitle" = "Streckkoder"; - -/* Cancel */ -"DecoderViewController cancel button title" = "Avbryt"; - -/* About */ -"DecoderViewController about button title" = "Info"; - -/* Hints */ -"DecoderViewController Hints MessageViewController title" = "Tips"; - -/* About */ -"DecoderViewController About MessageViewController title" = "Info"; - -/* Decoding image (%.0fx%.0f) ... */ -"DecoderViewController MessageWhileDecodingWithDimensions" = "Avkodar bild (%.0fx%.0f) ..."; - -/* Please take or choose a picture containing a barcode */ -"DecoderViewController take or choose picture" = "Tag eller välj en bild som innehåller en streckkod"; - -/* Email %@ */ -"EmailAction action title" = "Mejla %@"; - -/* Compose */ -"EmailAction alert button title" = "Skriv"; - -/* Compose Email to %@? */ -"EmailAction alert message" = "Skriv mejl till %@?"; - -/* Compose Email */ -"EmailAction alert title" = "Skriv mejl"; - -/* %@ */ -"EmailParsedResult Display: Body" = "%@"; - -/* To: %@ */ -"EmailParsedResult Display: Recipient" = "Till: %@"; - -/* Subject: %@ */ -"EmailParsedResult Display: Subject" = "Angående: %@"; - -/* Email */ -"EmailParsedResult type name" = "Mejl"; - -/* Geo: %@ */ -"GeoParsedResult display" = "Plats: %@"; - -/* Geolocation */ -"GeoParsedResult type name" = "Geografisk plats"; - -/* Open URL */ -"OpenURLAction action title" = "Öppna länk"; - -/* Open */ -"OpenURLAction alert button title" = "Öppna"; - -/* Open URL <%@>? */ -"OpenURLAction alert message" = "Öppna länk <%@>?"; - -/* Open URL */ -"OpenURLAction alert title" = "Öppna länk"; - -/* Cancel */ -"OpenURLAction cancel button title" = "Avbryt"; - -/* Scan Archive */ -"ScanArchiveTitle" = "Tidigare Streckkoder"; - -/* Scan */ -"ScanViewController title" = "Streckkod"; - -/* Show on Map */ -"ShowMapAction action title" = "Visa på karta"; - -/* Show */ -"ShowMapAction alert button title" = "Visa"; - -/* Show location %@ on Map ? */ -"ShowMapAction alert message" = "Visa plats %@ på karta?"; - -/* Show on Map */ -"ShowMapAction alert title" = "Visa på karta"; - -/* Compose SMS to %@ */ -"SMSAction action title" = "Skriv SMS till %@"; - -/* Compose */ -"SMSAction alert button title" = "Skriv"; - -/* Compose SMS to %@? */ -"SMSAction alert message" = "Skriv SMS till %@?"; - -/* SMS */ -"SMSParsedResult type name" = "SMS"; - -/* Tel */ -"TelParsedResult type name" = "Telefon"; - -/* Text */ -"TextParsedResult type name" = "Text"; - -/* URI */ -"URIParsedResult type name" = "Länk"; - diff --git a/iphone/Barcodes/sv.lproj/MainWindow.xib b/iphone/Barcodes/sv.lproj/MainWindow.xib deleted file mode 100644 index e0a569241..000000000 --- a/iphone/Barcodes/sv.lproj/MainWindow.xib +++ /dev/null @@ -1,171 +0,0 @@ - - - - 512 - 9C7010 - 658 - 949.26 - 352.00 - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - IBFilesOwner - - - IBFirstResponder - - - - - 1292 - - {320, 480} - - - 1 - MSAxIDEAA - - NO - NO - - - - - YES - - - window - - - - 5 - - - - delegate - - - - 9 - - - - - YES - - 0 - - YES - - - - - - 2 - - - YES - - - - - -1 - - - RmlsZSdzIE93bmVyA - - - 3 - - - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - UIResponder - - YES - - YES - - - YES - - - {{229, 113}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ZXingAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 11 - - - - YES - - ZXingAppDelegate - NSObject - - window - UIWindow - - - IBProjectSource - Classes/ZXingAppDelegate.h - - - - - 0 - ZXing.xcodeproj - 3 - - diff --git a/iphone/Barcodes/sv.lproj/Message.xib b/iphone/Barcodes/sv.lproj/Message.xib deleted file mode 100644 index de0dc8a28..000000000 --- a/iphone/Barcodes/sv.lproj/Message.xib +++ /dev/null @@ -1,424 +0,0 @@ - - - - 768 - 10H542 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 274 - {320, 436} - - - 1 - MSAxIDEAA - - YES - IBCocoaTouchFramework - 1 - YES - - - {320, 436} - - - 3 - MQA - - 2 - - - - NO - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 13 - - - - webView - - - - 17 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 12 - - - YES - - - - - - 16 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 12.IBEditorWindowLastContentRect - 12.IBPluginDependency - 16.IBPluginDependency - - - YES - MessageViewController - UIResponder - {{1, 33}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 19 - - - - YES - - MessageViewController - UIViewController - - dismiss: - id - - - dismiss: - - dismiss: - id - - - - YES - - YES - delegate - webView - - - YES - id - UIWebView - - - - YES - - YES - delegate - webView - - - YES - - delegate - id - - - webView - UIWebView - - - - - IBProjectSource - Classes/MessageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWebView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWebView.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Barcodes.xcodeproj - 3 - 132 - - diff --git a/iphone/README.md b/iphone/README.md deleted file mode 100644 index 805b32abf..000000000 --- a/iphone/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# ZXing iPhone/iPad README # - -ZXing for iOS is a sub-project of zxing project partially maintained -by independent developers. As of 26th of March 2011, it contains 3 iOS -projects: - -* Barcodes: Zxing iOS app. Available on the app store. -* ZXingWidget: a Library that can be included in any iOS app. -* ScanTest: a simple demo app for ZXingWidget. - -## How to include ZXingWidget in a easy and clean way (in Xcode4) ## - -1. Locate the `ZXingWidget.xcodeproj` file under - `zxing/iphone/ZXingWidget/`. Drag `ZXingWidget.xcodeproj` and - drop it onto the root of your Xcode project sidebar. A dialog - will appear — make sure _Copy items_ is unchecked and _Reference - Type_ is _Relative to Project_ before clicking - _Add_. Alternatively you can right-click on you project navigator - and select 'Add files to _your project_'. - -2. Now you need to link the ZXingWidget static library to your project. To do that - - a. select you project file in the project navigator - - b. In the second column, select your target (not the project itself) - - c. Go to the _Build Phases_ tab, expand the _Link Binary with Libraries_ section - - d. Click the _Add_ button. A dialog will appear and you should see - `libZXingWidget.a` at or near the top of the list - -3. Now you need to add ZXingWidget as a dependency of your project, so - Xcode compiles it whenever you compile your project. - - a. Like in substep **c** of previous step, you need to do that in the _Build Phases_ tab of your target - - b. Expand the _Target Dependencies_ section - - c. Click the _Add_ button and a dialog will appear. Select `ZXingWidget` target. - -4. Add the `ZXingWidget` to the _Headers Search Path_. - - a. Select your project in the - project navigator and then select your target. - - b. Go to the _Build Settings_ tab, look for _Header Search Paths_ and double-click - it. - - c: Add the relative path from your project's directory to the - `zxing/iphone/ZXingWidget/Classes` directory and select the _Recursive Path_ checkbox. - -5. Add the C++ core to the _Headers Search Path_. Repeat step **5**, but add the path to the C++ core: `zxing/cpp/core/src`. Do _not_ select the _Recursive Path_ checkbox. - -6. Import the following iOS frameworks: - * AVFoundation - * AudioToolbox - * CoreVideo - * CoreMedia - * libiconv - * AddressBook - * AddressBookUI - - This must be done by adding them in the _Link Libraries with - Binary_ just like step **2.c**. If you are supporting iOS 4, - for AVFoundation, you must select _Optional_ in the pull - down to the right in order to weak link the - framework. (Some symbols used in ZXing didn't exist before - iOS 5.) - -7. `#import ` in a source file - -8. `#import ` or `#import ` for example because you will need to - inject a barcode reader into `ZXingWidgetController`. - -9. Make sure the file in which you are importing the code headers has a `.mm` extension to enable importing -C++. - -10. Rename your `main.m` to `main.mm` to link against the C++ standard library. - -11. Make sure the C++ library in _Build Settings_ is _Compiler - Default_. Some versions of Xcode set this to the LLVM standard - library. Alternately, you can try setting the C++ library to the - LLVM version int the `XingWidget` project but this is not - well-tested. - -## Known issues for above steps to include: ## - -* If you have building error like " ... : No such file or directory", - then it is a classical error, it means that the include path is - not well specified. The best way to fix this is to look at the - build command that failed. To do that, click on the lower right - corner of your Xcode project, you should see the build command - that failed. Click on it and expand it by clicking on the _more_ - symbols that just appeared. This will show the exact command line - instruction that failed. You can then make sure that the header - search path you specified is there, and you can also copy/paste - this line into your terminal and try to see if you can - reproduce/fix the error by adding the right path to the - compiler. Once is is fixed, you should have an idea of what's the - problem and accordingly modify your Header Search Path. diff --git a/iphone/ScanTest/.gitignore b/iphone/ScanTest/.gitignore deleted file mode 100644 index 3417f592a..000000000 --- a/iphone/ScanTest/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/build -/ScanTest.xcodeproj/*.mode1v3 -/ScanTest.xcodeproj/*.pbxuser -/ScanTest.xcodeproj/xcuserdata -/ScanTest.xcodeproj/project.xcworkspace/xcuserdata -/ScanTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata \ No newline at end of file diff --git a/iphone/ScanTest/Classes/RootViewController.h b/iphone/ScanTest/Classes/RootViewController.h deleted file mode 100644 index ff2c434d3..000000000 --- a/iphone/ScanTest/Classes/RootViewController.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// RootViewController.h -// ScanTest -// -// Created by David Kavanagh on 5/10/10. -// Copyright __MyCompanyName__ 2010. All rights reserved. -// - -#import -#import "ZXingWidgetController.h" - -@interface RootViewController : UIViewController { - IBOutlet UITextView *resultsView; - NSString *resultsToDisplay; -} -@property (nonatomic, retain) IBOutlet UITextView *resultsView; -@property (nonatomic, copy) NSString *resultsToDisplay; - -- (IBAction)scanPressed:(id)sender; -@end diff --git a/iphone/ScanTest/Classes/RootViewController.mm b/iphone/ScanTest/Classes/RootViewController.mm deleted file mode 100644 index 6b198343f..000000000 --- a/iphone/ScanTest/Classes/RootViewController.mm +++ /dev/null @@ -1,87 +0,0 @@ -// -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -/* - * Copyright 2010-2012 ZXing authors - * - * 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. - */ - -#import "RootViewController.h" -#import "MultiFormatReader.h" - -@implementation RootViewController -@synthesize resultsView; -@synthesize resultsToDisplay; -#pragma mark - -#pragma mark View lifecycle - -- (void)viewDidLoad { - [super viewDidLoad]; - [self setTitle:@"ZXing"]; - [resultsView setText:resultsToDisplay]; -} - -- (IBAction)scanPressed:(id)sender { - - ZXingWidgetController *widController = - [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO]; - - NSMutableSet *readers = [[NSMutableSet alloc ] init]; - - MultiFormatReader* reader = [[MultiFormatReader alloc] init]; - [readers addObject:reader]; - [reader release]; - - widController.readers = readers; - [readers release]; - - NSBundle *mainBundle = [NSBundle mainBundle]; - widController.soundToPlay = - [NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO]; - - [self presentModalViewController:widController animated:YES]; - // [self presentViewController:widController animated:YES completion:nil]; - - [widController release]; -} - -#pragma mark - -#pragma mark ZXingDelegateMethods - -- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result { - self.resultsToDisplay = result; - if (self.isViewLoaded) { - [resultsView setText:resultsToDisplay]; - [resultsView setNeedsDisplay]; - } - [self dismissModalViewControllerAnimated:NO]; - // [self dismissViewControllerAnimated:NO completion:nil]; -} - -- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller { - [self dismissModalViewControllerAnimated:NO]; - // [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)viewDidUnload { - self.resultsView = nil; -} - -- (void)dealloc { - [resultsView release]; - [resultsToDisplay release]; - [super dealloc]; -} - - -@end - diff --git a/iphone/ScanTest/Classes/ScanTestAppDelegate.h b/iphone/ScanTest/Classes/ScanTestAppDelegate.h deleted file mode 100644 index dfc778419..000000000 --- a/iphone/ScanTest/Classes/ScanTestAppDelegate.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// ScanTestAppDelegate.h -// ScanTest -// -// Created by David Kavanagh on 5/10/10. -// Copyright __MyCompanyName__ 2010. All rights reserved. -// - -#import - -@interface ScanTestAppDelegate : NSObject { - - UIWindow *window; - UINavigationController *navigationController; -} - -@property (nonatomic, retain) IBOutlet UIWindow *window; -@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; - -@end - diff --git a/iphone/ScanTest/Classes/ScanTestAppDelegate.m b/iphone/ScanTest/Classes/ScanTestAppDelegate.m deleted file mode 100644 index 4d08c0ed2..000000000 --- a/iphone/ScanTest/Classes/ScanTestAppDelegate.m +++ /dev/null @@ -1,54 +0,0 @@ -// -*- mode:objc; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*- -/* - * Copyright 2010-2012 ZXing authors All rights reserved. - * - * 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. - */ - -#import "ScanTestAppDelegate.h" -#import "RootViewController.h" - -@implementation ScanTestAppDelegate - -@synthesize window; -@synthesize navigationController; - - -#pragma mark - -#pragma mark Application lifecycle - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - // Override point for customization after app launch - window.rootViewController = navigationController; - [window makeKeyAndVisible]; - return YES; -} - - -- (void)applicationWillTerminate:(UIApplication *)application { - // Save data if appropriate -} - - -#pragma mark - -#pragma mark Memory management - -- (void)dealloc { - [navigationController release]; - [window release]; - [super dealloc]; -} - - -@end - diff --git a/iphone/ScanTest/Default-568h@2x.png b/iphone/ScanTest/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/iphone/ScanTest/Icon.png b/iphone/ScanTest/Icon.png deleted file mode 100644 index 4ca7bf6ac280522eba57c9f017bedfccfa87cbb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3713 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 diff --git a/iphone/ScanTest/MainWindow.xib b/iphone/ScanTest/MainWindow.xib deleted file mode 100644 index 030474101..000000000 --- a/iphone/ScanTest/MainWindow.xib +++ /dev/null @@ -1,279 +0,0 @@ - - - - 800 - 10D541 - 760 - 1038.29 - 460.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 81 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - {320, 480} - - 1 - MSAxIDEAA - - NO - NO - - IBCocoaTouchFramework - YES - - - - IBCocoaTouchFramework - - - 256 - {0, 0} - NO - YES - YES - IBCocoaTouchFramework - - - YES - - - - IBCocoaTouchFramework - - - RootViewController - - IBCocoaTouchFramework - - - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - navigationController - - - - 15 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - -2 - - - - - 9 - - - YES - - - - - - - 11 - - - - - 13 - - - YES - - - - - - 14 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 11.IBPluginDependency - 13.CustomClassName - 13.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 9.IBEditorWindowLastContentRect - 9.IBPluginDependency - - - YES - UIApplication - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - RootViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - YES - - - {{673, 376}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ScanTestAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{186, 376}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 15 - - - - YES - - RootViewController - UITableViewController - - IBProjectSource - Classes/RootViewController.h - - - - ScanTestAppDelegate - NSObject - - YES - - YES - navigationController - window - - - YES - UINavigationController - UIWindow - - - - IBProjectSource - Classes/ScanTestAppDelegate.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ScanTest.xcodeproj - 3 - 81 - - diff --git a/iphone/ScanTest/README b/iphone/ScanTest/README deleted file mode 100644 index 5eabd5db4..000000000 --- a/iphone/ScanTest/README +++ /dev/null @@ -1,2 +0,0 @@ -ScanTest is a test application for ZXingWidget -It automatically builds ZXingWidget so there is no need to first build ZXingWidget \ No newline at end of file diff --git a/iphone/ScanTest/RootViewController.xib b/iphone/ScanTest/RootViewController.xib deleted file mode 100644 index ee072f7dc..000000000 --- a/iphone/ScanTest/RootViewController.xib +++ /dev/null @@ -1,465 +0,0 @@ - - - - 784 - 10D573 - 762 - 1038.29 - 460.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 87 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 274 - {{10, 79}, {300, 366}} - - - 1 - MC40NzI5Nzk5Mzk1IDAuNDc1MDcyNTkxMiAwLjYwMzI2MDg2OTYAA - - YES - YES - IBCocoaTouchFramework - NO - NO - NO - NO - NO - Results will be here - - 2 - IBCocoaTouchFramework - - - - - 292 - {{124, 20}, {72, 37}} - - NO - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - 1 - Scan - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - - {320, 460} - - - 1 - MCAwIDAAA - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 8 - - - - scanPressed: - - - 7 - - 11 - - - - resultsView - - - - 12 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 7 - - - YES - - - - - - - 9 - - - - - 10 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 10.IBPluginDependency - 7.IBEditorWindowLastContentRect - 7.IBPluginDependency - 9.IBPluginDependency - - - YES - RootViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{21, 662}, {320, 460}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 12 - - - - YES - - RootViewController - UIViewController - - scanPressed: - id - - - resultsView - UITextView - - - IBProjectSource - Classes/RootViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSNetServices.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPort.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSStream.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSXMLParser.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITextView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITextView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ScanTest.xcodeproj - 3 - 87 - - diff --git a/iphone/ScanTest/ScanTest-Info.plist b/iphone/ScanTest/ScanTest-Info.plist deleted file mode 100644 index 41d816136..000000000 --- a/iphone/ScanTest/ScanTest-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - com.rpechayr.vmetronomelite - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - MainWindow - NSMainNibFile~ipad - MainWindow-iPad - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - - - diff --git a/iphone/ScanTest/ScanTest.xcodeproj/project.pbxproj b/iphone/ScanTest/ScanTest.xcodeproj/project.pbxproj deleted file mode 100755 index 4b8df9342..000000000 --- a/iphone/ScanTest/ScanTest.xcodeproj/project.pbxproj +++ /dev/null @@ -1,429 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1D3623260D0F684500981E51 /* ScanTestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* ScanTestAppDelegate.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 1F027F8511A7BB77006B06DE /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F027F8411A7BB77006B06DE /* libiconv.dylib */; }; - 1FF586FD11BBD81D00E8E868 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1FF586FC11BBD81D00E8E868 /* main.mm */; }; - 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; }; - 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD735F0D9D9599002E5188 /* MainWindow.xib */; }; - 28C286E10D94DF7D0034E888 /* RootViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 28C286E00D94DF7D0034E888 /* RootViewController.mm */; }; - 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28F335F01007B36200424DE2 /* RootViewController.xib */; }; - 3B0A5DB91444C492000EC568 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B0A5DB81444C492000EC568 /* Icon.png */; }; - 3B331CEE161BB74E007313B6 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B331CED161BB74E007313B6 /* Default-568h@2x.png */; }; - 3B43FDCB15939575001CD5C9 /* libZXingWidget.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F027F7E11A7BAD4006B06DE /* libZXingWidget.a */; }; - 3B6AA67A1710EF3400DF84C0 /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B6AA6791710EF3400DF84C0 /* MainWindow-iPad.xib */; }; - 3BCED5C8120F84C900131FA0 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BCED5C7120F84C900131FA0 /* AVFoundation.framework */; }; - 3BCED5CE120F84E000131FA0 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BCED5CD120F84E000131FA0 /* CoreVideo.framework */; }; - 3BCED5EB120F885C00131FA0 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BCED5EA120F885C00131FA0 /* CoreMedia.framework */; }; - E5345BF11198D81A000CB77F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5345BF01198D81A000CB77F /* AudioToolbox.framework */; }; - E548755C119C62B9001CC0F8 /* beep-beep.aiff in Resources */ = {isa = PBXBuildFile; fileRef = E548755B119C62B9001CC0F8 /* beep-beep.aiff */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1F027F7D11A7BAD4006B06DE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F027F7611A7BAD4006B06DE /* ZXingWidget.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = ZXingWidget; - }; - 3B43FDC915939570001CD5C9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F027F7611A7BAD4006B06DE /* ZXingWidget.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = ZXingWidget; - }; - 3BFFCD1D13F02BB900A2B7EB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1F027F7611A7BAD4006B06DE /* ZXingWidget.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1D60398D13DF7CAD006F4B51; - remoteInfo = ZXingTests; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* ScanTestAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanTestAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* ScanTestAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScanTestAppDelegate.m; sourceTree = ""; }; - 1D6058910D05DD3D006BFB54 /* ScanTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScanTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 1F027F7611A7BAD4006B06DE /* ZXingWidget.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ZXingWidget.xcodeproj; path = ../ZXingWidget/ZXingWidget.xcodeproj; sourceTree = SOURCE_ROOT; }; - 1F027F8411A7BB77006B06DE /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; - 1FF586FC11BBD81D00E8E868 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 28A0AAE50D9B0CCF005BE974 /* ScanTest_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScanTest_Prefix.pch; sourceTree = ""; }; - 28AD735F0D9D9599002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 28C286DF0D94DF7D0034E888 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; - 28C286E00D94DF7D0034E888 /* RootViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RootViewController.mm; sourceTree = ""; }; - 28F335F01007B36200424DE2 /* RootViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RootViewController.xib; sourceTree = ""; }; - 3B0A5DB81444C492000EC568 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; - 3B331CED161BB74E007313B6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 3B6AA6791710EF3400DF84C0 /* MainWindow-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainWindow-iPad.xib"; path = "iPad/MainWindow-iPad.xib"; sourceTree = ""; }; - 3BCED5C7120F84C900131FA0 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 3BCED5CD120F84E000131FA0 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 3BCED5EA120F885C00131FA0 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 8D1107310486CEB800E47090 /* ScanTest-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "ScanTest-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - E5345BF01198D81A000CB77F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - E5345FD6119B27D2000CB77F /* libZXingWidget.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libZXingWidget.a; path = "build/Debug-iphoneos/libZXingWidget.a"; sourceTree = ""; }; - E548755B119C62B9001CC0F8 /* beep-beep.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = "beep-beep.aiff"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B43FDCB15939575001CD5C9 /* libZXingWidget.a in Frameworks */, - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, - E5345BF11198D81A000CB77F /* AudioToolbox.framework in Frameworks */, - 1F027F8511A7BB77006B06DE /* libiconv.dylib in Frameworks */, - 3BCED5C8120F84C900131FA0 /* AVFoundation.framework in Frameworks */, - 3BCED5CE120F84E000131FA0 /* CoreVideo.framework in Frameworks */, - 3BCED5EB120F885C00131FA0 /* CoreMedia.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 28C286DF0D94DF7D0034E888 /* RootViewController.h */, - 28C286E00D94DF7D0034E888 /* RootViewController.mm */, - 1D3623240D0F684500981E51 /* ScanTestAppDelegate.h */, - 1D3623250D0F684500981E51 /* ScanTestAppDelegate.m */, - ); - path = Classes; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* ScanTest.app */, - E5345FD6119B27D2000CB77F /* libZXingWidget.a */, - ); - name = Products; - sourceTree = ""; - }; - 1F027F7711A7BAD4006B06DE /* Products */ = { - isa = PBXGroup; - children = ( - 1F027F7E11A7BAD4006B06DE /* libZXingWidget.a */, - 3BFFCD1E13F02BB900A2B7EB /* ZXingTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - 3B331CED161BB74E007313B6 /* Default-568h@2x.png */, - 1F027F7611A7BAD4006B06DE /* ZXingWidget.xcodeproj */, - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 3B6AA6781710EF3400DF84C0 /* iPad */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = CustomTemplate; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 1FF586FC11BBD81D00E8E868 /* main.mm */, - 28A0AAE50D9B0CCF005BE974 /* ScanTest_Prefix.pch */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 3B0A5DB81444C492000EC568 /* Icon.png */, - E548755B119C62B9001CC0F8 /* beep-beep.aiff */, - 28F335F01007B36200424DE2 /* RootViewController.xib */, - 28AD735F0D9D9599002E5188 /* MainWindow.xib */, - 8D1107310486CEB800E47090 /* ScanTest-Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */, - E5345BF01198D81A000CB77F /* AudioToolbox.framework */, - 1F027F8411A7BB77006B06DE /* libiconv.dylib */, - 3BCED5C7120F84C900131FA0 /* AVFoundation.framework */, - 3BCED5CD120F84E000131FA0 /* CoreVideo.framework */, - 3BCED5EA120F885C00131FA0 /* CoreMedia.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3B6AA6781710EF3400DF84C0 /* iPad */ = { - isa = PBXGroup; - children = ( - 3B6AA6791710EF3400DF84C0 /* MainWindow-iPad.xib */, - ); - name = iPad; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* ScanTest */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "ScanTest" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 3B43FDCA15939570001CD5C9 /* PBXTargetDependency */, - ); - name = ScanTest; - productName = ScanTest; - productReference = 1D6058910D05DD3D006BFB54 /* ScanTest.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0450; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ScanTest" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 1F027F7711A7BAD4006B06DE /* Products */; - ProjectRef = 1F027F7611A7BAD4006B06DE /* ZXingWidget.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* ScanTest */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 1F027F7E11A7BAD4006B06DE /* libZXingWidget.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libZXingWidget.a; - remoteRef = 1F027F7D11A7BAD4006B06DE /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3BFFCD1E13F02BB900A2B7EB /* ZXingTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = ZXingTests.octest; - remoteRef = 3BFFCD1D13F02BB900A2B7EB /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */, - 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */, - E548755C119C62B9001CC0F8 /* beep-beep.aiff in Resources */, - 3B0A5DB91444C492000EC568 /* Icon.png in Resources */, - 3B331CEE161BB74E007313B6 /* Default-568h@2x.png in Resources */, - 3B6AA67A1710EF3400DF84C0 /* MainWindow-iPad.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D3623260D0F684500981E51 /* ScanTestAppDelegate.m in Sources */, - 28C286E10D94DF7D0034E888 /* RootViewController.mm in Sources */, - 1FF586FD11BBD81D00E8E868 /* main.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 3B43FDCA15939570001CD5C9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ZXingWidget; - targetProxy = 3B43FDC915939570001CD5C9 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = NO; - EXPORTED_SYMBOLS_FILE = ""; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ScanTest_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - INFOPLIST_FILE = "ScanTest-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ""; - PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - PRODUCT_NAME = ScanTest; - "PROVISIONING_PROFILE[sdk=*]" = ""; - STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = YES; - EXPORTED_SYMBOLS_FILE = ""; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ScanTest_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - INFOPLIST_FILE = "ScanTest-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - PRODUCT_NAME = ScanTest; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../../cpp/core/src, - "../ZXingWidget/Classes/**", - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - VALID_ARCHS = "armv7 armv7s"; - WARNING_CFLAGS = ( - "-Werror", - "-Wall", - "-Wextra", - "-Wno-unused-parameter", - ); - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../../cpp/core/src, - "../ZXingWidget/Classes/**", - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - VALID_ARCHS = "armv7 armv7s"; - WARNING_CFLAGS = ( - "-Werror", - "-Wall", - "-Wextra", - "-Wno-unused-parameter", - ); - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "ScanTest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ScanTest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/iphone/ScanTest/ScanTest_Prefix.pch b/iphone/ScanTest/ScanTest_Prefix.pch deleted file mode 100644 index bca89b95d..000000000 --- a/iphone/ScanTest/ScanTest_Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'ScanTest' target in the 'ScanTest' project -// -#import - -#ifndef __IPHONE_3_0 -#warning "This project uses features only available in iPhone SDK 3.0 and later." -#endif - - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/iphone/ScanTest/beep-beep.aiff b/iphone/ScanTest/beep-beep.aiff deleted file mode 100644 index 8854a590a2b5c2570f9c5f51214468924bf8c69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66046 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 z%0D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 diff --git a/iphone/ScanTest/iPad/MainWindow-iPad.xib b/iphone/ScanTest/iPad/MainWindow-iPad.xib deleted file mode 100644 index 0560f4caf..000000000 --- a/iphone/ScanTest/iPad/MainWindow-iPad.xib +++ /dev/null @@ -1,270 +0,0 @@ - - - - 1552 - 12D78 - 3084 - 1187.37 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 2083 - - - YES - IBProxyObject - IBUICustomObject - IBUINavigationBar - IBUINavigationController - IBUINavigationItem - IBUIViewController - IBUIWindow - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - IBIPadFramework - - - - 1316 - - {768, 1024} - - 1 - MSAxIDEAA - - NO - NO - - 2 - - IBIPadFramework - YES - - - - - 1 - 1 - - IBIPadFramework - NO - - - 256 - {0, 0} - NO - YES - YES - IBIPadFramework - - - YES - - - IBIPadFramework - - - RootViewController - - - 1 - 1 - - IBIPadFramework - NO - - - - - - - YES - - - delegate - - - - 4 - - - - window - - - - 5 - - - - navigationController - - - - 15 - - - - - YES - - 0 - - YES - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - -2 - - - - - 9 - - - YES - - - - - - - 11 - - - - - 13 - - - YES - - - - - - 14 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 11.IBPluginDependency - 13.CustomClassName - 13.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 13.IBPluginDependency - 14.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - 9.IBLastUsedUIStatusBarStylesToTargetRuntimesMap - 9.IBPluginDependency - - - YES - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - RootViewController - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - ScanTestAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - IBCocoaTouchFramework - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 15 - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 2083 - - diff --git a/iphone/ScanTest/main.mm b/iphone/ScanTest/main.mm deleted file mode 100644 index 5e7699e8b..000000000 --- a/iphone/ScanTest/main.mm +++ /dev/null @@ -1,17 +0,0 @@ -// -// main.m -// ScanTest -// -// Created by David Kavanagh on 5/10/10. -// Copyright __MyCompanyName__ 2010. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) { - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - [pool release]; - return retVal; -} diff --git a/iphone/ZXingWidget/.gitignore b/iphone/ZXingWidget/.gitignore deleted file mode 100644 index 8db1650c7..000000000 --- a/iphone/ZXingWidget/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/build -/ZXingWidget.xcodeproj/*.mode1v3 -/ZXingWidget.xcodeproj/*.pbxuser -xcuserdata diff --git a/iphone/ZXingWidget/Classes/ArrayAndStringCategories.h b/iphone/ZXingWidget/Classes/ArrayAndStringCategories.h deleted file mode 100644 index b8b5c27d4..000000000 --- a/iphone/ZXingWidget/Classes/ArrayAndStringCategories.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// ArrayAndStringCategories.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface NSString (DoCoMoFieldParsing) -- (NSString *)backslashUnescaped; -- (NSArray *)fieldsWithPrefix:(NSString *)prefix; -- (NSArray *)fieldsWithPrefix:(NSString *)prefix terminator:(NSString *)term; -- (NSString *)fieldWithPrefix:(NSString *)prefix; -- (NSString *)fieldWithPrefix:(NSString *)prefix terminator:(NSString *)term; -- (NSString *)stringWithTrimmedWhitespace; -@end - -@interface NSArray (DoCoMoStringArray) - -- (NSArray*)stringArrayWithTrimmedWhitespace; -+ (NSArray*)arrayWithStringIfNotNil:(NSString *)string; - -@end - - -// This works around the linker bug described here: -// http://developer.apple.com/library/mac/#qa/qa1490/_index.html -void ForceArrayAndStringCategoriesToLoad(void); diff --git a/iphone/ZXingWidget/Classes/ArrayAndStringCategories.m b/iphone/ZXingWidget/Classes/ArrayAndStringCategories.m deleted file mode 100644 index a842530ab..000000000 --- a/iphone/ZXingWidget/Classes/ArrayAndStringCategories.m +++ /dev/null @@ -1,143 +0,0 @@ -// -// ArrayAndStringCategories.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ArrayAndStringCategories.h" - - -@implementation NSString (ArrayAndStringCategories) - -- (NSString *)backslashUnescaped { - NSRange backslashRange = [self rangeOfString:@"\\"]; - if (backslashRange.location == NSNotFound) { - return self; - } - - int max = [self length]; - int startLocation = 0; - NSMutableString *result = [NSMutableString stringWithCapacity:[self length]]; - while (backslashRange.location != NSNotFound) { - [result appendString:[self substringWithRange:NSMakeRange(startLocation, - backslashRange.location - startLocation)]]; - [result appendFormat:@"%c", [self characterAtIndex:backslashRange.location + 1]]; - startLocation = backslashRange.location + 2; - NSRange searchRange = NSMakeRange(startLocation, max - startLocation); - backslashRange = [self rangeOfString:@"\\" options:0 range:searchRange]; - } - if (startLocation < max) { - [result appendString:[self substringWithRange:NSMakeRange(startLocation, max - startLocation)]]; - } - return [NSString stringWithString:result]; -} - -- (NSArray *)fieldsWithPrefix:(NSString *)prefix { - return [self fieldsWithPrefix:prefix terminator:@";"]; -} - -- (NSArray *)fieldsWithPrefix:(NSString *)prefix terminator:(NSString *)term { - NSMutableArray *result = nil; - - int i = 0; - int max = [self length]; - NSRange searchRange; - NSRange foundRange; - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - while (i < max) { - searchRange = NSMakeRange(i, max - i); - foundRange = [self rangeOfString:prefix options:0 range:searchRange]; - if(foundRange.location == NSNotFound) { - break; - } - - int start = i = foundRange.location + foundRange.length; - bool done = false; - while (!done) { - searchRange = NSMakeRange(i, max - i); - NSRange termRange = [self rangeOfString:term options:0 range:searchRange]; - if (termRange.location == NSNotFound) { - i = max; - done = true; - } else if ([self characterAtIndex:termRange.location-1] == (unichar)'\\') { - i++; - } else { - NSAutoreleasePool *secondaryPool = [[NSAutoreleasePool alloc] init]; - NSString *substring = [self substringWithRange:NSMakeRange(start, termRange.location - start)]; - NSString *unescaped = [substring backslashUnescaped]; - NSString *toBeInArray = [[NSString alloc] initWithString:unescaped]; - [secondaryPool release]; - if (result == nil) { - result = [[NSMutableArray alloc] initWithCapacity:1]; - } - [result addObject:toBeInArray]; - [toBeInArray release]; - i = termRange.location + termRange.length; - done = true; - } - } - } - [pool release]; - - return [result autorelease]; -} - -- (NSString *)fieldWithPrefix:(NSString *)prefix { - return [self fieldWithPrefix:prefix terminator:@";"]; -} - -- (NSString *)fieldWithPrefix:(NSString *)prefix terminator:(NSString *)term { - NSArray *fields = [self fieldsWithPrefix:prefix terminator:term]; - if (fields.count == 0) { - return nil; - } else { - return [fields lastObject]; - } -} - -- (NSString *)stringWithTrimmedWhitespace { - return [self stringByTrimmingCharactersInSet: - [NSCharacterSet whitespaceAndNewlineCharacterSet]]; -} - -@end - -@implementation NSArray (ArrayAndStringCategories) - -- (NSArray*)stringArrayWithTrimmedWhitespace { - NSMutableArray* trimmed = [NSMutableArray arrayWithCapacity:[self count]]; - for (NSString* s in self) { - [trimmed addObject:[s stringWithTrimmedWhitespace]]; - } - return trimmed; -} - -+ (NSArray*)arrayWithStringIfNotNil:(NSString *)string { - if (string != nil) { - return [NSArray arrayWithObject:string]; - } else { - return nil; - } -} - -@end - - -void ForceArrayAndStringCategoriesToLoad(void) { - // No-op. See comments in header file. -} diff --git a/iphone/ZXingWidget/Classes/AztecReader.h b/iphone/ZXingWidget/Classes/AztecReader.h deleted file mode 100644 index ba9e94486..000000000 --- a/iphone/ZXingWidget/Classes/AztecReader.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// AztecReader.h -// ZXingWidget -// -// Created by Lukas Stabe on 08.02.12. -// Copyright (c) 2012 EOS UPTRADE GmbH. All rights reserved. -// - -#import "FormatReader.h" - -@interface AztecReader : FormatReader - -- (id) init; - -@end diff --git a/iphone/ZXingWidget/Classes/AztecReader.mm b/iphone/ZXingWidget/Classes/AztecReader.mm deleted file mode 100644 index 227d74355..000000000 --- a/iphone/ZXingWidget/Classes/AztecReader.mm +++ /dev/null @@ -1,25 +0,0 @@ -// -// AztecReader.m -// ZXingWidget -// -// Created by Lukas Stabe on 08.02.12. -// Copyright (c) 2012 EOS UPTRADE GmbH. All rights reserved. -// - -#import "AztecReader.h" -#import - -@implementation AztecReader - -- (id)init { - zxing::aztec::AztecReader *reader = new zxing::aztec::AztecReader(); - - return [super initWithReader:reader]; -} - -- (zxing::Ref)decode:(zxing::Ref)grayImage andCallback:(zxing::Ref)callback { - //NSLog(@"no callbacks supported for aztec"); - return [self decode:grayImage]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/CBarcodeFormat.h b/iphone/ZXingWidget/Classes/CBarcodeFormat.h deleted file mode 100644 index c27a2dcd4..000000000 --- a/iphone/ZXingWidget/Classes/CBarcodeFormat.h +++ /dev/null @@ -1,47 +0,0 @@ -// -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - -#ifndef __CBARCODE_FORMAT_H__ -#define __CBARCODE_FORMAT_H__ - -/* - * CBarcodeFormat.h - * zxing - * - * Copyright 2011 ZXing authors All rights reserved. - * - * 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. - */ - -// This must remain parallel to zxing::BarcodeFormat. -typedef enum BarcodeFormat { - BarcodeFormat_NONE, - BarcodeFormat_AZTEC, - BarcodeFormat_CODABAR, - BarcodeFormat_CODE_39, - BarcodeFormat_CODE_93, - BarcodeFormat_CODE_128, - BarcodeFormat_DATA_MATRIX, - BarcodeFormat_EAN_8, - BarcodeFormat_EAN_13, - BarcodeFormat_ITF, - BarcodeFormat_MAXICODE, - BarcodeFormat_PDF_417, - BarcodeFormat_QR_CODE, - BarcodeFormat_RSS_14, - BarcodeFormat_RSS_EXPANDED, - BarcodeFormat_UPC_A, - BarcodeFormat_UPC_E, - BarcodeFormat_UPC_EAN_EXTENSION -} BarcodeFormat; - -#endif // __CBARCODE_FORMAT_H__ diff --git a/iphone/ZXingWidget/Classes/CBarcodeFormat.mm b/iphone/ZXingWidget/Classes/CBarcodeFormat.mm deleted file mode 100644 index c662d0906..000000000 --- a/iphone/ZXingWidget/Classes/CBarcodeFormat.mm +++ /dev/null @@ -1,65 +0,0 @@ -// -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -/** - * Copyright 2011 Google, Inc. - * - * 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. - */ - -#import "CBarcodeFormat.h" -#import "BarcodeFormat.h" - -BarcodeFormat CBarcodeFormatConvert(zxing::BarcodeFormat value); - -// The purpose of this function is to issue a warning when a value is added to -// zxing::BarcodeFormat. -BarcodeFormat CBarcodeFormatConvert(zxing::BarcodeFormat value) { - switch (value) { - case zxing::BarcodeFormat::NONE: - return BarcodeFormat_NONE; - case zxing::BarcodeFormat::AZTEC: - return BarcodeFormat_AZTEC; - case zxing::BarcodeFormat::CODABAR: - return BarcodeFormat_CODABAR; - case zxing::BarcodeFormat::CODE_39: - return BarcodeFormat_CODE_39; - case zxing::BarcodeFormat::CODE_93: - return BarcodeFormat_CODE_93; - case zxing::BarcodeFormat::CODE_128: - return BarcodeFormat_CODE_128; - case zxing::BarcodeFormat::DATA_MATRIX: - return BarcodeFormat_DATA_MATRIX; - case zxing::BarcodeFormat::EAN_8: - return BarcodeFormat_EAN_8; - case zxing::BarcodeFormat::EAN_13: - return BarcodeFormat_EAN_13; - case zxing::BarcodeFormat::ITF: - return BarcodeFormat_ITF; - case zxing::BarcodeFormat::MAXICODE: - return BarcodeFormat_MAXICODE; - case zxing::BarcodeFormat::PDF_417: - return BarcodeFormat_PDF_417; - case zxing::BarcodeFormat::QR_CODE: - return BarcodeFormat_QR_CODE; - case zxing::BarcodeFormat::RSS_14: - return BarcodeFormat_RSS_14; - case zxing::BarcodeFormat::RSS_EXPANDED: - return BarcodeFormat_RSS_EXPANDED; - case zxing::BarcodeFormat::UPC_A: - return BarcodeFormat_UPC_A; - case zxing::BarcodeFormat::UPC_E: - return BarcodeFormat_UPC_E; - case zxing::BarcodeFormat::UPC_EAN_EXTENSION: - return BarcodeFormat_UPC_EAN_EXTENSION; - } - return BarcodeFormat_NONE; -} diff --git a/iphone/ZXingWidget/Classes/DataMatrixReader.h b/iphone/ZXingWidget/Classes/DataMatrixReader.h deleted file mode 100644 index 8bdfbe81c..000000000 --- a/iphone/ZXingWidget/Classes/DataMatrixReader.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// DataMatrixReader.h -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "FormatReader.h" - - -@interface DataMatrixReader : FormatReader { - -} -- (id) init; -@end diff --git a/iphone/ZXingWidget/Classes/DataMatrixReader.mm b/iphone/ZXingWidget/Classes/DataMatrixReader.mm deleted file mode 100644 index f4509c45f..000000000 --- a/iphone/ZXingWidget/Classes/DataMatrixReader.mm +++ /dev/null @@ -1,19 +0,0 @@ -// -// DataMatrixReader.mm -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "DataMatrixReader.h" -#import - -@implementation DataMatrixReader - - -- (id) init { - zxing::datamatrix::DataMatrixReader *reader = new zxing::datamatrix::DataMatrixReader(); - return [super initWithReader:reader]; -} -@end diff --git a/iphone/ZXingWidget/Classes/Decoder.h b/iphone/ZXingWidget/Classes/Decoder.h deleted file mode 100644 index 9db2d78f0..000000000 --- a/iphone/ZXingWidget/Classes/Decoder.h +++ /dev/null @@ -1,40 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "DecoderDelegate.h" - -@interface Decoder : NSObject { - NSSet *readers; - UIImage *image; - CGRect cropRect; - UIImage *subsetImage; - size_t subsetWidth; - size_t subsetHeight; - size_t subsetBytesPerRow; - id delegate; -} - -@property(nonatomic, retain) UIImage *image; -@property(nonatomic, retain) NSSet *readers; -@property(nonatomic, assign) id delegate; - -- (BOOL) decodeImage:(UIImage *)image; -- (BOOL) decodeImage:(UIImage *)image cropRect:(CGRect)cropRect; -- (void) resultPointCallback:(CGPoint)point; - -@end diff --git a/iphone/ZXingWidget/Classes/Decoder.mm b/iphone/ZXingWidget/Classes/Decoder.mm deleted file mode 100644 index fe07a2667..000000000 --- a/iphone/ZXingWidget/Classes/Decoder.mm +++ /dev/null @@ -1,276 +0,0 @@ -// -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -/* - * Copyright 2008-2012 ZXing authors - * - * 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. - */ - -#import "Decoder.h" -#import "TwoDDecoderResult.h" -#import "FormatReader.h" - -#include -#include -#include -#include -#include - -using namespace zxing; - -class ZXingWidgetControllerCallback : public zxing::ResultPointCallback { -private: - Decoder* decoder; -public: -ZXingWidgetControllerCallback(Decoder* _decoder) : decoder(_decoder) {} - void foundPossibleResultPoint(ResultPoint const& result) { - CGPoint point; - point.x = result.getX(); - point.y = result.getY(); - [decoder resultPointCallback:point]; - } -}; - -@interface Decoder () -@property(nonatomic, retain) UIImage *subsetImage; -@end - -@implementation Decoder - -@synthesize image; -@synthesize subsetImage; -@synthesize delegate; -@synthesize readers; - -- (void)willDecodeImage { - if ([self.delegate respondsToSelector:@selector(decoder:willDecodeImage:usingSubset:)]) { - [self.delegate decoder:self willDecodeImage:self.image usingSubset:self.subsetImage]; - } -} - -- (void)didDecodeImage:(TwoDDecoderResult *)result { - if ([self.delegate respondsToSelector:@selector(decoder:didDecodeImage:usingSubset:withResult:)]) { - [self.delegate decoder:self didDecodeImage:self.image usingSubset:self.subsetImage withResult:result]; - } - [result release]; -} - -- (void)failedToDecodeImage:(NSString *)reason { - if (!self) return; - if ([delegate respondsToSelector:@selector(decoder:failedToDecodeImage:usingSubset:reason:)]) { - [delegate decoder:self failedToDecodeImage:self.image usingSubset:self.subsetImage reason:reason]; - } -} - -- (void)resultPointCallback:(CGPoint)point { - if ([self.delegate respondsToSelector:@selector(decoder:foundPossibleResultPoint:)]) { - [self.delegate decoder:self foundPossibleResultPoint:point]; - } -} - -#define SUBSET_SIZE 360 - -- (ArrayRef) prepareSubset { - CGSize size = [image size]; -#if ZXING_DEBUG - NSLog(@"decoding: image is (%.1f x %.1f), cropRect is (%.1f,%.1f)x(%.1f,%.1f)", size.width, size.height, - cropRect.origin.x, cropRect.origin.y, cropRect.size.width, cropRect.size.height); -#endif - float scale = fminf(1.0f, fmaxf(SUBSET_SIZE / cropRect.size.width, SUBSET_SIZE / cropRect.size.height)); - CGPoint offset = CGPointMake(-cropRect.origin.x, -cropRect.origin.y); -#if ZXING_DEBUG - NSLog(@" offset = (%.1f, %.1f), scale = %.3f", offset.x, offset.y, scale); -#endif - - subsetWidth = cropRect.size.width * scale; - subsetHeight = cropRect.size.height * scale; - - subsetBytesPerRow = ((subsetWidth + 0xf) >> 4) << 4; -#if ZXING_DEBUG - NSLog(@"decoding: image to decode is (%lu x %lu) (%lu bytes/row)", subsetWidth, subsetHeight, subsetBytesPerRow); -#endif - - ArrayRef subsetData (subsetBytesPerRow * subsetHeight); -#if ZXING_DEBUG - NSLog(@"allocated %lu bytes of memory", subsetBytesPerRow * subsetHeight); -#endif - - CGColorSpaceRef grayColorSpace = CGColorSpaceCreateDeviceGray(); - - CGContextRef ctx = - CGBitmapContextCreate(&subsetData->values()[0], subsetWidth, subsetHeight, - 8, subsetBytesPerRow, grayColorSpace, - kCGImageAlphaNone); - CGColorSpaceRelease(grayColorSpace); - CGContextSetInterpolationQuality(ctx, kCGInterpolationNone); - CGContextSetAllowsAntialiasing(ctx, false); - // adjust the coordinate system - CGContextTranslateCTM(ctx, 0.0, subsetHeight); - CGContextScaleCTM(ctx, 1.0, -1.0); - -#if ZXING_DEBUG - NSLog(@"created %lux%lu bitmap context", subsetWidth, subsetHeight); -#endif - - UIGraphicsPushContext(ctx); - CGRect rect = CGRectMake(offset.x * scale, offset.y * scale, scale * size.width, scale * size.height); -#if ZXING_DEBUG - NSLog(@"rect for image = (%.1f,%.1f)x(%.1f,%.1f)", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); -#endif - [image drawInRect:rect]; - UIGraphicsPopContext(); - -#if ZXING_DEBUG - NSLog(@"drew image into %lu(%lu)x%lu bitmap context", subsetWidth, subsetBytesPerRow, subsetHeight); -#endif - CGContextFlush(ctx); -#if ZXING_DEBUG - NSLog(@"flushed context"); -#endif - - CGImageRef subsetImageRef = CGBitmapContextCreateImage(ctx); -#if ZXING_DEBUG - NSLog(@"created CGImage from context"); -#endif - - self.subsetImage = [UIImage imageWithCGImage:subsetImageRef]; - CGImageRelease(subsetImageRef); - - CGContextRelease(ctx); -#if ZXING_DEBUG - NSLog(@"released context"); -#endif - return subsetData; -} - -- (BOOL)decode:(ArrayRef)subsetData { - NSAutoreleasePool* mainpool = [[NSAutoreleasePool alloc] init]; - TwoDDecoderResult *decoderResult = nil; - BOOL returnCode = NO; - { - //NSSet *formatReaders = [FormatReader formatReaders]; - NSSet *formatReaders = self.readers; - Ref source - (new GreyscaleLuminanceSource(ArrayRef(subsetData), subsetBytesPerRow, subsetHeight, 0, 0, subsetWidth, subsetHeight)); - subsetData = 0; - - Ref binarizer (new HybridBinarizer(source)); - source = 0; - Ref grayImage (new BinaryBitmap(binarizer)); - binarizer = 0; - -#ifdef TRY_ROTATIONS - for (int i = 0; !decoderResult && i < 4; i++) { -#endif - for (FormatReader *reader in formatReaders) { - NSAutoreleasePool *secondarypool = [[NSAutoreleasePool alloc] init]; - NSMutableArray *points = nil; - NSString *resultString = nil; - try { -#if ZXING_DEBUG - NSLog(@"decoding gray image"); -#endif - ResultPointCallback* callback_pointer(new ZXingWidgetControllerCallback(self)); - Ref callback(callback_pointer); - Ref result([reader decode:grayImage andCallback:callback]); -#if ZXING_DEBUG - NSLog(@"gray image decoded"); -#endif - - Ref resultText(result->getText()); - const char *cString = resultText->getText().c_str(); - const ArrayRef > &resultPoints = result->getResultPoints(); - points = [[NSMutableArray alloc ] initWithCapacity:resultPoints->size()]; - - for (int i = 0; i < resultPoints->size(); i++) { - const Ref &rp = resultPoints[i]; - CGPoint p = CGPointMake(rp->getX(), rp->getY()); - [points addObject:[NSValue valueWithCGPoint:p]]; - } - - resultString = [[NSString alloc] initWithCString:cString encoding:NSUTF8StringEncoding]; - if (decoderResult) [decoderResult release]; - decoderResult = [[TwoDDecoderResult alloc] initWithText:resultString points:points]; - } catch (ReaderException &rex) { -#if ZXING_DEBUG - NSLog(@"failed to decode, caught ReaderException '%s'", - rex.what()); -#endif - } catch (IllegalArgumentException &iex) { -#if ZXING_DEBUG - NSLog(@"failed to decode, caught IllegalArgumentException '%s'", - iex.what()); -#endif - } catch (...) { - NSLog(@"Caught unknown exception!"); - } - [resultString release]; - [points release]; - [secondarypool release]; - } - -#ifdef TRY_ROTATIONS - if (!decoderResult) { -#if ZXING_DEBUG - NSLog(@"rotating gray image"); -#endif - grayImage = grayImage->rotateCounterClockwise(); -#if ZXING_DEBUG - NSLog(@"gray image rotated"); -#endif - } - } -#endif - - if (decoderResult) { - [self performSelectorOnMainThread:@selector(didDecodeImage:) - withObject:[decoderResult copy] - waitUntilDone:NO]; - [decoderResult release]; - returnCode = YES; - } else { - [self performSelectorOnMainThread:@selector(failedToDecodeImage:) - withObject:NSLocalizedString(@"Decoder BarcodeDetectionFailure", @"No barcode detected.") - waitUntilDone:NO]; - } - } - - -#if ZXING_DEBUG - NSLog(@"finished decoding."); -#endif - [mainpool release]; - - return returnCode; -} - -- (BOOL) decodeImage:(UIImage *)i { - return [self decodeImage:i cropRect:CGRectMake(0.0f, 0.0f, i.size.width, i.size.height)]; -} - -- (BOOL) decodeImage:(UIImage *)i cropRect:(CGRect)cr { - self.image = i; - cropRect = cr; - ArrayRef subsetData = [self prepareSubset]; - [self willDecodeImage]; - return [self decode:subsetData]; -} - -- (void) dealloc { - delegate = nil; - [image release]; - [subsetImage release]; - [readers release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/DecoderDelegate.h b/iphone/ZXingWidget/Classes/DecoderDelegate.h deleted file mode 100644 index 1d735c57c..000000000 --- a/iphone/ZXingWidget/Classes/DecoderDelegate.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// DecoderDelegate.h -// ZXing -// -// Created by Christian Brunschen on 01/04/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - -@class Decoder; -@class TwoDDecoderResult; - -@protocol DecoderDelegate -@optional -- (void)decoder:(Decoder *)decoder willDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset; -- (void)decoder:(Decoder *)decoder didDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset withResult:(TwoDDecoderResult *)result; -- (void)decoder:(Decoder *)decoder failedToDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset reason:(NSString *)reason; -- (void)decoder:(Decoder *)decoder foundPossibleResultPoint:(CGPoint)point; - -@end diff --git a/iphone/ZXingWidget/Classes/FormatReader.h b/iphone/ZXingWidget/Classes/FormatReader.h deleted file mode 100644 index 1061c4cda..000000000 --- a/iphone/ZXingWidget/Classes/FormatReader.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// FormatReader.h -// -// Created by Dave MacLachlan on 2010-05-03. -/* - * Copyright 2010 ZXing authors - * - * 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. - */ - -#import -#import -#import -#import -#import -#import - -@interface FormatReader : NSObject { - zxing::Reader *reader_; -} - -+ (void)registerFormatReader:(FormatReader *)formatReader; -//+ (NSSet *)formatReaders; - -- (id)initWithReader:(zxing::Reader *)reader; -- (zxing::Ref)decode:(zxing::Ref)grayImage; -- (zxing::Ref)decode:(zxing::Ref)grayImage andCallback:(zxing::Ref)callback; - -@end diff --git a/iphone/ZXingWidget/Classes/FormatReader.mm b/iphone/ZXingWidget/Classes/FormatReader.mm deleted file mode 100644 index 885ec78f9..000000000 --- a/iphone/ZXingWidget/Classes/FormatReader.mm +++ /dev/null @@ -1,71 +0,0 @@ -// -// FormatReader.mm -// -// Created by Dave MacLachlan on 2010-05-03. -/* - * Copyright 2010 ZXing authors - * - * 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. - */ - -#import "FormatReader.h" - -@implementation FormatReader - -static NSMutableSet *sFormatReaders = nil; - -+ (void)registerFormatReader:(FormatReader*)formatReader { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - @synchronized(self) { - if (!sFormatReaders) { - sFormatReaders = [[NSMutableSet alloc] init]; - } - [sFormatReaders addObject:formatReader]; - } - [pool drain]; -} - -/* -+ (NSSet *)formatReaders { - NSSet *formatReaders = nil; - @synchronized(self) { - - formatReaders = [[sFormatReaders copy] autorelease]; - } - return formatReaders; -} -*/ - -- (id)initWithReader:(zxing::Reader *)reader { - if ((self = [super init])) { - reader_ = reader; - } - return self; -} - -- (void)dealloc { - delete reader_; - [super dealloc]; -} - -- (zxing::Ref)decode:(zxing::Ref)grayImage { - return reader_->decode(grayImage); -} - -- (zxing::Ref)decode:(zxing::Ref)grayImage andCallback:(zxing::Ref)callback { - zxing::DecodeHints hints; - hints.setResultPointCallback(callback); - return reader_->decode(grayImage, hints); -} - -@end diff --git a/iphone/ZXingWidget/Classes/MultiFormatOneDReader.h b/iphone/ZXingWidget/Classes/MultiFormatOneDReader.h deleted file mode 100644 index 4437c5675..000000000 --- a/iphone/ZXingWidget/Classes/MultiFormatOneDReader.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// MultiFormatOneDReader.h -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "FormatReader.h" - - -@interface MultiFormatOneDReader : FormatReader { - -} -- (id) init; -@end diff --git a/iphone/ZXingWidget/Classes/MultiFormatOneDReader.mm b/iphone/ZXingWidget/Classes/MultiFormatOneDReader.mm deleted file mode 100644 index 6e18bb702..000000000 --- a/iphone/ZXingWidget/Classes/MultiFormatOneDReader.mm +++ /dev/null @@ -1,19 +0,0 @@ -// -// MultiFormatOneDReader.mm -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "MultiFormatOneDReader.h" -#import -#include -@implementation MultiFormatOneDReader - - -- (id) init { - zxing::oned::MultiFormatOneDReader *reader = new zxing::oned::MultiFormatOneDReader(zxing::DecodeHints::DEFAULT_HINT); - return [super initWithReader:reader]; -} -@end diff --git a/iphone/ZXingWidget/Classes/MultiFormatReader.h b/iphone/ZXingWidget/Classes/MultiFormatReader.h deleted file mode 100644 index 6ff6fe53f..000000000 --- a/iphone/ZXingWidget/Classes/MultiFormatReader.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// MultiFormatReader.h -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "FormatReader.h" - - -@interface MultiFormatReader : FormatReader { -} -- (id) init; -@end diff --git a/iphone/ZXingWidget/Classes/MultiFormatReader.mm b/iphone/ZXingWidget/Classes/MultiFormatReader.mm deleted file mode 100644 index a1b8bf701..000000000 --- a/iphone/ZXingWidget/Classes/MultiFormatReader.mm +++ /dev/null @@ -1,40 +0,0 @@ -// -// MultiFormatReader.mm -// -// Created by Dave MacLachlan on 2010-05-03. -/* - * Copyright 2010 ZXing authors - * - * 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. - */ - -#import "FormatReader.h" -#import - -@interface MultiFormatReader : FormatReader -@end - -@implementation MultiFormatReader - -+ (void)load { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [FormatReader registerFormatReader:[[[self alloc] init] autorelease]]; - [pool drain]; -} - -- (id)init { - zxing::MultiFormatReader *reader = new zxing::MultiFormatReader(); - return [super initWithReader:reader]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.h b/iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.h deleted file mode 100644 index 3777dc9d1..000000000 --- a/iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// MultiFormatUPCEANReader.h -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "FormatReader.h" - - -@interface MultiFormatUPCEANReader : FormatReader { - -} -- (id) init; -@end diff --git a/iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.mm b/iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.mm deleted file mode 100644 index 4dc747669..000000000 --- a/iphone/ZXingWidget/Classes/MultiFormatUPCEANReader.mm +++ /dev/null @@ -1,19 +0,0 @@ -// -// MultiFormatUPCEANReader.mm -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "MultiFormatUPCEANReader.h" -#import -#include - -@implementation MultiFormatUPCEANReader - -- (id) init { - zxing::oned::MultiFormatUPCEANReader *reader = new zxing::oned::MultiFormatUPCEANReader(zxing::DecodeHints::DEFAULT_HINT); - return [super initWithReader:reader]; -} -@end diff --git a/iphone/ZXingWidget/Classes/NSString+HTML.h b/iphone/ZXingWidget/Classes/NSString+HTML.h deleted file mode 100644 index 52b6d6aff..000000000 --- a/iphone/ZXingWidget/Classes/NSString+HTML.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// NSString+HTML.h -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - - -@interface NSString (HTMLExtensions) - -+ (NSDictionary *)htmlEscapes; -+ (NSDictionary *)htmlUnescapes; -- (NSString *)htmlEscapedString; -- (NSString *)htmlUnescapedString; - -@end diff --git a/iphone/ZXingWidget/Classes/NSString+HTML.m b/iphone/ZXingWidget/Classes/NSString+HTML.m deleted file mode 100644 index 98c45d43f..000000000 --- a/iphone/ZXingWidget/Classes/NSString+HTML.m +++ /dev/null @@ -1,70 +0,0 @@ -// -// NSString+HTML.m -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "NSString+HTML.h" - - -@implementation NSString (HTMLExtensions) - -static NSDictionary *htmlEscapes = nil; -static NSDictionary *htmlUnescapes = nil; - -+ (NSDictionary *)htmlEscapes { - if (!htmlEscapes) { - htmlEscapes = [[NSDictionary alloc] initWithObjectsAndKeys: - @"&", @"&", - @"<", @"<", - @">", @">", - nil - ]; - } - return htmlEscapes; -} - -+ (NSDictionary *)htmlUnescapes { - if (!htmlUnescapes) { - htmlUnescapes = [[NSDictionary alloc] initWithObjectsAndKeys: - @"&", @"&", - @"<", @"<", - @">", @">", - nil - ]; - } - return htmlEscapes; -} - -static NSString *replaceAll(NSString *s, NSDictionary *replacements) { - for (NSString *key in replacements) { - NSString *replacement = [replacements objectForKey:key]; - s = [s stringByReplacingOccurrencesOfString:key withString:replacement]; - } - return s; -} - -- (NSString *)htmlEscapedString { - return replaceAll(self, [[self class] htmlEscapes]); -} - -- (NSString *)htmlUnescapedString { - return replaceAll(self, [[self class] htmlUnescapes]); -} - -@end diff --git a/iphone/ZXingWidget/Classes/OverlayView.h b/iphone/ZXingWidget/Classes/OverlayView.h deleted file mode 100644 index 56ee7c6fb..000000000 --- a/iphone/ZXingWidget/Classes/OverlayView.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright 2009 Jeff Verkoeyen - * - * 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. - */ - -#import - -@protocol CancelDelegate; - -@interface OverlayView : UIView { - NSMutableArray *_points; - UIButton *cancelButton; - UILabel *instructionsLabel; - id delegate; - BOOL oneDMode; - BOOL cancelEnabled; - CGRect cropRect; - NSString *displayedMessage; - NSString *cancelButtonTitle; -} - -@property (nonatomic, retain) NSMutableArray* points; -@property (nonatomic, assign) id delegate; -@property (nonatomic, assign) BOOL oneDMode; -@property (nonatomic, assign) CGRect cropRect; -@property (nonatomic, copy) NSString *displayedMessage; -@property (nonatomic, retain) NSString *cancelButtonTitle; -@property (nonatomic, assign) BOOL cancelEnabled; - -- (id)initWithFrame:(CGRect)theFrame cancelEnabled:(BOOL)isCancelEnabled oneDMode:(BOOL)isOneDModeEnabled showLicense:(BOOL)shouldShowLicense; -- (id)initWithFrame:(CGRect)theFrame cancelEnabled:(BOOL)isCancelEnabled oneDMode:(BOOL)isOneDModeEnabled; - -- (void)setPoint:(CGPoint)point; - -@end - -@protocol CancelDelegate -- (void)cancelled; -@end diff --git a/iphone/ZXingWidget/Classes/OverlayView.m b/iphone/ZXingWidget/Classes/OverlayView.m deleted file mode 100644 index 7ac1bff57..000000000 --- a/iphone/ZXingWidget/Classes/OverlayView.m +++ /dev/null @@ -1,288 +0,0 @@ -// -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - -/** - * Copyright 2009 Jeff Verkoeyen - * - * 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. - */ - -#import "OverlayView.h" - -static const CGFloat kPadding = 10; -static const CGFloat kLicenseButtonPadding = 10; - -@interface OverlayView() -@property (nonatomic,assign) UIButton *cancelButton; -@property (nonatomic,assign) UIButton *licenseButton; -@property (nonatomic,retain) UILabel *instructionsLabel; -@end - - -@implementation OverlayView - -@synthesize delegate, oneDMode; -@synthesize points = _points; -@synthesize cancelButton; -@synthesize licenseButton; -@synthesize cropRect; -@synthesize instructionsLabel; -@synthesize displayedMessage; -@synthesize cancelButtonTitle; -@synthesize cancelEnabled; - -//////////////////////////////////////////////////////////////////////////////////////////////////// -- (id)initWithFrame:(CGRect)theFrame cancelEnabled:(BOOL)isCancelEnabled oneDMode:(BOOL)isOneDModeEnabled { - return [self initWithFrame:theFrame cancelEnabled:isCancelEnabled oneDMode:isOneDModeEnabled showLicense:YES]; -} - -- (id) initWithFrame:(CGRect)theFrame cancelEnabled:(BOOL)isCancelEnabled oneDMode:(BOOL)isOneDModeEnabled showLicense:(BOOL)showLicenseButton { - self = [super initWithFrame:theFrame]; - if( self ) { - - CGFloat rectSize = self.frame.size.width - kPadding * 2; - if (!oneDMode) { - cropRect = CGRectMake(kPadding, (self.frame.size.height - rectSize) / 2, rectSize, rectSize); - } else { - CGFloat rectSize2 = self.frame.size.height - kPadding * 2; - cropRect = CGRectMake(kPadding, kPadding, rectSize, rectSize2); - } - - self.backgroundColor = [UIColor clearColor]; - self.oneDMode = isOneDModeEnabled; - - if (showLicenseButton) { - self.licenseButton = [UIButton buttonWithType:UIButtonTypeInfoLight]; - - CGRect lbFrame = [licenseButton frame]; - lbFrame.origin.x = self.frame.size.width - licenseButton.frame.size.width - kLicenseButtonPadding; - lbFrame.origin.y = self.frame.size.height - licenseButton.frame.size.height - kLicenseButtonPadding; - [licenseButton setFrame:lbFrame]; - [licenseButton addTarget:self action:@selector(showLicenseAlert:) forControlEvents:UIControlEventTouchUpInside]; - - [self addSubview:licenseButton]; - } - self.cancelEnabled = isCancelEnabled; - - if (self.cancelEnabled) { - UIButton *butt = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - self.cancelButton = butt; - if ([self.cancelButtonTitle length] > 0 ) { - [cancelButton setTitle:self.cancelButtonTitle forState:UIControlStateNormal]; - } else { - [cancelButton setTitle:NSLocalizedStringWithDefaultValue(@"OverlayView cancel button title", nil, [NSBundle mainBundle], @"Cancel", @"Cancel") forState:UIControlStateNormal]; - } - [cancelButton addTarget:self action:@selector(cancel:) forControlEvents:UIControlEventTouchUpInside]; - [self addSubview:cancelButton]; - } - } - return self; -} - -- (void)cancel:(id)sender { - // call delegate to cancel this scanner - if (delegate != nil) { - [delegate cancelled]; - } -} - -- (void)showLicenseAlert:(id)sender { - NSString *title = - NSLocalizedStringWithDefaultValue(@"OverlayView license alert title", nil, [NSBundle mainBundle], @"License", @"License"); - - NSString *message = - NSLocalizedStringWithDefaultValue(@"OverlayView license alert message", nil, [NSBundle mainBundle], @"Scanning functionality provided by ZXing library, licensed under Apache 2.0 license.", @"Scanning functionality provided by ZXing library, licensed under Apache 2.0 license."); - - NSString *cancelTitle = - NSLocalizedStringWithDefaultValue(@"OverlayView license alert cancel title", nil, [NSBundle mainBundle], @"OK", @"OK"); - - NSString *viewTitle = - NSLocalizedStringWithDefaultValue(@"OverlayView license alert view title", nil, [NSBundle mainBundle], @"View License", @"View License"); - - UIAlertView *av = - [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:cancelTitle otherButtonTitles:viewTitle, nil]; - - [av show]; - [self retain]; // For the delegate callback ... - [av release]; -} - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (buttonIndex == [alertView firstOtherButtonIndex]) { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.apache.org/licenses/LICENSE-2.0.html"]]; - } - [self release]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// -- (void) dealloc { - [_points release]; - [instructionsLabel release]; - [displayedMessage release]; - [cancelButtonTitle release], - [super dealloc]; -} - - -- (void)drawRect:(CGRect)rect inContext:(CGContextRef)context { - CGContextBeginPath(context); - CGContextMoveToPoint(context, rect.origin.x, rect.origin.y); - CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y); - CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + rect.size.height); - CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height); - CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y); - CGContextStrokePath(context); -} - -- (CGPoint)map:(CGPoint)point { - CGPoint center; - center.x = cropRect.size.width/2; - center.y = cropRect.size.height/2; - float x = point.x - center.x; - float y = point.y - center.y; - int rotation = 90; - switch(rotation) { - case 0: - point.x = x; - point.y = y; - break; - case 90: - point.x = -y; - point.y = x; - break; - case 180: - point.x = -x; - point.y = -y; - break; - case 270: - point.x = y; - point.y = -x; - break; - } - point.x = point.x + center.x; - point.y = point.y + center.y; - return point; -} - -#define kTextMargin 10 - -//////////////////////////////////////////////////////////////////////////////////////////////////// -- (void)drawRect:(CGRect)rect { - [super drawRect:rect]; - if (displayedMessage == nil) { - self.displayedMessage = NSLocalizedStringWithDefaultValue(@"OverlayView displayed message", nil, [NSBundle mainBundle], @"Place a barcode inside the viewfinder rectangle to scan it.", @"Place a barcode inside the viewfinder rectangle to scan it."); - } - CGContextRef c = UIGraphicsGetCurrentContext(); - - CGFloat white[4] = {1.0f, 1.0f, 1.0f, 1.0f}; - CGContextSetStrokeColor(c, white); - CGContextSetFillColor(c, white); - [self drawRect:cropRect inContext:c]; - - // CGContextSetStrokeColor(c, white); - // CGContextSetStrokeColor(c, white); - CGContextSaveGState(c); - if (oneDMode) { - NSString *text = NSLocalizedStringWithDefaultValue(@"OverlayView 1d instructions", nil, [NSBundle mainBundle], @"Place a red line over the bar code to be scanned.", @"Place a red line over the bar code to be scanned."); - UIFont *helvetica15 = [UIFont fontWithName:@"Helvetica" size:15]; - CGSize textSize = [text sizeWithFont:helvetica15]; - - CGContextRotateCTM(c, M_PI/2); - // Invert height and width, because we are rotated. - CGPoint textPoint = CGPointMake(self.bounds.size.height / 2 - textSize.width / 2, self.bounds.size.width * -1.0f + 20.0f); - [text drawAtPoint:textPoint withFont:helvetica15]; - } - else { - UIFont *font = [UIFont systemFontOfSize:18]; - CGSize constraint = CGSizeMake(rect.size.width - 2 * kTextMargin, cropRect.origin.y); - CGSize displaySize = [self.displayedMessage sizeWithFont:font constrainedToSize:constraint]; - CGRect displayRect = CGRectMake((rect.size.width - displaySize.width) / 2 , cropRect.origin.y - displaySize.height, displaySize.width, displaySize.height); - [self.displayedMessage drawInRect:displayRect withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter]; - } - CGContextRestoreGState(c); - int offset = rect.size.width / 2; - if (oneDMode) { - CGFloat red[4] = {1.0f, 0.0f, 0.0f, 1.0f}; - CGContextSetStrokeColor(c, red); - CGContextSetFillColor(c, red); - CGContextBeginPath(c); - // CGContextMoveToPoint(c, rect.origin.x + kPadding, rect.origin.y + offset); - // CGContextAddLineToPoint(c, rect.origin.x + rect.size.width - kPadding, rect.origin.y + offset); - CGContextMoveToPoint(c, rect.origin.x + offset, rect.origin.y + kPadding); - CGContextAddLineToPoint(c, rect.origin.x + offset, rect.origin.y + rect.size.height - kPadding); - CGContextStrokePath(c); - } - if( nil != _points ) { - CGFloat blue[4] = {0.0f, 1.0f, 0.0f, 1.0f}; - CGContextSetStrokeColor(c, blue); - CGContextSetFillColor(c, blue); - if (oneDMode) { - CGPoint val1 = [self map:[[_points objectAtIndex:0] CGPointValue]]; - CGPoint val2 = [self map:[[_points objectAtIndex:1] CGPointValue]]; - CGContextMoveToPoint(c, offset, val1.x); - CGContextAddLineToPoint(c, offset, val2.x); - CGContextStrokePath(c); - } - else { - CGRect smallSquare = CGRectMake(0, 0, 10, 10); - for( NSValue* value in _points ) { - CGPoint point = [self map:[value CGPointValue]]; - smallSquare.origin = CGPointMake( - cropRect.origin.x + point.x - smallSquare.size.width / 2, - cropRect.origin.y + point.y - smallSquare.size.height / 2); - [self drawRect:smallSquare inContext:c]; - } - } - } -} - - -//////////////////////////////////////////////////////////////////////////////////////////////////// -- (void) setPoints:(NSMutableArray*)pnts { - [pnts retain]; - [_points release]; - _points = pnts; - - if (pnts != nil) { - self.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.25]; - } - [self setNeedsDisplay]; -} - -- (void) setPoint:(CGPoint)point { - if (!_points) { - _points = [[NSMutableArray alloc] init]; - } - if (_points.count > 3) { - [_points removeObjectAtIndex:0]; - } - [_points addObject:[NSValue valueWithCGPoint:point]]; - [self setNeedsDisplay]; -} - - -- (void)layoutSubviews { - [super layoutSubviews]; - if (cancelButton) { - if (oneDMode) { - [cancelButton setTransform:CGAffineTransformMakeRotation(M_PI/2)]; - [cancelButton setFrame:CGRectMake(20, 175, 45, 130)]; - } else { - CGSize theSize = CGSizeMake(100, 50); - CGRect rect = self.frame; - CGRect theRect = CGRectMake((rect.size.width - theSize.width) / 2, cropRect.origin.y + cropRect.size.height + 20, theSize.width, theSize.height); - [cancelButton setFrame:theRect]; - } - } -} - -@end diff --git a/iphone/ZXingWidget/Classes/QRCodeReader.h b/iphone/ZXingWidget/Classes/QRCodeReader.h deleted file mode 100644 index 54fabc856..000000000 --- a/iphone/ZXingWidget/Classes/QRCodeReader.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QRCodeReader.h -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "FormatReader.h" - -@interface QRCodeReader : FormatReader { - -} -- (id) init; -@end diff --git a/iphone/ZXingWidget/Classes/QRCodeReader.mm b/iphone/ZXingWidget/Classes/QRCodeReader.mm deleted file mode 100644 index bc496da92..000000000 --- a/iphone/ZXingWidget/Classes/QRCodeReader.mm +++ /dev/null @@ -1,20 +0,0 @@ -// -// QRCodeReader.mm -// ZXingWidget -// -// Created by Romain Pechayre on 6/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "QRCodeReader.h" -#import -#import "FormatReader.h" - -@implementation QRCodeReader - - -- (id) init { - zxing::qrcode::QRCodeReader *reader = new zxing::qrcode::QRCodeReader(); - return [super initWithReader:reader]; -} -@end diff --git a/iphone/ZXingWidget/Classes/TwoDDecoderResult.h b/iphone/ZXingWidget/Classes/TwoDDecoderResult.h deleted file mode 100644 index 332b33ddc..000000000 --- a/iphone/ZXingWidget/Classes/TwoDDecoderResult.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// TwoDDecoderResult.h -// ZXing -// -// Created by Christian Brunschen on 04/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - -@interface TwoDDecoderResult : NSObject { - NSString *text; - NSArray *points; -} - -@property (nonatomic, retain) NSString *text; -@property (nonatomic, retain) NSArray *points; - -+ (id)resultWithText:(NSString *)text points:(NSArray *)points; -- (id)initWithText:(NSString *)text points:(NSArray *)points; -- (id)copyWithZone:(NSZone *)zone; -- (id)copy; - -@end diff --git a/iphone/ZXingWidget/Classes/TwoDDecoderResult.m b/iphone/ZXingWidget/Classes/TwoDDecoderResult.m deleted file mode 100644 index 136b71ec2..000000000 --- a/iphone/ZXingWidget/Classes/TwoDDecoderResult.m +++ /dev/null @@ -1,63 +0,0 @@ -// -// TwoDDecoderResult.m -// ZXing -// -// Created by Christian Brunschen on 04/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "TwoDDecoderResult.h" - - -@implementation TwoDDecoderResult - -@synthesize text; -@synthesize points; - -+ (id)resultWithText:(NSString *)text points:(NSArray *)points { - return [[[self alloc] initWithText:text points:points] autorelease]; -} - -- (id)initWithText:(NSString *)t points:(NSArray *)p { - if ((self = [super init]) != nil) { - self.text = t; - self.points = p; - } - return self; -} - -- (id)copyWithZone:(NSZone *)zone { - NSArray* newPoints = [[[NSArray alloc] initWithArray:points] autorelease]; - NSString* newText = [[[NSString alloc] initWithString:text] autorelease]; - - return [[TwoDDecoderResult allocWithZone:zone] initWithText:newText points:newPoints]; -} - -- (id)copy { - return [self copyWithZone:nil]; -} - -- (void)dealloc { - [text release]; - [points release]; - [super dealloc]; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"<%@: %p> %@", [self class], self, self.text]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/ZXingWidgetController.h b/iphone/ZXingWidget/Classes/ZXingWidgetController.h deleted file mode 100644 index 04760d0c4..000000000 --- a/iphone/ZXingWidget/Classes/ZXingWidgetController.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright 2009 Jeff Verkoeyen - * - * 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 -#include -#import -#include "Decoder.h" -#include "parsedResults/ParsedResult.h" -#include "OverlayView.h" - -@protocol ZXingDelegate; - -#if !TARGET_IPHONE_SIMULATOR -#define HAS_AVFF 1 -#endif - -@interface ZXingWidgetController : UIViewController { - NSSet *readers; - ParsedResult *result; - OverlayView *overlayView; - SystemSoundID beepSound; - BOOL showCancel; - NSURL *soundToPlay; - id delegate; - BOOL wasCancelled; - BOOL oneDMode; -#if HAS_AVFF - AVCaptureSession *captureSession; - AVCaptureVideoPreviewLayer *prevLayer; -#endif - BOOL decoding; - BOOL isStatusBarHidden; -} - -#if HAS_AVFF -@property (nonatomic, retain) AVCaptureSession *captureSession; -@property (nonatomic, retain) AVCaptureVideoPreviewLayer *prevLayer; -#endif -@property (nonatomic, retain ) NSSet *readers; -@property (nonatomic, assign) id delegate; -@property (nonatomic, retain) NSURL *soundToPlay; -@property (nonatomic, retain) ParsedResult *result; -@property (nonatomic, retain) OverlayView *overlayView; - -- (id)initWithDelegate:(id)delegate showCancel:(BOOL)shouldShowCancel OneDMode:(BOOL)shouldUseoOneDMode; -- (id)initWithDelegate:(id)scanDelegate showCancel:(BOOL)shouldShowCancel OneDMode:(BOOL)shouldUseoOneDMode showLicense:(BOOL)shouldShowLicense; - -- (BOOL)fixedFocus; -- (void)setTorch:(BOOL)status; -- (BOOL)torchIsOn; - -@end - -@protocol ZXingDelegate -- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result; -- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller; -@end diff --git a/iphone/ZXingWidget/Classes/ZXingWidgetController.m b/iphone/ZXingWidget/Classes/ZXingWidgetController.m deleted file mode 100644 index dc04e45ba..000000000 --- a/iphone/ZXingWidget/Classes/ZXingWidgetController.m +++ /dev/null @@ -1,526 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/** - * Copyright 2009-2012 ZXing authors All rights reserved. - * - * 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. - */ - -#import "ZXingWidgetController.h" -#import "Decoder.h" -#import "NSString+HTML.h" -#import "ResultParser.h" -#import "ParsedResult.h" -#import "ResultAction.h" -#import "TwoDDecoderResult.h" -#include -#include - -#import - -#define CAMERA_SCALAR 1.12412 // scalar = (480 / (2048 / 480)) -#define FIRST_TAKE_DELAY 1.0 -#define ONE_D_BAND_HEIGHT 10.0 - -@interface ZXingWidgetController () - -@property BOOL showCancel; -@property BOOL showLicense; -@property BOOL oneDMode; -@property BOOL isStatusBarHidden; - -- (void)initCapture; -- (void)stopCapture; - -@end - -@implementation ZXingWidgetController - -#if HAS_AVFF -@synthesize captureSession; -@synthesize prevLayer; -#endif -@synthesize result, delegate, soundToPlay; -@synthesize overlayView; -@synthesize oneDMode, showCancel, showLicense, isStatusBarHidden; -@synthesize readers; - - -- (id)initWithDelegate:(id)scanDelegate showCancel:(BOOL)shouldShowCancel OneDMode:(BOOL)shouldUseoOneDMode { - - return [self initWithDelegate:scanDelegate showCancel:shouldShowCancel OneDMode:shouldUseoOneDMode showLicense:YES]; -} - -- (id)initWithDelegate:(id)scanDelegate showCancel:(BOOL)shouldShowCancel OneDMode:(BOOL)shouldUseoOneDMode showLicense:(BOOL)shouldShowLicense { - self = [super init]; - if (self) { - [self setDelegate:scanDelegate]; - self.oneDMode = shouldUseoOneDMode; - self.showCancel = shouldShowCancel; - self.showLicense = shouldShowLicense; - self.wantsFullScreenLayout = YES; - beepSound = -1; - decoding = NO; - OverlayView *theOverLayView = [[OverlayView alloc] initWithFrame:[UIScreen mainScreen].bounds - cancelEnabled:showCancel - oneDMode:oneDMode - showLicense:shouldShowLicense]; - [theOverLayView setDelegate:self]; - self.overlayView = theOverLayView; - [theOverLayView release]; - } - - return self; -} - -- (void)dealloc { - if (beepSound != (SystemSoundID)-1) { - AudioServicesDisposeSystemSoundID(beepSound); - } - - [self stopCapture]; - - [result release]; - [soundToPlay release]; - [overlayView release]; - [readers release]; - [super dealloc]; -} - -- (void)cancelled { - [self stopCapture]; - if (!self.isStatusBarHidden) { - [[UIApplication sharedApplication] setStatusBarHidden:NO]; - } - - wasCancelled = YES; - if (delegate != nil) { - [delegate zxingControllerDidCancel:self]; - } -} - -- (NSString *)getPlatform { - size_t size; - sysctlbyname("hw.machine", NULL, &size, NULL, 0); - char *machine = malloc(size); - sysctlbyname("hw.machine", machine, &size, NULL, 0); - NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding]; - free(machine); - return platform; -} - -- (BOOL)fixedFocus { - NSString *platform = [self getPlatform]; - if ([platform isEqualToString:@"iPhone1,1"] || - [platform isEqualToString:@"iPhone1,2"]) return YES; - return NO; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - self.wantsFullScreenLayout = YES; - if ([self soundToPlay] != nil) { - OSStatus error = AudioServicesCreateSystemSoundID((CFURLRef)[self soundToPlay], &beepSound); - if (error != kAudioServicesNoError) { - NSLog(@"Problem loading nearSound.caf"); - } - } -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - self.isStatusBarHidden = [[UIApplication sharedApplication] isStatusBarHidden]; - if (!isStatusBarHidden) - [[UIApplication sharedApplication] setStatusBarHidden:YES]; - - decoding = YES; - - [self initCapture]; - [self.view addSubview:overlayView]; - - [overlayView setPoints:nil]; - wasCancelled = NO; -} - -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - if (!isStatusBarHidden) - [[UIApplication sharedApplication] setStatusBarHidden:NO]; - [self.overlayView removeFromSuperview]; - [self stopCapture]; -} - -- (CGImageRef)CGImageRotated90:(CGImageRef)imgRef -{ - CGFloat angleInRadians = -90 * (M_PI / 180); - CGFloat width = CGImageGetWidth(imgRef); - CGFloat height = CGImageGetHeight(imgRef); - - CGRect imgRect = CGRectMake(0, 0, width, height); - CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); - CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); - - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGContextRef bmContext = CGBitmapContextCreate(NULL, - rotatedRect.size.width, - rotatedRect.size.height, - 8, - 0, - colorSpace, - kCGImageAlphaPremultipliedFirst); - CGContextSetAllowsAntialiasing(bmContext, FALSE); - CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone); - CGColorSpaceRelease(colorSpace); - // CGContextTranslateCTM(bmContext, - // +(rotatedRect.size.width/2), - // +(rotatedRect.size.height/2)); - CGContextScaleCTM(bmContext, rotatedRect.size.width/rotatedRect.size.height, 1.0); - CGContextTranslateCTM(bmContext, 0.0, rotatedRect.size.height); - CGContextRotateCTM(bmContext, angleInRadians); - // CGContextTranslateCTM(bmContext, - // -(rotatedRect.size.width/2), - // -(rotatedRect.size.height/2)); - CGContextDrawImage(bmContext, CGRectMake(0, 0, - rotatedRect.size.width, - rotatedRect.size.height), - imgRef); - - CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); - CFRelease(bmContext); - [(id)rotatedImage autorelease]; - - return rotatedImage; -} - -- (CGImageRef)CGImageRotated180:(CGImageRef)imgRef -{ - CGFloat angleInRadians = M_PI; - CGFloat width = CGImageGetWidth(imgRef); - CGFloat height = CGImageGetHeight(imgRef); - - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGContextRef bmContext = CGBitmapContextCreate(NULL, - width, - height, - 8, - 0, - colorSpace, - kCGImageAlphaPremultipliedFirst); - CGContextSetAllowsAntialiasing(bmContext, FALSE); - CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone); - CGColorSpaceRelease(colorSpace); - CGContextTranslateCTM(bmContext, - +(width/2), - +(height/2)); - CGContextRotateCTM(bmContext, angleInRadians); - CGContextTranslateCTM(bmContext, - -(width/2), - -(height/2)); - CGContextDrawImage(bmContext, CGRectMake(0, 0, width, height), imgRef); - - CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); - CFRelease(bmContext); - [(id)rotatedImage autorelease]; - - return rotatedImage; -} - -// DecoderDelegate methods - -- (void)decoder:(Decoder *)decoder willDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset{ -#if ZXING_DEBUG - NSLog(@"DecoderViewController MessageWhileDecodingWithDimensions: Decoding image (%.0fx%.0f) ...", image.size.width, image.size.height); -#endif -} - -- (void)decoder:(Decoder *)decoder - decodingImage:(UIImage *)image - usingSubset:(UIImage *)subset { -} - -- (void)presentResultForString:(NSString *)resultString { - self.result = [ResultParser parsedResultForString:resultString]; - if (beepSound != (SystemSoundID)-1) { - AudioServicesPlaySystemSound(beepSound); - } -#if ZXING_DEBUG - NSLog(@"result string = %@", resultString); -#endif -} - -- (void)presentResultPoints:(NSArray *)resultPoints - forImage:(UIImage *)image - usingSubset:(UIImage *)subset { - // simply add the points to the image view - NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:resultPoints]; - [overlayView setPoints:mutableArray]; - [mutableArray release]; -} - -- (void)decoder:(Decoder *)decoder didDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset withResult:(TwoDDecoderResult *)twoDResult { - [self presentResultForString:[twoDResult text]]; - [self presentResultPoints:[twoDResult points] forImage:image usingSubset:subset]; - // now, in a selector, call the delegate to give this overlay time to show the points - [self performSelector:@selector(notifyDelegate:) withObject:[[twoDResult text] copy] afterDelay:0.0]; - decoder.delegate = nil; -} - -- (void)notifyDelegate:(id)text { - if (!isStatusBarHidden) [[UIApplication sharedApplication] setStatusBarHidden:NO]; - [delegate zxingController:self didScanResult:text]; - [text release]; -} - -- (void)decoder:(Decoder *)decoder failedToDecodeImage:(UIImage *)image usingSubset:(UIImage *)subset reason:(NSString *)reason { - decoder.delegate = nil; - [overlayView setPoints:nil]; -} - -- (void)decoder:(Decoder *)decoder foundPossibleResultPoint:(CGPoint)point { - [overlayView setPoint:point]; -} - -/* - - (void)stopPreview:(NSNotification*)notification { - // NSLog(@"stop preview"); - } - - - (void)notification:(NSNotification*)notification { - // NSLog(@"notification %@", notification.name); - } -*/ - -#pragma mark - -#pragma mark AVFoundation - -#include -#include - -- (void)initCapture { -#if HAS_AVFF - AVCaptureDevice* inputDevice = - [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; - AVCaptureDeviceInput *captureInput = - [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil]; - - if (!captureInput) { - return; - } - - AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init]; - captureOutput.alwaysDiscardsLateVideoFrames = YES; - [captureOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; - NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; - NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; - NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; - [captureOutput setVideoSettings:videoSettings]; - self.captureSession = [[[AVCaptureSession alloc] init] autorelease]; - - NSString* preset = 0; - - if (!preset) { - preset = AVCaptureSessionPresetMedium; - } - self.captureSession.sessionPreset = preset; - - [self.captureSession addInput:captureInput]; - [self.captureSession addOutput:captureOutput]; - - [captureOutput release]; - - if (!self.prevLayer) { - self.prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; - } - // NSLog(@"prev %p %@", self.prevLayer, self.prevLayer); - self.prevLayer.frame = self.view.bounds; - self.prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; - [self.view.layer addSublayer: self.prevLayer]; - - [self.captureSession startRunning]; -#endif -} - -#if HAS_AVFF -- (void)captureOutput:(AVCaptureOutput *)captureOutput -didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer - fromConnection:(AVCaptureConnection *)connection -{ - if (!decoding) { - return; - } - CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); - /*Lock the image buffer*/ - CVPixelBufferLockBaseAddress(imageBuffer,0); - /*Get information about the image*/ - size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); - size_t width = CVPixelBufferGetWidth(imageBuffer); - size_t height = CVPixelBufferGetHeight(imageBuffer); - - // NSLog(@"wxh: %lu x %lu", width, height); - - uint8_t* baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); - void* free_me = 0; - if (true) { // iOS bug? - uint8_t* tmp = baseAddress; - int bytes = bytesPerRow*height; - free_me = baseAddress = (uint8_t*)malloc(bytes); - baseAddress[0] = 0xdb; - memcpy(baseAddress,tmp,bytes); - } - - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGContextRef newContext = - CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, - kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst); - - CGImageRef capture = CGBitmapContextCreateImage(newContext); - CVPixelBufferUnlockBaseAddress(imageBuffer,0); - free(free_me); - - CGContextRelease(newContext); - CGColorSpaceRelease(colorSpace); - - if (false) { - CGRect cropRect = [overlayView cropRect]; - if (oneDMode) { - // let's just give the decoder a vertical band right above the red line - cropRect.origin.x = cropRect.origin.x + (cropRect.size.width / 2) - (ONE_D_BAND_HEIGHT + 1); - cropRect.size.width = ONE_D_BAND_HEIGHT; - // do a rotate - CGImageRef croppedImg = CGImageCreateWithImageInRect(capture, cropRect); - CGImageRelease(capture); - capture = [self CGImageRotated90:croppedImg]; - capture = [self CGImageRotated180:capture]; - // UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:capture], nil, nil, nil); - CGImageRelease(croppedImg); - CGImageRetain(capture); - cropRect.origin.x = 0.0; - cropRect.origin.y = 0.0; - cropRect.size.width = CGImageGetWidth(capture); - cropRect.size.height = CGImageGetHeight(capture); - } - - // N.B. - // - Won't work if the overlay becomes uncentered ... - // - iOS always takes videos in landscape - // - images are always 4x3; device is not - // - iOS uses virtual pixels for non-image stuff - - { - float height = CGImageGetHeight(capture); - float width = CGImageGetWidth(capture); - - NSLog(@"%f %f", width, height); - - CGRect screen = UIScreen.mainScreen.bounds; - float tmp = screen.size.width; - screen.size.width = screen.size.height;; - screen.size.height = tmp; - - cropRect.origin.x = (width-cropRect.size.width)/2; - cropRect.origin.y = (height-cropRect.size.height)/2; - } - - NSLog(@"sb %@", NSStringFromCGRect(UIScreen.mainScreen.bounds)); - NSLog(@"cr %@", NSStringFromCGRect(cropRect)); - - CGImageRef newImage = CGImageCreateWithImageInRect(capture, cropRect); - CGImageRelease(capture); - capture = newImage; - } - - UIImage* scrn = [[[UIImage alloc] initWithCGImage:capture] autorelease]; - - CGImageRelease(capture); - - Decoder* d = [[Decoder alloc] init]; - d.readers = readers; - d.delegate = self; - - decoding = [d decodeImage:scrn] == YES ? NO : YES; - - [d release]; - - if (decoding) { - - d = [[Decoder alloc] init]; - d.readers = readers; - d.delegate = self; - - scrn = [[[UIImage alloc] initWithCGImage:scrn.CGImage - scale:1.0 - orientation:UIImageOrientationLeft] autorelease]; - - // NSLog(@"^ %@ %f", NSStringFromCGSize([scrn size]), scrn.scale); - decoding = [d decodeImage:scrn] == YES ? NO : YES; - - [d release]; - } - -} -#endif - -- (void)stopCapture { - decoding = NO; -#if HAS_AVFF - [captureSession stopRunning]; - AVCaptureInput* input = [captureSession.inputs objectAtIndex:0]; - [captureSession removeInput:input]; - AVCaptureVideoDataOutput* output = (AVCaptureVideoDataOutput*)[captureSession.outputs objectAtIndex:0]; - [captureSession removeOutput:output]; - [self.prevLayer removeFromSuperlayer]; - - self.prevLayer = nil; - self.captureSession = nil; -#endif -} - -#pragma mark - Torch - -- (void)setTorch:(BOOL)status { -#if HAS_AVFF - Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice"); - if (captureDeviceClass != nil) { - - AVCaptureDevice *device = [captureDeviceClass defaultDeviceWithMediaType:AVMediaTypeVideo]; - - [device lockForConfiguration:nil]; - if ( [device hasTorch] ) { - if ( status ) { - [device setTorchMode:AVCaptureTorchModeOn]; - } else { - [device setTorchMode:AVCaptureTorchModeOff]; - } - } - [device unlockForConfiguration]; - - } -#endif -} - -- (BOOL)torchIsOn { -#if HAS_AVFF - Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice"); - if (captureDeviceClass != nil) { - - AVCaptureDevice *device = [captureDeviceClass defaultDeviceWithMediaType:AVMediaTypeVideo]; - - if ( [device hasTorch] ) { - return [device torchMode] == AVCaptureTorchModeOn; - } - [device unlockForConfiguration]; - } -#endif - return NO; -} - -@end diff --git a/iphone/ZXingWidget/Classes/actions/AddContactAction.h b/iphone/ZXingWidget/Classes/actions/AddContactAction.h deleted file mode 100644 index 3a1fce6d7..000000000 --- a/iphone/ZXingWidget/Classes/actions/AddContactAction.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// AddContactAction.h -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultAction.h" -#import "AddressBookUI/AddressBookUI.h" - -@interface AddContactAction : ResultAction { - NSString *name; - NSArray *phoneNumbers; - NSString *note; - NSString *email; - NSString *urlString; - NSString *address; - NSString *organization; - NSString *jobTitle; - - UIViewController *viewController; -} - -@property (nonatomic, copy) NSString *name; -@property (nonatomic, retain) NSArray *phoneNumbers; -@property (nonatomic, copy) NSString *note; -@property (nonatomic, copy) NSString *email; -@property (nonatomic, copy) NSString *urlString; -@property (nonatomic, copy) NSString *address; -@property (nonatomic, copy) NSString *organization; -@property (nonatomic, copy) NSString *jobTitle; - -+ (id)actionWithName:(NSString *)n - phoneNumbers:(NSArray *)nums - email:(NSString *)em - url:(NSString *)us - address:(NSString *)ad - note:(NSString *)nt - organization:(NSString *)org - jobTitle:(NSString *)title; - -@end diff --git a/iphone/ZXingWidget/Classes/actions/AddContactAction.m b/iphone/ZXingWidget/Classes/actions/AddContactAction.m deleted file mode 100644 index 16d3486de..000000000 --- a/iphone/ZXingWidget/Classes/actions/AddContactAction.m +++ /dev/null @@ -1,249 +0,0 @@ -// -// AddContactAction.m -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "AddContactAction.h" -#import "AddressBook/AddressBook.h" - - -@implementation AddContactAction - -@synthesize name; -@synthesize phoneNumbers; -@synthesize note; -@synthesize email; -@synthesize urlString; -@synthesize address; -@synthesize organization; -@synthesize jobTitle; - -+ (id)actionWithName:(NSString *)n - phoneNumbers:(NSArray *)nums - email:(NSString *)em - url:(NSString *)us - address:(NSString *)ad - note:(NSString *)nt - organization:(NSString *)org - jobTitle:(NSString *)title { - AddContactAction *aca = [[[self alloc] init] autorelease]; - aca.name = n; - aca.phoneNumbers = nums; - aca.email = em; - aca.urlString = us; - aca.address = ad; - aca.note = nt; - aca.organization = org; - aca.jobTitle = title; - return aca; -} - -- (NSString *)title { - return NSLocalizedString(@"AddContactAction title", @"Add Contact"); -} - -- (void) addContactWithController:(UIViewController *)controller { - CFErrorRef *error = NULL; - NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceCharacterSet]; - - ABRecordRef person = ABPersonCreate(); - - NSRange commaRange = [name rangeOfString:@","]; - if (commaRange.location != NSNotFound) { - NSString *lastName = [[name substringToIndex:commaRange.location] - stringByTrimmingCharactersInSet:whitespaceSet]; - ABRecordSetValue(person, kABPersonLastNameProperty, lastName, error); - NSArray *firstNames = [[[name substringFromIndex:commaRange.location + commaRange.length] - stringByTrimmingCharactersInSet:whitespaceSet] - componentsSeparatedByCharactersInSet:whitespaceSet]; - ABRecordSetValue(person, kABPersonFirstNameProperty, [firstNames objectAtIndex:0], error); - for (unsigned i = 1; i < [firstNames count]; i++) { - ABRecordSetValue(person, kABPersonMiddleNameProperty, [firstNames objectAtIndex:1], error); - } - } else { - NSArray *nameParts = [name componentsSeparatedByCharactersInSet:whitespaceSet]; - int nParts = nameParts.count; - if (nParts == 1) { - ABRecordSetValue(person, kABPersonFirstNameProperty, name, error); - } else if (nParts >= 2) { - int lastPart = nParts - 1; - ABRecordSetValue(person, kABPersonFirstNameProperty, [nameParts objectAtIndex:0], error); - for (int i = 1; i < lastPart; i++) { - ABRecordSetValue(person, kABPersonMiddleNameProperty, [nameParts objectAtIndex:i], error); - } - ABRecordSetValue(person, kABPersonLastNameProperty, [nameParts objectAtIndex:lastPart], error); - } - } - - if (self.note) { - ABRecordSetValue(person, kABPersonNoteProperty, self.note, error); - } - - if (self.organization) { - ABRecordSetValue(person, kABPersonOrganizationProperty, (CFStringRef)self.organization, error); - } - - if (self.jobTitle) { - ABRecordSetValue(person, kABPersonJobTitleProperty, (CFStringRef)self.jobTitle, error); - } - - if (self.phoneNumbers && self.phoneNumbers.count > 0) { - // multi-values: nultiple phone numbers - ABMutableMultiValueRef phoneNumberMultiValue = - ABMultiValueCreateMutable(kABStringPropertyType); - for (NSString *number in self.phoneNumbers) { - ABMultiValueAddValueAndLabel(phoneNumberMultiValue, number, - kABPersonPhoneMainLabel, NULL); - } - ABRecordSetValue(person, kABPersonPhoneProperty, - phoneNumberMultiValue, error); - CFRelease(phoneNumberMultiValue); - } - - if (self.email) { - // a single email address - ABMutableMultiValueRef emailMultiValue = - ABMultiValueCreateMutable(kABStringPropertyType); - ABMultiValueAddValueAndLabel(emailMultiValue, self.email, - kABHomeLabel, NULL); - ABRecordSetValue(person, kABPersonEmailProperty, emailMultiValue, error); - CFRelease(emailMultiValue); - } - - if (self.urlString) { - // a single url as the home page - ABMutableMultiValueRef urlMultiValue = - ABMultiValueCreateMutable(kABStringPropertyType); - ABMultiValueAddValueAndLabel(urlMultiValue, self.urlString, - kABPersonHomePageLabel, NULL); - ABRecordSetValue(person, kABPersonURLProperty, urlMultiValue, error); - CFRelease(urlMultiValue); - } - - if (self.address) { - // we can't parse all the possible address formats, alas, so we punt by putting - // the entire thing into a multi-line 'street' address. - // This won't look great on the phone, but at least the info will be there, - // and can be syned to a desktop computer, adjusted as necessary, and so on. - - // split the address into parts at each comma or return - NSArray *parts = - [self.address componentsSeparatedByCharactersInSet: - [NSCharacterSet characterSetWithCharactersInString:@",;\r\n"]]; - NSMutableArray *strippedParts = [NSMutableArray arrayWithCapacity:[parts count]]; - // for each part: - for (NSString *part in parts) { - // strip the part of whitespace - NSString *strippedPart = - [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; - if ([strippedPart length] > 0) { - // if there is anything in this address part, add it to the list of stripped parts - [strippedParts addObject:strippedPart]; - } - } - // finally, create a 'street' address by concatenating all the stripped parts, separated by linefeeds - NSString *street = [strippedParts componentsJoinedByString:@"\n"]; - - CFMutableDictionaryRef addressDict = - CFDictionaryCreateMutable(NULL, - 1, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - CFDictionarySetValue(addressDict, kABPersonAddressStreetKey, street); - - ABMutableMultiValueRef addressMultiValue = - ABMultiValueCreateMutable(kABStringPropertyType); - ABMultiValueAddValueAndLabel(addressMultiValue, - addressDict, - kABHomeLabel, - NULL); - ABRecordSetValue(person, kABPersonAddressProperty, addressMultiValue, error); - CFRelease(addressMultiValue); - CFRelease(addressDict); - } - - ABUnknownPersonViewController *unknownPersonViewController = - [[ABUnknownPersonViewController alloc] init]; - unknownPersonViewController.displayedPerson = person; - unknownPersonViewController.allowsActions = true; - unknownPersonViewController.allowsAddingToAddressBook = true; - unknownPersonViewController.unknownPersonViewDelegate = self; - CFRelease(person); - - viewController = [controller retain]; - [[viewController navigationController] pushViewController:unknownPersonViewController animated:YES]; - [unknownPersonViewController release]; -} - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (buttonIndex != [alertView cancelButtonIndex]) { - // perform the action - [self addContactWithController:viewController]; - } -} - -#ifdef CONFIRM_ADDING_CONTACT -#undef CONFIRM_ADDING_CONTACT -#endif -- (void)performActionWithController:(UIViewController *)controller - shouldConfirm:(bool)confirm { -#ifdef CONFIRM_ADDING_CONTACT - if (confirm) { - viewController = controller; - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil - message:NSLocalizedString(@"AddContactAction alert message", @"Add Contact?") - delegate:self - cancelButtonTitle:NSLocalizedString(@"AddContactAction cancel button title", @"Cancel") - otherButtonTitles:NSLocalizedString(@"AddContactAction confirm button title", @"Add Contact"), nil]; - [alertView show]; - [alertView release]; - } else { -#endif - [self addContactWithController:controller]; -#ifdef CONFIRM_ADDING_CONTACT - } -#endif -} - -- (void)dismissUnknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonViewController { - [[viewController navigationController] popToViewController:viewController animated:YES]; - [viewController release]; - viewController = nil; -} - -// ABUnknownPersonViewControllerDelegate - -- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonViewController - didResolveToPerson:(ABRecordRef)person { - if (person) { - [self performSelector:@selector(dismissUnknownPersonViewController:) withObject:unknownPersonViewController afterDelay:0.0]; - } -} - -- (void)dealloc { - [name release]; - [phoneNumbers release]; - [note release]; - [email release]; - [urlString release]; - [address release]; - [organization release]; - [super dealloc]; -} -@end diff --git a/iphone/ZXingWidget/Classes/actions/CallAction.h b/iphone/ZXingWidget/Classes/actions/CallAction.h deleted file mode 100644 index becd8683b..000000000 --- a/iphone/ZXingWidget/Classes/actions/CallAction.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// CallAction.h -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "OpenUrlAction.h" - -@interface CallAction : OpenUrlAction { - NSString *number; -} - -@property (nonatomic, copy) NSString *number; - -+ (NSURL *)urlForNumber:(NSString *)number; - -- (id)initWithNumber:(NSString *)number; -+ (id)actionWithNumber:(NSString *)number; - -@end diff --git a/iphone/ZXingWidget/Classes/actions/CallAction.m b/iphone/ZXingWidget/Classes/actions/CallAction.m deleted file mode 100644 index e6acc789e..000000000 --- a/iphone/ZXingWidget/Classes/actions/CallAction.m +++ /dev/null @@ -1,67 +0,0 @@ -// -// CallAction.m -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "CallAction.h" - - -@implementation CallAction - -@synthesize number; - -+ (NSURL *)urlForNumber:(NSString *)number { - NSString *urlString = [NSString stringWithFormat:@"tel:%@", number]; - return [NSURL URLWithString:urlString]; -} - -- (id)initWithNumber:(NSString *)n { - if ((self = [super initWithURL:[[self class] urlForNumber:n]]) != nil) { - self.number = n; - } - return self; -} - -+ (id)actionWithNumber:(NSString *)number { - return [[[self alloc] initWithNumber:number] autorelease]; -} - -- (NSString *)title { - return [NSString localizedStringWithFormat:NSLocalizedString(@"CallAction action title", @"Call %@"), self.number]; -} - -- (NSString *)alertTitle { - return NSLocalizedString(@"CallAction alert title", @"Call"); -} - -- (NSString *)alertMessage { - return [NSString localizedStringWithFormat:NSLocalizedString(@"CallAction alert message", @"Call %@?"), self.number]; -} - -- (NSString *)alertButtonTitle { - return NSLocalizedString(@"CallAction alert button title", @"Call"); -} - - -- (void) dealloc { - [number release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/actions/EmailAction.h b/iphone/ZXingWidget/Classes/actions/EmailAction.h deleted file mode 100644 index 78e48e81e..000000000 --- a/iphone/ZXingWidget/Classes/actions/EmailAction.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// EmailAction.h -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#include "OpenUrlAction.h" - -@interface EmailAction : OpenUrlAction { - NSString *recipient; -} - -@property (nonatomic, copy) NSString *recipient; - -- (id)initWithRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body; -+ (id)actionWithRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body; - -@end diff --git a/iphone/ZXingWidget/Classes/actions/EmailAction.m b/iphone/ZXingWidget/Classes/actions/EmailAction.m deleted file mode 100644 index 2f4fb01c4..000000000 --- a/iphone/ZXingWidget/Classes/actions/EmailAction.m +++ /dev/null @@ -1,68 +0,0 @@ -// -// EmailAction.m -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "EmailAction.h" - -@implementation EmailAction - -@synthesize recipient; - -static NSURL *MailtoURL(NSString *to, NSString *sub, NSString *body) { - NSMutableString *result = [NSMutableString stringWithFormat:@"mailto:%@", - [to stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - if (sub) { - [result appendFormat:@"&subject=%@", [sub stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - } - if (body) { - [result appendFormat:@"&body=%@", [body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - } - return [NSURL URLWithString:result]; -} - -- (id)initWithRecipient:(NSString *)rec subject:(NSString *)subject body:(NSString *)body { - if ((self = [super initWithURL:MailtoURL(rec, subject, body)]) != nil) { - self.recipient = rec; - } - return self; -} - -+ (id)actionWithRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body { - return [[[self alloc] initWithRecipient:recipient subject:subject body:body] autorelease]; -} - -- (NSString *)title { - return [NSString localizedStringWithFormat:NSLocalizedString(@"EmailAction action title", @"Email %@"), self.recipient]; -} - -- (NSString *)alertTitle { - return NSLocalizedString(@"EmailAction alert title", @"Compose Email"); -} - -- (NSString *)alertMessage { - return [NSString localizedStringWithFormat:NSLocalizedString(@"EmailAction alert message", @"Compose Email to %@?"), self.recipient]; -} - -- (NSString *)alertButtonTitle { - return NSLocalizedString(@"EmailAction alert button title", @"Compose"); -} - - -@end diff --git a/iphone/ZXingWidget/Classes/actions/OpenUrlAction.h b/iphone/ZXingWidget/Classes/actions/OpenUrlAction.h deleted file mode 100644 index cc1e17bd8..000000000 --- a/iphone/ZXingWidget/Classes/actions/OpenUrlAction.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// OpenUrlAction.h -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultAction.h" - -@interface OpenUrlAction : ResultAction { - NSURL *URL; -} - -@property(nonatomic, retain) NSURL *URL; - -- (id)initWithURL:(NSURL *)URL; -+ (id)actionWithURL:(NSURL *)URL; -- (void)openURL; - -- (NSString *)alertTitle; -- (NSString *)alertMessage; -- (NSString *)alertButtonTitle; - -// UIAlertViewDelegate -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; - -@end diff --git a/iphone/ZXingWidget/Classes/actions/OpenUrlAction.m b/iphone/ZXingWidget/Classes/actions/OpenUrlAction.m deleted file mode 100644 index f59da6072..000000000 --- a/iphone/ZXingWidget/Classes/actions/OpenUrlAction.m +++ /dev/null @@ -1,82 +0,0 @@ -// -// OpenUrlAction.m -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "OpenUrlAction.h" - - -@implementation OpenUrlAction - -@synthesize URL; - -- (id)initWithURL:(NSURL *)url { - if ((self = [super init]) != nil) { - self.URL = url; - } - return self; -} - -+ (id)actionWithURL:(NSURL *)URL { - return [[[self alloc] initWithURL:URL] autorelease]; -} - -- (NSString *)title { - return [NSString localizedStringWithFormat:NSLocalizedString(@"OpenURLAction action title", @"Open URL"), self.URL]; -} - -- (NSString *)alertTitle { - return NSLocalizedString(@"OpenURLAction alert title", @"Open URL"); -} - -- (NSString *)alertMessage { - return [NSString localizedStringWithFormat:NSLocalizedString(@"OpenURLAction alert message", @"Open URL <%@>?"), self.URL]; -} - -- (NSString *)alertButtonTitle { - return NSLocalizedString(@"OpenURLAction alert button title", @"Open"); -} - -- (void)performActionWithController:(UIViewController *)controller - shouldConfirm:(bool)shouldConfirm { - if (shouldConfirm) { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil - message:[self alertMessage] - delegate:self - cancelButtonTitle:NSLocalizedString(@"OpenURLAction cancel button title", @"Cancel") - otherButtonTitles:[self alertButtonTitle], nil]; - [alertView show]; - [alertView release]; - } else { - [self openURL]; - } -} - -- (void)openURL { - [[UIApplication sharedApplication] openURL:self.URL]; -} - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (buttonIndex != [alertView cancelButtonIndex]) { - // perform the action - [self openURL]; - } -} - -@end diff --git a/iphone/ZXingWidget/Classes/actions/ResultAction.h b/iphone/ZXingWidget/Classes/actions/ResultAction.h deleted file mode 100644 index 5a8e21466..000000000 --- a/iphone/ZXingWidget/Classes/actions/ResultAction.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// ResultAction.h -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - -@interface ResultAction : NSObject { - -} - -- (NSString *)title; -- (void)performActionWithController:(UIViewController *)controller - shouldConfirm:(bool)confirm; - -@end diff --git a/iphone/ZXingWidget/Classes/actions/ResultAction.m b/iphone/ZXingWidget/Classes/actions/ResultAction.m deleted file mode 100644 index d0b61d362..000000000 --- a/iphone/ZXingWidget/Classes/actions/ResultAction.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// ResultAction.m -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ResultAction.h" - - -@implementation ResultAction - -- (NSString *)title { - return @"Abstract Action"; -} - -- (void)performActionWithController:(UIViewController *)controller - shouldConfirm:(bool)confirm { - NSLog(@"Abstract Action performed"); -} - -@end diff --git a/iphone/ZXingWidget/Classes/actions/SMSAction.h b/iphone/ZXingWidget/Classes/actions/SMSAction.h deleted file mode 100644 index 42b7245bd..000000000 --- a/iphone/ZXingWidget/Classes/actions/SMSAction.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// SMSAction.h -// ZXing -// -// Created by Christian Brunschen on 16/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "CallAction.h" - -@interface SMSAction : CallAction { - NSString *body; -} - -@property (nonatomic, copy) NSString *body; - -+ (id)actionWithNumber:(NSString *)number body:(NSString *)body; -+ (id)actionWithNumber:(NSString *)number; - -@end diff --git a/iphone/ZXingWidget/Classes/actions/SMSAction.m b/iphone/ZXingWidget/Classes/actions/SMSAction.m deleted file mode 100644 index 413a0a99a..000000000 --- a/iphone/ZXingWidget/Classes/actions/SMSAction.m +++ /dev/null @@ -1,85 +0,0 @@ -// -// SMSAction.m -// ZXing -// -// Created by Christian Brunschen on 16/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "SMSAction.h" - -// currently, including a message body makes the iPhone not actually -// go to compose an SMS at all, just start the SMS app. Bummer. -#ifdef SMS_URL_INCLUDE_BODY -#undef SMS_URL_INCLUDE_BODY -#endif - -@implementation SMSAction - -@synthesize body; - -+ (NSURL *)urlForNumber:(NSString *)number withBody:(NSString *)body { - NSString *urlString = -#ifdef SMS_URL_INCLUDE_BODY - (body && [body length]) ? - [NSString stringWithFormat:@"sms:%@?body=%@", number, [body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] : -#endif - [NSString stringWithFormat:@"sms:%@", number]; - return [NSURL URLWithString:urlString]; -} - -- (id)initWithNumber:(NSString *)n body:(NSString *)b { - if ((self = [super initWithURL:[[self class] urlForNumber:n withBody:b]]) != nil) { - self.number = n; - self.body = b; - } - return self; -} - -- (id)initWithNumber:(NSString *)n { - return [self initWithNumber:n body:nil]; -} - -+ (id)actionWithNumber:(NSString *)number body:(NSString *)body { - return [[[self alloc] initWithNumber:number body:body] autorelease]; -} - -+ (id)actionWithNumber:(NSString *)number { - return [self actionWithNumber:number body:nil]; -} - -- (NSString *)title { - return [NSString localizedStringWithFormat:NSLocalizedString(@"SMSAction action title", @"Compose SMS to %@"), self.number]; -} - -- (NSString *)alertTitle { - return NSLocalizedString(@"SMSAction alert title", @"Compose"); -} - -- (NSString *)alertMessage { - return [NSString localizedStringWithFormat:NSLocalizedString(@"SMSAction alert message", @"Compose SMS to %@?"), self.number]; -} - -- (NSString *)alertButtonTitle { - return NSLocalizedString(@"SMSAction alert button title", @"Compose"); -} - -- (void) dealloc { - [body release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/actions/ShowMapAction.h b/iphone/ZXingWidget/Classes/actions/ShowMapAction.h deleted file mode 100644 index 3f3042332..000000000 --- a/iphone/ZXingWidget/Classes/actions/ShowMapAction.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2008 ZXing authors - * - * 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. - */ -// -// ShowMapAction.h -// ZXing -// -// Created by Christian Brunschen on 05/06/2008. - -#import -#import "OpenUrlAction.h" - -@interface ShowMapAction : OpenUrlAction { - NSString *location; -} - -@property (nonatomic, copy) NSString *location; - -- (id)initWithLocation:(NSString *)location; -+ (id)actionWithLocation:(NSString *)location; - -@end diff --git a/iphone/ZXingWidget/Classes/actions/ShowMapAction.m b/iphone/ZXingWidget/Classes/actions/ShowMapAction.m deleted file mode 100644 index f3817a23f..000000000 --- a/iphone/ZXingWidget/Classes/actions/ShowMapAction.m +++ /dev/null @@ -1,68 +0,0 @@ -// -// ShowMapAction.m -// ZXing -// -// Created by Christian Brunschen on 05/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ShowMapAction.h" - - -@implementation ShowMapAction - -@synthesize location; - -static NSURL * URLForLocation(NSString *location) { - NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", - [location stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - return [NSURL URLWithString:urlString]; -} - -- (id)initWithLocation:(NSString *)l { - if ((self = [super initWithURL:URLForLocation(l)]) != nil) { - self.location = l; - } - return self; -} - -+ (id)actionWithLocation:(NSString *)location { - return [[[self alloc] initWithLocation:location] autorelease]; -} - -- (NSString *)title { - return NSLocalizedString(@"ShowMapAction action title", @"Show on Map"); -} - -- (NSString *)alertTitle { - return NSLocalizedString(@"ShowMapAction alert title", @"Show on Map"); -} - -- (NSString *)alertMessage { - return [NSString stringWithFormat:NSLocalizedString(@"ShowMapAction alert message", @"Show location %@ on Map ?"), self.location]; -} - -- (NSString *)alertButtonTitle { - return NSLocalizedString(@"ShowMapAction alert button title", @"Show"); -} - - -- (void)dealloc { - [location release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.h deleted file mode 100644 index 741eb7ab4..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// AddressBookDoCoMoParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - -@interface BusinessCardParsedResult : ParsedResult { - NSArray *names; - NSString *pronunciation; - NSArray *phoneNumbers; - NSArray *emails; - NSString *note; - NSArray *addresses; - NSString *organization; - NSString *birthday; - NSString *jobTitle; - NSString *url; -} - -@property (nonatomic, retain) NSArray *names; -@property (nonatomic, copy) NSString *pronunciation; -@property (nonatomic, retain) NSArray *phoneNumbers; -@property (nonatomic, retain) NSArray *emails; -@property (nonatomic, copy) NSString *note; -@property (nonatomic, retain) NSArray *addresses; -@property (nonatomic, copy) NSString *organization; -@property (nonatomic, copy) NSString *birthday; -@property (nonatomic, copy) NSString *jobTitle; -@property (nonatomic, copy) NSString *url; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.m deleted file mode 100644 index d99191d84..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/BusinessCardParsedResult.m +++ /dev/null @@ -1,130 +0,0 @@ -// -// BusinesCardParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "BusinessCardParsedResult.h" -#import "AddContactAction.h" - -@interface BusinessCardParsedResult (Private) - -- (void)append:(id)obj to:(NSMutableString *)dest; -+ (NSString *)normalizeName:(NSString*)name; - -@end - -@implementation BusinessCardParsedResult (Private) - -// Append an object's string representation to dest preceeded by a newline. If -// it is an array, append each item sequentially. -- (void)append:(id)obj to:(NSMutableString *)dest { - if (obj == nil) { - return; - } - if ([obj isKindOfClass:[NSArray class]]) { - for (id sub in obj) { - [self append:sub to:dest]; - } - } else if ([obj isKindOfClass:[NSString class]]) { - [dest appendFormat:@"\n%@", obj]; - } -} - -// Convert lastname,firstname to firstname lastname. -+ (NSString *)normalizeName:(NSString*)name { - int comma = [name rangeOfString:@","].location; - if (comma != NSNotFound) { - // Format may be last,first; switch it around - NSString* firstName = [name - substringWithRange:NSMakeRange(comma + 1, - [name length] - comma - 1)]; - NSString* lastName = [name - substringWithRange:NSMakeRange(0, comma)]; - return [NSString stringWithFormat:@"%@ %@", firstName, lastName]; - } - return name; -} -@end - -@implementation BusinessCardParsedResult - -@synthesize names; -@synthesize pronunciation; -@synthesize phoneNumbers; -@synthesize emails; -@synthesize note; -@synthesize addresses; -@synthesize organization; -@synthesize birthday; -@synthesize jobTitle; -@synthesize url; - -- (NSString *)stringForDisplay { - NSMutableString* result = [NSMutableString stringWithCapacity:1024]; - for (NSString *name in names) { - [self append:[BusinessCardParsedResult normalizeName:name] to:result]; - } - [self append:pronunciation to:result]; - [self append:jobTitle to:result]; - [self append:organization to:result]; - [self append:phoneNumbers to:result]; - [self append:emails to:result]; - [self append:url to:result]; - [self append:birthday to:result]; - [self append:note to:result]; - [self append:addresses to:result]; - - return result; -} - -- (void)populateActions { - [actions addObject:[AddContactAction actionWithName:[self.names objectAtIndex:0] - phoneNumbers:self.phoneNumbers - email:[self.emails objectAtIndex:0] - url:self.url - address:[self.addresses objectAtIndex:0] - note:self.note - organization:self.organization - jobTitle:self.jobTitle]]; -} - -- (void)dealloc { - [names release]; - [pronunciation release]; - [phoneNumbers release]; - [emails release]; - [note release]; - [addresses release]; - [organization release]; - [birthday release]; - [jobTitle release]; - [url release]; - - [super dealloc]; -} - -+ (NSString *)typeName { - return NSLocalizedString(@"Contact Result Type Name", @"Contact"); -} - -- (UIImage *)icon { - return [UIImage imageNamed:@"business-card.png"]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.h deleted file mode 100644 index 8378f529a..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// EmailDoCoMoParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - -@interface EmailParsedResult : ParsedResult { - NSString *to; - NSString *subject; - NSString *body; -} - -@property (nonatomic, copy) NSString *to; -@property (nonatomic, copy) NSString *subject; -@property (nonatomic, copy) NSString *body; - -+ (bool) looksLikeAnEmailAddress:(NSString *)s; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.m deleted file mode 100644 index 0fa96c2c3..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/EmailParsedResult.m +++ /dev/null @@ -1,76 +0,0 @@ -// -// EmailDoCoMoParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 28/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "EmailParsedResult.h" -#import "EmailAction.h" - - -@implementation EmailParsedResult - -@synthesize to; -@synthesize subject; -@synthesize body; - -+ (bool) looksLikeAnEmailAddress:(NSString *)s { - if ([s rangeOfString:@"@"].location == NSNotFound) { - return false; - } - if ([s rangeOfString:@"."].location == NSNotFound) { - return false; - } - if ([s rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]].location != NSNotFound) { - return false; - } - return true; -} - - -- (NSString *)stringForDisplay { - NSMutableArray *parts = [[NSMutableArray alloc] initWithCapacity:10]; - [parts addObject:[NSString stringWithFormat:NSLocalizedString(@"EmailParsedResult Display: Recipient", @"To: %@"), self.to]]; - if (self.subject) { - [parts addObject:[NSString stringWithFormat:NSLocalizedString(@"EmailParsedResult Display: Subject", @"Subject: %@"), self.subject]]; - } - if (self.body) { - [parts addObject:@""]; - [parts addObject:[NSString stringWithFormat:NSLocalizedString(@"EmailParsedResult Display: Body", @"%@"), self.body]]; - } - NSString* string = [NSString stringWithString:[parts componentsJoinedByString:@"\n"]]; - [parts release]; - return string; -} - -+ (NSString *)typeName { - return NSLocalizedString(@"EmailParsedResult type name", @"Email"); -} - -- (NSArray *)actions { - return [NSArray arrayWithObject:[EmailAction actionWithRecipient:self.to - subject:self.subject - body:self.body]]; -} - -- (UIImage *)icon { - return [UIImage imageNamed:@"email.png"]; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.h deleted file mode 100644 index 4feb8802d..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// GeoParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 05/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - -@interface GeoParsedResult : ParsedResult { - NSString *location; -} - -@property (nonatomic, copy) NSString *location; - -- (id)initWithLocation:(NSString *)location; - - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.m deleted file mode 100644 index 44ecfc8cc..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/GeoParsedResult.m +++ /dev/null @@ -1,59 +0,0 @@ -// -// GeoParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 05/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "GeoParsedResult.h" -#import "ShowMapAction.h" - -@implementation GeoParsedResult - -@synthesize location; - -- (id)initWithLocation:(NSString *)l { - if ((self = [super init]) != nil) { - self.location = l; - } - return self; -} - - -+ (NSString *)typeName { - return NSLocalizedString(@"GeoParsedResult type name", @"Geolocation"); -} - -- (UIImage *)icon { - return [UIImage imageNamed:@"map-pin.png"]; -} - - -- (NSString *)stringForDisplay { - return [NSString stringWithFormat:NSLocalizedString(@"GeoParsedResult display", @"Geo: %@"), self.location]; -} - -- (void)populateActions { - [actions addObject:[ShowMapAction actionWithLocation:self.location]]; -} - -- (void) dealloc { - [location release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.h deleted file mode 100644 index fd3cd85f0..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// ISBNParsedResult.h -// ZXing -// -// Ported to Objective C by George Nachman on 8/1/2011. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - -@interface ISBNParsedResult : ParsedResult { - NSString *value; -} - -@property (nonatomic, copy) NSString *value; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.m deleted file mode 100644 index 0e65aea7b..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/ISBNParsedResult.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// ISBNParsedResult.m -// ZXing -// -// Ported to Objective C by George Nachman on 8/1/2011 -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ISBNParsedResult.h" - -@implementation ISBNParsedResult - -@synthesize value; - -- (NSString *)stringForDisplay { - return value; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/ParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/ParsedResult.h deleted file mode 100644 index 1a7566c21..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/ParsedResult.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// ParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 22/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - -@interface ParsedResult : NSObject { - NSMutableArray *actions; -} - -+ (NSString *)typeName; - -- (NSString *)stringForDisplay; -- (UIImage *)icon; -- (NSArray *)actions; -- (void)populateActions; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/ParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/ParsedResult.m deleted file mode 100644 index 52ceacae7..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/ParsedResult.m +++ /dev/null @@ -1,107 +0,0 @@ -// -// ParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 22/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ParsedResult.h" - -#import "TextParsedResult.h" -#import "TelParsedResult.h" -#import "EmailParsedResult.h" -#import "BusinessCardParsedResult.h" -#import "URIParsedResult.h" -#import "GeoParsedResult.h" - -#import "UIKit/UIStringDrawing.h" -#import - -@implementation ParsedResult - -static NSMutableDictionary *iconsByClass = nil; - -- (NSString *)stringForDisplay { - return @"{none}"; -} - -#define ICON_SIZE 40 -#define ICON_INSIDE 36 - -+ (NSString *)typeName { - return NSStringFromClass(self); -} - -+ (UIImage *)icon { - if (iconsByClass == nil) { - iconsByClass = [[NSMutableDictionary alloc] initWithCapacity:16]; - } - UIImage *icon = [iconsByClass objectForKey:NSStringFromClass([self class])]; - if (icon == nil) { - UIGraphicsBeginImageContext(CGSizeMake(ICON_SIZE, ICON_SIZE)); - CGContextRef ctx = UIGraphicsGetCurrentContext(); - - [[UIColor lightGrayColor] set]; - UIRectFill(CGRectMake(0, 0, ICON_SIZE, ICON_SIZE)); - - [[UIColor blackColor] set]; - NSString *s = NSStringFromClass([self class]); - UIFont *font = [UIFont systemFontOfSize:16]; - CGSize stringSize = [s sizeWithFont:font]; - float xScale = fminf(1.0, ICON_INSIDE / stringSize.width); - float yScale = fminf(1.0, ICON_INSIDE / stringSize.height); - - CGContextTranslateCTM(ctx, (ICON_SIZE / 2), (ICON_SIZE / 2)); - CGContextRotateCTM(ctx, -M_PI / 6.0); - CGContextScaleCTM(ctx, xScale, yScale); - CGContextTranslateCTM(ctx, - -(stringSize.width)/2.0, - -(stringSize.height)/2.0); - - [s drawAtPoint:CGPointMake(0, 0) withFont:font]; - - // N.B.: I think this is overretained but it's static so doesn't matter and - // I don't want to test right now. (smp) - - icon = [UIGraphicsGetImageFromCurrentImageContext() retain]; - [iconsByClass setObject:icon forKey:NSStringFromClass([self class])]; - UIGraphicsEndImageContext(); - } - return icon; -} - -- (UIImage *)icon { - return [[self class] icon]; -} - -- (NSArray *)actions { - if (!actions) { - actions = [[NSMutableArray alloc] init]; - [self populateActions]; - } - return actions; -} - -- (void) populateActions { -} - -- (void) dealloc { - [actions release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.h deleted file mode 100644 index 6b0a77cff..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// ProductParsedResult.h -// ZXing -// -// Created by George Nachman on 7/8/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - -@interface ProductParsedResult : ParsedResult { - NSString *productID; - NSString *normalizedProductID; -} - -@property (nonatomic, copy) NSString *productID; -@property (nonatomic, copy) NSString *normalizedProductID; - -- (id)initWithProductID:(NSString*)newProductID - normalizedProductID:(NSString*)newNormalizedProductID; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.m deleted file mode 100644 index 477706d26..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/ProductParsedResult.m +++ /dev/null @@ -1,43 +0,0 @@ -// -// ProductParsedResult.4 -// ZXing -// -// Created by George Nachman on 7/8/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import "ProductParsedResult.h" - -@implementation ProductParsedResult - -@synthesize productID; -@synthesize normalizedProductID; - -- (id)initWithProductID:(NSString*)newProductID - normalizedProductID:(NSString*)newNormalizedProductID { - if ((self = [super init]) != nil) { - self.productID = newProductID; - self.normalizedProductID = newNormalizedProductID; - } - return self; -} - -- (NSString *)stringForDisplay { - return self.productID; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.h deleted file mode 100644 index 3349d1b2c..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// SMSParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - - -@interface SMSParsedResult : ParsedResult { - NSString *number; - NSString *body; -} - -@property (nonatomic, copy) NSString *number; -@property (nonatomic, copy) NSString *body; - -- (id)initWithNumber:(NSString *)n body:(NSString *)b; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.m deleted file mode 100644 index ac2205bcb..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/SMSParsedResult.m +++ /dev/null @@ -1,65 +0,0 @@ -// -// SMSParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "SMSParsedResult.h" -#import "SMSAction.h" - -@implementation SMSParsedResult - -@synthesize number; -@synthesize body; - -- (id)initWithNumber:(NSString *)n body:(NSString *)b { - if ((self = [super init]) != nil) { - self.number = n; - self.body = b; - } - return self; -} - -- (NSString *)stringForDisplay { - if (self.body) { - return [NSString stringWithFormat:@"%@\n%@", self.number, self.body]; - } - return self.number; -} - - -+ (NSString *)typeName { - return NSLocalizedString(@"SMSParsedResult type name", @"SMS"); -} - -- (UIImage *)icon { - return [UIImage imageNamed:@"sms.png"]; -} - -- (void)populateActions { - [actions addObject:[SMSAction actionWithNumber:self.number body:self.body]]; -} - -- (void) dealloc { - [number release]; - [body release]; - [super dealloc]; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.h deleted file mode 100644 index 6d7789da8..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// TelParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 23/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - -@interface TelParsedResult : ParsedResult { - NSString *number; -} - -@property (nonatomic, copy) NSString *number; - -- (id)initWithNumber:(NSString *)n; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.m deleted file mode 100644 index d43118910..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/TelParsedResult.m +++ /dev/null @@ -1,58 +0,0 @@ -// -// TelParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 23/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "TelParsedResult.h" -#import "CallAction.h" - -@implementation TelParsedResult - -@synthesize number; - -- (id)initWithNumber:(NSString *)n { - if ((self = [super init]) != nil) { - self.number = n; - } - return self; -} - -- (NSString *)stringForDisplay { - return self.number; -} - - -+ (NSString *)typeName { - return NSLocalizedString(@"TelParsedResult type name", @"Tel"); -} - -- (UIImage *)icon { - return [UIImage imageNamed:@"phone.png"]; -} - -- (void)populateActions { - [actions addObject:[CallAction actionWithNumber:self.number]]; -} - -- (void) dealloc { - [number release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.h deleted file mode 100644 index 70f3d3f63..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// TextParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 23/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import - -#import "ParsedResult.h" - -@interface TextParsedResult : ParsedResult { - NSString *text; -} - -@property (nonatomic, retain) NSString *text; - -- (id)initWithString:(NSString *)s; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.m deleted file mode 100644 index 1572456e0..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/TextParsedResult.m +++ /dev/null @@ -1,58 +0,0 @@ -// -// TextParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 23/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "TextParsedResult.h" -#import "EmailAction.h" - - -@implementation TextParsedResult - -@synthesize text; - -- (id)initWithString:(NSString *)s { - if ((self = [super init]) != nil) { - self.text = s; - } - return self; -} - -+ (NSString *)typeName { - return NSLocalizedString(@"TextParsedResult type name", @"Text"); -} - -- (UIImage *)icon { - return [UIImage imageNamed:@"text.png"]; -} - -- (NSString *)stringForDisplay { - return self.text; -} - -- (void) populateActions { - //[actions addObject:[EmailAction actionWithRecipient:@"recipient@domain" subject:@"QR Code Contents" body:text]]; -} - -- (void)dealloc { - [text release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.h b/iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.h deleted file mode 100644 index deaa8fdcc..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// URIParsedResult.h -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ParsedResult.h" - -@interface NSString (ZXingURLExtensions) -- (bool) looksLikeAURI; -- (NSString *)massagedURLString; -@end - -@interface URIParsedResult : ParsedResult { - NSString *urlString; - NSString *title; - NSURL *URL; -} - -- (id)initWithURLString:(NSString *)s title:(NSString *)t URL:(NSURL *)ur; -- (id)initWithURLString:(NSString *)s title:(NSString *)t; -- (id)initWithURLString:(NSString *)s URL:(NSURL *)ur; -- (id)initWithURLString:(NSString *)s; - -@property (nonatomic, copy) NSString *urlString; -@property (nonatomic, copy) NSString *title; -@property (nonatomic, copy) NSURL *URL; - -@end diff --git a/iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.m b/iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.m deleted file mode 100644 index b18385e4c..000000000 --- a/iphone/ZXingWidget/Classes/parsedResults/URIParsedResult.m +++ /dev/null @@ -1,88 +0,0 @@ -// -// URIParsedResult.m -// ZXing -// -// Created by Christian Brunschen on 29/05/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "URIParsedResult.h" -#import "OpenUrlAction.h" -#import "EmailAction.h" -#import "SMSAction.h" - - -@implementation URIParsedResult - -@synthesize urlString; -@synthesize title; -@synthesize URL; - -- (ResultAction *)createAction { - return [OpenUrlAction actionWithURL:self.URL]; -} - -- (id)initWithURLString:(NSString *)s title:(NSString *)t URL:(NSURL *)url { - if ((self = [super init]) != nil) { - self.urlString = s; - self.title = t; - self.URL = url; - } - return self; -} - -- (id)initWithURLString:(NSString *)s URL:(NSURL *)url { - return [self initWithURLString:s title:nil URL:url]; -} - -- (id)initWithURLString:(NSString *)s title:(NSString *)t { - return [self initWithURLString:s title:t URL:[NSURL URLWithString:s]]; -} - -- (id)initWithURLString:(NSString *)s { - return [self initWithURLString:s title:nil URL:[NSURL URLWithString:s]]; -} - -- (NSString *)stringForDisplay { - return self.title ? - [NSString stringWithFormat:@"%@ <%@>", self.title, self.urlString] : - self.urlString; -} - -+ (NSString *)typeName { - return NSLocalizedString(@"URIParsedResult type name", @"URI"); -} - -- (UIImage *)icon { - return [UIImage imageNamed:@"link2.png"]; -} - -- (void)populateActions { -#if ZXING_DEBUG - NSLog(@"creating action to open URL '%@'", self.urlString); -#endif - - [actions addObject:[self createAction]]; -} - -- (void)dealloc { - [URL release]; - [urlString release]; - [title release]; - [super dealloc]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.h deleted file mode 100644 index b5d990391..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// AddressBookAUResultParser.h -// ZXing -// -// Created by George Nachman on 7/7/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface AddressBookAUResultParser : ResultParser { - -} - -@end - - diff --git a/iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.m deleted file mode 100644 index c8019f574..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/AddressBookAUResultParser.m +++ /dev/null @@ -1,126 +0,0 @@ -// -// AddressBookAUResultParser.m -// ZXing -// -// Ported to Objective-C by George Nachman on 7/7/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import "AddressBookAUResultParser.h" -#import "BusinessCardParsedResult.h" -#import "CBarcodeFormat.h" -#import "ArrayAndStringCategories.h" - -@interface NSString (AddressBookAUResultParser) - -- (NSArray *)fieldsWithPrefix:(NSString *)prefix - maxResults:(int)maxResults - trim:(BOOL)trim; - -@end - -@implementation NSString (AddressBookAUResultParser) - -- (NSArray *)fieldsWithPrefix:(NSString *)prefix - maxResults:(int)maxResults - trim:(BOOL)trim { - NSMutableArray *values = nil; - for (int i = 1; i <= maxResults; i++) { - NSString *prefixWithNum = [NSString stringWithFormat:@"%@%d:", prefix, i]; - NSString *value = [self fieldWithPrefix:prefixWithNum - terminator:@"\r"]; - if (value == nil) { - break; - } - if (trim) { - value = [value stringWithTrimmedWhitespace]; - } - if (values == nil) { - values = [NSMutableArray arrayWithCapacity:maxResults]; - } - [values addObject:value]; - } - return values; -} - -@end - - -@implementation AddressBookAUResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -// -// Implements KDDI AU's address book format. See -// http://www.au.kddi.com/ezfactory/tec/two_dimensions/index.html. -// (Thanks to Yuzo for translating!) -// Credit to Sean Owen as the original author of this class in Java. -// -+ (ParsedResult *)parsedResultForString:(NSString *)rawText - format:(BarcodeFormat)format { - // Force objects in ArrayAndStringCategories.m to be loaded from static - // library to work around a linker bug. - ForceArrayAndStringCategoriesToLoad(); - - // MEMORY is mandatory; seems like a decent indicator, as does - // end-of-record separator CR/LF - if (rawText == nil || - [rawText rangeOfString:@"MEMORY"].location == NSNotFound || - [rawText rangeOfString:@"\r\n"].location == NSNotFound) { - return nil; - } - - // NAME1 and NAME2 have specific uses, namely written name and - // pronunciation, respectively. Therefore we treat them specially instead - // of as an array of names. - NSString *name = [[rawText fieldWithPrefix:@"NAME1:" - terminator:@"\r"] stringWithTrimmedWhitespace]; - NSString *pronunciation = - [[rawText fieldWithPrefix:@"NAME2:" - terminator:@"\r"] stringWithTrimmedWhitespace]; - - NSArray *phoneNumbers = - [rawText fieldsWithPrefix:@"TEL" - maxResults:3 - trim:YES]; - NSArray *emails = - [rawText fieldsWithPrefix:@"MAIL" - maxResults:3 - trim:YES]; - NSString *note = - [rawText fieldWithPrefix:@"MEMORY:" - terminator:@"\r"]; - - NSString *address = - [[rawText fieldWithPrefix:@"ADD:" - terminator:@"\r"] stringWithTrimmedWhitespace]; - NSArray *addresses = address ? [NSArray arrayWithObject:address] : nil; - - BusinessCardParsedResult *result = [[BusinessCardParsedResult alloc] init]; - - result.names = [NSArray arrayWithStringIfNotNil:name]; - result.pronunciation = pronunciation; - result.phoneNumbers = phoneNumbers; - result.emails = emails; - result.note = note; - result.addresses = addresses; - - return [result autorelease]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.h deleted file mode 100644 index 8b0f2631c..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// BizcardResultParser.h -// ZXing -// -// Created by George Nachman on 7/15/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import "ResultParser.h" - -@interface BizcardResultParser : ResultParser { - -} - -@end - - diff --git a/iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.m deleted file mode 100644 index ad799b930..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/BizcardResultParser.m +++ /dev/null @@ -1,102 +0,0 @@ -// -// BizcardResultParser.m -// ZXing -// -// Ported to Objective-C by George Nachman on 7/14/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import "BizcardResultParser.h" -#import "BusinessCardParsedResult.h" -#import "CBarcodeFormat.h" -#import "ArrayAndStringCategories.h" - -@implementation BizcardResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (NSArray*)arrayWithFirstName:(NSString*)firstName - lastName:(NSString*)lastName { - if (firstName && !lastName) { - return [NSArray arrayWithObject:firstName]; - } else if (!firstName && lastName) { - return [NSArray arrayWithObject:lastName]; - } else if (lastName && firstName) { - return [NSArray arrayWithObject:[NSString stringWithFormat:@"%@ %@", - firstName, lastName, nil]]; - } else { - return nil; - } -} - -// -// Implements the "BIZCARD" address book entry format, though this has been -// largely reverse-engineered from examples observed in the wild -- still -// looking for a definitive reference. -// -// @author Sean Owen -// -+ (ParsedResult *)parsedResultForString:(NSString *)rawText - format:(BarcodeFormat)format { - if (rawText == nil || ![rawText hasPrefix:@"BIZCARD:"]) { - return nil; - } - NSString *firstName = - [[rawText fieldWithPrefix:@"N:"] stringWithTrimmedWhitespace]; - NSString *lastName = - [[rawText fieldWithPrefix:@"X:"] stringWithTrimmedWhitespace]; - NSString *title = - [[rawText fieldWithPrefix:@"T:"] stringWithTrimmedWhitespace]; - NSString *org = - [[rawText fieldWithPrefix:@"C:"] stringWithTrimmedWhitespace]; - NSArray *addresses = - [[rawText fieldsWithPrefix:@"A:"] stringArrayWithTrimmedWhitespace]; - NSString *phoneNumber1 = - [[rawText fieldWithPrefix:@"B:"] stringWithTrimmedWhitespace]; - NSString *phoneNumber2 = - [[rawText fieldWithPrefix:@"M:"] stringWithTrimmedWhitespace]; - NSString *phoneNumber3 = - [[rawText fieldWithPrefix:@"F:"] stringWithTrimmedWhitespace]; - NSString *email = - [[rawText fieldWithPrefix:@"E:"] stringWithTrimmedWhitespace]; - - BusinessCardParsedResult *result = [[BusinessCardParsedResult alloc] init]; - - result.names = [BizcardResultParser arrayWithFirstName:firstName lastName:lastName]; - NSMutableArray *phoneNumbers = [NSMutableArray arrayWithCapacity:3]; - if (phoneNumber1) { - [phoneNumbers addObject:phoneNumber1]; - } - if (phoneNumber1) { - [phoneNumbers addObject:phoneNumber2]; - } - if (phoneNumber1) { - [phoneNumbers addObject:phoneNumber3]; - } - if ([phoneNumbers count]) { - result.phoneNumbers = phoneNumbers; - } - result.emails = email ? [NSArray arrayWithObject:email] : nil; - result.addresses = addresses; - result.organization = org; - result.jobTitle = title; - - return [result autorelease]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.h deleted file mode 100644 index d2cf1c8f3..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// BookmarkDoCoMoResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface BookmarkDoCoMoResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.m deleted file mode 100644 index 8bec88595..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/BookmarkDoCoMoResultParser.m +++ /dev/null @@ -1,52 +0,0 @@ -// -// BookmarkDoCoMoResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "BookmarkDoCoMoResultParser.h" -#import "URIParsedResult.h" -#import "CBarcodeFormat.h" -#import "ArrayAndStringCategories.h" - -@implementation BookmarkDoCoMoResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange foundRange = [s rangeOfString:@"MEBKM:"]; - if (foundRange.location == NSNotFound) { - return nil; - } - - NSString *urlString = [s fieldWithPrefix:@"URL:"]; - if (urlString == nil) { - return nil; - } - - NSString *title = [s fieldWithPrefix:@"TITLE:"]; - - return [[[URIParsedResult alloc] initWithURLString:urlString - title:title] autorelease]; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.h deleted file mode 100644 index d50211f3c..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// EmailAddressResultParser.h -// ZXing -// -// Ported to Objective C by George Nachman on 8/1/2011 -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface EmailAddressResultParser : ResultParser { - -} - -+ (BOOL)isBasicallyValidEmailAddress:(NSString *)address; - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.m deleted file mode 100644 index 5ce1270c5..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/EmailAddressResultParser.m +++ /dev/null @@ -1,130 +0,0 @@ -// -// EmailAddressResultParser.m -// ZXing -// -// Ported to Objective-C by George Nachman on 7/29/2011 -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "EmailAddressResultParser.h" -#import "EmailParsedResult.h" -#import "ArrayAndStringCategories.h" - -// -// Represents a result that encodes an e-mail address, either as a plain address -// like "joe@example.org" or a mailto: URL like "mailto:joe@example.org". -// It can also take query parameters. For example: -// "mailto:joe@example.org?subject=hello&body=hello+world" -// "mailto:?to=joe%40example.org&subject=hello&body=hello+world" -// -// A query paramter of "to" will supercede the user/host portion of the URL if -// both are present. -// -// If the mailto: prefix is absent, this will recognize strings that look -// approximately like email addresses: they have an @ sign and no characters -// outlawed by RFC 2822. -// -// Originally by Sean Owen -// -@implementation EmailAddressResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)rawText - format:(BarcodeFormat)format { - if (rawText == nil) { - return nil; - } - NSString *kMailto = @"mailto"; - NSURL *url = [NSURL URLWithString:rawText]; - if (url && [[[url scheme] lowercaseString] isEqualToString:kMailto]) { - NSDictionary *nameValues = nil; - if ([url query]) { - nameValues = [ResultParser dictionaryForQueryString:[url query]]; - } - - // Set the "to" value with the query parameter or as much of the - // user+host as we have. - NSString *user = [url user]; - NSString *host = [url host]; - NSString *emailAddress = nil; - EmailParsedResult *result = - [[[EmailParsedResult alloc] init] autorelease]; - if ([nameValues objectForKey:@"to"]) { - emailAddress = [nameValues objectForKey:@"to"]; - } else if (user && host) { - emailAddress = [NSString stringWithFormat:@"%@@%@", user, host]; - } else if (user) { - emailAddress = user; - } - if (!emailAddress) { - return nil; - } - - // Add optional fields if present. - result.to = emailAddress; - if ([nameValues objectForKey:@"subject"]) { - result.subject = [nameValues objectForKey:@"subject"]; - } - if ([nameValues objectForKey:@"body"]) { - result.body = [nameValues objectForKey:@"body"]; - } - return result; - } else { - // It doesn't start with mailto:, but maybe it looks like an email - // address. - if (![self isBasicallyValidEmailAddress:rawText]) { - return nil; - } - EmailParsedResult *result = - [[[EmailParsedResult alloc] init] autorelease]; - result.to = rawText; - return result; - } -} - -// This implements only the most basic checking for an email address's validity: -// that it contains an '@' contains no characters disallowed by RFC 2822. -// This is an overly lenient definition of validity. We want to generally be -// lenient here since this class is only intended to encapsulate what's in a -// barcode, not "judge" it. -+ (BOOL)isBasicallyValidEmailAddress:(NSString *)address { - NSRange atRange = [address rangeOfString:@"@"]; - if (atRange.location == NSNotFound) { - return NO; - } - // Strip out the first at sign (exactly one is allowed). - NSString *atlessEmail = - [address stringByReplacingCharactersInRange:atRange - withString:@""]; - // Set of non-alphanumeric characters allowed by rfc2822. - NSString *allowedChars = @"!#$%&'*+-/=?^_`{}|~."; - NSMutableCharacterSet *allowedSet = - [NSCharacterSet characterSetWithCharactersInString:allowedChars]; - [allowedSet formUnionWithCharacterSet: - [NSCharacterSet alphanumericCharacterSet]]; - NSCharacterSet *bogusSet = [allowedSet invertedSet]; - - if ([atlessEmail rangeOfCharacterFromSet:bogusSet].location != NSNotFound) { - return NO; - } - return YES; -} - -@end - diff --git a/iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.h deleted file mode 100644 index 12bb061d5..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// EmailDoCoMoResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface EmailDoCoMoResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.m deleted file mode 100644 index bc01ec121..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/EmailDoCoMoResultParser.m +++ /dev/null @@ -1,53 +0,0 @@ -// -// EmailDoCoMoResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "EmailDoCoMoResultParser.h" -#import "EmailParsedResult.h" -#import "CBarcodeFormat.h" -#import "ArrayAndStringCategories.h" - -@implementation EmailDoCoMoResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange foundRange = [s rangeOfString:@"MATMSG:"]; - if (foundRange.location == NSNotFound) { - return nil; - } - - NSString *to = [s fieldWithPrefix:@"TO:"]; - if (to == nil) { - return nil; - } - - EmailParsedResult *result = [[EmailParsedResult alloc] init]; - result.to = to; - result.subject = [s fieldWithPrefix:@"SUB:"]; - result.body = [s fieldWithPrefix:@"BODY:"]; - - return [result autorelease]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.h deleted file mode 100644 index f91b3d412..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// GeoResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface GeoResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.m deleted file mode 100644 index 3b9e9c60a..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/GeoResultParser.m +++ /dev/null @@ -1,45 +0,0 @@ -// -// GeoResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "GeoResultParser.h" -#import "GeoParsedResult.h" -#import "CBarcodeFormat.h" - -#define PREFIX @"geo:" - -@implementation GeoResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange prefixRange = [s rangeOfString:PREFIX options:NSCaseInsensitiveSearch]; - if (prefixRange.location == 0) { - int restStart = /*prefixRange.location + */ prefixRange.length; - return [[[GeoParsedResult alloc] initWithLocation:[s substringFromIndex:restStart]] - autorelease]; - } - return nil; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.h deleted file mode 100644 index 35a2c0fb3..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// ISBNResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ResultParser.h" - -@interface ISBNResultParser : ResultParser { -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.m deleted file mode 100644 index 0434258b3..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/ISBNResultParser.m +++ /dev/null @@ -1,57 +0,0 @@ -// -// ISBNResultParser.m -// ZXing -// -// Ported to Objective-C by George Nachman on 7/29/2011 -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ISBNResultParser.h" -#import "ISBNParsedResult.h" -#import "ArrayAndStringCategories.h" - -@implementation ISBNResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -// Parses strings of digits that represent an ISBN -// ISBN-13 For Dummies -// http://www.bisg.org/isbn-13/for.dummies.html -// Originally by jbreiden@google.com (Jeff Breidenbach) -+ (ParsedResult *)parsedResultForString:(NSString *)rawText - format:(BarcodeFormat)format { - if (format != BarcodeFormat_EAN_13) { - return nil; - } - if (rawText == nil) { - return nil; - } - if ([rawText length] != 13) { - return nil; - } - if (![rawText hasPrefix:@"978"] && - ![rawText hasPrefix:@"979"]) { - return nil; - } - - ISBNParsedResult *result = [[[ISBNParsedResult alloc] init] autorelease]; - result.value = rawText; - return result; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/MeCardParser.h b/iphone/ZXingWidget/Classes/resultParsers/MeCardParser.h deleted file mode 100644 index 8d411f6c8..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/MeCardParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// MeCardParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface MeCardParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/MeCardParser.m b/iphone/ZXingWidget/Classes/resultParsers/MeCardParser.m deleted file mode 100644 index dca1fd160..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/MeCardParser.m +++ /dev/null @@ -1,89 +0,0 @@ -// -// MeCardParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "MeCardParser.h" -#import "BusinessCardParsedResult.h" -#import "CBarcodeFormat.h" -#import "ArrayAndStringCategories.h" - -@interface MeCardParser (Private) - -+ (BOOL)isWellFormedBirthday:(NSString *)birthday; - -@end - -@implementation MeCardParser (Private) - -+ (BOOL)isWellFormedBirthday:(NSString *)birthday { - if ([birthday length] != 8) { - return NO; - } - NSCharacterSet* nonDigits = - [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] - invertedSet]; - NSRange range = [birthday rangeOfCharacterFromSet:nonDigits]; - return range.location == NSNotFound; -} - -@end - -@implementation MeCardParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange foundRange = [s rangeOfString:@"MECARD:"]; - if (foundRange.location == NSNotFound) { - return nil; - } - - NSString *name = [[s fieldWithPrefix:@"N:"] stringWithTrimmedWhitespace]; - if (name == nil) { - return nil; - } - - BusinessCardParsedResult *result = [[BusinessCardParsedResult alloc] init]; - result.names = [NSArray arrayWithObject:name]; - result.pronunciation = [[s fieldWithPrefix:@"SOUND:"] stringWithTrimmedWhitespace]; - result.phoneNumbers = [[s fieldsWithPrefix:@"TEL:"] stringArrayWithTrimmedWhitespace]; - result.emails = [[s fieldsWithPrefix:@"EMAIL:"] stringArrayWithTrimmedWhitespace]; - result.note = [s fieldWithPrefix:@"NOTE:"]; - result.addresses = [[s fieldsWithPrefix:@"ADR:"] stringArrayWithTrimmedWhitespace]; - result.birthday = [[s fieldWithPrefix:@"BDAY:"] stringWithTrimmedWhitespace]; - if (result.birthday != nil && ![MeCardParser isWellFormedBirthday:result.birthday]) { - // No reason to throw out the whole card because the birthday is formatted wrong. - result.birthday = nil; - } - - // The following tags are not stricty part of MECARD spec, but as they are standard in - // vcard, we honor them. - result.url = [[s fieldWithPrefix:@"URL:"] stringWithTrimmedWhitespace]; - result.organization = [[s fieldWithPrefix:@"ORG:"] stringWithTrimmedWhitespace]; - result.jobTitle = [s fieldWithPrefix:@"TITLE:"]; - - return [result autorelease]; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.h deleted file mode 100644 index a689f6460..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// PlainEmailResultParser.h -// ZXing -// -// Created by Christian Brunschen on 28/07/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - - -@interface PlainEmailResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.m deleted file mode 100644 index 0440c8b7c..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/PlainEmailResultParser.m +++ /dev/null @@ -1,42 +0,0 @@ -// -// PlainEmailResultParser.m -// ZXing -// -// Created by Christian Brunschen on 28/07/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "PlainEmailResultParser.h" -#import "EmailParsedResult.h" -#import "CBarcodeFormat.h" - -@implementation PlainEmailResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - if ([EmailParsedResult looksLikeAnEmailAddress:s]) { - EmailParsedResult *result = [[[EmailParsedResult alloc] init] autorelease]; - [result setTo:s]; - return result; - } - return nil; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.h deleted file mode 100644 index b8d67cd8d..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// ProductResultParser.h -// ZXing -// -// Created by George Nachman on 7/7/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface ProductResultParser : ResultParser { - -} - -@end - diff --git a/iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.mm b/iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.mm deleted file mode 100644 index ba32ea165..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/ProductResultParser.mm +++ /dev/null @@ -1,71 +0,0 @@ -// -*- Mode: ObjC; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -// -// ProductResultParser.m -// ZXing -// -// Ported to Objective-C by George Nachman on 7/7/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import "ProductResultParser.h" -#import "ProductParsedResult.h" -#import "CBarcodeFormat.h" -#include - -using std::string; -using zxing::String; -using zxing::Ref; - -@implementation ProductResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s format:(BarcodeFormat)format { - // Treat all UPC and EAN variants as UPCs, in the sense that they are all - // product barcodes. - if (format != BarcodeFormat_UPC_E && - format != BarcodeFormat_UPC_A && - format != BarcodeFormat_EAN_8 && - format != BarcodeFormat_EAN_13) { - return nil; - } - - // Barcode must be all digits. - for (unsigned int i = 0; i < [s length]; i++) { - unichar c = [s characterAtIndex:i]; - if (c < '0' || c > '9') { - return nil; - } - } - - NSString *normalizedProductID; - // Expand UPC-E for purposes of searching - if (format == BarcodeFormat_UPC_E) { - Ref textStr (new String([s UTF8String])); - string normal = zxing::oned::UPCEReader::convertUPCEtoUPCA(textStr)->getText(); - normalizedProductID = [NSString stringWithUTF8String:normal.c_str()]; - } else { - normalizedProductID = s; - } - - return [[[ProductParsedResult alloc] initWithProductID:s - normalizedProductID:normalizedProductID] - autorelease]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/ResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/ResultParser.h deleted file mode 100644 index baba6f92e..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/ResultParser.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// ResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "../parsedResults/ParsedResult.h" -#import "CBarcodeFormat.h" - -@interface ResultParser : NSObject { - -} -+ (void)registerResultParserClass:(Class)resultParser; -+ (ParsedResult *)parsedResultForString:(NSString *)s; -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)barcodeFormat; -+ (NSDictionary*)dictionaryForQueryString:(NSString *)uri; - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/ResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/ResultParser.m deleted file mode 100644 index 78fe30367..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/ResultParser.m +++ /dev/null @@ -1,112 +0,0 @@ -// -// ResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ResultParser.h" -#import "TextResultParser.h" - -@interface ResultParser(Private) - -+ (NSString *)urlDecode:(NSString *)str; - -@end - -@implementation ResultParser - -static NSMutableSet *sResultParsers = nil; - -+ (void)registerResultParserClass:(Class)resultParser { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - @synchronized(self) { - if (!sResultParsers) { - sResultParsers = [[NSMutableSet alloc] init]; - } - [sResultParsers addObject:resultParser]; - } - [pool drain]; -} - -+ (NSSet *)resultParsers { - NSSet *resultParsers = nil; - @synchronized(self) { - resultParsers = [[sResultParsers copy] autorelease]; - } - return resultParsers; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)barcodeFormat { -#if ZXING_DEBUG - NSLog(@"parsing result:\n<<<\n%@\n>>>\n", s); -#endif - for (Class c in [self resultParsers]) { -#if ZXING_DEBUG - NSLog(@"trying %@", NSStringFromClass(c)); -#endif - ParsedResult *result = [c parsedResultForString:s format:barcodeFormat]; - if (result != nil) { -#if ZXING_DEBUG - NSLog(@"parsed as %@ %@", NSStringFromClass([result class]), result); -#endif - return result; - } - } - -#if ZXING_DEBUG - NSLog(@"No result parsers matched. Falling back to text."); -#endif - return [TextResultParser parsedResultForString:s format:barcodeFormat]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s { - return [ResultParser parsedResultForString:s format:BarcodeFormat_NONE]; -} - -+ (NSDictionary*)dictionaryForQueryString:(NSString *)queryString { - NSMutableDictionary *result = [NSMutableDictionary dictionary]; - NSArray *keyValuePairs = [queryString componentsSeparatedByString:@"&"]; - for (NSString *kvp in keyValuePairs) { - NSRange equals = [kvp rangeOfString:@"="]; - if (equals.location != NSNotFound) { - NSString *key = - [kvp substringWithRange:NSMakeRange(0, equals.location)]; - NSUInteger i = equals.location + 1; - NSString *value = - [kvp substringWithRange:NSMakeRange(i, [kvp length] - i)]; - [result setObject:[self urlDecode:value] - forKey:[self urlDecode:key]]; - } - } - return result; -} - -@end - -@implementation ResultParser(Private) - -+ (NSString *)urlDecode:(NSString *)str { - // Obj-C's url decoder does everything except + to space conversion. - NSString *result = [str stringByReplacingOccurrencesOfString:@"+" - withString:@" "]; - return [result stringByReplacingPercentEscapesUsingEncoding: - NSUTF8StringEncoding]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.h deleted file mode 100644 index d087edf4d..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// SMSResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface SMSResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.m deleted file mode 100644 index c320c0d96..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/SMSResultParser.m +++ /dev/null @@ -1,80 +0,0 @@ -// -// SMSResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "SMSResultParser.h" -#import "SMSParsedResult.h" -#import "CBarcodeFormat.h" - -#define PREFIX @"sms:" - -@implementation SMSResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange prefixRange = [s rangeOfString:PREFIX options:NSCaseInsensitiveSearch]; - if (prefixRange.location == 0) { - int max = [s length]; - int restStart = /*prefixRange.location + */ prefixRange.length; - - // initial presuption: everything after the prefix is the number, and there is no body - NSRange numberRange = NSMakeRange(restStart, max - restStart); - NSRange bodyRange = NSMakeRange(NSNotFound, 0); - - // is there a query string? - NSRange queryRange = [s rangeOfString:@"?" options:0 range:numberRange]; - if (queryRange.location != NSNotFound) { - // truncate the number range at the beginning of the query string - numberRange.length = queryRange.location - numberRange.location; - - int paramsStart = queryRange.location + queryRange.length; - NSRange paramsRange = NSMakeRange(paramsStart, max - paramsStart); - NSRange bodyPrefixRange = [s rangeOfString:@"body=" options:0 range:paramsRange]; - if (bodyPrefixRange.location != NSNotFound) { - int bodyStart = bodyPrefixRange.location + bodyPrefixRange.length; - bodyRange = NSMakeRange(bodyStart, max - bodyStart); - NSRange ampRange = [s rangeOfString:@"&" options:0 range:bodyRange]; - if (ampRange.location != NSNotFound) { - // we found a '&', so we truncate the body range there - bodyRange.length = ampRange.location - bodyRange.location; - } - } - } - - // if there's a semicolon in the number, truncate the number there - NSRange semicolonRange = [s rangeOfString:@";" options:0 range:numberRange]; - if (semicolonRange.location != NSNotFound) { - numberRange.length = semicolonRange.location - numberRange.location; - } - - NSString *number = [s substringWithRange:numberRange]; - NSString *body = bodyRange.location != NSNotFound ? [s substringWithRange:bodyRange] : nil; - return [[[SMSParsedResult alloc] initWithNumber:number body:body] - autorelease]; - } - return nil; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.h deleted file mode 100644 index 43c7bc56d..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// SMSTOResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface SMSTOResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.m deleted file mode 100644 index 9779ab7f4..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/SMSTOResultParser.m +++ /dev/null @@ -1,59 +0,0 @@ -// -// SMSTOResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "SMSTOResultParser.h" -#import "SMSParsedResult.h" -#import "CBarcodeFormat.h" - -#define PREFIX @"SMSTO:" - -@implementation SMSTOResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange prefixRange = [s rangeOfString:PREFIX options:NSCaseInsensitiveSearch]; - if (prefixRange.location == 0) { - int max = [s length]; - int restStart = /*prefixRange.location + */ prefixRange.length; - NSRange searchRange = NSMakeRange(restStart, max - restStart); - NSRange colonRange = [s rangeOfString:@":" options:0 range:searchRange]; - if (colonRange.location != NSNotFound) { - NSRange numberRange = NSMakeRange(restStart, - colonRange.location - restStart); - int bodyStart = colonRange.location + colonRange.length; - NSRange bodyRange = NSMakeRange(bodyStart, max - bodyStart); - return [[[SMSParsedResult alloc] initWithNumber:[s substringWithRange:numberRange] - body:[s substringWithRange:bodyRange]] - autorelease]; - } else { - return [[[SMSParsedResult alloc] initWithNumber:[s substringFromIndex:restStart] - body:nil] - autorelease]; - } - } - return nil; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.h deleted file mode 100644 index 7ec73afba..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// SMTPResultParser.h -// ZXing -// -// Ported to Objective C by George Nachman on 8/1/2011 -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "ResultParser.h" - -@interface SMTPResultParser : ResultParser { -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.m deleted file mode 100644 index ba3ddcedb..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/SMTPResultParser.m +++ /dev/null @@ -1,74 +0,0 @@ -// -// SMTPResultParser.m -// ZXing -// -// Ported to Objective-C by George Nachman on 7/29/2011 -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "SMTPResultParser.h" -#import "EmailParsedResult.h" -#import "ArrayAndStringCategories.h" - -@implementation SMTPResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -// -// Parses an "smtp:" URI result, whose format is not standardized but appears -// to be like one of these: -// smtp:to -// smtp:to:subject -// smtp:to:subject:body -// -// See http://code.google.com/p/zxing/issues/detail?id=536 -// -// Originally by Sean Owen -// -+ (ParsedResult *)parsedResultForString:(NSString *)rawText - format:(BarcodeFormat)format { - if (rawText == nil) { - return nil; - } - NSString *kSmtp = @"smtp:"; - if ([rawText length] <= [kSmtp length] || - (![rawText hasPrefix:kSmtp] && - ![rawText hasPrefix:[kSmtp uppercaseString]])) { - return nil; - } - - NSArray *components = [rawText componentsSeparatedByString:@":"]; - const NSUInteger n = [components count]; - if (n < 2 || n > 4) { - return nil; - } - - EmailParsedResult *result = [[[EmailParsedResult alloc] init] autorelease]; - if (n >= 2) { - result.to = [components objectAtIndex:1]; - } - if (n >= 3) { - result.subject = [components objectAtIndex:2]; - } - if (n >= 4) { - result.body = [components objectAtIndex:3]; - } - return result; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/TelResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/TelResultParser.h deleted file mode 100644 index dd989fef5..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/TelResultParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// TelResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface TelResultParser : NSObject { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/TelResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/TelResultParser.m deleted file mode 100644 index 44f3beb06..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/TelResultParser.m +++ /dev/null @@ -1,46 +0,0 @@ -// -// TelResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "TelResultParser.h" -#import "TelParsedResult.h" -#import "CBarcodeFormat.h" - -#define PREFIX @"tel:" - -@implementation TelResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange telRange = [s rangeOfString:PREFIX options:NSCaseInsensitiveSearch]; - if (telRange.location == 0) { - int restStart = /*telRange.location + */ telRange.length; - return [[[TelParsedResult alloc] initWithNumber:[s substringFromIndex:restStart]] - autorelease]; - } - return nil; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/TextResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/TextResultParser.h deleted file mode 100644 index 3dc64adf4..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/TextResultParser.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// TextResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - - -@interface TextResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/TextResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/TextResultParser.m deleted file mode 100644 index f5de7756f..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/TextResultParser.m +++ /dev/null @@ -1,34 +0,0 @@ -// -// TextResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "TextResultParser.h" -#import "TextParsedResult.h" -#import "CBarcodeFormat.h" - -@implementation TextResultParser - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - return [[[TextParsedResult alloc] initWithString:s] autorelease]; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/URLResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/URLResultParser.h deleted file mode 100644 index 9cff23315..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/URLResultParser.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// URIResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - - -@interface URLResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/URLResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/URLResultParser.m deleted file mode 100644 index 3c97cb10b..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/URLResultParser.m +++ /dev/null @@ -1,88 +0,0 @@ -// -// URIResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "URLResultParser.h" -#import "URIParsedResult.h" -#import "CBarcodeFormat.h" - -@implementation NSString (ZXingURLExtensions) - -- (bool)looksLikeAURI { - if ([self rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]].location != NSNotFound) { - return false; - } - if ([self rangeOfString:@":"].location == NSNotFound) { - return false; - } - return true; -} - -- (NSString *)massagedURLString { - NSRange colonRange = [self rangeOfString:@":"]; - if (colonRange.location == NSNotFound) { - return [NSString stringWithFormat:@"http://%@", self]; - } else { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSString *part1 = [[self substringToIndex:colonRange.location] lowercaseString]; - NSString *part2 = [self substringFromIndex:colonRange.location]; - NSString *result = [[NSString alloc] initWithFormat:@"%@%@", part1,part2]; - [pool release]; - return [result autorelease]; - } -} - -@end - - -#define PREFIX @"URL:" - -@implementation URLResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - - NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; - ParsedResult *result = nil; - - NSRange prefixRange = [s rangeOfString:PREFIX options:NSCaseInsensitiveSearch]; - if (prefixRange.location == 0) { - int restStart = /*prefixRange.location + */ prefixRange.length; - result = [[URIParsedResult alloc] initWithURLString:[[s substringFromIndex:restStart] massagedURLString]]; -// return [[[URIParsedResult alloc] initWithURLString:[[s substringFromIndex:restStart] massagedURLString]] -// autorelease]; - } else if ([s looksLikeAURI]) { - NSString *massaged = [s massagedURLString]; - NSURL *url = [[NSURL alloc] initWithString:massaged]; - if (url != nil) { - result = [[URIParsedResult alloc] initWithURLString:massaged URL:url]; - } - [url release]; - } - [myPool release]; - return [result autorelease]; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.h deleted file mode 100644 index 3419acfe3..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// URLTOResultParser.h -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface URLTOResultParser : ResultParser { - -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.m deleted file mode 100644 index 3e82bbd3e..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/URLTOResultParser.m +++ /dev/null @@ -1,56 +0,0 @@ -// -// URLTOResultParser.m -// ZXing -// -// Created by Christian Brunschen on 25/06/2008. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "URLTOResultParser.h" -#import "URIParsedResult.h" -#import "CBarcodeFormat.h" - -#define PREFIX @"URLTO:" - -@implementation URLTOResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { - NSRange prefixRange = [s rangeOfString:PREFIX options:NSCaseInsensitiveSearch]; - if (prefixRange.location == 0) { - int max = [s length]; - int titleStart = /*prefixRange.location + */ prefixRange.length; - NSRange searchRange = NSMakeRange(titleStart, max - titleStart); - NSRange colonRange = [s rangeOfString:@":" options:0 range:searchRange]; - if (colonRange.location != NSNotFound) { - NSRange titleRange = NSMakeRange(titleStart, - colonRange.location - titleStart); - int linkStart = colonRange.location + colonRange.length; - NSRange linkRange = NSMakeRange(linkStart, max - linkStart); - return [[[URIParsedResult alloc] initWithURLString:[s substringWithRange:linkRange] - title:[s substringWithRange:titleRange]] - autorelease]; - } - } - return nil; -} - - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.h deleted file mode 100644 index d6db1e1b2..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// UniversalResultParser.h -// ZXingWidget -// -// Created by Romain Pechayre on 11/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "ResultParser.h" - -@interface UniversalResultParser : ResultParser { - //NSMutableArray *parsers; -} - -//@property(nonatomic,retain) NSMutableArray *parsers; - -+ (void)initWithDefaultParsers; -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format; -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.m deleted file mode 100644 index 3aa549167..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/UniversalResultParser.m +++ /dev/null @@ -1,94 +0,0 @@ -// -// UniversalResultParser.m -// ZXingWidget -// -// Created by Romain Pechayre on 11/14/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "UniversalResultParser.h" -#import "SMSTOResultParser.h" -#import "URLResultParser.h" -#import "TelResultParser.h" -#import "URLTOResultParser.h" -#import "SMSResultParser.h" -#import "PlainEmailResultParser.h" -#import "MeCardParser.h" -#import "EmailDoCoMoResultParser.h" -#import "BookmarkDoCoMoResultParser.h" -#import "GeoResultParser.h" -#import "TextResultParser.h" -#import "CBarcodeFormat.h" -#import "ProductResultParser.h" -#import "BizcardResultParser.h" -#import "AddressBookAUResultParser.h" -#import "VCardResultParser.h" -#import "SMTPResultParser.h" -#import "ISBNResultParser.h" -#import "EmailAddressResultParser.h" - -@implementation UniversalResultParser -static NSMutableArray *sTheResultParsers = nil; -//@synthesize parsers; - -+(void) load { - [self initWithDefaultParsers]; -} - -+ (void)addParserClass:(Class)klass { - [sTheResultParsers addObject:klass]; -} - -+ (void) initWithDefaultParsers { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - @synchronized(self) { - if (!sTheResultParsers) { - sTheResultParsers = [[NSMutableArray alloc] init]; - } - } - [pool release]; - [self addParserClass:[BookmarkDoCoMoResultParser class]]; - [self addParserClass:[MeCardParser class]]; - [self addParserClass:[EmailDoCoMoResultParser class]]; - [self addParserClass:[AddressBookAUResultParser class]]; - [self addParserClass:[VCardResultParser class]]; - [self addParserClass:[BizcardResultParser class]]; - [self addParserClass:[EmailAddressResultParser class]]; - [self addParserClass:[PlainEmailResultParser class]]; - [self addParserClass:[SMTPResultParser class]]; - [self addParserClass:[TelResultParser class]]; - [self addParserClass:[SMSResultParser class]]; - [self addParserClass:[SMSTOResultParser class]]; - [self addParserClass:[GeoResultParser class]]; - [self addParserClass:[URLTOResultParser class]]; - [self addParserClass:[URLResultParser class]]; - [self addParserClass:[ISBNResultParser class]]; - [self addParserClass:[ProductResultParser class]]; - [self addParserClass:[TextResultParser class]]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)s - format:(BarcodeFormat)format { -#if ZXING_DEBUG - NSLog(@"parsing result:\n<<<\n%@\n>>>\n", s); -#endif - for (Class c in sTheResultParsers) { -#if ZXING_DEBUG - NSLog(@"trying %@", NSStringFromClass(c)); -#endif - ParsedResult *result = [c parsedResultForString:s format:format]; - if (result != nil) { -#if ZXING_DEBUG - NSLog(@"parsed as %@ %@", NSStringFromClass([result class]), result); -#endif - return result; - } - } - return nil; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)theString { - return [self parsedResultForString:theString format:BarcodeFormat_NONE]; -} - -@end diff --git a/iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.h b/iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.h deleted file mode 100644 index 7b7b538f5..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// VCardResultParser.h -// ZXing -// -// Created by George Nachman on 7/7/2011. -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import "ResultParser.h" - -@interface VCardResultParser : ResultParser { -} - -@end - - diff --git a/iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.m b/iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.m deleted file mode 100644 index 4d0c66738..000000000 --- a/iphone/ZXingWidget/Classes/resultParsers/VCardResultParser.m +++ /dev/null @@ -1,435 +0,0 @@ -// -// VCardResultParser.m -// ZXing -// -// Ported to Objective-C by George Nachman on 7/19/2011. -/* - * Copyright 2008 ZXing authors - * - * 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. - */ - -#import "BusinessCardParsedResult.h" -#import "CBarcodeFormat.h" -#import "ResultParser.h" -#import "AddressBookAUResultParser.h" -#import "VCardResultParser.h" -#import "ArrayAndStringCategories.h" - -@interface NSString (VCardResultParser) - -// Extract a single VCard value from this with a given prefix. -- (NSString *)vcardValueForFieldWithPrefix:(NSString *)prefix; - -// Extracts an array of VCard values from this string with a given prefix. -- (NSArray *)vcardValuesForFieldWithPrefix:(NSString *)prefix; - -// Returns true if the string's value is a well-formed date. -- (BOOL)isVCardDate; - -// Returns the starting index (or NSNotFound) of the given substring not -// before index |offset|. -- (NSUInteger)vcardIndexOf:(NSString*)substr startingAt:(int)offset; - -// Assuming this string is in quoted printable in the character set |charset|, -// decode the QP encoding and convert to NSString's native character set. -- (NSString *)vcardStringFromQuotedPrintableWithCharset:(NSString *)charset; - -// Strip out \r. Also strip out \n plus one character following it if possible. -- (NSString *)vcardStringWithoutContinuationCRLF; - -// Split up key-value strings on = sign. -- (NSString *)vcardKeyComponent; -- (NSString *)vcardValueComponent; -@end - -@interface NSArray (VCardResultParser) - -// Reformat VCard names from a semicolon-delimited list to a human-readable -// name. -- (NSArray *)vcardArrayWithFormattedNames; -// Reformat VCard addresses from a semicolon-delimited list to a human-readable -// name. -- (NSArray *)vcardArrayWithFormattedAddresses; - -@end - -// Parses contact information formatted according to the VCard (2.1) format. -// This is not a complete implementation but should parse information as -// commonly encoded in 2D barcodes. -// -// Originally by Sean Owen. Adapted to Objective-C by George Nachman. -// -@implementation VCardResultParser - -+ (void)load { - [ResultParser registerResultParserClass:self]; -} - -+ (ParsedResult *)parsedResultForString:(NSString *)rawText - format:(BarcodeFormat)format { - // Although we should insist on the raw text ending with "END:VCARD", - // there's no reason to throw out everything else we parsed just because - // this was omitted. In fact, Eclair is doing just that, and we can't parse - // its contacts without this leniency. - if (rawText == nil || ![rawText hasPrefix:@"BEGIN:VCARD"]) { - return nil; - } - NSArray *names = [[rawText vcardValuesForFieldWithPrefix:@"FN"] - stringArrayWithTrimmedWhitespace]; - if ([names count] == 0) { - // If no display names found, look for regular name fields and format them - names = [[rawText vcardValuesForFieldWithPrefix:@"N"] - stringArrayWithTrimmedWhitespace]; - } - names = [names vcardArrayWithFormattedNames]; - NSArray *phoneNumbers = [[rawText vcardValuesForFieldWithPrefix:@"TEL"] stringArrayWithTrimmedWhitespace]; - NSArray *emails = [[rawText vcardValuesForFieldWithPrefix:@"EMAIL"] stringArrayWithTrimmedWhitespace]; - NSString *note = [rawText vcardValueForFieldWithPrefix:@"NOTE"]; - NSArray *addresses = [[[rawText vcardValuesForFieldWithPrefix:@"ADR"] stringArrayWithTrimmedWhitespace] - vcardArrayWithFormattedAddresses]; - NSString *org = [[rawText vcardValueForFieldWithPrefix:@"ORG"] stringWithTrimmedWhitespace]; - NSString *birthday = [[rawText vcardValueForFieldWithPrefix:@"BDAY"]stringWithTrimmedWhitespace]; - if (![birthday isVCardDate]) { - birthday = nil; - } - NSString *title = [[rawText vcardValueForFieldWithPrefix:@"TITLE"]stringWithTrimmedWhitespace]; - NSString *url = [[rawText vcardValueForFieldWithPrefix:@"URL"] stringWithTrimmedWhitespace]; - - BusinessCardParsedResult *result = - [[[BusinessCardParsedResult alloc] init] autorelease]; - - if ([names count]) { - result.names = names; - } - if ([phoneNumbers count]) { - result.phoneNumbers = phoneNumbers; - } - if ([emails count]) { - result.emails = emails; - } - if ([note length]) { - result.note = note; - } - if ([addresses count]) { - result.addresses = addresses; - } - if ([org length]) { - result.organization = org; - } - if (birthday) { - result.birthday = birthday; - } - if ([title length]) { - result.jobTitle = title; - } - if ([url length]) { - result.url = url; - } - - return result; -} - -@end - -@implementation NSString (VCardResultParser) - -- (NSUInteger)vcardIndexOf:(NSString*)substr startingAt:(int)offset { - NSRange temp = NSMakeRange(offset, [self length] - offset); - NSRange r = [self rangeOfString:substr - options:0 - range:temp]; - return r.location; -} - -- (NSString *)vcardKeyComponent { - NSUInteger equals = [self vcardIndexOf:@"=" startingAt:0]; - if (equals != NSNotFound) { - return [self substringWithRange:NSMakeRange(0, equals)]; - } else { - return nil; - } -} - -- (NSString *)vcardValueComponent { - NSUInteger equals = [self vcardIndexOf:@"=" startingAt:0]; - if (equals != NSNotFound) { - return [self substringWithRange:NSMakeRange(equals + 1, - [self length] - equals - 1)]; - } else { - return nil; - } -} - -- (NSDictionary*)parsedFieldMetadata { - NSArray *parts = [self componentsSeparatedByCharactersInSet: - [NSCharacterSet characterSetWithCharactersInString:@";:"]]; - NSMutableDictionary *result = [NSMutableDictionary dictionary]; - for (NSString *part in parts) { - NSString *key = [part vcardKeyComponent]; - NSString *value = [part vcardValueComponent]; - if (key && value) { - [result setObject:value forKey:key]; - } - } - - return result; -} - -- (NSArray *)vcardValuesForFieldWithPrefix:(NSString *)prefix { - NSMutableArray *matches = [NSMutableArray array]; - NSUInteger i = 0; - NSUInteger myLength = [self length]; - unichar c; - while (i < myLength) { - i = [self vcardIndexOf:prefix startingAt:i]; - if (i == NSNotFound) { - break; - } - - if (i > 0 && [self characterAtIndex:i - 1] != '\n') { - // This didn't start a new token: we matched in the middle of - // something. - i++; - continue; - } - i += [prefix length]; // Skip past the prefix. - c = [self characterAtIndex:i]; - if (c != ':' && c != ';') { - // What we found wasn't actually a prefix. - continue; - } - - const NSUInteger metadataStart = i; - // Skip until we find a colon. - while ([self characterAtIndex:i] != ':') { - i++; - } - - // Extract key-value metadata fields between the ; and the : after the - // prefix. - BOOL quotedPrintable = NO; - NSString *quotedPrintableCharset = @"ASCII"; - if (i >= metadataStart + 1) { - NSString *metaData = [self substringWithRange: - NSMakeRange(metadataStart + 1, - i - (metadataStart + 1))]; - NSDictionary *metaDataDict = [metaData parsedFieldMetadata]; - NSString *encoding = [metaDataDict objectForKey:@"ENCODING"]; - NSString *charset = [metaDataDict objectForKey:@"CHARSET"]; - if ([encoding isEqualToString:@"QUOTED-PRINTABLE"]) { - quotedPrintable = YES; - if (charset) { - quotedPrintableCharset = charset; - } - } - } - - i++; // Skip the colon. - - const NSUInteger matchStart = i; // Found the start of a match here. - - while ((i = [self vcardIndexOf:@"\n" startingAt:i]) != NSNotFound) { - if (i + 1 < [self length] && - ([self characterAtIndex:i + 1] == ' ' || - [self characterAtIndex:i + 1] == '\t')) { - // If it's followed by a tab or space, ignore them. - i += 2; - } else if (quotedPrintable && - i >= 2 && - ([self characterAtIndex:i-1] == '=' || - [self characterAtIndex:i-2] == '=')) { - // Indicates this is a quoted-printable continuation so - // ignore the newline. - i++; - } else { - break; - } - } - - if (i == NSNotFound) { - // No terminating character. - break; - } else if (i > matchStart) { - // Found a legal line. Add it to the output. i must be greater than - // 0 because matchStart is unsigned. - if ([self characterAtIndex:i-1] == '\r') { - i--; // Back up over \r if present. - } - NSUInteger rangeLength; - if (i >= matchStart) { - rangeLength = i - matchStart; - } else { - rangeLength = 0; - } - NSString *element = [self substringWithRange: - NSMakeRange(matchStart, rangeLength)]; - if (quotedPrintable) { - element = [element vcardStringFromQuotedPrintableWithCharset: - quotedPrintableCharset]; - } else { - element = [element vcardStringWithoutContinuationCRLF]; - } - [matches addObject:element]; - i++; - } else { - // Zero-length line. - i++; - } - } - - return matches; -} - -- (NSString *)vcardStringWithoutContinuationCRLF { - int length = [self length]; - NSMutableString *result = [NSMutableString stringWithCapacity:length]; - BOOL lastWasLF = NO; - for (int i = 0; i < length; i++) { - if (lastWasLF) { - lastWasLF = NO; - continue; - } - unichar c = [self characterAtIndex:i]; - lastWasLF = NO; - switch (c) { - case '\n': - lastWasLF = YES; - break; - case '\r': - break; - default: - [result appendString:[NSString stringWithCharacters:&c - length:1]]; - break; - } - } - return result; -} - -- (NSString *)vcardStringFromQuotedPrintableWithCharset:(NSString *)charset { - int length = [self length]; - NSMutableData *temp = [NSMutableData dataWithCapacity:length]; - for (int i = 0; i < length; i++) { - unichar c = [self characterAtIndex:i]; - switch (c) { - case '\r': - case '\n': - break; - case '=': - if (i < length - 2) { - unichar nextChar = [self characterAtIndex:i+1]; - if (nextChar == '\r' || nextChar == '\n') { - // Ignore, it's just a continuation symbol. - } else { - NSString *hexstr = - [self substringWithRange:NSMakeRange(i+1, 2)]; - NSScanner *scanner = - [NSScanner scannerWithString:hexstr]; - unsigned result; - if ([scanner scanHexInt:&result]) { - unsigned char parsedChar = result; - [temp appendBytes:&parsedChar length:1]; - } - - i += 2; - } - } - break; - default: - [temp appendBytes:&c length:1]; - } - } - - NSStringEncoding encoding; - encoding = CFStringConvertEncodingToNSStringEncoding( - CFStringConvertIANACharSetNameToEncoding((CFStringRef) charset)); - return [[[NSString alloc] initWithData:temp - encoding:encoding] autorelease]; -} - -- (NSString *)vcardValueForFieldWithPrefix:(NSString *)prefix { - NSArray *values = [self vcardValuesForFieldWithPrefix:prefix]; - return [values count] ? [values objectAtIndex:0] : @""; -} - -- (BOOL)rangeIsDigits:(NSRange)range { - for (NSUInteger i = range.location; - i < range.location + range.length; - i++) { - unichar c = [self characterAtIndex:i]; - if (c < '0' || c > '9') { - return NO; - } - } - return YES; -} - -- (BOOL)isVCardDate { - // Not really sure this is true but matches practice - if ([self length] == 8 && [self rangeIsDigits:NSMakeRange(0, 8)]) { - // Matches YYYYMMDD - return YES; - } else if ([self length] == 10 && - [self characterAtIndex:4] == '-' && - [self characterAtIndex:7] == '-' && - [self rangeIsDigits:NSMakeRange(0, 4)] && - [self rangeIsDigits:NSMakeRange(5, 2)] && - [self rangeIsDigits:NSMakeRange(8, 2)]) { - // Matches YYYY-MM-DD - return YES; - } else { - return NO; - } -} - -@end - -@implementation NSArray (VCardResultParser) - -- (NSArray *)vcardArrayWithFormattedAddresses { - NSMutableArray* result = [NSMutableArray array]; - for (NSString* address in self) { - [result addObject: - [[address stringByReplacingOccurrencesOfString:@";" - withString:@" "] - stringWithTrimmedWhitespace]]; - } - return result; -} - -// Formats name fields of the form "Public;John;Q.;Reverend;III" into a form -// like "Reverend John Q. Public III". -- (NSArray *)vcardArrayWithFormattedNames { - NSMutableArray *result = [NSMutableArray array]; - for (NSString *name in self) { - NSArray *components = [name componentsSeparatedByString:@";"]; - int newOrder[] = { 3, 1, 2, 0, 4 }; - int numReorderItems = sizeof(newOrder) / sizeof(int); - NSMutableString *formattedName = - [NSMutableString stringWithCapacity:[name length]]; - int n = [components count]; - for (int i = 0; i < numReorderItems; i++) { - int j = newOrder[i]; - if (n > j) { - [formattedName appendString:@" "]; - [formattedName appendString:[components objectAtIndex:j]]; - } - } - [result addObject:[formattedName stringWithTrimmedWhitespace]]; - } - return result; -} - - -@end diff --git a/iphone/ZXingWidget/Tests/AddressBookAUResultParserTests.m b/iphone/ZXingWidget/Tests/AddressBookAUResultParserTests.m deleted file mode 100644 index 2abc64338..000000000 --- a/iphone/ZXingWidget/Tests/AddressBookAUResultParserTests.m +++ /dev/null @@ -1,113 +0,0 @@ -// -// AddressBookAUTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "AddressBookAUResultParser.h" -#import "BusinessCardParsedResult.h" - -@interface AddressBookAUResultParserTests : SenTestCase -@end - -@implementation AddressBookAUResultParserTests - -- (void)testWellFormedAddressBookAU { - NSString *msg = - @"NAME1:Name One\r" - @"NAME2:Name Two\r" - @"NAME3:Name Three\r" // ignored - @"TEL1:1111111\r" - @"TEL2:2222222\r" - @"TEL3:3333333\r" - @"TEL4:4444444\r" // ignored - @"MAIL1:1@1.com\r" - @"MAIL2:2@2.com\r" - @"MAIL3:3@3.com\r" - @"MAIL4:4@4.com\r" // ignored - @"MEMORY:This is a note\r" - @"ADD:123 Fake St\r\n"; - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [AddressBookAUResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertEquals(1U, result.names.count, @"Wrong number of names %d", - result.names.count); - STAssertTrue([[result.names objectAtIndex:0] isEqualToString:@"Name One"], - @"Wrong name one %@", [result.names objectAtIndex:0]); - STAssertTrue([result.pronunciation isEqualToString:@"Name Two"], - @"Wrong pronunciation %@", result.pronunciation); - STAssertEquals(3U, result.phoneNumbers.count, - @"Wrong number of phone numbers %d", - result.phoneNumbers.count); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:0] isEqualToString:@"1111111"], - @"Wrong phone number 1 %@", [result.phoneNumbers objectAtIndex:0]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:1] isEqualToString:@"2222222"], - @"Wrong phone number 2 %@", [result.phoneNumbers objectAtIndex:1]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:2] isEqualToString:@"3333333"], - @"Wrong phone number 3 %@", [result.phoneNumbers objectAtIndex:2]); - STAssertEquals(3U, result.emails.count, - @"Wrong number of emails %d", result.emails.count); - STAssertTrue([[result.emails objectAtIndex:0] isEqualToString:@"1@1.com"], - @"Wrong email 1 %@", [result.emails objectAtIndex:0]); - STAssertTrue([[result.emails objectAtIndex:1] isEqualToString:@"2@2.com"], - @"Wrong email 2 %@", [result.emails objectAtIndex:1]); - STAssertTrue([[result.emails objectAtIndex:2] isEqualToString:@"3@3.com"], - @"Wrong email 3 %@", [result.emails objectAtIndex:2]); - STAssertTrue([result.note isEqualToString:@"This is a note"], - @"Wrong note %@", result.note); - STAssertEquals(1U, result.addresses.count, @"Wrong number of addresses %d", - result.addresses.count); - STAssertTrue( - [[result.addresses objectAtIndex:0] isEqualToString:@"123 Fake St"], - @"Wrong address %@", [result.addresses objectAtIndex:0]); -} - -- (void)testMissingNewlineAddressBookAU { - NSString *msg = - @"NAME1:Name One\r" - @"NAME2:Name Two\r" - @"NAME3:Name Three\r" - @"TEL1:1111111\r" - @"TEL2:2222222\r" - @"TEL3:3333333\r" - @"TEL4:4444444\r" - @"MAIL1:1@1.com\r" - @"MAIL2:2@2.com\r" - @"MAIL3:3@3.com\r" - @"MAIL4:4@4.com\r" - @"MEMORY:This is a note\r" - @"ADD:123 Fake St\r"; - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [AddressBookAUResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus string matched"); -} - -- (void)testMalformedAddressBookAU { - NSString *msg = - @"NAME1:Name One\r" - @"NAME2:Name Two\r" - @"NAME3:Name Three\r" // ignored - @"TEL1:1111111\r" - @"TEL2:2222222\r" - @"TEL3:3333333\r" - @"TEL4:4444444\r" // ignored - @"MAIL1:1@1.com\r" - @"MAIL2:2@2.com\r" - @"MAIL3:3@3.com\r" - @"MAIL4:4@4.com\r" // ignored - @"ADD:123 Fake St"; - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [AddressBookAUResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus string matched"); -} - -@end diff --git a/iphone/ZXingWidget/Tests/BizcardResultParserTests.m b/iphone/ZXingWidget/Tests/BizcardResultParserTests.m deleted file mode 100644 index b6df1048e..000000000 --- a/iphone/ZXingWidget/Tests/BizcardResultParserTests.m +++ /dev/null @@ -1,135 +0,0 @@ -// -// BizcardTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "BizcardResultParser.h" -#import "BusinessCardParsedResult.h" - -@interface BizcardResultParserTests : SenTestCase -@end - -@implementation BizcardResultParserTests - -- (void)testWellFormedBizcard { - NSString *msg = - @"BIZCARD:;" - @"N:Firstname;" - @"X:Lastname;" - @"T:Title;" - @"C:Org;" - @"A:Addr 1;" - @"A:Addr 2;" - @"B:1111111;" - @"M:2222222;" - @"F:3333333;" - @"E:1@1.com;"; - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [BizcardResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertEquals(1U, result.names.count, @"Wrong number of names %d", - result.names.count); - STAssertTrue( - [[result.names objectAtIndex:0] isEqualToString:@"Firstname Lastname"], - @"Name one is %@", [result.names objectAtIndex:0]); - STAssertTrue([result.jobTitle isEqualToString:@"Title"], - @"Title is %@", result.jobTitle); - STAssertTrue([result.organization isEqualToString:@"Org"], - @"Organization is %@", result.organization); - STAssertEquals(2U, result.addresses.count, @"Wrong number of addresses %d", - result.addresses.count); - STAssertTrue([[result.addresses objectAtIndex:0] isEqualToString:@"Addr 1"], - @"Wrong address %@", [result.addresses objectAtIndex:0]); - STAssertTrue([[result.addresses objectAtIndex:1] isEqualToString:@"Addr 2"], - @"Wrong address %@", [result.addresses objectAtIndex:0]); - STAssertEquals(3U, result.phoneNumbers.count, - @"Wrong number of phone numbers %d", - result.phoneNumbers.count); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:0] isEqualToString:@"1111111"], - @"Phone number 1 is %@", [result.phoneNumbers objectAtIndex:0]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:1] isEqualToString:@"2222222"], - @"Phone number 2 is %@", [result.phoneNumbers objectAtIndex:1]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:2] isEqualToString:@"3333333"], - @"Phone number 3 is %@", [result.phoneNumbers objectAtIndex:2]); - STAssertEquals(1U, result.emails.count, - @"Wrong number of emails %d", result.emails.count); - STAssertTrue([[result.emails objectAtIndex:0] isEqualToString:@"1@1.com"], - @"Email 1 is %@", [result.emails objectAtIndex:0]); -} - -- (void)testExtraWhitespaceBizcard { - NSString *msg = - @"BIZCARD:;" - @"N:Firstname ;" - @"X:Lastname\r;" - @"T:Title\n;" - @"C:Org\r\n;" - @"A: Addr 1;" - @"A:\rAddr 2;" - @"B:\n1111111;" - @"M:\r\n2222222;" - @"F:\t3333333;" - @"E:1@1.com\t;"; - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [BizcardResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertEquals(1U, result.names.count, @"Wrong number of names %d", - result.names.count); - STAssertTrue( - [[result.names objectAtIndex:0] isEqualToString:@"Firstname Lastname"], - @"Name one is %@", [result.names objectAtIndex:0]); - STAssertTrue([result.jobTitle isEqualToString:@"Title"], - @"Title is %@", result.jobTitle); - STAssertTrue([result.organization isEqualToString:@"Org"], - @"Organization is %@", result.organization); - STAssertEquals(2U, result.addresses.count, @"Wrong number of addresses %d", - result.addresses.count); - STAssertTrue([[result.addresses objectAtIndex:0] isEqualToString:@"Addr 1"], - @"Wrong address %@", [result.addresses objectAtIndex:0]); - STAssertTrue([[result.addresses objectAtIndex:1] isEqualToString:@"Addr 2"], - @"Wrong address %@", [result.addresses objectAtIndex:0]); - STAssertEquals(3U, result.phoneNumbers.count, - @"Wrong number of phone numbers %d", - result.phoneNumbers.count); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:0] isEqualToString:@"1111111"], - @"Phone number 1 is %@", [result.phoneNumbers objectAtIndex:0]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:1] isEqualToString:@"2222222"], - @"Phone number 2 is %@", [result.phoneNumbers objectAtIndex:1]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:2] isEqualToString:@"3333333"], - @"Phone number 3 is %@", [result.phoneNumbers objectAtIndex:2]); - STAssertEquals(1U, result.emails.count, - @"Wrong number of emails %d", result.emails.count); - STAssertTrue([[result.emails objectAtIndex:0] isEqualToString:@"1@1.com"], - @"Email 1 is %@", [result.emails objectAtIndex:0]); -} - -- (void)testMalformedBizcard { - NSString *msg = - @"N:Name One;" - @"X:Name Two;" - @"T:Title;" - @"C:Org;" - @"A:Addr 1;" - @"A:Addr 2;" - @"B:1111111;" - @"M:2222222;" - @"F:3333333;" - @"E:1@1.com;"; - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [BizcardResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus string matched"); -} - -@end diff --git a/iphone/ZXingWidget/Tests/BookmarkDoCoMoTests.m b/iphone/ZXingWidget/Tests/BookmarkDoCoMoTests.m deleted file mode 100644 index dd3a055a8..000000000 --- a/iphone/ZXingWidget/Tests/BookmarkDoCoMoTests.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// BookmarkDoCoMoTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "BookmarkDoCoMoResultParser.h" -#import "URIParsedResult.h" - -@interface BookmarkDoCoMoTests : SenTestCase -@end - -@implementation BookmarkDoCoMoTests - -- (void)testWellFormedBookmarkDoCoMo { - NSString *msg = - @"MEBKM:;" - @"URL:http://www.example.com/;" - @"TITLE:The Title;"; - URIParsedResult *result = (URIParsedResult *) - [BookmarkDoCoMoResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.urlString isEqualToString:@"http://www.example.com/"], - @"Wrong URL string %@", result.urlString); - STAssertTrue([[result.URL host] isEqualToString:@"www.example.com"], - @"Wrong URL host %@", [result.URL host]); - STAssertTrue([[result.URL path] isEqualToString:@"/"], - @"Wrong URL path %@", [result.URL path]); - STAssertTrue([[result.URL scheme] isEqualToString:@"http"], - @"Wrong URL scheme %@", [result.URL scheme]); - STAssertTrue([result.title isEqualToString:@"The Title"], - @"Wrong title %@", result.title); -} - -- (void)testMalformedBookmarkDoCoMo { - NSString *msg = - @"URL:http://www.example.com/;" - @"TITLE:The Title"; - URIParsedResult *result = (URIParsedResult *) - [BookmarkDoCoMoResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus string matched."); -} - - -@end diff --git a/iphone/ZXingWidget/Tests/EmailAddressResultParserTests.m b/iphone/ZXingWidget/Tests/EmailAddressResultParserTests.m deleted file mode 100644 index 8c8ca8b65..000000000 --- a/iphone/ZXingWidget/Tests/EmailAddressResultParserTests.m +++ /dev/null @@ -1,130 +0,0 @@ -// -// EmailAddressResultParserTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "EmailAddressResultParserResultParser.h" -#import "URIParsedResult.h" - -@interface EmailAddressResultParserTests : SenTestCase -@end - -@implementation EmailAddressResultParserTests - -- (void)testWellFormedEmailAddressResultParser { - NSString *msg = - @"mailto:user@example.com?subject=the+subject&body=the%20body"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user@example.com"], - @"Wrong to %@", result.to); - STAssertTrue([result.subject isEqualToString:@"the subject"], - @"Wrong subject %@", result.subject); - STAssertTrue([result.body isEqualToString:@"the body"], - @"Wrong body %@", result.body); -} - -- (void)testWellFormedEmailAddressWithToResultParser { - NSString *msg = - @"mailto:bogus@example.com?to=user@exampe.com&subject=the+subject&" - @"body=the%20body"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user@example.com"], - @"Wrong to %@", result.to); - STAssertTrue([result.subject isEqualToString:@"the subject"], - @"Wrong subject %@", result.subject); - STAssertTrue([result.body isEqualToString:@"the body"], - @"Wrong body %@", result.body); -} - -- (void)testWellFormedEmailAddressNoQueryResultParser { - NSString *msg = - @"mailto:user@example.com"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user@example.com"], - @"Wrong to %@", result.to); - STAssertNil(result.subject, @"Wrong subject %@", result.subject); - STAssertNil(result.body, @"Wrong body %@", result.body); -} - -- (void)testWellFormedEmailAddressNoHostResultParser { - NSString *msg = - @"mailto:user"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user"], - @"Wrong to %@", result.to); - STAssertNil(result.subject, @"Wrong subject %@", result.subject); - STAssertNil(result.body, @"Wrong body %@", result.body); -} - -- (void)testSimpleEmailAddressResultParser { - NSString *msg = - @"user@example.com"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user@example.com"], - @"Wrong to %@", result.to); - STAssertNil(result.subject, - @"Wrong subject %@", result.subject); - STAssertNil(result.body, - @"Wrong body %@", result.body); -} - -- (void)testMalformedEmailAddressResultParser { - NSString *msg = - @"I like traffic lights"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedDoubleAtEmailAddressResultParser { - NSString *msg = - @"me@here@there" - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedBogusCharEmailAddressResultParser { - NSString *msg = - @"me(yeah)me@google.com" - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedJustMailtoEmailAddressResultParser { - NSString *msg = - @"mailto:" - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedEmptyEmailAddressResultParser { - NSString *msg = - @"" - EmailParsedResult *result = (EmailParsedResult *) - [EmailAddressResultParserResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} -@end diff --git a/iphone/ZXingWidget/Tests/EmailDoCoMoResultParserTests.m b/iphone/ZXingWidget/Tests/EmailDoCoMoResultParserTests.m deleted file mode 100644 index dca0acf80..000000000 --- a/iphone/ZXingWidget/Tests/EmailDoCoMoResultParserTests.m +++ /dev/null @@ -1,48 +0,0 @@ -// -// EmailDoCoMoTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "EmailDoCoMoResultParser.h" -#import "EmailParsedResult.h" - -@interface EmailDoCoMoResultParserTests : SenTestCase -@end - -@implementation EmailDoCoMoResultParserTests - -- (void)testWellFormedEmailDoCoMo { - NSString *msg = - @"MATMSG:;" - @"TO:addressee@example.com;" - @"SUB:subject;" - @"BODY:The body\nThe end;"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailDoCoMoResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"addressee@example.com"], - @"Wrong to: is %@", result.to); - STAssertTrue([result.subject isEqualToString:@"subject"], - @"Wrong subject %@", result.subject); - STAssertTrue([result.body isEqualToString:@"The body\nThe end"], - @"Wrong body %@", result.subject); -} - -- (void)testMalformedEmailDoCoMo { - NSString *msg = - @"TO:addressee@example.com;" - @"SUB:subject;" - @"BODY:The body\nThe end;"; - EmailParsedResult *result = (EmailParsedResult *) - [EmailDoCoMoResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus string matched."); -} - - -@end diff --git a/iphone/ZXingWidget/Tests/ISBNResultParserTests.m b/iphone/ZXingWidget/Tests/ISBNResultParserTests.m deleted file mode 100644 index 00cf28730..000000000 --- a/iphone/ZXingWidget/Tests/ISBNResultParserTests.m +++ /dev/null @@ -1,52 +0,0 @@ -// -// ISBNResultParserTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "ISBNResultParser.h" -#import "ISBNParsedResult.h" - -@interface ISBNResultParserTests : SenTestCase -@end - -@implementation ISBNResultParserTests - -- (void)testWellFormedISBNResultParser { - NSString *msg = @"9781234567890"; - ISBNParsedResult *result = (ISBNParsedResult *) - [ISBNResultParser parsedResultForString:msg - format:BarcodeFormat_EAN_13]; - STAssertTrue([result.value isEqualToString:msg], - @"Wrong value %@", result.value); -} - -- (void)testMalformedNumDigitsISBNResultParser { - NSString *msg = @"1234"; - ISBNParsedResult *result = (ISBNParsedResult *) - [ISBNResultParser parsedResultForString:msg - format:BarcodeFormat_EAN_13]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedPrefixISBNResultParser { - NSString *msg = @"9991234567890"; - ISBNParsedResult *result = (ISBNParsedResult *) - [ISBNResultParser parsedResultForString:msg - format:BarcodeFormat_EAN_13]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedISBNResultParser { - NSString *msg = @"I like traffic lights"; - ISBNParsedResult *result = (ISBNParsedResult *) - [ISBNResultParser parsedResultForString:msg - format:BarcodeFormat_EAN_13]; - STAssertNil(result, @"Bogus message parsed"); -} - -@end diff --git a/iphone/ZXingWidget/Tests/MeCardParserTests.m b/iphone/ZXingWidget/Tests/MeCardParserTests.m deleted file mode 100644 index 950e5ed2e..000000000 --- a/iphone/ZXingWidget/Tests/MeCardParserTests.m +++ /dev/null @@ -1,111 +0,0 @@ -// -// MeCardParserTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "BusinessCardParsedResult.h" -#import "MeCardParser.h" - -@interface MeCardParserTests : SenTestCase -@end - -@implementation MeCardParserTests - -- (void)testWellFormedMeCard { - NSString *msg = - @"MECARD:;" - @"N:Name One;" - @"SOUND:pronunciation;" - @"TEL:1111111;" - @"TEL:2222222;" - @"TEL:3333333;" - @"EMAIL:1@1.com;" - @"EMAIL:2@2.com;" - @"EMAIL:3@3.com;" - @"NOTE:This is a note;" - @"ADR:123 Fake St;" - @"ADR:234 Fake St;" - @"BDAY:19980904;" - @"URL:http://example.com/;" - @"ORG:Organization;" - @"TITLE:Title;"; - - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [MeCardParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertEquals(1U, result.names.count, @"Wrong number of names %d", - result.names.count); - STAssertTrue([[result.names objectAtIndex:0] isEqualToString:@"Name One"], - @"Wrong Name one %@", [result.names objectAtIndex:0]); - STAssertTrue([result.pronunciation isEqualToString:@"pronunciation"], - @"Wrong pronunciation %@", result.pronunciation); - STAssertEquals(3U, result.phoneNumbers.count, - @"Wrong number of phone numbers %d", - result.phoneNumbers.count); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:0] isEqualToString:@"1111111"], - @"Wrong phone number 1 %@", [result.phoneNumbers objectAtIndex:0]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:1] isEqualToString:@"2222222"], - @"Wrong phone number 2 %@", [result.phoneNumbers objectAtIndex:1]); - STAssertTrue( - [[result.phoneNumbers objectAtIndex:2] isEqualToString:@"3333333"], - @"Wrong phone number 3 %@", [result.phoneNumbers objectAtIndex:2]); - STAssertEquals(3U, result.emails.count, - @"Wrong number of emails %d", result.emails.count); - STAssertTrue([[result.emails objectAtIndex:0] isEqualToString:@"1@1.com"], - @"Wrong email 1 %@", [result.emails objectAtIndex:0]); - STAssertTrue([[result.emails objectAtIndex:1] isEqualToString:@"2@2.com"], - @"Wrong email 2 %@", [result.emails objectAtIndex:1]); - STAssertTrue([[result.emails objectAtIndex:2] isEqualToString:@"3@3.com"], - @"Wrong email 3 %@", [result.emails objectAtIndex:2]); - STAssertTrue([result.note isEqualToString:@"This is a note"], - @"Wrong note %@", result.note); - STAssertEquals(2U, result.addresses.count, @"Wrong number of addresses %d", - result.addresses.count); - STAssertTrue( - [[result.addresses objectAtIndex:0] isEqualToString:@"123 Fake St"], - @"Wrong address %@", [result.addresses objectAtIndex:0]); - STAssertTrue( - [[result.addresses objectAtIndex:1] isEqualToString:@"234 Fake St"], - @"Wrong address %@", [result.addresses objectAtIndex:1]); - STAssertTrue([result.birthday isEqualToString:@"19980904"], - @"Wrong birthday %@", result.birthday); - STAssertTrue([result.url isEqualToString:@"http://example.com/"], - @"Wrong url %@", result.url); - STAssertTrue([result.organization isEqualToString:@"Organization"], - @"Wrong organization %@", result.organization); - STAssertTrue([result.jobTitle isEqualToString:@"Title"], - @"Wrong job title %@", result.jobTitle); -} - -- (void)testMalformedMeCard { - NSString *msg = - @"N:Name One;" - @"SOUND:pronunciation;" - @"TEL1:1111111;" - @"TEL2:2222222;" - @"TEL3:3333333;" - @"EMAIL1:1@1.com;" - @"EMAIL2:2@2.com;" - @"EMAIL3:3@3.com;" - @"NOTE:This is a note;" - @"ADR1:123 Fake St;" - @"ADR2:234 Fake St;" - @"BDAY:19980904;" - @"URL:http://example.com/;" - @"ORG:Organization;" - @"TITLE:Title;"; - - BusinessCardParsedResult *result = (BusinessCardParsedResult *) - [MeCardParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus string matched."); -} - -@end diff --git a/iphone/ZXingWidget/Tests/SMTPResultParserTests.m b/iphone/ZXingWidget/Tests/SMTPResultParserTests.m deleted file mode 100644 index e2c06985d..000000000 --- a/iphone/ZXingWidget/Tests/SMTPResultParserTests.m +++ /dev/null @@ -1,86 +0,0 @@ -// -// SMTPResultParserTests.m -// ZXingWidget -// -// Created by George Nachman on 7/27/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "SMTPResultParser.h" -#import "EmailParsedResult.h" - -@interface SMTPResultParserTests : SenTestCase -@end - -@implementation SMTPResultParserTests - -- (void)testWellFormedSMTPResultParser { - NSString *msg = - @"smtp:user@example.com:the subject:the body"; - EmailParsedResult *result = (EmailParsedResult *) - [SMTPResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user@example.com"], - @"Wrong to %@", result.to); - STAssertTrue([result.subject isEqualToString:@"the subject"], - @"Wrong subject %@", result.subject); - STAssertTrue([result.body isEqualToString:@"the body"], - @"Wrong body %@", result.body); -} - -- (void)testWellFormedNoBodySMTPResultParser { - NSString *msg = - @"smtp:user@example.com:the subject"; - EmailParsedResult *result = (EmailParsedResult *) - [SMTPResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user@example.com"], - @"Wrong to %@", result.to); - STAssertTrue([result.subject isEqualToString:@"the subject"], - @"Wrong subject %@", result.subject); - STAssertNil(result.body, - @"Wrong body %@", result.body); -} - -- (void)testWellFormedNoSubjectSMTPResultParser { - NSString *msg = @"smtp:user@example.com"; - EmailParsedResult *result = (EmailParsedResult *) - [SMTPResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertTrue([result.to isEqualToString:@"user@example.com"], - @"Wrong to %@", result.to); - STAssertNil(result.subject, - @"Wrong subject %@", result.subject); - STAssertNil(result.body, - @"Wrong body %@", result.body); -} - -- (void)testMalformedHeaderOnlySMTPResultParser { - NSString *msg = - @"smtp:"; - EmailParsedResult *result = (EmailParsedResult *) - [SMTPResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedEmptySMTPResultParser { - NSString *msg = - @""; - EmailParsedResult *result = (EmailParsedResult *) - [SMTPResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} - -- (void)testMalformedSMTPResultParser { - NSString *msg = - @"I like traffic lights"; - EmailParsedResult *result = (EmailParsedResult *) - [SMTPResultParser parsedResultForString:msg - format:BarcodeFormat_QR_CODE]; - STAssertNil(result, @"Bogus message parsed"); -} -@end diff --git a/iphone/ZXingWidget/Tests/VCardResultParserTests.m b/iphone/ZXingWidget/Tests/VCardResultParserTests.m deleted file mode 100644 index 35ef44d31..000000000 --- a/iphone/ZXingWidget/Tests/VCardResultParserTests.m +++ /dev/null @@ -1,150 +0,0 @@ -// -// VCardResultParserTests.m -// ZXingWidget -// -// Created by George Nachman on 7/26/11. -// Copyright 2011 ZXing Authors. All rights reserved. -// - -#import -#import -#import "VCardResultParser.h" -#import "BusinessCardParsedResult.h" - -@interface VCardResultParserTests : SenTestCase -@end - -@implementation VCardResultParserTests - -- (void)testVanillaVCard { - NSString* msg = - @"BEGIN:VCARD\n" - @"N:Kennedy;Steve\n" - @"TEL:+44 (0)7775 755503\n" - @"ADR;HOME:;;Flat 2, 43 Howitt Road, Belsize Park;London;;NW34LU;UK\n" - @"ORG:NetTek Ltd;\n" - @"TITLE:Consultant\n" - @"EMAIL:steve@nettek.co.uk\n" - @"URL:www.nettek.co.uk\n" - @"EMAIL;IM:MSN:steve@gbnet.net\n" - @"NOTE:Testing 1 2 3\n" - @"BDAY:19611105\n" - @"END:VCARD"; - BusinessCardParsedResult* b = (BusinessCardParsedResult *) - [VCardResultParser parsedResultForString:msg - format:0]; - - STAssertEquals(1U, b.names.count, @"Should have exactly one name"); - STAssertTrue([[b.names objectAtIndex:0] isEqualToString:@"Steve Kennedy"], - @"Wrong name %@", b.names); - STAssertEquals(1U, b.phoneNumbers.count, - @"Should have exactly one phone number"); - STAssertTrue([[b.phoneNumbers objectAtIndex:0] isEqualToString: - @"+44 (0)7775 755503"], - @"Wrong phone number %@", [b.phoneNumbers objectAtIndex:0]); - STAssertEquals(1U, b.addresses.count, @"Should have exactly one address"); - STAssertTrue([[b.addresses objectAtIndex:0] isEqualToString: - @"Flat 2, 43 Howitt Road, Belsize Park London NW34LU UK"], - @"Wrong address %@", [b.addresses objectAtIndex:0]); - STAssertTrue([b.organization isEqualToString:@"NetTek Ltd;"], - @"Wrong organization %@", b.organization); - STAssertTrue([b.jobTitle isEqualToString:@"Consultant"], - @"Wrong job title %@", b.jobTitle); - STAssertEquals(2U, b.emails.count, - @"Wrong number of emails %d", b.emails.count); - STAssertTrue([[b.emails objectAtIndex:0] isEqualToString: - @"steve@nettek.co.uk"], - @"Wrong first email %@", [b.emails objectAtIndex:0]); - STAssertTrue([b.note isEqualToString:@"Testing 1 2 3"], - @"Wrong note %@", b.note); - STAssertTrue([b.url isEqualToString:@"www.nettek.co.uk"], - @"Wrong url %@", b.url); - STAssertTrue([[b.emails objectAtIndex:1] isEqualToString: - @"MSN:steve@gbnet.net"], - @"Wrong second email %@", [b.emails objectAtIndex:1]); - STAssertTrue([b.birthday isEqualToString:@"19611105"], - @"Wrong birthday %@", b.birthday); -} - -- (void)testBrokenVCard { - NSString *msg = @"Blah blah blah"; - BusinessCardParsedResult* b = (BusinessCardParsedResult *) - [VCardResultParser parsedResultForString:msg - format:0]; - - STAssertTrue(b == nil, @"Bogus string parsed"); -} - -- (void)testQuotedPrintableVCard { - NSString *msg = - @"BEGIN:VCARD\n" - @"FN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Kennedy;=C5=9Bteve\n" - @"TEL:+44 (0)7775 755503\n" - @"ADR;HOME:;;Flat 2, 43 Howitt Road, Belsize Park;London;;NW34LU;UK\n" - @"ORG:NetTek Ltd;\n" - @"TITLE:Consultant\n" - @"EMAIL:steve@nettek.co.uk\n" - @"URL:www.nettek.co.uk\n" - @"EMAIL;IM:MSN:steve@gbnet.net\n" - @"NOTE:Testing 1 2 3\n" - @"BDAY:19611105\n" - @"END:VCARD"; - BusinessCardParsedResult* b = (BusinessCardParsedResult *) - [VCardResultParser parsedResultForString:msg - format:0]; - STAssertEquals(1U, b.names.count, - @"Wrong number of names %d", b.names.count); - STAssertTrue([[b.names objectAtIndex:0] isEqualToString:@"śteve Kennedy"], - @"Wrong name %@", [b.names objectAtIndex:0]); -} - -- (void)testExcessNewlineVCard { - NSString *msg = - @"BEGIN:VCARD\n" - @"FN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Kennedy;=C5=9Bteve\n" - @"TEL:+44 (0)7775 755503\n" - @"ADR;HOME:;;Flat 2, 43 Howitt Road, Belsize Park;London;;NW34LU;UK\n" - @"ORG:NetTek Ltd;\t\n" // note tab at end - @"TITLE:Consultant\n" - @"EMAIL:steve@nettek.co.uk\n" - @"URL:www.nettek.co.uk \n" // note trailing space - @"EMAIL;IM:MSN:steve@gbnet.net\n" - @"NOTE:Testing 1 2 3\r\n" // note dos newline - @"BDAY:19611105\n"; - BusinessCardParsedResult* b = (BusinessCardParsedResult *) - [VCardResultParser parsedResultForString:msg - format:0]; - STAssertTrue([b.birthday isEqualToString:@"19611105"], - @"Wrong birthday %@", b.birthday); - STAssertTrue([b.jobTitle isEqualToString:@"Consultant"], - @"Wrong job title %@", b.jobTitle); - STAssertTrue([b.url isEqualToString:@"www.nettek.co.uk"], - @"Wrong url %@", b.url); - STAssertTrue([b.note isEqualToString:@"Testing 1 2 3"], - @"Wrong note %@", b.note); -} - -- (void)testStrayKeywordVCard { - NSString *msg = - @"BEGIN:VCARD\n" - @"FN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Kennedy;=C5=9Bteve\n" - @"TEL:+44 (0)7775 755503\n" - @"ADR;HOME:;;Flat ORG TITLE 2, 43 Howitt Road, Belsize Park;London;;" - @"NW34LU;UK\n" - @"ORG:NetTek Ltd;\t\n" // note tab at end - @"TITLE:Consultant\n" - @"EMAIL:steve@nettek.co.uk\n" - @"URL:www.nettek.co.uk \n" // note trailing space - @"EMAIL;IM:MSN:steve@gbnet.net\n" - @"NOTE:Testing 1 2 3\r\n" // note dos newline - @"BDAY:19611105\n"; - BusinessCardParsedResult* b = (BusinessCardParsedResult *) - [VCardResultParser parsedResultForString:msg - format:0]; - STAssertTrue([b.jobTitle isEqualToString:@"Consultant"], - @"Wrong job title %@", b.jobTitle); - STAssertTrue([b.organization isEqualToString:@"NetTek Ltd;"], - @"Wrong organization %@", b.organization); -} - -@end diff --git a/iphone/ZXingWidget/ZXingTests-Info.plist b/iphone/ZXingWidget/ZXingTests-Info.plist deleted file mode 100644 index 7d42ad21f..000000000 --- a/iphone/ZXingWidget/ZXingTests-Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - org.zxing.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - - diff --git a/iphone/ZXingWidget/ZXingWidget.xcodeproj/default.pbxuser b/iphone/ZXingWidget/ZXingWidget.xcodeproj/default.pbxuser deleted file mode 100644 index 04354bf76..000000000 --- a/iphone/ZXingWidget/ZXingWidget.xcodeproj/default.pbxuser +++ /dev/null @@ -1,78 +0,0 @@ -// !$*UTF8*$! -{ - 0867D690FE84028FC02AAC07 /* Project object */ = { - activeArchitecturePreference = armv6; - activeBuildConfigurationName = Debug; - activeExecutable = 1D6039CA13DF7EA1006F4B51 /* otest */; - activeSDKPreference = iphonesimulator4.2; - activeTarget = 1D60398C13DF7CAD006F4B51 /* ZXingTests */; - addToTargets = ( - D2AAC07D0554694100DB518D /* ZXingWidget */, - ); - breakpoints = ( - ); - codeSenseManager = 1DFA08E013CE19C800599044 /* Code sense */; - executables = ( - 1D6039CA13DF7EA1006F4B51 /* otest */, - ); - sourceControlManager = 1DFA08DF13CE19C800599044 /* Source Control */; - userBuildSettings = { - }; - }; - 1D6039CA13DF7EA1006F4B51 /* otest */ = { - isa = PBXExecutable; - activeArgIndices = ( - YES, - YES, - ); - argumentStrings = ( - "-SenTest Self", - "$(BUILT_PRODUCTS_DIR)/ZXingTests.octest", - ); - autoAttachOnCrash = 1; - breakpointsEnabled = 1; - configStateDict = { - "PBXLSLaunchAction-0" = { - PBXLSLaunchAction = 0; - PBXLSLaunchStartAction = 1; - PBXLSLaunchStdioStyle = 2; - PBXLSLaunchStyle = 0; - class = PBXLSRunLaunchConfig; - commandLineArgs = ( - ); - displayName = "Executable Runner"; - environment = { - }; - identifier = com.apple.Xcode.launch.runConfig; - remoteHostInfo = ""; - startActionInfo = ""; - }; - }; - customDataFormattersEnabled = 1; - dataTipCustomDataFormattersEnabled = 1; - dataTipShowTypeColumn = 1; - dataTipSortType = 0; - debuggerPlugin = GDBDebugging; - disassemblyDisplayState = 0; - dylibVariantSuffix = ""; - enableDebugStr = 1; - environmentEntries = ( - ); - executableSystemSymbolLevel = 0; - executableUserSymbolLevel = 0; - launchableReference = 1D6039CB13DF7EA1006F4B51 /* otest */; - libgmallocEnabled = 0; - name = otest; - savedGlobals = { - }; - showTypeColumn = 0; - sourceDirectories = ( - ); - }; - 1D6039CB13DF7EA1006F4B51 /* otest */ = { - isa = PBXFileReference; - name = otest; - path = Developer/usr/bin/otest; - sourceTree = SDKROOT; - }; -} diff --git a/iphone/ZXingWidget/ZXingWidget.xcodeproj/project.pbxproj b/iphone/ZXingWidget/ZXingWidget.xcodeproj/project.pbxproj deleted file mode 100644 index a80a643d5..000000000 --- a/iphone/ZXingWidget/ZXingWidget.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1814 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1D0CBDF913D0DD5D003D0F8D /* BizcardResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D0CBDF713D0DD5D003D0F8D /* BizcardResultParser.h */; }; - 1D0CBDFA13D0DD5D003D0F8D /* BizcardResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D0CBDF813D0DD5D003D0F8D /* BizcardResultParser.m */; }; - 1D4F11FB13D89EFD0032F754 /* VCardResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D4F11F913D89EFD0032F754 /* VCardResultParser.h */; }; - 1D4F11FC13D89EFD0032F754 /* VCardResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D4F11FA13D89EFD0032F754 /* VCardResultParser.m */; }; - 1D6039EC13DF7F62006F4B51 /* libZXingWidget.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2AAC07E0554694100DB518D /* libZXingWidget.a */; }; - 1D6039F313DF7F9A006F4B51 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D60391813DF7780006F4B51 /* AddressBook.framework */; }; - 1D6039F413DF7F9A006F4B51 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D60391E13DF778C006F4B51 /* AddressBookUI.framework */; }; - 1D6039F513DF7F9A006F4B51 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5345AA21198859A000CB77F /* CoreGraphics.framework */; }; - 1D6039F613DF7F9A006F4B51 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; - 1D6039F713DF7F9A006F4B51 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E53459CA119873F3000CB77F /* UIKit.framework */; }; - 1D603D7413E0B60D006F4B51 /* AddressBookAUResultParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D603D6913E0B60D006F4B51 /* AddressBookAUResultParserTests.m */; }; - 1D603D7513E0B60D006F4B51 /* BizcardResultParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D603D6B13E0B60D006F4B51 /* BizcardResultParserTests.m */; }; - 1D603D7613E0B60D006F4B51 /* BookmarkDoCoMoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D603D6D13E0B60D006F4B51 /* BookmarkDoCoMoTests.m */; }; - 1D603D7713E0B60D006F4B51 /* EmailDoCoMoResultParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D603D6F13E0B60D006F4B51 /* EmailDoCoMoResultParserTests.m */; }; - 1D603D7813E0B60D006F4B51 /* MeCardParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D603D7113E0B60D006F4B51 /* MeCardParserTests.m */; }; - 1D603D7913E0B60D006F4B51 /* VCardResultParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D603D7313E0B60D006F4B51 /* VCardResultParserTests.m */; }; - 1D603E6413E20AF1006F4B51 /* ArrayAndStringCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D603E6213E20AF1006F4B51 /* ArrayAndStringCategories.h */; }; - 1D603E6513E20AF1006F4B51 /* ArrayAndStringCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D603E6313E20AF1006F4B51 /* ArrayAndStringCategories.m */; }; - 1D60411613E36BF8006F4B51 /* EmailAddressResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D60411013E36BF8006F4B51 /* EmailAddressResultParser.h */; }; - 1D60411713E36BF8006F4B51 /* EmailAddressResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60411113E36BF8006F4B51 /* EmailAddressResultParser.m */; }; - 1D60411813E36BF8006F4B51 /* ISBNResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D60411213E36BF8006F4B51 /* ISBNResultParser.h */; }; - 1D60411913E36BF8006F4B51 /* ISBNResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60411313E36BF8006F4B51 /* ISBNResultParser.m */; }; - 1D60411A13E36BF8006F4B51 /* SMTPResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D60411413E36BF8006F4B51 /* SMTPResultParser.h */; }; - 1D60411B13E36BF8006F4B51 /* SMTPResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60411513E36BF8006F4B51 /* SMTPResultParser.m */; }; - 1D60412313E36C2D006F4B51 /* ISBNParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D60412113E36C2D006F4B51 /* ISBNParsedResult.h */; }; - 1D60412413E36C2D006F4B51 /* ISBNParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60412213E36C2D006F4B51 /* ISBNParsedResult.m */; }; - 1D60412A13E36C55006F4B51 /* ISBNResultParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60412713E36C55006F4B51 /* ISBNResultParserTests.m */; }; - 1D60412B13E36C55006F4B51 /* SMTPResultParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D60412813E36C55006F4B51 /* SMTPResultParserTests.m */; }; - 1DFA090C13CE1A3900599044 /* CBarcodeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA090A13CE1A3900599044 /* CBarcodeFormat.h */; }; - 1DFA090D13CE1A3900599044 /* CBarcodeFormat.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA090B13CE1A3900599044 /* CBarcodeFormat.mm */; }; - 1DFA092413CE251600599044 /* ProductParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA092213CE251600599044 /* ProductParsedResult.h */; }; - 1DFA092513CE251600599044 /* ProductParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA092313CE251600599044 /* ProductParsedResult.m */; }; - 1DFA092A13CE252300599044 /* ProductResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA092813CE252300599044 /* ProductResultParser.h */; }; - 1DFA092B13CE252300599044 /* ProductResultParser.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA092913CE252300599044 /* ProductResultParser.mm */; }; - 1DFA09A013CE5C0300599044 /* AddressBookAUResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DFA099E13CE5C0300599044 /* AddressBookAUResultParser.h */; }; - 1DFA09A113CE5C0300599044 /* AddressBookAUResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA099F13CE5C0300599044 /* AddressBookAUResultParser.m */; }; - 1F027FAB11A7BEAF006B06DE /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027F9F11A7BEAF006B06DE /* Decoder.h */; }; - 1F027FAC11A7BEAF006B06DE /* Decoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FA011A7BEAF006B06DE /* Decoder.mm */; }; - 1F027FAD11A7BEAF006B06DE /* DecoderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */; }; - 1F027FAE11A7BEAF006B06DE /* FormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FA211A7BEAF006B06DE /* FormatReader.h */; }; - 1F027FAF11A7BEAF006B06DE /* FormatReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FA311A7BEAF006B06DE /* FormatReader.mm */; }; - 1F027FB211A7BEAF006B06DE /* MultiFormatReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */; }; - 1F027FB511A7BEAF006B06DE /* OverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FA911A7BEAF006B06DE /* OverlayView.h */; }; - 1F027FB611A7BEAF006B06DE /* OverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FAA11A7BEAF006B06DE /* OverlayView.m */; }; - 1F027FBB11A7BEBF006B06DE /* TwoDDecoderResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */; }; - 1F027FBC11A7BEBF006B06DE /* TwoDDecoderResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */; }; - 1F027FBD11A7BEBF006B06DE /* ZXingWidgetController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */; }; - 1F027FBE11A7BEBF006B06DE /* ZXingWidgetController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */; }; - 1F027FCD11A7BED6006B06DE /* AddContactAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FBF11A7BED6006B06DE /* AddContactAction.h */; }; - 1F027FCE11A7BED6006B06DE /* AddContactAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC011A7BED6006B06DE /* AddContactAction.m */; }; - 1F027FCF11A7BED6006B06DE /* CallAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC111A7BED6006B06DE /* CallAction.h */; }; - 1F027FD011A7BED6006B06DE /* CallAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC211A7BED6006B06DE /* CallAction.m */; }; - 1F027FD111A7BED6006B06DE /* EmailAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC311A7BED6006B06DE /* EmailAction.h */; }; - 1F027FD211A7BED6006B06DE /* EmailAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC411A7BED6006B06DE /* EmailAction.m */; }; - 1F027FD311A7BED6006B06DE /* OpenUrlAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC511A7BED6006B06DE /* OpenUrlAction.h */; }; - 1F027FD411A7BED6006B06DE /* OpenUrlAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC611A7BED6006B06DE /* OpenUrlAction.m */; }; - 1F027FD511A7BED6006B06DE /* ResultAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC711A7BED6006B06DE /* ResultAction.h */; }; - 1F027FD611A7BED6006B06DE /* ResultAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FC811A7BED6006B06DE /* ResultAction.m */; }; - 1F027FD711A7BED6006B06DE /* ShowMapAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FC911A7BED6006B06DE /* ShowMapAction.h */; }; - 1F027FD811A7BED6006B06DE /* ShowMapAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FCA11A7BED6006B06DE /* ShowMapAction.m */; }; - 1F027FD911A7BED6006B06DE /* SMSAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FCB11A7BED6006B06DE /* SMSAction.h */; }; - 1F027FDA11A7BED6006B06DE /* SMSAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FCC11A7BED6006B06DE /* SMSAction.m */; }; - 1F027FEB11A7BEEB006B06DE /* BusinessCardParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FDB11A7BEEB006B06DE /* BusinessCardParsedResult.h */; }; - 1F027FEC11A7BEEB006B06DE /* BusinessCardParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FDC11A7BEEB006B06DE /* BusinessCardParsedResult.m */; }; - 1F027FED11A7BEEB006B06DE /* EmailParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FDD11A7BEEB006B06DE /* EmailParsedResult.h */; }; - 1F027FEE11A7BEEB006B06DE /* EmailParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FDE11A7BEEB006B06DE /* EmailParsedResult.m */; }; - 1F027FEF11A7BEEB006B06DE /* GeoParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FDF11A7BEEB006B06DE /* GeoParsedResult.h */; }; - 1F027FF011A7BEEB006B06DE /* GeoParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE011A7BEEB006B06DE /* GeoParsedResult.m */; }; - 1F027FF111A7BEEB006B06DE /* ParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE111A7BEEB006B06DE /* ParsedResult.h */; }; - 1F027FF211A7BEEB006B06DE /* ParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE211A7BEEB006B06DE /* ParsedResult.m */; }; - 1F027FF311A7BEEB006B06DE /* SMSParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE311A7BEEB006B06DE /* SMSParsedResult.h */; }; - 1F027FF411A7BEEB006B06DE /* SMSParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE411A7BEEB006B06DE /* SMSParsedResult.m */; }; - 1F027FF511A7BEEB006B06DE /* TelParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE511A7BEEB006B06DE /* TelParsedResult.h */; }; - 1F027FF611A7BEEB006B06DE /* TelParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE611A7BEEB006B06DE /* TelParsedResult.m */; }; - 1F027FF711A7BEEB006B06DE /* TextParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE711A7BEEB006B06DE /* TextParsedResult.h */; }; - 1F027FF811A7BEEB006B06DE /* TextParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FE811A7BEEB006B06DE /* TextParsedResult.m */; }; - 1F027FF911A7BEEB006B06DE /* URIParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FE911A7BEEB006B06DE /* URIParsedResult.h */; }; - 1F027FFA11A7BEEB006B06DE /* URIParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FEA11A7BEEB006B06DE /* URIParsedResult.m */; }; - 1F02801511A7BF06006B06DE /* BookmarkDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FFB11A7BF06006B06DE /* BookmarkDoCoMoResultParser.h */; }; - 1F02801611A7BF06006B06DE /* BookmarkDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F027FFC11A7BF06006B06DE /* BookmarkDoCoMoResultParser.m */; }; - 1F02801911A7BF06006B06DE /* EmailDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F027FFF11A7BF06006B06DE /* EmailDoCoMoResultParser.h */; }; - 1F02801A11A7BF06006B06DE /* EmailDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800011A7BF06006B06DE /* EmailDoCoMoResultParser.m */; }; - 1F02801B11A7BF06006B06DE /* GeoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800111A7BF06006B06DE /* GeoResultParser.h */; }; - 1F02801C11A7BF06006B06DE /* GeoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800211A7BF06006B06DE /* GeoResultParser.m */; }; - 1F02801D11A7BF06006B06DE /* MeCardParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800311A7BF06006B06DE /* MeCardParser.h */; }; - 1F02801E11A7BF06006B06DE /* MeCardParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800411A7BF06006B06DE /* MeCardParser.m */; }; - 1F02801F11A7BF06006B06DE /* PlainEmailResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800511A7BF06006B06DE /* PlainEmailResultParser.h */; }; - 1F02802011A7BF06006B06DE /* PlainEmailResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800611A7BF06006B06DE /* PlainEmailResultParser.m */; }; - 1F02802111A7BF06006B06DE /* ResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800711A7BF06006B06DE /* ResultParser.h */; }; - 1F02802211A7BF06006B06DE /* ResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800811A7BF06006B06DE /* ResultParser.m */; }; - 1F02802311A7BF06006B06DE /* SMSResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800911A7BF06006B06DE /* SMSResultParser.h */; }; - 1F02802411A7BF06006B06DE /* SMSResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800A11A7BF06006B06DE /* SMSResultParser.m */; }; - 1F02802511A7BF06006B06DE /* SMSTOResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800B11A7BF06006B06DE /* SMSTOResultParser.h */; }; - 1F02802611A7BF06006B06DE /* SMSTOResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800C11A7BF06006B06DE /* SMSTOResultParser.m */; }; - 1F02802711A7BF06006B06DE /* TelResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800D11A7BF06006B06DE /* TelResultParser.h */; }; - 1F02802811A7BF06006B06DE /* TelResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02800E11A7BF06006B06DE /* TelResultParser.m */; }; - 1F02802911A7BF06006B06DE /* TextResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02800F11A7BF06006B06DE /* TextResultParser.h */; }; - 1F02802A11A7BF06006B06DE /* TextResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02801011A7BF06006B06DE /* TextResultParser.m */; }; - 1F02802B11A7BF06006B06DE /* URLResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02801111A7BF06006B06DE /* URLResultParser.h */; }; - 1F02802C11A7BF06006B06DE /* URLResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02801211A7BF06006B06DE /* URLResultParser.m */; }; - 1F02802D11A7BF06006B06DE /* URLTOResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F02801311A7BF06006B06DE /* URLTOResultParser.h */; }; - 1F02802E11A7BF06006B06DE /* URLTOResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F02801411A7BF06006B06DE /* URLTOResultParser.m */; }; - 1F3DB0C211C60DB4009C581B /* QRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0C011C60DB4009C581B /* QRCodeReader.h */; }; - 1F3DB0C311C60DB4009C581B /* QRCodeReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0C111C60DB4009C581B /* QRCodeReader.mm */; }; - 1F3DB0FB11C61080009C581B /* DataMatrixReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0F511C61080009C581B /* DataMatrixReader.h */; }; - 1F3DB0FC11C61080009C581B /* DataMatrixReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0F611C61080009C581B /* DataMatrixReader.mm */; }; - 1F3DB0FD11C61080009C581B /* MultiFormatOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0F711C61080009C581B /* MultiFormatOneDReader.h */; }; - 1F3DB0FE11C61080009C581B /* MultiFormatOneDReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0F811C61080009C581B /* MultiFormatOneDReader.mm */; }; - 1F3DB0FF11C61080009C581B /* MultiFormatUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F3DB0F911C61080009C581B /* MultiFormatUPCEANReader.h */; }; - 1F3DB10011C61080009C581B /* MultiFormatUPCEANReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F3DB0FA11C61080009C581B /* MultiFormatUPCEANReader.mm */; }; - 1FB4319F12901C76002D63E8 /* UniversalResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FB4319D12901C76002D63E8 /* UniversalResultParser.h */; }; - 1FB431A012901C76002D63E8 /* UniversalResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB4319E12901C76002D63E8 /* UniversalResultParser.m */; }; - 3B117EF1145B220A0035037B /* MonochromeRectangleDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B117EEF145B220A0035037B /* MonochromeRectangleDetector.cpp */; }; - 3B117EF2145B220A0035037B /* WhiteRectangleDetector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B117EF0145B220A0035037B /* WhiteRectangleDetector.cpp */; }; - 3B248F7D14EF3A660065F0DA /* GenericGF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B248F7914EF3A660065F0DA /* GenericGF.cpp */; }; - 3B248F7E14EF3A660065F0DA /* GenericGF.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B248F7A14EF3A660065F0DA /* GenericGF.h */; }; - 3B248F7F14EF3A660065F0DA /* GenericGFPoly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B248F7B14EF3A660065F0DA /* GenericGFPoly.cpp */; }; - 3B248F8014EF3A660065F0DA /* GenericGFPoly.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B248F7C14EF3A660065F0DA /* GenericGFPoly.h */; }; - 3B248F8E14EF3A980065F0DA /* AztecDetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B248F8414EF3A980065F0DA /* AztecDetectorResult.cpp */; }; - 3B248F8F14EF3A980065F0DA /* AztecDetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B248F8514EF3A980065F0DA /* AztecDetectorResult.h */; }; - 3B248F9014EF3A980065F0DA /* AztecReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B248F8614EF3A980065F0DA /* AztecReader.cpp */; }; - 3B248F9114EF3A980065F0DA /* AztecReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B248F8714EF3A980065F0DA /* AztecReader.h */; }; - 3B248F9214EF3A980065F0DA /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B248F8914EF3A980065F0DA /* Decoder.cpp */; }; - 3B248F9314EF3A980065F0DA /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B248F8A14EF3A980065F0DA /* Decoder.h */; }; - 3B248F9414EF3A980065F0DA /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B248F8C14EF3A980065F0DA /* Detector.cpp */; }; - 3B248F9514EF3A980065F0DA /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B248F8D14EF3A980065F0DA /* Detector.h */; }; - 3B248F9814EF3AF80065F0DA /* AztecReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B248F9614EF3AF80065F0DA /* AztecReader.h */; }; - 3B248F9914EF3AF80065F0DA /* AztecReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B248F9714EF3AF80065F0DA /* AztecReader.mm */; }; - 3B27C5D8144735CE005157C4 /* FormatException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B27C5D6144735CE005157C4 /* FormatException.cpp */; }; - 3B27C5D9144735CE005157C4 /* FormatException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B27C5D7144735CE005157C4 /* FormatException.h */; }; - 3B27C5E1144735E6005157C4 /* CharacterSetECI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B27C5DB144735E6005157C4 /* CharacterSetECI.cpp */; }; - 3B27C5E2144735E6005157C4 /* CharacterSetECI.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B27C5DC144735E6005157C4 /* CharacterSetECI.h */; }; - 3B27C5E5144735E6005157C4 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B27C5DF144735E6005157C4 /* StringUtils.cpp */; }; - 3B27C5E6144735E6005157C4 /* StringUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B27C5E0144735E6005157C4 /* StringUtils.h */; }; - 3B6AA66C1710C34600DF84C0 /* InvertedLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B6AA66A1710C34600DF84C0 /* InvertedLuminanceSource.cpp */; }; - 3B6AA66D1710C34600DF84C0 /* InvertedLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6AA66B1710C34600DF84C0 /* InvertedLuminanceSource.h */; }; - 3B6C805717090ED300D22AB2 /* CodaBarReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B6C805317090ED300D22AB2 /* CodaBarReader.cpp */; }; - 3B6C805817090ED300D22AB2 /* CodaBarReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6C805417090ED300D22AB2 /* CodaBarReader.h */; }; - 3B6C805917090ED300D22AB2 /* Code93Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B6C805517090ED300D22AB2 /* Code93Reader.cpp */; }; - 3B6C805A17090ED300D22AB2 /* Code93Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6C805617090ED300D22AB2 /* Code93Reader.h */; }; - 3B6C805D17090EFC00D22AB2 /* ChecksumException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B6C805B17090EFC00D22AB2 /* ChecksumException.cpp */; }; - 3B6C805E17090EFC00D22AB2 /* ChecksumException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B6C805C17090EFC00D22AB2 /* ChecksumException.h */; }; - 3B72D96F12130EF6007CEF32 /* ResultPointCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B72D96D12130EF6007CEF32 /* ResultPointCallback.cpp */; }; - 3B72D97012130EF6007CEF32 /* ResultPointCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B72D96E12130EF6007CEF32 /* ResultPointCallback.h */; }; - 3B81AAC5120F07E40022E5D4 /* DecodeHints.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AAC3120F07E40022E5D4 /* DecodeHints.cpp */; }; - 3B81AAC6120F07E40022E5D4 /* DecodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AAC4120F07E40022E5D4 /* DecodeHints.h */; }; - 3B81AAC9120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AAC7120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp */; }; - 3B81AACA120F080D0022E5D4 /* GreyscaleLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AAC8120F080D0022E5D4 /* GreyscaleLuminanceSource.h */; }; - 3B81AACD120F08170022E5D4 /* HybridBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AACB120F08170022E5D4 /* HybridBinarizer.cpp */; }; - 3B81AACE120F08170022E5D4 /* HybridBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AACC120F08170022E5D4 /* HybridBinarizer.h */; }; - 3B81AAF8120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B81AAF6120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp */; }; - 3B81AAF9120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B81AAF7120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h */; }; - 3BAC39C017242C2300473974 /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39AC17242C2200473974 /* BitMatrixParser.cpp */; }; - 3BAC39C117242C2300473974 /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39AD17242C2200473974 /* BitMatrixParser.h */; }; - 3BAC39C217242C2300473974 /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39AE17242C2200473974 /* DecodedBitStreamParser.cpp */; }; - 3BAC39C317242C2300473974 /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39AF17242C2200473974 /* DecodedBitStreamParser.h */; }; - 3BAC39C417242C2300473974 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39B017242C2200473974 /* Decoder.cpp */; }; - 3BAC39C517242C2300473974 /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39B117242C2200473974 /* Decoder.h */; }; - 3BAC39C617242C2300473974 /* ErrorCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39B317242C2200473974 /* ErrorCorrection.cpp */; }; - 3BAC39C717242C2300473974 /* ErrorCorrection.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39B417242C2200473974 /* ErrorCorrection.h */; }; - 3BAC39C817242C2300473974 /* ModulusGF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39B517242C2200473974 /* ModulusGF.cpp */; }; - 3BAC39C917242C2300473974 /* ModulusGF.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39B617242C2200473974 /* ModulusGF.h */; }; - 3BAC39CA17242C2300473974 /* ModulusPoly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39B717242C2200473974 /* ModulusPoly.cpp */; }; - 3BAC39CB17242C2300473974 /* ModulusPoly.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39B817242C2200473974 /* ModulusPoly.h */; }; - 3BAC39CC17242C2300473974 /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39BA17242C2200473974 /* Detector.cpp */; }; - 3BAC39CD17242C2300473974 /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39BB17242C2200473974 /* Detector.h */; }; - 3BAC39CE17242C2300473974 /* LinesSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39BC17242C2200473974 /* LinesSampler.cpp */; }; - 3BAC39CF17242C2300473974 /* LinesSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39BD17242C2300473974 /* LinesSampler.h */; }; - 3BAC39D017242C2300473974 /* PDF417Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39BE17242C2300473974 /* PDF417Reader.cpp */; }; - 3BAC39D117242C2300473974 /* PDF417Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39BF17242C2300473974 /* PDF417Reader.h */; }; - 3BAC39E717242E5D00473974 /* BigInteger.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39D817242E5D00473974 /* BigInteger.cc */; }; - 3BAC39E817242E5D00473974 /* BigInteger.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39D917242E5D00473974 /* BigInteger.hh */; }; - 3BAC39E917242E5D00473974 /* BigIntegerAlgorithms.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39DA17242E5D00473974 /* BigIntegerAlgorithms.cc */; }; - 3BAC39EA17242E5D00473974 /* BigIntegerAlgorithms.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39DB17242E5D00473974 /* BigIntegerAlgorithms.hh */; }; - 3BAC39EB17242E5D00473974 /* BigIntegerLibrary.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39DC17242E5D00473974 /* BigIntegerLibrary.hh */; }; - 3BAC39EC17242E5D00473974 /* BigIntegerUtils.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39DD17242E5D00473974 /* BigIntegerUtils.cc */; }; - 3BAC39ED17242E5D00473974 /* BigIntegerUtils.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39DE17242E5D00473974 /* BigIntegerUtils.hh */; }; - 3BAC39EE17242E5D00473974 /* BigUnsigned.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39DF17242E5D00473974 /* BigUnsigned.cc */; }; - 3BAC39EF17242E5D00473974 /* BigUnsigned.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39E017242E5D00473974 /* BigUnsigned.hh */; }; - 3BAC39F017242E5D00473974 /* BigUnsignedInABase.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3BAC39E117242E5D00473974 /* BigUnsignedInABase.cc */; }; - 3BAC39F117242E5D00473974 /* BigUnsignedInABase.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39E217242E5D00473974 /* BigUnsignedInABase.hh */; }; - 3BAC39F317242E5D00473974 /* NumberlikeArray.hh in Headers */ = {isa = PBXBuildFile; fileRef = 3BAC39E517242E5D00473974 /* NumberlikeArray.hh */; }; - AA747D9F0F9514B9006C5449 /* ZXingWidget_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* ZXingWidget_Prefix.pch */; }; - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; - E534594311987396000CB77F /* BarcodeFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458B511987396000CB77F /* BarcodeFormat.cpp */; }; - E534594411987396000CB77F /* BarcodeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458B611987396000CB77F /* BarcodeFormat.h */; }; - E534594511987396000CB77F /* Binarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458B711987396000CB77F /* Binarizer.cpp */; }; - E534594611987396000CB77F /* Binarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458B811987396000CB77F /* Binarizer.h */; }; - E534594711987396000CB77F /* BinaryBitmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458B911987396000CB77F /* BinaryBitmap.cpp */; }; - E534594811987396000CB77F /* BinaryBitmap.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458BA11987396000CB77F /* BinaryBitmap.h */; }; - E534594A11987396000CB77F /* Array.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458BD11987396000CB77F /* Array.h */; }; - E534594B11987396000CB77F /* BitArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458BE11987396000CB77F /* BitArray.cpp */; }; - E534594C11987396000CB77F /* BitArray.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458BF11987396000CB77F /* BitArray.h */; }; - E534594D11987396000CB77F /* BitMatrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C011987396000CB77F /* BitMatrix.cpp */; }; - E534594E11987396000CB77F /* BitMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C111987396000CB77F /* BitMatrix.h */; }; - E534594F11987396000CB77F /* BitSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C211987396000CB77F /* BitSource.cpp */; }; - E534595011987396000CB77F /* BitSource.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C311987396000CB77F /* BitSource.h */; }; - E534595211987396000CB77F /* Counted.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C511987396000CB77F /* Counted.h */; }; - E534595311987396000CB77F /* DecoderResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C611987396000CB77F /* DecoderResult.cpp */; }; - E534595411987396000CB77F /* DecoderResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C711987396000CB77F /* DecoderResult.h */; }; - E534595511987396000CB77F /* DetectorResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458C811987396000CB77F /* DetectorResult.cpp */; }; - E534595611987396000CB77F /* DetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458C911987396000CB77F /* DetectorResult.h */; }; - E534595911987396000CB77F /* GlobalHistogramBinarizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458CC11987396000CB77F /* GlobalHistogramBinarizer.cpp */; }; - E534595A11987396000CB77F /* GlobalHistogramBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458CD11987396000CB77F /* GlobalHistogramBinarizer.h */; }; - E534595B11987396000CB77F /* GridSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458CE11987396000CB77F /* GridSampler.cpp */; }; - E534595C11987396000CB77F /* GridSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458CF11987396000CB77F /* GridSampler.h */; }; - E534595D11987396000CB77F /* IllegalArgumentException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458D011987396000CB77F /* IllegalArgumentException.cpp */; }; - E534595E11987396000CB77F /* IllegalArgumentException.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458D111987396000CB77F /* IllegalArgumentException.h */; }; - E534596111987396000CB77F /* PerspectiveTransform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458D411987396000CB77F /* PerspectiveTransform.cpp */; }; - E534596211987396000CB77F /* PerspectiveTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458D511987396000CB77F /* PerspectiveTransform.h */; }; - E534596311987396000CB77F /* Point.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458D611987396000CB77F /* Point.h */; }; - E534596811987396000CB77F /* ReedSolomonDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458DC11987396000CB77F /* ReedSolomonDecoder.cpp */; }; - E534596911987396000CB77F /* ReedSolomonDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458DD11987396000CB77F /* ReedSolomonDecoder.h */; }; - E534596A11987396000CB77F /* ReedSolomonException.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458DE11987396000CB77F /* ReedSolomonException.cpp */; }; - E534596B11987396000CB77F /* ReedSolomonException.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458DF11987396000CB77F /* ReedSolomonException.h */; }; - E534596C11987396000CB77F /* Str.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E011987396000CB77F /* Str.cpp */; }; - E534596D11987396000CB77F /* Str.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E111987396000CB77F /* Str.h */; }; - E534596E11987396000CB77F /* DataMatrixReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E311987396000CB77F /* DataMatrixReader.cpp */; }; - E534596F11987396000CB77F /* DataMatrixReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E411987396000CB77F /* DataMatrixReader.h */; }; - E534597011987396000CB77F /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E611987396000CB77F /* BitMatrixParser.cpp */; }; - E534597111987396000CB77F /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E711987396000CB77F /* BitMatrixParser.h */; }; - E534597211987396000CB77F /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458E811987396000CB77F /* DataBlock.cpp */; }; - E534597311987396000CB77F /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458E911987396000CB77F /* DataBlock.h */; }; - E534597411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458EA11987396000CB77F /* DecodedBitStreamParser.cpp */; }; - E534597511987396000CB77F /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458EB11987396000CB77F /* DecodedBitStreamParser.h */; }; - E534597611987396000CB77F /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458EC11987396000CB77F /* Decoder.cpp */; }; - E534597711987396000CB77F /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458ED11987396000CB77F /* Decoder.h */; }; - E534597811987396000CB77F /* CornerPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458EF11987396000CB77F /* CornerPoint.cpp */; }; - E534597911987396000CB77F /* CornerPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F011987396000CB77F /* CornerPoint.h */; }; - E534597A11987396000CB77F /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F111987396000CB77F /* Detector.cpp */; }; - E534597B11987396000CB77F /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F211987396000CB77F /* Detector.h */; }; - E534597E11987396000CB77F /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F511987396000CB77F /* Version.cpp */; }; - E534597F11987396000CB77F /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F611987396000CB77F /* Version.h */; }; - E534598011987396000CB77F /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F711987396000CB77F /* Exception.cpp */; }; - E534598111987396000CB77F /* Exception.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458F811987396000CB77F /* Exception.h */; }; - E534598211987396000CB77F /* LuminanceSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458F911987396000CB77F /* LuminanceSource.cpp */; }; - E534598311987396000CB77F /* LuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458FA11987396000CB77F /* LuminanceSource.h */; }; - E534598411987396000CB77F /* MultiFormatReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458FB11987396000CB77F /* MultiFormatReader.cpp */; }; - E534598511987396000CB77F /* MultiFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458FC11987396000CB77F /* MultiFormatReader.h */; }; - E534598611987396000CB77F /* Code128Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E53458FE11987396000CB77F /* Code128Reader.cpp */; }; - E534598711987396000CB77F /* Code128Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E53458FF11987396000CB77F /* Code128Reader.h */; }; - E534598811987396000CB77F /* Code39Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590011987396000CB77F /* Code39Reader.cpp */; }; - E534598911987396000CB77F /* Code39Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590111987396000CB77F /* Code39Reader.h */; }; - E534598A11987396000CB77F /* EAN13Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590211987396000CB77F /* EAN13Reader.cpp */; }; - E534598B11987396000CB77F /* EAN13Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590311987396000CB77F /* EAN13Reader.h */; }; - E534598C11987396000CB77F /* EAN8Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590411987396000CB77F /* EAN8Reader.cpp */; }; - E534598D11987396000CB77F /* EAN8Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590511987396000CB77F /* EAN8Reader.h */; }; - E534598E11987396000CB77F /* ITFReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590611987396000CB77F /* ITFReader.cpp */; }; - E534598F11987396000CB77F /* ITFReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590711987396000CB77F /* ITFReader.h */; }; - E534599011987396000CB77F /* MultiFormatOneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590811987396000CB77F /* MultiFormatOneDReader.cpp */; }; - E534599111987396000CB77F /* MultiFormatOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590911987396000CB77F /* MultiFormatOneDReader.h */; }; - E534599211987396000CB77F /* MultiFormatUPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590A11987396000CB77F /* MultiFormatUPCEANReader.cpp */; }; - E534599311987396000CB77F /* MultiFormatUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590B11987396000CB77F /* MultiFormatUPCEANReader.h */; }; - E534599411987396000CB77F /* OneDReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590C11987396000CB77F /* OneDReader.cpp */; }; - E534599511987396000CB77F /* OneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590D11987396000CB77F /* OneDReader.h */; }; - E534599611987396000CB77F /* OneDResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534590E11987396000CB77F /* OneDResultPoint.cpp */; }; - E534599711987396000CB77F /* OneDResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E534590F11987396000CB77F /* OneDResultPoint.h */; }; - E534599811987396000CB77F /* UPCAReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591011987396000CB77F /* UPCAReader.cpp */; }; - E534599911987396000CB77F /* UPCAReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591111987396000CB77F /* UPCAReader.h */; }; - E534599A11987396000CB77F /* UPCEANReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591211987396000CB77F /* UPCEANReader.cpp */; }; - E534599B11987396000CB77F /* UPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591311987396000CB77F /* UPCEANReader.h */; }; - E534599C11987396000CB77F /* UPCEReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591411987396000CB77F /* UPCEReader.cpp */; }; - E534599D11987396000CB77F /* UPCEReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591511987396000CB77F /* UPCEReader.h */; }; - E534599E11987396000CB77F /* BitMatrixParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591811987396000CB77F /* BitMatrixParser.cpp */; }; - E534599F11987396000CB77F /* BitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591911987396000CB77F /* BitMatrixParser.h */; }; - E53459A011987396000CB77F /* DataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591A11987396000CB77F /* DataBlock.cpp */; }; - E53459A111987396000CB77F /* DataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591B11987396000CB77F /* DataBlock.h */; }; - E53459A211987396000CB77F /* DataMask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591C11987396000CB77F /* DataMask.cpp */; }; - E53459A311987396000CB77F /* DataMask.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591D11987396000CB77F /* DataMask.h */; }; - E53459A411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534591E11987396000CB77F /* DecodedBitStreamParser.cpp */; }; - E53459A511987396000CB77F /* DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E534591F11987396000CB77F /* DecodedBitStreamParser.h */; }; - E53459A611987396000CB77F /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592011987396000CB77F /* Decoder.cpp */; }; - E53459A711987396000CB77F /* Decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592111987396000CB77F /* Decoder.h */; }; - E53459A811987396000CB77F /* Mode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592211987396000CB77F /* Mode.cpp */; }; - E53459A911987396000CB77F /* Mode.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592311987396000CB77F /* Mode.h */; }; - E53459AA11987396000CB77F /* AlignmentPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592511987396000CB77F /* AlignmentPattern.cpp */; }; - E53459AB11987396000CB77F /* AlignmentPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592611987396000CB77F /* AlignmentPattern.h */; }; - E53459AC11987396000CB77F /* AlignmentPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592711987396000CB77F /* AlignmentPatternFinder.cpp */; }; - E53459AD11987396000CB77F /* AlignmentPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592811987396000CB77F /* AlignmentPatternFinder.h */; }; - E53459AE11987396000CB77F /* Detector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592911987396000CB77F /* Detector.cpp */; }; - E53459AF11987396000CB77F /* Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592A11987396000CB77F /* Detector.h */; }; - E53459B011987396000CB77F /* FinderPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592B11987396000CB77F /* FinderPattern.cpp */; }; - E53459B111987396000CB77F /* FinderPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592C11987396000CB77F /* FinderPattern.h */; }; - E53459B211987396000CB77F /* FinderPatternFinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592D11987396000CB77F /* FinderPatternFinder.cpp */; }; - E53459B311987396000CB77F /* FinderPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = E534592E11987396000CB77F /* FinderPatternFinder.h */; }; - E53459B411987396000CB77F /* FinderPatternInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534592F11987396000CB77F /* FinderPatternInfo.cpp */; }; - E53459B511987396000CB77F /* FinderPatternInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593011987396000CB77F /* FinderPatternInfo.h */; }; - E53459B811987396000CB77F /* ErrorCorrectionLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593311987396000CB77F /* ErrorCorrectionLevel.cpp */; }; - E53459B911987396000CB77F /* ErrorCorrectionLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593411987396000CB77F /* ErrorCorrectionLevel.h */; }; - E53459BA11987396000CB77F /* FormatInformation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593511987396000CB77F /* FormatInformation.cpp */; }; - E53459BB11987396000CB77F /* FormatInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593611987396000CB77F /* FormatInformation.h */; }; - E53459BC11987396000CB77F /* QRCodeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593711987396000CB77F /* QRCodeReader.cpp */; }; - E53459BD11987396000CB77F /* QRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593811987396000CB77F /* QRCodeReader.h */; }; - E53459BE11987396000CB77F /* Version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593911987396000CB77F /* Version.cpp */; }; - E53459BF11987396000CB77F /* Version.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593A11987396000CB77F /* Version.h */; }; - E53459C011987396000CB77F /* Reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593B11987396000CB77F /* Reader.cpp */; }; - E53459C111987396000CB77F /* Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593C11987396000CB77F /* Reader.h */; }; - E53459C311987396000CB77F /* ReaderException.h in Headers */ = {isa = PBXBuildFile; fileRef = E534593E11987396000CB77F /* ReaderException.h */; }; - E53459C411987396000CB77F /* Result.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534593F11987396000CB77F /* Result.cpp */; }; - E53459C511987396000CB77F /* Result.h in Headers */ = {isa = PBXBuildFile; fileRef = E534594011987396000CB77F /* Result.h */; }; - E53459C611987396000CB77F /* ResultPoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E534594111987396000CB77F /* ResultPoint.cpp */; }; - E53459C711987396000CB77F /* ResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = E534594211987396000CB77F /* ResultPoint.h */; }; - E53459CB119873F3000CB77F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E53459CA119873F3000CB77F /* UIKit.framework */; }; - E5345A661198792F000CB77F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5345A651198792F000CB77F /* AudioToolbox.framework */; }; - E5345AA31198859A000CB77F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5345AA21198859A000CB77F /* CoreGraphics.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1D603E4D13E1E010006F4B51 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D; - remoteInfo = ZXingWidget; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1D0CBDF713D0DD5D003D0F8D /* BizcardResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BizcardResultParser.h; path = Classes/resultParsers/BizcardResultParser.h; sourceTree = ""; }; - 1D0CBDF813D0DD5D003D0F8D /* BizcardResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BizcardResultParser.m; path = Classes/resultParsers/BizcardResultParser.m; sourceTree = ""; }; - 1D4F11F913D89EFD0032F754 /* VCardResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VCardResultParser.h; path = Classes/resultParsers/VCardResultParser.h; sourceTree = ""; }; - 1D4F11FA13D89EFD0032F754 /* VCardResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VCardResultParser.m; path = Classes/resultParsers/VCardResultParser.m; sourceTree = ""; }; - 1D60389C13DF6FB5006F4B51 /* ZXingTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ZXingTests-Info.plist"; sourceTree = ""; }; - 1D6038E913DF75BA006F4B51 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 1D60391813DF7780006F4B51 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; - 1D60391E13DF778C006F4B51 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; - 1D60398D13DF7CAD006F4B51 /* ZXingTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ZXingTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1D603D6913E0B60D006F4B51 /* AddressBookAUResultParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AddressBookAUResultParserTests.m; path = Tests/AddressBookAUResultParserTests.m; sourceTree = ""; }; - 1D603D6B13E0B60D006F4B51 /* BizcardResultParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BizcardResultParserTests.m; path = Tests/BizcardResultParserTests.m; sourceTree = ""; }; - 1D603D6D13E0B60D006F4B51 /* BookmarkDoCoMoTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkDoCoMoTests.m; path = Tests/BookmarkDoCoMoTests.m; sourceTree = ""; }; - 1D603D6F13E0B60D006F4B51 /* EmailDoCoMoResultParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailDoCoMoResultParserTests.m; path = Tests/EmailDoCoMoResultParserTests.m; sourceTree = ""; }; - 1D603D7113E0B60D006F4B51 /* MeCardParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MeCardParserTests.m; path = Tests/MeCardParserTests.m; sourceTree = ""; }; - 1D603D7313E0B60D006F4B51 /* VCardResultParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VCardResultParserTests.m; path = Tests/VCardResultParserTests.m; sourceTree = ""; }; - 1D603E6213E20AF1006F4B51 /* ArrayAndStringCategories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ArrayAndStringCategories.h; path = Classes/ArrayAndStringCategories.h; sourceTree = ""; }; - 1D603E6313E20AF1006F4B51 /* ArrayAndStringCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ArrayAndStringCategories.m; path = Classes/ArrayAndStringCategories.m; sourceTree = ""; }; - 1D6040C413E3393B006F4B51 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 1D60411013E36BF8006F4B51 /* EmailAddressResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmailAddressResultParser.h; path = Classes/resultParsers/EmailAddressResultParser.h; sourceTree = ""; }; - 1D60411113E36BF8006F4B51 /* EmailAddressResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailAddressResultParser.m; path = Classes/resultParsers/EmailAddressResultParser.m; sourceTree = ""; }; - 1D60411213E36BF8006F4B51 /* ISBNResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISBNResultParser.h; path = Classes/resultParsers/ISBNResultParser.h; sourceTree = ""; }; - 1D60411313E36BF8006F4B51 /* ISBNResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ISBNResultParser.m; path = Classes/resultParsers/ISBNResultParser.m; sourceTree = ""; }; - 1D60411413E36BF8006F4B51 /* SMTPResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMTPResultParser.h; path = Classes/resultParsers/SMTPResultParser.h; sourceTree = ""; }; - 1D60411513E36BF8006F4B51 /* SMTPResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMTPResultParser.m; path = Classes/resultParsers/SMTPResultParser.m; sourceTree = ""; }; - 1D60412113E36C2D006F4B51 /* ISBNParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISBNParsedResult.h; path = Classes/parsedResults/ISBNParsedResult.h; sourceTree = ""; }; - 1D60412213E36C2D006F4B51 /* ISBNParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ISBNParsedResult.m; path = Classes/parsedResults/ISBNParsedResult.m; sourceTree = ""; }; - 1D60412713E36C55006F4B51 /* ISBNResultParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ISBNResultParserTests.m; path = Tests/ISBNResultParserTests.m; sourceTree = ""; }; - 1D60412813E36C55006F4B51 /* SMTPResultParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMTPResultParserTests.m; path = Tests/SMTPResultParserTests.m; sourceTree = ""; }; - 1DFA090A13CE1A3900599044 /* CBarcodeFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CBarcodeFormat.h; path = Classes/CBarcodeFormat.h; sourceTree = ""; }; - 1DFA090B13CE1A3900599044 /* CBarcodeFormat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CBarcodeFormat.mm; path = Classes/CBarcodeFormat.mm; sourceTree = ""; }; - 1DFA092213CE251600599044 /* ProductParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProductParsedResult.h; path = Classes/parsedResults/ProductParsedResult.h; sourceTree = ""; }; - 1DFA092313CE251600599044 /* ProductParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProductParsedResult.m; path = Classes/parsedResults/ProductParsedResult.m; sourceTree = ""; }; - 1DFA092813CE252300599044 /* ProductResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProductResultParser.h; path = Classes/resultParsers/ProductResultParser.h; sourceTree = ""; }; - 1DFA092913CE252300599044 /* ProductResultParser.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ProductResultParser.mm; path = Classes/resultParsers/ProductResultParser.mm; sourceTree = ""; }; - 1DFA099E13CE5C0300599044 /* AddressBookAUResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AddressBookAUResultParser.h; path = Classes/resultParsers/AddressBookAUResultParser.h; sourceTree = ""; }; - 1DFA099F13CE5C0300599044 /* AddressBookAUResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AddressBookAUResultParser.m; path = Classes/resultParsers/AddressBookAUResultParser.m; sourceTree = ""; }; - 1F027F9F11A7BEAF006B06DE /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Decoder.h; path = Classes/Decoder.h; sourceTree = ""; }; - 1F027FA011A7BEAF006B06DE /* Decoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Decoder.mm; path = Classes/Decoder.mm; sourceTree = ""; }; - 1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DecoderDelegate.h; path = Classes/DecoderDelegate.h; sourceTree = ""; }; - 1F027FA211A7BEAF006B06DE /* FormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FormatReader.h; path = Classes/FormatReader.h; sourceTree = ""; }; - 1F027FA311A7BEAF006B06DE /* FormatReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FormatReader.mm; path = Classes/FormatReader.mm; sourceTree = ""; }; - 1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MultiFormatReader.mm; path = Classes/MultiFormatReader.mm; sourceTree = ""; }; - 1F027FA911A7BEAF006B06DE /* OverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OverlayView.h; path = Classes/OverlayView.h; sourceTree = ""; }; - 1F027FAA11A7BEAF006B06DE /* OverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OverlayView.m; path = Classes/OverlayView.m; sourceTree = ""; }; - 1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TwoDDecoderResult.h; path = Classes/TwoDDecoderResult.h; sourceTree = ""; }; - 1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TwoDDecoderResult.m; path = Classes/TwoDDecoderResult.m; sourceTree = ""; }; - 1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXingWidgetController.h; path = Classes/ZXingWidgetController.h; sourceTree = ""; }; - 1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ZXingWidgetController.m; path = Classes/ZXingWidgetController.m; sourceTree = ""; }; - 1F027FBF11A7BED6006B06DE /* AddContactAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AddContactAction.h; path = Classes/actions/AddContactAction.h; sourceTree = ""; }; - 1F027FC011A7BED6006B06DE /* AddContactAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AddContactAction.m; path = Classes/actions/AddContactAction.m; sourceTree = ""; }; - 1F027FC111A7BED6006B06DE /* CallAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CallAction.h; path = Classes/actions/CallAction.h; sourceTree = ""; }; - 1F027FC211A7BED6006B06DE /* CallAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CallAction.m; path = Classes/actions/CallAction.m; sourceTree = ""; }; - 1F027FC311A7BED6006B06DE /* EmailAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmailAction.h; path = Classes/actions/EmailAction.h; sourceTree = ""; }; - 1F027FC411A7BED6006B06DE /* EmailAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailAction.m; path = Classes/actions/EmailAction.m; sourceTree = ""; }; - 1F027FC511A7BED6006B06DE /* OpenUrlAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpenUrlAction.h; path = Classes/actions/OpenUrlAction.h; sourceTree = ""; }; - 1F027FC611A7BED6006B06DE /* OpenUrlAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OpenUrlAction.m; path = Classes/actions/OpenUrlAction.m; sourceTree = ""; }; - 1F027FC711A7BED6006B06DE /* ResultAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultAction.h; path = Classes/actions/ResultAction.h; sourceTree = ""; }; - 1F027FC811A7BED6006B06DE /* ResultAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultAction.m; path = Classes/actions/ResultAction.m; sourceTree = ""; }; - 1F027FC911A7BED6006B06DE /* ShowMapAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ShowMapAction.h; path = Classes/actions/ShowMapAction.h; sourceTree = ""; }; - 1F027FCA11A7BED6006B06DE /* ShowMapAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ShowMapAction.m; path = Classes/actions/ShowMapAction.m; sourceTree = ""; }; - 1F027FCB11A7BED6006B06DE /* SMSAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSAction.h; path = Classes/actions/SMSAction.h; sourceTree = ""; }; - 1F027FCC11A7BED6006B06DE /* SMSAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSAction.m; path = Classes/actions/SMSAction.m; sourceTree = ""; }; - 1F027FDB11A7BEEB006B06DE /* BusinessCardParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BusinessCardParsedResult.h; path = Classes/parsedResults/BusinessCardParsedResult.h; sourceTree = ""; }; - 1F027FDC11A7BEEB006B06DE /* BusinessCardParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BusinessCardParsedResult.m; path = Classes/parsedResults/BusinessCardParsedResult.m; sourceTree = ""; }; - 1F027FDD11A7BEEB006B06DE /* EmailParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmailParsedResult.h; path = Classes/parsedResults/EmailParsedResult.h; sourceTree = ""; }; - 1F027FDE11A7BEEB006B06DE /* EmailParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailParsedResult.m; path = Classes/parsedResults/EmailParsedResult.m; sourceTree = ""; }; - 1F027FDF11A7BEEB006B06DE /* GeoParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GeoParsedResult.h; path = Classes/parsedResults/GeoParsedResult.h; sourceTree = ""; }; - 1F027FE011A7BEEB006B06DE /* GeoParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GeoParsedResult.m; path = Classes/parsedResults/GeoParsedResult.m; sourceTree = ""; }; - 1F027FE111A7BEEB006B06DE /* ParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ParsedResult.h; path = Classes/parsedResults/ParsedResult.h; sourceTree = ""; }; - 1F027FE211A7BEEB006B06DE /* ParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ParsedResult.m; path = Classes/parsedResults/ParsedResult.m; sourceTree = ""; }; - 1F027FE311A7BEEB006B06DE /* SMSParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSParsedResult.h; path = Classes/parsedResults/SMSParsedResult.h; sourceTree = ""; }; - 1F027FE411A7BEEB006B06DE /* SMSParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSParsedResult.m; path = Classes/parsedResults/SMSParsedResult.m; sourceTree = ""; }; - 1F027FE511A7BEEB006B06DE /* TelParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TelParsedResult.h; path = Classes/parsedResults/TelParsedResult.h; sourceTree = ""; }; - 1F027FE611A7BEEB006B06DE /* TelParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TelParsedResult.m; path = Classes/parsedResults/TelParsedResult.m; sourceTree = ""; }; - 1F027FE711A7BEEB006B06DE /* TextParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextParsedResult.h; path = Classes/parsedResults/TextParsedResult.h; sourceTree = ""; }; - 1F027FE811A7BEEB006B06DE /* TextParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TextParsedResult.m; path = Classes/parsedResults/TextParsedResult.m; sourceTree = ""; }; - 1F027FE911A7BEEB006B06DE /* URIParsedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = URIParsedResult.h; path = Classes/parsedResults/URIParsedResult.h; sourceTree = ""; }; - 1F027FEA11A7BEEB006B06DE /* URIParsedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = URIParsedResult.m; path = Classes/parsedResults/URIParsedResult.m; sourceTree = ""; }; - 1F027FFB11A7BF06006B06DE /* BookmarkDoCoMoResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BookmarkDoCoMoResultParser.h; path = Classes/resultParsers/BookmarkDoCoMoResultParser.h; sourceTree = ""; }; - 1F027FFC11A7BF06006B06DE /* BookmarkDoCoMoResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BookmarkDoCoMoResultParser.m; path = Classes/resultParsers/BookmarkDoCoMoResultParser.m; sourceTree = ""; }; - 1F027FFF11A7BF06006B06DE /* EmailDoCoMoResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmailDoCoMoResultParser.h; path = Classes/resultParsers/EmailDoCoMoResultParser.h; sourceTree = ""; }; - 1F02800011A7BF06006B06DE /* EmailDoCoMoResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EmailDoCoMoResultParser.m; path = Classes/resultParsers/EmailDoCoMoResultParser.m; sourceTree = ""; }; - 1F02800111A7BF06006B06DE /* GeoResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GeoResultParser.h; path = Classes/resultParsers/GeoResultParser.h; sourceTree = ""; }; - 1F02800211A7BF06006B06DE /* GeoResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GeoResultParser.m; path = Classes/resultParsers/GeoResultParser.m; sourceTree = ""; }; - 1F02800311A7BF06006B06DE /* MeCardParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MeCardParser.h; path = Classes/resultParsers/MeCardParser.h; sourceTree = ""; }; - 1F02800411A7BF06006B06DE /* MeCardParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MeCardParser.m; path = Classes/resultParsers/MeCardParser.m; sourceTree = ""; }; - 1F02800511A7BF06006B06DE /* PlainEmailResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlainEmailResultParser.h; path = Classes/resultParsers/PlainEmailResultParser.h; sourceTree = ""; }; - 1F02800611A7BF06006B06DE /* PlainEmailResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlainEmailResultParser.m; path = Classes/resultParsers/PlainEmailResultParser.m; sourceTree = ""; }; - 1F02800711A7BF06006B06DE /* ResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultParser.h; path = Classes/resultParsers/ResultParser.h; sourceTree = ""; }; - 1F02800811A7BF06006B06DE /* ResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultParser.m; path = Classes/resultParsers/ResultParser.m; sourceTree = ""; }; - 1F02800911A7BF06006B06DE /* SMSResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSResultParser.h; path = Classes/resultParsers/SMSResultParser.h; sourceTree = ""; }; - 1F02800A11A7BF06006B06DE /* SMSResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSResultParser.m; path = Classes/resultParsers/SMSResultParser.m; sourceTree = ""; }; - 1F02800B11A7BF06006B06DE /* SMSTOResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SMSTOResultParser.h; path = Classes/resultParsers/SMSTOResultParser.h; sourceTree = ""; }; - 1F02800C11A7BF06006B06DE /* SMSTOResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SMSTOResultParser.m; path = Classes/resultParsers/SMSTOResultParser.m; sourceTree = ""; }; - 1F02800D11A7BF06006B06DE /* TelResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TelResultParser.h; path = Classes/resultParsers/TelResultParser.h; sourceTree = ""; }; - 1F02800E11A7BF06006B06DE /* TelResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TelResultParser.m; path = Classes/resultParsers/TelResultParser.m; sourceTree = ""; }; - 1F02800F11A7BF06006B06DE /* TextResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextResultParser.h; path = Classes/resultParsers/TextResultParser.h; sourceTree = ""; }; - 1F02801011A7BF06006B06DE /* TextResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TextResultParser.m; path = Classes/resultParsers/TextResultParser.m; sourceTree = ""; }; - 1F02801111A7BF06006B06DE /* URLResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = URLResultParser.h; path = Classes/resultParsers/URLResultParser.h; sourceTree = ""; }; - 1F02801211A7BF06006B06DE /* URLResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = URLResultParser.m; path = Classes/resultParsers/URLResultParser.m; sourceTree = ""; }; - 1F02801311A7BF06006B06DE /* URLTOResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = URLTOResultParser.h; path = Classes/resultParsers/URLTOResultParser.h; sourceTree = ""; }; - 1F02801411A7BF06006B06DE /* URLTOResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = URLTOResultParser.m; path = Classes/resultParsers/URLTOResultParser.m; sourceTree = ""; }; - 1F3DB0C011C60DB4009C581B /* QRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QRCodeReader.h; path = Classes/QRCodeReader.h; sourceTree = ""; }; - 1F3DB0C111C60DB4009C581B /* QRCodeReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = QRCodeReader.mm; path = Classes/QRCodeReader.mm; sourceTree = ""; }; - 1F3DB0F511C61080009C581B /* DataMatrixReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DataMatrixReader.h; path = Classes/DataMatrixReader.h; sourceTree = ""; }; - 1F3DB0F611C61080009C581B /* DataMatrixReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = DataMatrixReader.mm; path = Classes/DataMatrixReader.mm; sourceTree = ""; }; - 1F3DB0F711C61080009C581B /* MultiFormatOneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MultiFormatOneDReader.h; path = Classes/MultiFormatOneDReader.h; sourceTree = ""; }; - 1F3DB0F811C61080009C581B /* MultiFormatOneDReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MultiFormatOneDReader.mm; path = Classes/MultiFormatOneDReader.mm; sourceTree = ""; }; - 1F3DB0F911C61080009C581B /* MultiFormatUPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MultiFormatUPCEANReader.h; path = Classes/MultiFormatUPCEANReader.h; sourceTree = ""; }; - 1F3DB0FA11C61080009C581B /* MultiFormatUPCEANReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MultiFormatUPCEANReader.mm; path = Classes/MultiFormatUPCEANReader.mm; sourceTree = ""; }; - 1FB4319D12901C76002D63E8 /* UniversalResultParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UniversalResultParser.h; path = Classes/resultParsers/UniversalResultParser.h; sourceTree = ""; }; - 1FB4319E12901C76002D63E8 /* UniversalResultParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UniversalResultParser.m; path = Classes/resultParsers/UniversalResultParser.m; sourceTree = ""; }; - 3B117EEF145B220A0035037B /* MonochromeRectangleDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MonochromeRectangleDetector.cpp; path = detector/MonochromeRectangleDetector.cpp; sourceTree = ""; }; - 3B117EF0145B220A0035037B /* WhiteRectangleDetector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WhiteRectangleDetector.cpp; path = detector/WhiteRectangleDetector.cpp; sourceTree = ""; }; - 3B248F7914EF3A660065F0DA /* GenericGF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericGF.cpp; sourceTree = ""; }; - 3B248F7A14EF3A660065F0DA /* GenericGF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericGF.h; sourceTree = ""; }; - 3B248F7B14EF3A660065F0DA /* GenericGFPoly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericGFPoly.cpp; sourceTree = ""; }; - 3B248F7C14EF3A660065F0DA /* GenericGFPoly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericGFPoly.h; sourceTree = ""; }; - 3B248F8414EF3A980065F0DA /* AztecDetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AztecDetectorResult.cpp; sourceTree = ""; }; - 3B248F8514EF3A980065F0DA /* AztecDetectorResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AztecDetectorResult.h; sourceTree = ""; }; - 3B248F8614EF3A980065F0DA /* AztecReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AztecReader.cpp; sourceTree = ""; }; - 3B248F8714EF3A980065F0DA /* AztecReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AztecReader.h; sourceTree = ""; }; - 3B248F8914EF3A980065F0DA /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3B248F8A14EF3A980065F0DA /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3B248F8C14EF3A980065F0DA /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3B248F8D14EF3A980065F0DA /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3B248F9614EF3AF80065F0DA /* AztecReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AztecReader.h; path = Classes/AztecReader.h; sourceTree = ""; }; - 3B248F9714EF3AF80065F0DA /* AztecReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AztecReader.mm; path = Classes/AztecReader.mm; sourceTree = ""; }; - 3B27C5D6144735CE005157C4 /* FormatException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatException.cpp; sourceTree = ""; }; - 3B27C5D7144735CE005157C4 /* FormatException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatException.h; sourceTree = ""; }; - 3B27C5DB144735E6005157C4 /* CharacterSetECI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CharacterSetECI.cpp; sourceTree = ""; }; - 3B27C5DC144735E6005157C4 /* CharacterSetECI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharacterSetECI.h; sourceTree = ""; }; - 3B27C5DF144735E6005157C4 /* StringUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringUtils.cpp; sourceTree = ""; }; - 3B27C5E0144735E6005157C4 /* StringUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringUtils.h; sourceTree = ""; }; - 3B6AA66A1710C34600DF84C0 /* InvertedLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InvertedLuminanceSource.cpp; sourceTree = ""; }; - 3B6AA66B1710C34600DF84C0 /* InvertedLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InvertedLuminanceSource.h; sourceTree = ""; }; - 3B6C805317090ED300D22AB2 /* CodaBarReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodaBarReader.cpp; sourceTree = ""; }; - 3B6C805417090ED300D22AB2 /* CodaBarReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodaBarReader.h; sourceTree = ""; }; - 3B6C805517090ED300D22AB2 /* Code93Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code93Reader.cpp; sourceTree = ""; }; - 3B6C805617090ED300D22AB2 /* Code93Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code93Reader.h; sourceTree = ""; }; - 3B6C805B17090EFC00D22AB2 /* ChecksumException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChecksumException.cpp; sourceTree = ""; }; - 3B6C805C17090EFC00D22AB2 /* ChecksumException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChecksumException.h; sourceTree = ""; }; - 3B72D96D12130EF6007CEF32 /* ResultPointCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPointCallback.cpp; sourceTree = ""; }; - 3B72D96E12130EF6007CEF32 /* ResultPointCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPointCallback.h; sourceTree = ""; }; - 3B81AAC3120F07E40022E5D4 /* DecodeHints.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodeHints.cpp; sourceTree = ""; }; - 3B81AAC4120F07E40022E5D4 /* DecodeHints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodeHints.h; sourceTree = ""; }; - 3B81AAC7120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleLuminanceSource.cpp; sourceTree = ""; }; - 3B81AAC8120F080D0022E5D4 /* GreyscaleLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleLuminanceSource.h; sourceTree = ""; }; - 3B81AACB120F08170022E5D4 /* HybridBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridBinarizer.cpp; sourceTree = ""; }; - 3B81AACC120F08170022E5D4 /* HybridBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HybridBinarizer.h; sourceTree = ""; }; - 3B81AAF6120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GreyscaleRotatedLuminanceSource.cpp; sourceTree = ""; }; - 3B81AAF7120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GreyscaleRotatedLuminanceSource.h; sourceTree = ""; }; - 3BAC39AC17242C2200473974 /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - 3BAC39AD17242C2200473974 /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - 3BAC39AE17242C2200473974 /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - 3BAC39AF17242C2200473974 /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - 3BAC39B017242C2200473974 /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - 3BAC39B117242C2200473974 /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - 3BAC39B317242C2200473974 /* ErrorCorrection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorCorrection.cpp; sourceTree = ""; }; - 3BAC39B417242C2200473974 /* ErrorCorrection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorCorrection.h; sourceTree = ""; }; - 3BAC39B517242C2200473974 /* ModulusGF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModulusGF.cpp; sourceTree = ""; }; - 3BAC39B617242C2200473974 /* ModulusGF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModulusGF.h; sourceTree = ""; }; - 3BAC39B717242C2200473974 /* ModulusPoly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModulusPoly.cpp; sourceTree = ""; }; - 3BAC39B817242C2200473974 /* ModulusPoly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModulusPoly.h; sourceTree = ""; }; - 3BAC39BA17242C2200473974 /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - 3BAC39BB17242C2200473974 /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - 3BAC39BC17242C2200473974 /* LinesSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LinesSampler.cpp; sourceTree = ""; }; - 3BAC39BD17242C2300473974 /* LinesSampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinesSampler.h; sourceTree = ""; }; - 3BAC39BE17242C2300473974 /* PDF417Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PDF417Reader.cpp; sourceTree = ""; }; - 3BAC39BF17242C2300473974 /* PDF417Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PDF417Reader.h; sourceTree = ""; }; - 3BAC39D817242E5D00473974 /* BigInteger.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigInteger.cc; sourceTree = ""; }; - 3BAC39D917242E5D00473974 /* BigInteger.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigInteger.hh; sourceTree = ""; }; - 3BAC39DA17242E5D00473974 /* BigIntegerAlgorithms.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigIntegerAlgorithms.cc; sourceTree = ""; }; - 3BAC39DB17242E5D00473974 /* BigIntegerAlgorithms.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigIntegerAlgorithms.hh; sourceTree = ""; }; - 3BAC39DC17242E5D00473974 /* BigIntegerLibrary.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigIntegerLibrary.hh; sourceTree = ""; }; - 3BAC39DD17242E5D00473974 /* BigIntegerUtils.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigIntegerUtils.cc; sourceTree = ""; }; - 3BAC39DE17242E5D00473974 /* BigIntegerUtils.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigIntegerUtils.hh; sourceTree = ""; }; - 3BAC39DF17242E5D00473974 /* BigUnsigned.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigUnsigned.cc; sourceTree = ""; }; - 3BAC39E017242E5D00473974 /* BigUnsigned.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigUnsigned.hh; sourceTree = ""; }; - 3BAC39E117242E5D00473974 /* BigUnsignedInABase.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BigUnsignedInABase.cc; sourceTree = ""; }; - 3BAC39E217242E5D00473974 /* BigUnsignedInABase.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = BigUnsignedInABase.hh; sourceTree = ""; }; - 3BAC39E517242E5D00473974 /* NumberlikeArray.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = NumberlikeArray.hh; sourceTree = ""; }; - AA747D9E0F9514B9006C5449 /* ZXingWidget_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXingWidget_Prefix.pch; sourceTree = SOURCE_ROOT; }; - AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - D2AAC07E0554694100DB518D /* libZXingWidget.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libZXingWidget.a; sourceTree = BUILT_PRODUCTS_DIR; }; - E53458B511987396000CB77F /* BarcodeFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BarcodeFormat.cpp; sourceTree = ""; }; - E53458B611987396000CB77F /* BarcodeFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BarcodeFormat.h; sourceTree = ""; }; - E53458B711987396000CB77F /* Binarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Binarizer.cpp; sourceTree = ""; }; - E53458B811987396000CB77F /* Binarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Binarizer.h; sourceTree = ""; }; - E53458B911987396000CB77F /* BinaryBitmap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BinaryBitmap.cpp; sourceTree = ""; }; - E53458BA11987396000CB77F /* BinaryBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BinaryBitmap.h; sourceTree = ""; }; - E53458BD11987396000CB77F /* Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Array.h; sourceTree = ""; }; - E53458BE11987396000CB77F /* BitArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitArray.cpp; sourceTree = ""; }; - E53458BF11987396000CB77F /* BitArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitArray.h; sourceTree = ""; }; - E53458C011987396000CB77F /* BitMatrix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrix.cpp; sourceTree = ""; }; - E53458C111987396000CB77F /* BitMatrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrix.h; sourceTree = ""; }; - E53458C211987396000CB77F /* BitSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitSource.cpp; sourceTree = ""; }; - E53458C311987396000CB77F /* BitSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitSource.h; sourceTree = ""; }; - E53458C511987396000CB77F /* Counted.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Counted.h; sourceTree = ""; }; - E53458C611987396000CB77F /* DecoderResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecoderResult.cpp; sourceTree = ""; }; - E53458C711987396000CB77F /* DecoderResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecoderResult.h; sourceTree = ""; }; - E53458C811987396000CB77F /* DetectorResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DetectorResult.cpp; sourceTree = ""; }; - E53458C911987396000CB77F /* DetectorResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetectorResult.h; sourceTree = ""; }; - E53458CC11987396000CB77F /* GlobalHistogramBinarizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GlobalHistogramBinarizer.cpp; sourceTree = ""; }; - E53458CD11987396000CB77F /* GlobalHistogramBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlobalHistogramBinarizer.h; sourceTree = ""; }; - E53458CE11987396000CB77F /* GridSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridSampler.cpp; sourceTree = ""; }; - E53458CF11987396000CB77F /* GridSampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridSampler.h; sourceTree = ""; }; - E53458D011987396000CB77F /* IllegalArgumentException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IllegalArgumentException.cpp; sourceTree = ""; }; - E53458D111987396000CB77F /* IllegalArgumentException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IllegalArgumentException.h; sourceTree = ""; }; - E53458D411987396000CB77F /* PerspectiveTransform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerspectiveTransform.cpp; sourceTree = ""; }; - E53458D511987396000CB77F /* PerspectiveTransform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerspectiveTransform.h; sourceTree = ""; }; - E53458D611987396000CB77F /* Point.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Point.h; sourceTree = ""; }; - E53458DC11987396000CB77F /* ReedSolomonDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonDecoder.cpp; sourceTree = ""; }; - E53458DD11987396000CB77F /* ReedSolomonDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonDecoder.h; sourceTree = ""; }; - E53458DE11987396000CB77F /* ReedSolomonException.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReedSolomonException.cpp; sourceTree = ""; }; - E53458DF11987396000CB77F /* ReedSolomonException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedSolomonException.h; sourceTree = ""; }; - E53458E011987396000CB77F /* Str.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Str.cpp; sourceTree = ""; }; - E53458E111987396000CB77F /* Str.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Str.h; sourceTree = ""; }; - E53458E311987396000CB77F /* DataMatrixReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMatrixReader.cpp; sourceTree = ""; }; - E53458E411987396000CB77F /* DataMatrixReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMatrixReader.h; sourceTree = ""; }; - E53458E611987396000CB77F /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - E53458E711987396000CB77F /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - E53458E811987396000CB77F /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; }; - E53458E911987396000CB77F /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; }; - E53458EA11987396000CB77F /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - E53458EB11987396000CB77F /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - E53458EC11987396000CB77F /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - E53458ED11987396000CB77F /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - E53458EF11987396000CB77F /* CornerPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CornerPoint.cpp; sourceTree = ""; }; - E53458F011987396000CB77F /* CornerPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CornerPoint.h; sourceTree = ""; }; - E53458F111987396000CB77F /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - E53458F211987396000CB77F /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - E53458F511987396000CB77F /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; }; - E53458F611987396000CB77F /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; - E53458F711987396000CB77F /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Exception.cpp; sourceTree = ""; }; - E53458F811987396000CB77F /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = ""; }; - E53458F911987396000CB77F /* LuminanceSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LuminanceSource.cpp; sourceTree = ""; }; - E53458FA11987396000CB77F /* LuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LuminanceSource.h; sourceTree = ""; }; - E53458FB11987396000CB77F /* MultiFormatReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatReader.cpp; sourceTree = ""; }; - E53458FC11987396000CB77F /* MultiFormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatReader.h; sourceTree = ""; }; - E53458FE11987396000CB77F /* Code128Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code128Reader.cpp; sourceTree = ""; }; - E53458FF11987396000CB77F /* Code128Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code128Reader.h; sourceTree = ""; }; - E534590011987396000CB77F /* Code39Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Code39Reader.cpp; sourceTree = ""; }; - E534590111987396000CB77F /* Code39Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Code39Reader.h; sourceTree = ""; }; - E534590211987396000CB77F /* EAN13Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN13Reader.cpp; sourceTree = ""; }; - E534590311987396000CB77F /* EAN13Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN13Reader.h; sourceTree = ""; }; - E534590411987396000CB77F /* EAN8Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EAN8Reader.cpp; sourceTree = ""; }; - E534590511987396000CB77F /* EAN8Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EAN8Reader.h; sourceTree = ""; }; - E534590611987396000CB77F /* ITFReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ITFReader.cpp; sourceTree = ""; }; - E534590711987396000CB77F /* ITFReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITFReader.h; sourceTree = ""; }; - E534590811987396000CB77F /* MultiFormatOneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatOneDReader.cpp; sourceTree = ""; }; - E534590911987396000CB77F /* MultiFormatOneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatOneDReader.h; sourceTree = ""; }; - E534590A11987396000CB77F /* MultiFormatUPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiFormatUPCEANReader.cpp; sourceTree = ""; }; - E534590B11987396000CB77F /* MultiFormatUPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFormatUPCEANReader.h; sourceTree = ""; }; - E534590C11987396000CB77F /* OneDReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDReader.cpp; sourceTree = ""; }; - E534590D11987396000CB77F /* OneDReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDReader.h; sourceTree = ""; }; - E534590E11987396000CB77F /* OneDResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDResultPoint.cpp; sourceTree = ""; }; - E534590F11987396000CB77F /* OneDResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDResultPoint.h; sourceTree = ""; }; - E534591011987396000CB77F /* UPCAReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCAReader.cpp; sourceTree = ""; }; - E534591111987396000CB77F /* UPCAReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCAReader.h; sourceTree = ""; }; - E534591211987396000CB77F /* UPCEANReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEANReader.cpp; sourceTree = ""; }; - E534591311987396000CB77F /* UPCEANReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEANReader.h; sourceTree = ""; }; - E534591411987396000CB77F /* UPCEReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UPCEReader.cpp; sourceTree = ""; }; - E534591511987396000CB77F /* UPCEReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UPCEReader.h; sourceTree = ""; }; - E534591811987396000CB77F /* BitMatrixParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitMatrixParser.cpp; sourceTree = ""; }; - E534591911987396000CB77F /* BitMatrixParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitMatrixParser.h; sourceTree = ""; }; - E534591A11987396000CB77F /* DataBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataBlock.cpp; sourceTree = ""; }; - E534591B11987396000CB77F /* DataBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataBlock.h; sourceTree = ""; }; - E534591C11987396000CB77F /* DataMask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMask.cpp; sourceTree = ""; }; - E534591D11987396000CB77F /* DataMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMask.h; sourceTree = ""; }; - E534591E11987396000CB77F /* DecodedBitStreamParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedBitStreamParser.cpp; sourceTree = ""; }; - E534591F11987396000CB77F /* DecodedBitStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedBitStreamParser.h; sourceTree = ""; }; - E534592011987396000CB77F /* Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; - E534592111987396000CB77F /* Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; - E534592211987396000CB77F /* Mode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode.cpp; sourceTree = ""; }; - E534592311987396000CB77F /* Mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mode.h; sourceTree = ""; }; - E534592511987396000CB77F /* AlignmentPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPattern.cpp; sourceTree = ""; }; - E534592611987396000CB77F /* AlignmentPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPattern.h; sourceTree = ""; }; - E534592711987396000CB77F /* AlignmentPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlignmentPatternFinder.cpp; sourceTree = ""; }; - E534592811987396000CB77F /* AlignmentPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignmentPatternFinder.h; sourceTree = ""; }; - E534592911987396000CB77F /* Detector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Detector.cpp; sourceTree = ""; }; - E534592A11987396000CB77F /* Detector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Detector.h; sourceTree = ""; }; - E534592B11987396000CB77F /* FinderPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPattern.cpp; sourceTree = ""; }; - E534592C11987396000CB77F /* FinderPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPattern.h; sourceTree = ""; }; - E534592D11987396000CB77F /* FinderPatternFinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternFinder.cpp; sourceTree = ""; }; - E534592E11987396000CB77F /* FinderPatternFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternFinder.h; sourceTree = ""; }; - E534592F11987396000CB77F /* FinderPatternInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinderPatternInfo.cpp; sourceTree = ""; }; - E534593011987396000CB77F /* FinderPatternInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinderPatternInfo.h; sourceTree = ""; }; - E534593311987396000CB77F /* ErrorCorrectionLevel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorCorrectionLevel.cpp; sourceTree = ""; }; - E534593411987396000CB77F /* ErrorCorrectionLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorCorrectionLevel.h; sourceTree = ""; }; - E534593511987396000CB77F /* FormatInformation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatInformation.cpp; sourceTree = ""; }; - E534593611987396000CB77F /* FormatInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatInformation.h; sourceTree = ""; }; - E534593711987396000CB77F /* QRCodeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QRCodeReader.cpp; sourceTree = ""; }; - E534593811987396000CB77F /* QRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QRCodeReader.h; sourceTree = ""; }; - E534593911987396000CB77F /* Version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Version.cpp; sourceTree = ""; }; - E534593A11987396000CB77F /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; - E534593B11987396000CB77F /* Reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reader.cpp; sourceTree = ""; }; - E534593C11987396000CB77F /* Reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reader.h; sourceTree = ""; }; - E534593E11987396000CB77F /* ReaderException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderException.h; sourceTree = ""; }; - E534593F11987396000CB77F /* Result.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Result.cpp; sourceTree = ""; }; - E534594011987396000CB77F /* Result.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Result.h; sourceTree = ""; }; - E534594111987396000CB77F /* ResultPoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResultPoint.cpp; sourceTree = ""; }; - E534594211987396000CB77F /* ResultPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResultPoint.h; sourceTree = ""; }; - E53459CA119873F3000CB77F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - E5345A651198792F000CB77F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - E5345AA21198859A000CB77F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60398A13DF7CAD006F4B51 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D6039EC13DF7F62006F4B51 /* libZXingWidget.a in Frameworks */, - 1D6039F313DF7F9A006F4B51 /* AddressBook.framework in Frameworks */, - 1D6039F413DF7F9A006F4B51 /* AddressBookUI.framework in Frameworks */, - 1D6039F513DF7F9A006F4B51 /* CoreGraphics.framework in Frameworks */, - 1D6039F613DF7F9A006F4B51 /* Foundation.framework in Frameworks */, - 1D6039F713DF7F9A006F4B51 /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, - E53459CB119873F3000CB77F /* UIKit.framework in Frameworks */, - E5345A661198792F000CB77F /* AudioToolbox.framework in Frameworks */, - E5345AA31198859A000CB77F /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* libZXingWidget.a */, - 1D60398D13DF7CAD006F4B51 /* ZXingTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* ZXingWidget */ = { - isa = PBXGroup; - children = ( - 1D6038A113DF6FBF006F4B51 /* Tests */, - E53458B311987396000CB77F /* CoreSrc */, - 08FB77AEFE84172EC02AAC07 /* Classes */, - 32C88DFF0371C24200C91783 /* Other Sources */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - E5345D2811999F53000CB77F /* Resources */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - name = ZXingWidget; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1D60391813DF7780006F4B51 /* AddressBook.framework */, - 1D60391E13DF778C006F4B51 /* AddressBookUI.framework */, - 1D6040C413E3393B006F4B51 /* AVFoundation.framework */, - AACBBE490F95108600F1A2B1 /* Foundation.framework */, - E53459CA119873F3000CB77F /* UIKit.framework */, - E5345A651198792F000CB77F /* AudioToolbox.framework */, - E5345AA21198859A000CB77F /* CoreGraphics.framework */, - 1D6038E913DF75BA006F4B51 /* SenTestingKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 08FB77AEFE84172EC02AAC07 /* Classes */ = { - isa = PBXGroup; - children = ( - 3B248F9614EF3AF80065F0DA /* AztecReader.h */, - 3B248F9714EF3AF80065F0DA /* AztecReader.mm */, - 1D603E6213E20AF1006F4B51 /* ArrayAndStringCategories.h */, - 1D603E6313E20AF1006F4B51 /* ArrayAndStringCategories.m */, - 1DFA090A13CE1A3900599044 /* CBarcodeFormat.h */, - 1DFA090B13CE1A3900599044 /* CBarcodeFormat.mm */, - 1F3DB0F511C61080009C581B /* DataMatrixReader.h */, - 1F3DB0F611C61080009C581B /* DataMatrixReader.mm */, - 1F3DB0F711C61080009C581B /* MultiFormatOneDReader.h */, - 1F3DB0F811C61080009C581B /* MultiFormatOneDReader.mm */, - 1F3DB0F911C61080009C581B /* MultiFormatUPCEANReader.h */, - 1F3DB0FA11C61080009C581B /* MultiFormatUPCEANReader.mm */, - 1F3DB0C011C60DB4009C581B /* QRCodeReader.h */, - 1F3DB0C111C60DB4009C581B /* QRCodeReader.mm */, - 1F027FB711A7BEBF006B06DE /* TwoDDecoderResult.h */, - 1F027FB811A7BEBF006B06DE /* TwoDDecoderResult.m */, - 1F027FB911A7BEBF006B06DE /* ZXingWidgetController.h */, - 1F027FBA11A7BEBF006B06DE /* ZXingWidgetController.m */, - 1F027F9F11A7BEAF006B06DE /* Decoder.h */, - 1F027FA011A7BEAF006B06DE /* Decoder.mm */, - 1F027FA111A7BEAF006B06DE /* DecoderDelegate.h */, - 1F027FA211A7BEAF006B06DE /* FormatReader.h */, - 1F027FA311A7BEAF006B06DE /* FormatReader.mm */, - 1F027FA611A7BEAF006B06DE /* MultiFormatReader.mm */, - 1F027FA911A7BEAF006B06DE /* OverlayView.h */, - 1F027FAA11A7BEAF006B06DE /* OverlayView.m */, - E5345A00119876A5000CB77F /* Actions */, - E53459EF119876A5000CB77F /* ParsedResults */, - E53459D4119876A5000CB77F /* ResultParsers */, - ); - name = Classes; - sourceTree = ""; - }; - 1D6038A113DF6FBF006F4B51 /* Tests */ = { - isa = PBXGroup; - children = ( - 1D60389C13DF6FB5006F4B51 /* ZXingTests-Info.plist */, - 1D603D6913E0B60D006F4B51 /* AddressBookAUResultParserTests.m */, - 1D603D6B13E0B60D006F4B51 /* BizcardResultParserTests.m */, - 1D603D6D13E0B60D006F4B51 /* BookmarkDoCoMoTests.m */, - 1D603D6F13E0B60D006F4B51 /* EmailDoCoMoResultParserTests.m */, - 1D60412713E36C55006F4B51 /* ISBNResultParserTests.m */, - 1D603D7113E0B60D006F4B51 /* MeCardParserTests.m */, - 1D60412813E36C55006F4B51 /* SMTPResultParserTests.m */, - 1D603D7313E0B60D006F4B51 /* VCardResultParserTests.m */, - ); - name = Tests; - sourceTree = ""; - }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { - isa = PBXGroup; - children = ( - AA747D9E0F9514B9006C5449 /* ZXingWidget_Prefix.pch */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 3B248F8314EF3A980065F0DA /* aztec */ = { - isa = PBXGroup; - children = ( - 3B248F8414EF3A980065F0DA /* AztecDetectorResult.cpp */, - 3B248F8514EF3A980065F0DA /* AztecDetectorResult.h */, - 3B248F8614EF3A980065F0DA /* AztecReader.cpp */, - 3B248F8714EF3A980065F0DA /* AztecReader.h */, - 3B248F8814EF3A980065F0DA /* decoder */, - 3B248F8B14EF3A980065F0DA /* detector */, - ); - path = aztec; - sourceTree = ""; - }; - 3B248F8814EF3A980065F0DA /* decoder */ = { - isa = PBXGroup; - children = ( - 3B248F8914EF3A980065F0DA /* Decoder.cpp */, - 3B248F8A14EF3A980065F0DA /* Decoder.h */, - ); - path = decoder; - sourceTree = ""; - }; - 3B248F8B14EF3A980065F0DA /* detector */ = { - isa = PBXGroup; - children = ( - 3B248F8C14EF3A980065F0DA /* Detector.cpp */, - 3B248F8D14EF3A980065F0DA /* Detector.h */, - ); - path = detector; - sourceTree = ""; - }; - 3BAC39AA17242C2200473974 /* pdf417 */ = { - isa = PBXGroup; - children = ( - 3BAC39AB17242C2200473974 /* decoder */, - 3BAC39B917242C2200473974 /* detector */, - 3BAC39BE17242C2300473974 /* PDF417Reader.cpp */, - 3BAC39BF17242C2300473974 /* PDF417Reader.h */, - ); - path = pdf417; - sourceTree = ""; - }; - 3BAC39AB17242C2200473974 /* decoder */ = { - isa = PBXGroup; - children = ( - 3BAC39AC17242C2200473974 /* BitMatrixParser.cpp */, - 3BAC39AD17242C2200473974 /* BitMatrixParser.h */, - 3BAC39AE17242C2200473974 /* DecodedBitStreamParser.cpp */, - 3BAC39AF17242C2200473974 /* DecodedBitStreamParser.h */, - 3BAC39B017242C2200473974 /* Decoder.cpp */, - 3BAC39B117242C2200473974 /* Decoder.h */, - 3BAC39B217242C2200473974 /* ec */, - ); - path = decoder; - sourceTree = ""; - }; - 3BAC39B217242C2200473974 /* ec */ = { - isa = PBXGroup; - children = ( - 3BAC39B317242C2200473974 /* ErrorCorrection.cpp */, - 3BAC39B417242C2200473974 /* ErrorCorrection.h */, - 3BAC39B517242C2200473974 /* ModulusGF.cpp */, - 3BAC39B617242C2200473974 /* ModulusGF.h */, - 3BAC39B717242C2200473974 /* ModulusPoly.cpp */, - 3BAC39B817242C2200473974 /* ModulusPoly.h */, - ); - path = ec; - sourceTree = ""; - }; - 3BAC39B917242C2200473974 /* detector */ = { - isa = PBXGroup; - children = ( - 3BAC39BA17242C2200473974 /* Detector.cpp */, - 3BAC39BB17242C2200473974 /* Detector.h */, - 3BAC39BC17242C2200473974 /* LinesSampler.cpp */, - 3BAC39BD17242C2300473974 /* LinesSampler.h */, - ); - path = detector; - sourceTree = ""; - }; - 3BAC39D617242E5D00473974 /* bigint */ = { - isa = PBXGroup; - children = ( - 3BAC39D817242E5D00473974 /* BigInteger.cc */, - 3BAC39D917242E5D00473974 /* BigInteger.hh */, - 3BAC39DA17242E5D00473974 /* BigIntegerAlgorithms.cc */, - 3BAC39DB17242E5D00473974 /* BigIntegerAlgorithms.hh */, - 3BAC39DC17242E5D00473974 /* BigIntegerLibrary.hh */, - 3BAC39DD17242E5D00473974 /* BigIntegerUtils.cc */, - 3BAC39DE17242E5D00473974 /* BigIntegerUtils.hh */, - 3BAC39DF17242E5D00473974 /* BigUnsigned.cc */, - 3BAC39E017242E5D00473974 /* BigUnsigned.hh */, - 3BAC39E117242E5D00473974 /* BigUnsignedInABase.cc */, - 3BAC39E217242E5D00473974 /* BigUnsignedInABase.hh */, - 3BAC39E517242E5D00473974 /* NumberlikeArray.hh */, - ); - path = bigint; - sourceTree = ""; - }; - E53458B311987396000CB77F /* CoreSrc */ = { - isa = PBXGroup; - children = ( - 3BAC39D617242E5D00473974 /* bigint */, - E53458B411987396000CB77F /* zxing */, - ); - name = CoreSrc; - path = ../../cpp/core/src; - sourceTree = SOURCE_ROOT; - }; - E53458B411987396000CB77F /* zxing */ = { - isa = PBXGroup; - children = ( - 3BAC39AA17242C2200473974 /* pdf417 */, - 3B6AA66A1710C34600DF84C0 /* InvertedLuminanceSource.cpp */, - 3B6AA66B1710C34600DF84C0 /* InvertedLuminanceSource.h */, - 3B6C805B17090EFC00D22AB2 /* ChecksumException.cpp */, - 3B6C805C17090EFC00D22AB2 /* ChecksumException.h */, - 3B248F8314EF3A980065F0DA /* aztec */, - 3B27C5D6144735CE005157C4 /* FormatException.cpp */, - 3B27C5D7144735CE005157C4 /* FormatException.h */, - 3B72D96D12130EF6007CEF32 /* ResultPointCallback.cpp */, - 3B72D96E12130EF6007CEF32 /* ResultPointCallback.h */, - 3B81AAC3120F07E40022E5D4 /* DecodeHints.cpp */, - 3B81AAC4120F07E40022E5D4 /* DecodeHints.h */, - E53458B511987396000CB77F /* BarcodeFormat.cpp */, - E53458B611987396000CB77F /* BarcodeFormat.h */, - E53458B711987396000CB77F /* Binarizer.cpp */, - E53458B811987396000CB77F /* Binarizer.h */, - E53458B911987396000CB77F /* BinaryBitmap.cpp */, - E53458BA11987396000CB77F /* BinaryBitmap.h */, - E53458BB11987396000CB77F /* common */, - E53458E211987396000CB77F /* datamatrix */, - E53458F711987396000CB77F /* Exception.cpp */, - E53458F811987396000CB77F /* Exception.h */, - E53458F911987396000CB77F /* LuminanceSource.cpp */, - E53458FA11987396000CB77F /* LuminanceSource.h */, - E53458FB11987396000CB77F /* MultiFormatReader.cpp */, - E53458FC11987396000CB77F /* MultiFormatReader.h */, - E53458FD11987396000CB77F /* oned */, - E534591611987396000CB77F /* qrcode */, - E534593B11987396000CB77F /* Reader.cpp */, - E534593C11987396000CB77F /* Reader.h */, - E534593E11987396000CB77F /* ReaderException.h */, - E534593F11987396000CB77F /* Result.cpp */, - E534594011987396000CB77F /* Result.h */, - E534594111987396000CB77F /* ResultPoint.cpp */, - E534594211987396000CB77F /* ResultPoint.h */, - ); - path = zxing; - sourceTree = ""; - }; - E53458BB11987396000CB77F /* common */ = { - isa = PBXGroup; - children = ( - 3B117EEF145B220A0035037B /* MonochromeRectangleDetector.cpp */, - 3B117EF0145B220A0035037B /* WhiteRectangleDetector.cpp */, - 3B27C5DB144735E6005157C4 /* CharacterSetECI.cpp */, - 3B27C5DC144735E6005157C4 /* CharacterSetECI.h */, - 3B27C5DF144735E6005157C4 /* StringUtils.cpp */, - 3B27C5E0144735E6005157C4 /* StringUtils.h */, - 3B81AAF6120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp */, - 3B81AAF7120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h */, - 3B81AACB120F08170022E5D4 /* HybridBinarizer.cpp */, - 3B81AACC120F08170022E5D4 /* HybridBinarizer.h */, - 3B81AAC7120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp */, - 3B81AAC8120F080D0022E5D4 /* GreyscaleLuminanceSource.h */, - E53458BD11987396000CB77F /* Array.h */, - E53458BE11987396000CB77F /* BitArray.cpp */, - E53458BF11987396000CB77F /* BitArray.h */, - E53458C011987396000CB77F /* BitMatrix.cpp */, - E53458C111987396000CB77F /* BitMatrix.h */, - E53458C211987396000CB77F /* BitSource.cpp */, - E53458C311987396000CB77F /* BitSource.h */, - E53458C511987396000CB77F /* Counted.h */, - E53458C611987396000CB77F /* DecoderResult.cpp */, - E53458C711987396000CB77F /* DecoderResult.h */, - E53458C811987396000CB77F /* DetectorResult.cpp */, - E53458C911987396000CB77F /* DetectorResult.h */, - E53458CC11987396000CB77F /* GlobalHistogramBinarizer.cpp */, - E53458CD11987396000CB77F /* GlobalHistogramBinarizer.h */, - E53458CE11987396000CB77F /* GridSampler.cpp */, - E53458CF11987396000CB77F /* GridSampler.h */, - E53458D011987396000CB77F /* IllegalArgumentException.cpp */, - E53458D111987396000CB77F /* IllegalArgumentException.h */, - E53458D411987396000CB77F /* PerspectiveTransform.cpp */, - E53458D511987396000CB77F /* PerspectiveTransform.h */, - E53458D611987396000CB77F /* Point.h */, - E53458D711987396000CB77F /* reedsolomon */, - E53458E011987396000CB77F /* Str.cpp */, - E53458E111987396000CB77F /* Str.h */, - ); - path = common; - sourceTree = ""; - }; - E53458D711987396000CB77F /* reedsolomon */ = { - isa = PBXGroup; - children = ( - 3B248F7914EF3A660065F0DA /* GenericGF.cpp */, - 3B248F7A14EF3A660065F0DA /* GenericGF.h */, - 3B248F7B14EF3A660065F0DA /* GenericGFPoly.cpp */, - 3B248F7C14EF3A660065F0DA /* GenericGFPoly.h */, - E53458DC11987396000CB77F /* ReedSolomonDecoder.cpp */, - E53458DD11987396000CB77F /* ReedSolomonDecoder.h */, - E53458DE11987396000CB77F /* ReedSolomonException.cpp */, - E53458DF11987396000CB77F /* ReedSolomonException.h */, - ); - path = reedsolomon; - sourceTree = ""; - }; - E53458E211987396000CB77F /* datamatrix */ = { - isa = PBXGroup; - children = ( - E53458E311987396000CB77F /* DataMatrixReader.cpp */, - E53458E411987396000CB77F /* DataMatrixReader.h */, - E53458E511987396000CB77F /* decoder */, - E53458EE11987396000CB77F /* detector */, - E53458F511987396000CB77F /* Version.cpp */, - E53458F611987396000CB77F /* Version.h */, - ); - path = datamatrix; - sourceTree = ""; - }; - E53458E511987396000CB77F /* decoder */ = { - isa = PBXGroup; - children = ( - E53458E611987396000CB77F /* BitMatrixParser.cpp */, - E53458E711987396000CB77F /* BitMatrixParser.h */, - E53458E811987396000CB77F /* DataBlock.cpp */, - E53458E911987396000CB77F /* DataBlock.h */, - E53458EA11987396000CB77F /* DecodedBitStreamParser.cpp */, - E53458EB11987396000CB77F /* DecodedBitStreamParser.h */, - E53458EC11987396000CB77F /* Decoder.cpp */, - E53458ED11987396000CB77F /* Decoder.h */, - ); - path = decoder; - sourceTree = ""; - }; - E53458EE11987396000CB77F /* detector */ = { - isa = PBXGroup; - children = ( - E53458EF11987396000CB77F /* CornerPoint.cpp */, - E53458F011987396000CB77F /* CornerPoint.h */, - E53458F111987396000CB77F /* Detector.cpp */, - E53458F211987396000CB77F /* Detector.h */, - ); - path = detector; - sourceTree = ""; - }; - E53458FD11987396000CB77F /* oned */ = { - isa = PBXGroup; - children = ( - 3B6C805317090ED300D22AB2 /* CodaBarReader.cpp */, - 3B6C805417090ED300D22AB2 /* CodaBarReader.h */, - 3B6C805517090ED300D22AB2 /* Code93Reader.cpp */, - 3B6C805617090ED300D22AB2 /* Code93Reader.h */, - E53458FE11987396000CB77F /* Code128Reader.cpp */, - E53458FF11987396000CB77F /* Code128Reader.h */, - E534590011987396000CB77F /* Code39Reader.cpp */, - E534590111987396000CB77F /* Code39Reader.h */, - E534590211987396000CB77F /* EAN13Reader.cpp */, - E534590311987396000CB77F /* EAN13Reader.h */, - E534590411987396000CB77F /* EAN8Reader.cpp */, - E534590511987396000CB77F /* EAN8Reader.h */, - E534590611987396000CB77F /* ITFReader.cpp */, - E534590711987396000CB77F /* ITFReader.h */, - E534590811987396000CB77F /* MultiFormatOneDReader.cpp */, - E534590911987396000CB77F /* MultiFormatOneDReader.h */, - E534590A11987396000CB77F /* MultiFormatUPCEANReader.cpp */, - E534590B11987396000CB77F /* MultiFormatUPCEANReader.h */, - E534590C11987396000CB77F /* OneDReader.cpp */, - E534590D11987396000CB77F /* OneDReader.h */, - E534590E11987396000CB77F /* OneDResultPoint.cpp */, - E534590F11987396000CB77F /* OneDResultPoint.h */, - E534591011987396000CB77F /* UPCAReader.cpp */, - E534591111987396000CB77F /* UPCAReader.h */, - E534591211987396000CB77F /* UPCEANReader.cpp */, - E534591311987396000CB77F /* UPCEANReader.h */, - E534591411987396000CB77F /* UPCEReader.cpp */, - E534591511987396000CB77F /* UPCEReader.h */, - ); - path = oned; - sourceTree = ""; - }; - E534591611987396000CB77F /* qrcode */ = { - isa = PBXGroup; - children = ( - E534591711987396000CB77F /* decoder */, - E534592411987396000CB77F /* detector */, - E534593311987396000CB77F /* ErrorCorrectionLevel.cpp */, - E534593411987396000CB77F /* ErrorCorrectionLevel.h */, - E534593511987396000CB77F /* FormatInformation.cpp */, - E534593611987396000CB77F /* FormatInformation.h */, - E534593711987396000CB77F /* QRCodeReader.cpp */, - E534593811987396000CB77F /* QRCodeReader.h */, - E534593911987396000CB77F /* Version.cpp */, - E534593A11987396000CB77F /* Version.h */, - ); - path = qrcode; - sourceTree = ""; - }; - E534591711987396000CB77F /* decoder */ = { - isa = PBXGroup; - children = ( - E534591811987396000CB77F /* BitMatrixParser.cpp */, - E534591911987396000CB77F /* BitMatrixParser.h */, - E534591A11987396000CB77F /* DataBlock.cpp */, - E534591B11987396000CB77F /* DataBlock.h */, - E534591C11987396000CB77F /* DataMask.cpp */, - E534591D11987396000CB77F /* DataMask.h */, - E534591E11987396000CB77F /* DecodedBitStreamParser.cpp */, - E534591F11987396000CB77F /* DecodedBitStreamParser.h */, - E534592011987396000CB77F /* Decoder.cpp */, - E534592111987396000CB77F /* Decoder.h */, - E534592211987396000CB77F /* Mode.cpp */, - E534592311987396000CB77F /* Mode.h */, - ); - path = decoder; - sourceTree = ""; - }; - E534592411987396000CB77F /* detector */ = { - isa = PBXGroup; - children = ( - E534592511987396000CB77F /* AlignmentPattern.cpp */, - E534592611987396000CB77F /* AlignmentPattern.h */, - E534592711987396000CB77F /* AlignmentPatternFinder.cpp */, - E534592811987396000CB77F /* AlignmentPatternFinder.h */, - E534592911987396000CB77F /* Detector.cpp */, - E534592A11987396000CB77F /* Detector.h */, - E534592B11987396000CB77F /* FinderPattern.cpp */, - E534592C11987396000CB77F /* FinderPattern.h */, - E534592D11987396000CB77F /* FinderPatternFinder.cpp */, - E534592E11987396000CB77F /* FinderPatternFinder.h */, - E534592F11987396000CB77F /* FinderPatternInfo.cpp */, - E534593011987396000CB77F /* FinderPatternInfo.h */, - ); - path = detector; - sourceTree = ""; - }; - E53459D4119876A5000CB77F /* ResultParsers */ = { - isa = PBXGroup; - children = ( - 1FB4319D12901C76002D63E8 /* UniversalResultParser.h */, - 1FB4319E12901C76002D63E8 /* UniversalResultParser.m */, - 1DFA099E13CE5C0300599044 /* AddressBookAUResultParser.h */, - 1DFA099F13CE5C0300599044 /* AddressBookAUResultParser.m */, - 1D0CBDF713D0DD5D003D0F8D /* BizcardResultParser.h */, - 1D0CBDF813D0DD5D003D0F8D /* BizcardResultParser.m */, - 1F027FFB11A7BF06006B06DE /* BookmarkDoCoMoResultParser.h */, - 1F027FFC11A7BF06006B06DE /* BookmarkDoCoMoResultParser.m */, - 1D60411013E36BF8006F4B51 /* EmailAddressResultParser.h */, - 1D60411113E36BF8006F4B51 /* EmailAddressResultParser.m */, - 1F027FFF11A7BF06006B06DE /* EmailDoCoMoResultParser.h */, - 1F02800011A7BF06006B06DE /* EmailDoCoMoResultParser.m */, - 1F02800111A7BF06006B06DE /* GeoResultParser.h */, - 1F02800211A7BF06006B06DE /* GeoResultParser.m */, - 1D60411213E36BF8006F4B51 /* ISBNResultParser.h */, - 1D60411313E36BF8006F4B51 /* ISBNResultParser.m */, - 1F02800311A7BF06006B06DE /* MeCardParser.h */, - 1F02800411A7BF06006B06DE /* MeCardParser.m */, - 1F02800511A7BF06006B06DE /* PlainEmailResultParser.h */, - 1F02800611A7BF06006B06DE /* PlainEmailResultParser.m */, - 1DFA092813CE252300599044 /* ProductResultParser.h */, - 1DFA092913CE252300599044 /* ProductResultParser.mm */, - 1F02800711A7BF06006B06DE /* ResultParser.h */, - 1F02800811A7BF06006B06DE /* ResultParser.m */, - 1F02800911A7BF06006B06DE /* SMSResultParser.h */, - 1F02800A11A7BF06006B06DE /* SMSResultParser.m */, - 1F02800B11A7BF06006B06DE /* SMSTOResultParser.h */, - 1F02800C11A7BF06006B06DE /* SMSTOResultParser.m */, - 1D60411413E36BF8006F4B51 /* SMTPResultParser.h */, - 1D60411513E36BF8006F4B51 /* SMTPResultParser.m */, - 1F02800D11A7BF06006B06DE /* TelResultParser.h */, - 1F02800E11A7BF06006B06DE /* TelResultParser.m */, - 1F02800F11A7BF06006B06DE /* TextResultParser.h */, - 1F02801011A7BF06006B06DE /* TextResultParser.m */, - 1F02801111A7BF06006B06DE /* URLResultParser.h */, - 1F02801211A7BF06006B06DE /* URLResultParser.m */, - 1F02801311A7BF06006B06DE /* URLTOResultParser.h */, - 1F02801411A7BF06006B06DE /* URLTOResultParser.m */, - 1D4F11F913D89EFD0032F754 /* VCardResultParser.h */, - 1D4F11FA13D89EFD0032F754 /* VCardResultParser.m */, - ); - name = ResultParsers; - sourceTree = ""; - }; - E53459EF119876A5000CB77F /* ParsedResults */ = { - isa = PBXGroup; - children = ( - 1F027FDB11A7BEEB006B06DE /* BusinessCardParsedResult.h */, - 1F027FDC11A7BEEB006B06DE /* BusinessCardParsedResult.m */, - 1F027FDD11A7BEEB006B06DE /* EmailParsedResult.h */, - 1F027FDE11A7BEEB006B06DE /* EmailParsedResult.m */, - 1F027FDF11A7BEEB006B06DE /* GeoParsedResult.h */, - 1F027FE011A7BEEB006B06DE /* GeoParsedResult.m */, - 1D60412113E36C2D006F4B51 /* ISBNParsedResult.h */, - 1D60412213E36C2D006F4B51 /* ISBNParsedResult.m */, - 1F027FE111A7BEEB006B06DE /* ParsedResult.h */, - 1F027FE211A7BEEB006B06DE /* ParsedResult.m */, - 1DFA092213CE251600599044 /* ProductParsedResult.h */, - 1DFA092313CE251600599044 /* ProductParsedResult.m */, - 1F027FE311A7BEEB006B06DE /* SMSParsedResult.h */, - 1F027FE411A7BEEB006B06DE /* SMSParsedResult.m */, - 1F027FE511A7BEEB006B06DE /* TelParsedResult.h */, - 1F027FE611A7BEEB006B06DE /* TelParsedResult.m */, - 1F027FE711A7BEEB006B06DE /* TextParsedResult.h */, - 1F027FE811A7BEEB006B06DE /* TextParsedResult.m */, - 1F027FE911A7BEEB006B06DE /* URIParsedResult.h */, - 1F027FEA11A7BEEB006B06DE /* URIParsedResult.m */, - ); - name = ParsedResults; - sourceTree = ""; - }; - E5345A00119876A5000CB77F /* Actions */ = { - isa = PBXGroup; - children = ( - 1F027FBF11A7BED6006B06DE /* AddContactAction.h */, - 1F027FC011A7BED6006B06DE /* AddContactAction.m */, - 1F027FC111A7BED6006B06DE /* CallAction.h */, - 1F027FC211A7BED6006B06DE /* CallAction.m */, - 1F027FC311A7BED6006B06DE /* EmailAction.h */, - 1F027FC411A7BED6006B06DE /* EmailAction.m */, - 1F027FC511A7BED6006B06DE /* OpenUrlAction.h */, - 1F027FC611A7BED6006B06DE /* OpenUrlAction.m */, - 1F027FC711A7BED6006B06DE /* ResultAction.h */, - 1F027FC811A7BED6006B06DE /* ResultAction.m */, - 1F027FC911A7BED6006B06DE /* ShowMapAction.h */, - 1F027FCA11A7BED6006B06DE /* ShowMapAction.m */, - 1F027FCB11A7BED6006B06DE /* SMSAction.h */, - 1F027FCC11A7BED6006B06DE /* SMSAction.m */, - ); - name = Actions; - sourceTree = ""; - }; - E5345D2811999F53000CB77F /* Resources */ = { - isa = PBXGroup; - children = ( - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - AA747D9F0F9514B9006C5449 /* ZXingWidget_Prefix.pch in Headers */, - E534594411987396000CB77F /* BarcodeFormat.h in Headers */, - E534594611987396000CB77F /* Binarizer.h in Headers */, - E534594811987396000CB77F /* BinaryBitmap.h in Headers */, - E534594A11987396000CB77F /* Array.h in Headers */, - E534594C11987396000CB77F /* BitArray.h in Headers */, - E534594E11987396000CB77F /* BitMatrix.h in Headers */, - E534595011987396000CB77F /* BitSource.h in Headers */, - E534595211987396000CB77F /* Counted.h in Headers */, - E534595411987396000CB77F /* DecoderResult.h in Headers */, - E534595611987396000CB77F /* DetectorResult.h in Headers */, - E534595A11987396000CB77F /* GlobalHistogramBinarizer.h in Headers */, - E534595C11987396000CB77F /* GridSampler.h in Headers */, - E534595E11987396000CB77F /* IllegalArgumentException.h in Headers */, - E534596211987396000CB77F /* PerspectiveTransform.h in Headers */, - E534596311987396000CB77F /* Point.h in Headers */, - E534596911987396000CB77F /* ReedSolomonDecoder.h in Headers */, - E534596B11987396000CB77F /* ReedSolomonException.h in Headers */, - E534596D11987396000CB77F /* Str.h in Headers */, - E534596F11987396000CB77F /* DataMatrixReader.h in Headers */, - E534597111987396000CB77F /* BitMatrixParser.h in Headers */, - E534597311987396000CB77F /* DataBlock.h in Headers */, - E534597511987396000CB77F /* DecodedBitStreamParser.h in Headers */, - E534597711987396000CB77F /* Decoder.h in Headers */, - E534597911987396000CB77F /* CornerPoint.h in Headers */, - E534597B11987396000CB77F /* Detector.h in Headers */, - E534597F11987396000CB77F /* Version.h in Headers */, - E534598111987396000CB77F /* Exception.h in Headers */, - E534598311987396000CB77F /* LuminanceSource.h in Headers */, - E534598511987396000CB77F /* MultiFormatReader.h in Headers */, - E534598711987396000CB77F /* Code128Reader.h in Headers */, - E534598911987396000CB77F /* Code39Reader.h in Headers */, - E534598B11987396000CB77F /* EAN13Reader.h in Headers */, - E534598D11987396000CB77F /* EAN8Reader.h in Headers */, - E534598F11987396000CB77F /* ITFReader.h in Headers */, - E534599111987396000CB77F /* MultiFormatOneDReader.h in Headers */, - E534599311987396000CB77F /* MultiFormatUPCEANReader.h in Headers */, - E534599511987396000CB77F /* OneDReader.h in Headers */, - E534599711987396000CB77F /* OneDResultPoint.h in Headers */, - E534599911987396000CB77F /* UPCAReader.h in Headers */, - E534599B11987396000CB77F /* UPCEANReader.h in Headers */, - E534599D11987396000CB77F /* UPCEReader.h in Headers */, - E534599F11987396000CB77F /* BitMatrixParser.h in Headers */, - E53459A111987396000CB77F /* DataBlock.h in Headers */, - E53459A311987396000CB77F /* DataMask.h in Headers */, - E53459A511987396000CB77F /* DecodedBitStreamParser.h in Headers */, - E53459A711987396000CB77F /* Decoder.h in Headers */, - E53459A911987396000CB77F /* Mode.h in Headers */, - E53459AB11987396000CB77F /* AlignmentPattern.h in Headers */, - E53459AD11987396000CB77F /* AlignmentPatternFinder.h in Headers */, - E53459AF11987396000CB77F /* Detector.h in Headers */, - E53459B111987396000CB77F /* FinderPattern.h in Headers */, - E53459B311987396000CB77F /* FinderPatternFinder.h in Headers */, - E53459B511987396000CB77F /* FinderPatternInfo.h in Headers */, - E53459B911987396000CB77F /* ErrorCorrectionLevel.h in Headers */, - E53459BB11987396000CB77F /* FormatInformation.h in Headers */, - E53459BD11987396000CB77F /* QRCodeReader.h in Headers */, - E53459BF11987396000CB77F /* Version.h in Headers */, - E53459C111987396000CB77F /* Reader.h in Headers */, - E53459C311987396000CB77F /* ReaderException.h in Headers */, - E53459C511987396000CB77F /* Result.h in Headers */, - E53459C711987396000CB77F /* ResultPoint.h in Headers */, - 1F027FAB11A7BEAF006B06DE /* Decoder.h in Headers */, - 1F027FAD11A7BEAF006B06DE /* DecoderDelegate.h in Headers */, - 1F027FAE11A7BEAF006B06DE /* FormatReader.h in Headers */, - 1F027FB511A7BEAF006B06DE /* OverlayView.h in Headers */, - 1F027FBB11A7BEBF006B06DE /* TwoDDecoderResult.h in Headers */, - 1F027FBD11A7BEBF006B06DE /* ZXingWidgetController.h in Headers */, - 1F027FCD11A7BED6006B06DE /* AddContactAction.h in Headers */, - 1F027FCF11A7BED6006B06DE /* CallAction.h in Headers */, - 1F027FD111A7BED6006B06DE /* EmailAction.h in Headers */, - 1F027FD311A7BED6006B06DE /* OpenUrlAction.h in Headers */, - 1F027FD511A7BED6006B06DE /* ResultAction.h in Headers */, - 1F027FD711A7BED6006B06DE /* ShowMapAction.h in Headers */, - 1F027FD911A7BED6006B06DE /* SMSAction.h in Headers */, - 1F027FEB11A7BEEB006B06DE /* BusinessCardParsedResult.h in Headers */, - 1F027FED11A7BEEB006B06DE /* EmailParsedResult.h in Headers */, - 1F027FEF11A7BEEB006B06DE /* GeoParsedResult.h in Headers */, - 1F027FF111A7BEEB006B06DE /* ParsedResult.h in Headers */, - 1F027FF311A7BEEB006B06DE /* SMSParsedResult.h in Headers */, - 1F027FF511A7BEEB006B06DE /* TelParsedResult.h in Headers */, - 1F027FF711A7BEEB006B06DE /* TextParsedResult.h in Headers */, - 1F027FF911A7BEEB006B06DE /* URIParsedResult.h in Headers */, - 1F02801511A7BF06006B06DE /* BookmarkDoCoMoResultParser.h in Headers */, - 1F02801911A7BF06006B06DE /* EmailDoCoMoResultParser.h in Headers */, - 1F02801B11A7BF06006B06DE /* GeoResultParser.h in Headers */, - 1F02801D11A7BF06006B06DE /* MeCardParser.h in Headers */, - 1F02801F11A7BF06006B06DE /* PlainEmailResultParser.h in Headers */, - 1F02802111A7BF06006B06DE /* ResultParser.h in Headers */, - 1F02802311A7BF06006B06DE /* SMSResultParser.h in Headers */, - 1F02802511A7BF06006B06DE /* SMSTOResultParser.h in Headers */, - 1F02802711A7BF06006B06DE /* TelResultParser.h in Headers */, - 1F02802911A7BF06006B06DE /* TextResultParser.h in Headers */, - 1F02802B11A7BF06006B06DE /* URLResultParser.h in Headers */, - 1F02802D11A7BF06006B06DE /* URLTOResultParser.h in Headers */, - 1F3DB0C211C60DB4009C581B /* QRCodeReader.h in Headers */, - 1F3DB0FB11C61080009C581B /* DataMatrixReader.h in Headers */, - 1F3DB0FD11C61080009C581B /* MultiFormatOneDReader.h in Headers */, - 1F3DB0FF11C61080009C581B /* MultiFormatUPCEANReader.h in Headers */, - 3B81AAC6120F07E40022E5D4 /* DecodeHints.h in Headers */, - 3B81AACA120F080D0022E5D4 /* GreyscaleLuminanceSource.h in Headers */, - 3B81AACE120F08170022E5D4 /* HybridBinarizer.h in Headers */, - 3B81AAF9120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.h in Headers */, - 3B72D97012130EF6007CEF32 /* ResultPointCallback.h in Headers */, - 1FB4319F12901C76002D63E8 /* UniversalResultParser.h in Headers */, - 1DFA090C13CE1A3900599044 /* CBarcodeFormat.h in Headers */, - 1DFA092413CE251600599044 /* ProductParsedResult.h in Headers */, - 1DFA092A13CE252300599044 /* ProductResultParser.h in Headers */, - 1DFA09A013CE5C0300599044 /* AddressBookAUResultParser.h in Headers */, - 1D0CBDF913D0DD5D003D0F8D /* BizcardResultParser.h in Headers */, - 1D4F11FB13D89EFD0032F754 /* VCardResultParser.h in Headers */, - 1D603E6413E20AF1006F4B51 /* ArrayAndStringCategories.h in Headers */, - 1D60411613E36BF8006F4B51 /* EmailAddressResultParser.h in Headers */, - 1D60411813E36BF8006F4B51 /* ISBNResultParser.h in Headers */, - 1D60411A13E36BF8006F4B51 /* SMTPResultParser.h in Headers */, - 1D60412313E36C2D006F4B51 /* ISBNParsedResult.h in Headers */, - 3B27C5D9144735CE005157C4 /* FormatException.h in Headers */, - 3B27C5E2144735E6005157C4 /* CharacterSetECI.h in Headers */, - 3B27C5E6144735E6005157C4 /* StringUtils.h in Headers */, - 3B248F7E14EF3A660065F0DA /* GenericGF.h in Headers */, - 3B248F8014EF3A660065F0DA /* GenericGFPoly.h in Headers */, - 3B248F8F14EF3A980065F0DA /* AztecDetectorResult.h in Headers */, - 3B248F9114EF3A980065F0DA /* AztecReader.h in Headers */, - 3B248F9314EF3A980065F0DA /* Decoder.h in Headers */, - 3B248F9514EF3A980065F0DA /* Detector.h in Headers */, - 3B248F9814EF3AF80065F0DA /* AztecReader.h in Headers */, - 3B6C805817090ED300D22AB2 /* CodaBarReader.h in Headers */, - 3B6C805A17090ED300D22AB2 /* Code93Reader.h in Headers */, - 3B6C805E17090EFC00D22AB2 /* ChecksumException.h in Headers */, - 3B6AA66D1710C34600DF84C0 /* InvertedLuminanceSource.h in Headers */, - 3BAC39C117242C2300473974 /* BitMatrixParser.h in Headers */, - 3BAC39C317242C2300473974 /* DecodedBitStreamParser.h in Headers */, - 3BAC39C517242C2300473974 /* Decoder.h in Headers */, - 3BAC39C717242C2300473974 /* ErrorCorrection.h in Headers */, - 3BAC39C917242C2300473974 /* ModulusGF.h in Headers */, - 3BAC39CB17242C2300473974 /* ModulusPoly.h in Headers */, - 3BAC39CD17242C2300473974 /* Detector.h in Headers */, - 3BAC39CF17242C2300473974 /* LinesSampler.h in Headers */, - 3BAC39D117242C2300473974 /* PDF417Reader.h in Headers */, - 3BAC39E817242E5D00473974 /* BigInteger.hh in Headers */, - 3BAC39EA17242E5D00473974 /* BigIntegerAlgorithms.hh in Headers */, - 3BAC39EB17242E5D00473974 /* BigIntegerLibrary.hh in Headers */, - 3BAC39ED17242E5D00473974 /* BigIntegerUtils.hh in Headers */, - 3BAC39EF17242E5D00473974 /* BigUnsigned.hh in Headers */, - 3BAC39F117242E5D00473974 /* BigUnsignedInABase.hh in Headers */, - 3BAC39F317242E5D00473974 /* NumberlikeArray.hh in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1D60398C13DF7CAD006F4B51 /* ZXingTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D60399113DF7CDC006F4B51 /* Build configuration list for PBXNativeTarget "ZXingTests" */; - buildPhases = ( - 1D60398813DF7CAD006F4B51 /* Resources */, - 1D60398913DF7CAD006F4B51 /* Sources */, - 1D60398A13DF7CAD006F4B51 /* Frameworks */, - 1D60398B13DF7CAD006F4B51 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 1D603E4E13E1E010006F4B51 /* PBXTargetDependency */, - ); - name = ZXingTests; - productName = ZXingTests; - productReference = 1D60398D13DF7CAD006F4B51 /* ZXingTests.octest */; - productType = "com.apple.product-type.bundle"; - }; - D2AAC07D0554694100DB518D /* ZXingWidget */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ZXingWidget" */; - buildPhases = ( - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ZXingWidget; - productName = ZXingWidget; - productReference = D2AAC07E0554694100DB518D /* libZXingWidget.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0450; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ZXingWidget" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* ZXingWidget */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* ZXingWidget */, - 1D60398C13DF7CAD006F4B51 /* ZXingTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60398813DF7CAD006F4B51 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 1D60398B13DF7CAD006F4B51 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60398913DF7CAD006F4B51 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D603D7413E0B60D006F4B51 /* AddressBookAUResultParserTests.m in Sources */, - 1D603D7513E0B60D006F4B51 /* BizcardResultParserTests.m in Sources */, - 1D603D7613E0B60D006F4B51 /* BookmarkDoCoMoTests.m in Sources */, - 1D603D7713E0B60D006F4B51 /* EmailDoCoMoResultParserTests.m in Sources */, - 1D603D7813E0B60D006F4B51 /* MeCardParserTests.m in Sources */, - 1D603D7913E0B60D006F4B51 /* VCardResultParserTests.m in Sources */, - 1D60412A13E36C55006F4B51 /* ISBNResultParserTests.m in Sources */, - 1D60412B13E36C55006F4B51 /* SMTPResultParserTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - E534594311987396000CB77F /* BarcodeFormat.cpp in Sources */, - E534594511987396000CB77F /* Binarizer.cpp in Sources */, - E534594711987396000CB77F /* BinaryBitmap.cpp in Sources */, - E534594B11987396000CB77F /* BitArray.cpp in Sources */, - E534594D11987396000CB77F /* BitMatrix.cpp in Sources */, - E534594F11987396000CB77F /* BitSource.cpp in Sources */, - E534595311987396000CB77F /* DecoderResult.cpp in Sources */, - E534595511987396000CB77F /* DetectorResult.cpp in Sources */, - E534595911987396000CB77F /* GlobalHistogramBinarizer.cpp in Sources */, - E534595B11987396000CB77F /* GridSampler.cpp in Sources */, - E534595D11987396000CB77F /* IllegalArgumentException.cpp in Sources */, - E534596111987396000CB77F /* PerspectiveTransform.cpp in Sources */, - E534596811987396000CB77F /* ReedSolomonDecoder.cpp in Sources */, - E534596A11987396000CB77F /* ReedSolomonException.cpp in Sources */, - E534596C11987396000CB77F /* Str.cpp in Sources */, - E534596E11987396000CB77F /* DataMatrixReader.cpp in Sources */, - E534597011987396000CB77F /* BitMatrixParser.cpp in Sources */, - E534597211987396000CB77F /* DataBlock.cpp in Sources */, - E534597411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */, - E534597611987396000CB77F /* Decoder.cpp in Sources */, - E534597811987396000CB77F /* CornerPoint.cpp in Sources */, - E534597A11987396000CB77F /* Detector.cpp in Sources */, - E534597E11987396000CB77F /* Version.cpp in Sources */, - E534598011987396000CB77F /* Exception.cpp in Sources */, - E534598211987396000CB77F /* LuminanceSource.cpp in Sources */, - E534598411987396000CB77F /* MultiFormatReader.cpp in Sources */, - E534598611987396000CB77F /* Code128Reader.cpp in Sources */, - E534598811987396000CB77F /* Code39Reader.cpp in Sources */, - E534598A11987396000CB77F /* EAN13Reader.cpp in Sources */, - E534598C11987396000CB77F /* EAN8Reader.cpp in Sources */, - E534598E11987396000CB77F /* ITFReader.cpp in Sources */, - E534599011987396000CB77F /* MultiFormatOneDReader.cpp in Sources */, - E534599211987396000CB77F /* MultiFormatUPCEANReader.cpp in Sources */, - E534599411987396000CB77F /* OneDReader.cpp in Sources */, - E534599611987396000CB77F /* OneDResultPoint.cpp in Sources */, - E534599811987396000CB77F /* UPCAReader.cpp in Sources */, - E534599A11987396000CB77F /* UPCEANReader.cpp in Sources */, - E534599C11987396000CB77F /* UPCEReader.cpp in Sources */, - E534599E11987396000CB77F /* BitMatrixParser.cpp in Sources */, - E53459A011987396000CB77F /* DataBlock.cpp in Sources */, - E53459A211987396000CB77F /* DataMask.cpp in Sources */, - E53459A411987396000CB77F /* DecodedBitStreamParser.cpp in Sources */, - E53459A611987396000CB77F /* Decoder.cpp in Sources */, - E53459A811987396000CB77F /* Mode.cpp in Sources */, - E53459AA11987396000CB77F /* AlignmentPattern.cpp in Sources */, - E53459AC11987396000CB77F /* AlignmentPatternFinder.cpp in Sources */, - E53459AE11987396000CB77F /* Detector.cpp in Sources */, - E53459B011987396000CB77F /* FinderPattern.cpp in Sources */, - E53459B211987396000CB77F /* FinderPatternFinder.cpp in Sources */, - E53459B411987396000CB77F /* FinderPatternInfo.cpp in Sources */, - E53459B811987396000CB77F /* ErrorCorrectionLevel.cpp in Sources */, - E53459BA11987396000CB77F /* FormatInformation.cpp in Sources */, - E53459BC11987396000CB77F /* QRCodeReader.cpp in Sources */, - E53459BE11987396000CB77F /* Version.cpp in Sources */, - E53459C011987396000CB77F /* Reader.cpp in Sources */, - E53459C411987396000CB77F /* Result.cpp in Sources */, - E53459C611987396000CB77F /* ResultPoint.cpp in Sources */, - 1F027FAC11A7BEAF006B06DE /* Decoder.mm in Sources */, - 1F027FAF11A7BEAF006B06DE /* FormatReader.mm in Sources */, - 1F027FB211A7BEAF006B06DE /* MultiFormatReader.mm in Sources */, - 1F027FB611A7BEAF006B06DE /* OverlayView.m in Sources */, - 1F027FBC11A7BEBF006B06DE /* TwoDDecoderResult.m in Sources */, - 1F027FBE11A7BEBF006B06DE /* ZXingWidgetController.m in Sources */, - 1F027FCE11A7BED6006B06DE /* AddContactAction.m in Sources */, - 1F027FD011A7BED6006B06DE /* CallAction.m in Sources */, - 1F027FD211A7BED6006B06DE /* EmailAction.m in Sources */, - 1F027FD411A7BED6006B06DE /* OpenUrlAction.m in Sources */, - 1F027FD611A7BED6006B06DE /* ResultAction.m in Sources */, - 1F027FD811A7BED6006B06DE /* ShowMapAction.m in Sources */, - 1F027FDA11A7BED6006B06DE /* SMSAction.m in Sources */, - 1F027FEC11A7BEEB006B06DE /* BusinessCardParsedResult.m in Sources */, - 1F027FEE11A7BEEB006B06DE /* EmailParsedResult.m in Sources */, - 1F027FF011A7BEEB006B06DE /* GeoParsedResult.m in Sources */, - 1F027FF211A7BEEB006B06DE /* ParsedResult.m in Sources */, - 1F027FF411A7BEEB006B06DE /* SMSParsedResult.m in Sources */, - 1F027FF611A7BEEB006B06DE /* TelParsedResult.m in Sources */, - 1F027FF811A7BEEB006B06DE /* TextParsedResult.m in Sources */, - 1F027FFA11A7BEEB006B06DE /* URIParsedResult.m in Sources */, - 1F02801611A7BF06006B06DE /* BookmarkDoCoMoResultParser.m in Sources */, - 1F02801A11A7BF06006B06DE /* EmailDoCoMoResultParser.m in Sources */, - 1F02801C11A7BF06006B06DE /* GeoResultParser.m in Sources */, - 1F02801E11A7BF06006B06DE /* MeCardParser.m in Sources */, - 1F02802011A7BF06006B06DE /* PlainEmailResultParser.m in Sources */, - 1F02802211A7BF06006B06DE /* ResultParser.m in Sources */, - 1F02802411A7BF06006B06DE /* SMSResultParser.m in Sources */, - 1F02802611A7BF06006B06DE /* SMSTOResultParser.m in Sources */, - 1F02802811A7BF06006B06DE /* TelResultParser.m in Sources */, - 1F02802A11A7BF06006B06DE /* TextResultParser.m in Sources */, - 1F02802C11A7BF06006B06DE /* URLResultParser.m in Sources */, - 1F02802E11A7BF06006B06DE /* URLTOResultParser.m in Sources */, - 1F3DB0C311C60DB4009C581B /* QRCodeReader.mm in Sources */, - 1F3DB0FC11C61080009C581B /* DataMatrixReader.mm in Sources */, - 1F3DB0FE11C61080009C581B /* MultiFormatOneDReader.mm in Sources */, - 1F3DB10011C61080009C581B /* MultiFormatUPCEANReader.mm in Sources */, - 3B81AAC5120F07E40022E5D4 /* DecodeHints.cpp in Sources */, - 3B81AAC9120F080D0022E5D4 /* GreyscaleLuminanceSource.cpp in Sources */, - 3B81AACD120F08170022E5D4 /* HybridBinarizer.cpp in Sources */, - 3B81AAF8120F0A7E0022E5D4 /* GreyscaleRotatedLuminanceSource.cpp in Sources */, - 3B72D96F12130EF6007CEF32 /* ResultPointCallback.cpp in Sources */, - 1FB431A012901C76002D63E8 /* UniversalResultParser.m in Sources */, - 1DFA090D13CE1A3900599044 /* CBarcodeFormat.mm in Sources */, - 1DFA092513CE251600599044 /* ProductParsedResult.m in Sources */, - 1DFA092B13CE252300599044 /* ProductResultParser.mm in Sources */, - 1DFA09A113CE5C0300599044 /* AddressBookAUResultParser.m in Sources */, - 1D0CBDFA13D0DD5D003D0F8D /* BizcardResultParser.m in Sources */, - 1D4F11FC13D89EFD0032F754 /* VCardResultParser.m in Sources */, - 1D603E6513E20AF1006F4B51 /* ArrayAndStringCategories.m in Sources */, - 1D60411713E36BF8006F4B51 /* EmailAddressResultParser.m in Sources */, - 1D60411913E36BF8006F4B51 /* ISBNResultParser.m in Sources */, - 1D60411B13E36BF8006F4B51 /* SMTPResultParser.m in Sources */, - 1D60412413E36C2D006F4B51 /* ISBNParsedResult.m in Sources */, - 3B27C5D8144735CE005157C4 /* FormatException.cpp in Sources */, - 3B27C5E1144735E6005157C4 /* CharacterSetECI.cpp in Sources */, - 3B27C5E5144735E6005157C4 /* StringUtils.cpp in Sources */, - 3B117EF1145B220A0035037B /* MonochromeRectangleDetector.cpp in Sources */, - 3B117EF2145B220A0035037B /* WhiteRectangleDetector.cpp in Sources */, - 3B248F7D14EF3A660065F0DA /* GenericGF.cpp in Sources */, - 3B248F7F14EF3A660065F0DA /* GenericGFPoly.cpp in Sources */, - 3B248F8E14EF3A980065F0DA /* AztecDetectorResult.cpp in Sources */, - 3B248F9014EF3A980065F0DA /* AztecReader.cpp in Sources */, - 3B248F9214EF3A980065F0DA /* Decoder.cpp in Sources */, - 3B248F9414EF3A980065F0DA /* Detector.cpp in Sources */, - 3B248F9914EF3AF80065F0DA /* AztecReader.mm in Sources */, - 3B6C805717090ED300D22AB2 /* CodaBarReader.cpp in Sources */, - 3B6C805917090ED300D22AB2 /* Code93Reader.cpp in Sources */, - 3B6C805D17090EFC00D22AB2 /* ChecksumException.cpp in Sources */, - 3B6AA66C1710C34600DF84C0 /* InvertedLuminanceSource.cpp in Sources */, - 3BAC39C017242C2300473974 /* BitMatrixParser.cpp in Sources */, - 3BAC39C217242C2300473974 /* DecodedBitStreamParser.cpp in Sources */, - 3BAC39C417242C2300473974 /* Decoder.cpp in Sources */, - 3BAC39C617242C2300473974 /* ErrorCorrection.cpp in Sources */, - 3BAC39C817242C2300473974 /* ModulusGF.cpp in Sources */, - 3BAC39CA17242C2300473974 /* ModulusPoly.cpp in Sources */, - 3BAC39CC17242C2300473974 /* Detector.cpp in Sources */, - 3BAC39CE17242C2300473974 /* LinesSampler.cpp in Sources */, - 3BAC39D017242C2300473974 /* PDF417Reader.cpp in Sources */, - 3BAC39E717242E5D00473974 /* BigInteger.cc in Sources */, - 3BAC39E917242E5D00473974 /* BigIntegerAlgorithms.cc in Sources */, - 3BAC39EC17242E5D00473974 /* BigIntegerUtils.cc in Sources */, - 3BAC39EE17242E5D00473974 /* BigUnsigned.cc in Sources */, - 3BAC39F017242E5D00473974 /* BigUnsignedInABase.cc in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 1D603E4E13E1E010006F4B51 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = D2AAC07D0554694100DB518D /* ZXingWidget */; - targetProxy = 1D603E4D13E1E010006F4B51 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1D60398E13DF7CAD006F4B51 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - INFOPLIST_FILE = "ZXingTests-Info.plist"; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - SenTestingKit, - "-framework", - UIKit, - ); - PRODUCT_NAME = ZXingTests; - WRAPPER_EXTENSION = octest; - }; - name = Debug; - }; - 1D60398F13DF7CAD006F4B51 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - ); - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - INFOPLIST_FILE = "ZXingTests-Info.plist"; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - SenTestingKit, - "-framework", - UIKit, - ); - PRODUCT_NAME = ZXingTests; - WRAPPER_EXTENSION = octest; - ZERO_LINK = NO; - }; - name = Release; - }; - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; - EXPORTED_SYMBOLS_FILE = exportList; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ZXingWidget_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - HEADER_SEARCH_PATHS = ../../cpp/core/src; - INSTALL_PATH = /usr/local/lib; - LD_GENERATE_MAP_FILE = YES; - LD_OPENMP_FLAGS = "-fopenmp"; - MACH_O_TYPE = staticlib; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "-ObjC", - "-M", - ); - PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; - PRODUCT_NAME = ZXingWidget; - SEPARATE_STRIP = NO; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ZXingWidget_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - HEADER_SEARCH_PATHS = ../../cpp/core/src; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = ZXingWidget; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ../../cpp/core/src; - "HEADER_SEARCH_PATHS[arch=*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - VALID_ARCHS = "armv7 armv7s"; - WARNING_CFLAGS = ( - "-Wall", - "-Wextra", - "-Werror", - "-Wno-unused-parameter", - ); - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - armv7, - armv7s, - ); - GCC_C_LANGUAGE_STANDARD = c99; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = ""; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ../../cpp/core/src; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - VALID_ARCHS = "armv7 armv7s"; - WARNING_CFLAGS = ( - "-Wall", - "-Wextra", - "-Werror", - "-Wno-unused-parameter", - ); - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D60399113DF7CDC006F4B51 /* Build configuration list for PBXNativeTarget "ZXingTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D60398E13DF7CAD006F4B51 /* Debug */, - 1D60398F13DF7CAD006F4B51 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ZXingWidget" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ZXingWidget" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/iphone/ZXingWidget/ZXingWidget_Prefix.pch b/iphone/ZXingWidget/ZXingWidget_Prefix.pch deleted file mode 100644 index bfb739423..000000000 --- a/iphone/ZXingWidget/ZXingWidget_Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project. -// - -#ifdef __OBJC__ - #import -#endif diff --git a/iphone/ZXingWidget/beep-beep.caf b/iphone/ZXingWidget/beep-beep.caf deleted file mode 100644 index 8c693f888f727be5290521c2bb63d10b7d602b46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518418 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%0Ds z%O->|Cq>2349p1fE8h_;7QWo`tkdN&u?5|`O7V|of%Jjwkl?@8U;N?LnWAeQq|W<_ zhX$9PilL=L+dv&22>d=|H)XHyTh2zRPxKdNZpg&(U8e0{l86$kq0aUjc#%sutWe5R;8+4zz zCn}3}Z_1f)>~ug3cqSzFRkAQ@c3c%}7CS58myZXU2bd;o_0vT>A+nRw)vSGLS!m00lDTN$6j-WHJ|T?iOMb_+P$siCQ_~n3fu92c zND@pk65s&`Y`2FGE>~9=UQ2Gu6iq;J_}^R24OI)daQCou2d{n4^5T~7g zx-|4G>-*gHMA=gRRFd`QDHm8|uC4!G`giDOPMy4R7k?@r(|%hC(a#;{segL0L2vzU z;+BWS2C3sEtf$isN32SD6xozCH*EQYQ;cUJ8vhW&6>l+czuTy_-^NwE(Eb$pcfM#q zifPqn1(DTaK}G#F@pqwEHbwqgAKpi{FLPbz7LL3F*Z6CR^FurWlftgh(!%f35o{@i zLTUBm5itJJ-If!p1N8g=^gR^KSi?Uy4TQ-wDEApe>SaepQ<1>n_Ii;D_X?0G9k0^ ztEgWTG2T(^(s=i6@4xEy-X#&e8TLLnlC(4ID&_5j7C79*dg2teb} z=vKfhkL>=yf$v@Cv{v4dw(iRN{M3>~^*euDsu7eJ>Y0`KJVW!(R*~GIoo-ud{{(jN zfRe;$B{PcL7kfVB^<;Wj+mv4s6DO5&)Y01+yJ>bm37&w=_L%2Bzu#v2qiEL-i4ri~^&=ccwH#lxm5Nn=%cb5glm<5>BlCVWjjzh1~}2|H z-FG3CKf871xIe~m(~8~&PSc(6-cabCfThIeq45;w*fCa9LS@*^_&QEr%vI)6rX{e< z=M8oji(lTKE112moanP0vgDO)IOH@f*30 z))k!`)kCwr|Gq27r4B7X%%qZiZ$^@6yA!U4eok5u5jMFg?8C%o%!<$}K`6hw*kZ3% zFn!o{_>IQbm>{0kHLEU1R9z0?t^Kp1=}=h-Z(6N~$gSm%Or+Xss2N3H_rg_rTR)zeBo@`1Vag5kuS3P6=hOh?q{=kq46GCoGN(=om$;LT1F@_Zu zdN+6q`8MGxJjrYQ2yg7T?!I}gq+ULyu1L%-YvuX;+SzdWH={vY708G47Pp?2ZBYC7 zmRhsiGhDx5(-0r1g}%EZI;p0(@9f}27fwZdB0DegD6N=w&hPZNp9FiHEkAFKvHwtn z>yEUj~ORREJuF3^A&Z zkcm3h?O1%seU6DTJJ`u56%9i8xXN9P7KL?4c1LrkxxBsdZ;)_$shK;uw7RLODyX@> z>4JpUK~M;Ksx4=oL5^?8e&~^)8N>x)dGsl690F7^L*uhJOfM z3yB#%J-R}xHm#AK=$1E>if>eoHv5(bH*KsK;9jo(uO(G{qw}bGt$x9Pd~g}~w8sO& zHB=p~%zs^Y2aOktXYHAQXCIBc5Q1TJ2j2Jfz$bd?A(KXSj3Eu)=DTh63MBWY6jn2l zFRg6l8mqrFvzih`L(%!Gi_=rtj@_$tnlNu02k6IQU1 zoDEd}KoaR0!VH5uA)VTd%HIFAy;J;ZS}kQ&7B}ztv%Qf~n$q~Ds=K+D7bMlm!c_lR zGWxw-kGo`}Meygr|B&QiI!eyOtE}w_dqZV$vFt^W8FUPd;`akrfc)k07_im4YhbG4 zl^)*GAoHuIh~8DLYgSYaH&3Z$3n%m6wyo$|pc=BU`nJ1BoHJ2rFjim+krP@R92a9` zf+oIW-=08V6@*Wv-KC`XWniBmn*mz^G5sj}HTl1~EJ0t#lbW}}t>xdid&-!NW0e)W zf13it+%~)%Y*=Ozj8l`R;4(-q`2xNvR2Yn(kj8v9X$_}n(wi`3YzOlr`)N?I|9w0U z77U3U=^F#-lg-)ELHUcu1Cq+B8T^d0yWFW2&v=jOibPNmxbu(dsQ#tBe{eeJi3gA% zLT#ka@@tC7p$<*-XNAVav*$;DXJ}c2K}`Q*`~W-<^8dbWyNwXbuQr_$z&+NQRsB}5 zqWl$iuyS*Aa@|LfSBrW4ESqhT%RK97qKB1l_<rupZ8j!Z!ZyEj`QteR<0NS7fGZce*yzpHov$mzBslt`_uC%<#TKSxh zYOqTFNUzCH>*t$~js}foz!(sW|5f~2_S8T_EGHyml6UBxgu&3Mu`-4(G$nAle=QCQ z>jdk^Y2`Wk64QfLqx@CVTIq?Z{Q}>zLEevw5BytoK4NZ*tgB2FVZ3Hf9ohi8<6$C{ zqGWXV_rv@DQCj&B=ow(TC61L6SQ6E-57>8Jf7qps85#2;YwPP!SoH|{g* zOt_6Aq+l4E{ACD@32Lo^6dYu%1MkXh3?g-*LimWED^dh_*Wo{88rW zFSdM=h1GS5BP(6`r1Hr;bM*>g9M`S&Z#zv{Z?yJacYJpOBJ#YX0UHVBp*w@RVjGwn z5?*ok#cvDkk6sia3Ar4oBYEIB;7i~S17RZ`N~O`K<&q3s`%E~c>|Mk4KRLC_%iHSa z*0pgjNv2CzX}RiE!&2J~XuAj8-wV^pjt(+RAaSxLy^OgxsdnO$i4n1TLiJ%=$y+Hd z@Q2u}(FVXA{h|J6tyjkRI<|0i<vU64CfqnbrohhZ}BzG!7?% z9u}^c$iaMQCw=mvB}jFzD`zf!s3{LXwEF}tz;L+C+I<=ZK$YyxjM3GuW)Tu zZgpH)T*;#{Q&DnF%}=_ZtZY#Jp6h27cXb0nwng~2o?QA3|B}eD@SgZtQ`{#F&BVtY zN^6bSHp7*gFiDN+VGp?QMb)YFb>@K6Md<7!eE>!Q{j>HIr}4uv(ceHGLKP#GY=3aPR#eR1{XV+ zUa1zJzN1Qlv{c$%VG=C-;>P>^_FQxH>j@&vyOz#V-+i^B8lml4SFY>dkqxkC*nbGm zI9-8mDaq9O?B5K|@-!N6c}d`j`Nbr7Dhn|hh6SW!whV_3mYWmX=c;~{-;+`E6|IM! zzL)%bu)Fo$qtVWaoH5nI9~~y0z-4fYdB`;bw#Ey?e2EgKaEP=;qkg69lF3sxiu|vy zo#AsKTaJB{$b%mX!T=At2Rp7SbL{v3t~GD_AkYpx9#FR2IxatbYkqgv<9o_EA1bt` zYGQi+s;^qrzneh>Gn%Ri>==t5V zNqgH}So3u3T0Yc%@%|~xi7RgUU6+aKtXrFv?_RG`GJo6D$(>R9Q_ghr!hqwp;mO@& z&lg>CS8kf<^>(KNb#6NkAHL=b>C&7apWPAV#1|-U+^N1WWEB4k1W>rpZTE|-!{6@w z?9IFBs!zYCQ=)S!WJSNGb{>%~l*J6D%JI168g7)c$&pq$@M_slmp|(cK+@M?QO2eB zNONY|{DtA~1D!EW0VDQOzgN-?1nQrC-rT%QVEdEBW1AoF`?H=L(M`&`(|w{ea(vGJ zRvI@jDm{ZycYq^+a^=jkM#_>W0~6O4y5_BY1pB_^H32d+i_8rhq2{2^(x2GlX)clv zfs#LN#Jjl``0FPmx1xuk_61LIdieXBUH>a9l3Z%*6`mR*3NK+R#M{EZc3zqR(Kal! zSvRh{?(%HKRhVzK62Em?Z~%yTk|IMusk(kTWu3Uozq)ib4*p@SSN|)5bLR_B8}jWD z!_>kEc}>Imjzel{+XvU!_C(*Du6;34nzJ)i7Vv_1!w;5T0|YLD!$N11u}Kr@q~+vR z-wZ&yZ?B+sUoBOjvnc18v-(m#HSAiI+OF;__ zQSqDli0S5Ff<>zB`lE?%?*la{uP_$2nNkHqh-?=rV&;w{ZPOi)u2?9q?=fbV(K zQJ+^n{TE)}H$)b2RN>DbQG`wy&`tg9R5fp!N6(_IuyYGvqi4=(!6hfY#2e^^xQ%dcRDu-;o6$NO z=v={dCZi_WEURnmefh*U*rc3x(pB|IQa%PE#d@vAL)_z z8rO+lB<(ps60gH?>DMCrK*3RS_1h2nz3=X;V?PHeUzTyzcyWMMYgU^=!FJp9KCE?F@lkQ{M$%<-T*8{0n7&^>Lng zP3{lvulKK%^S?tC#Of7_Yi)nk4c1iS5$M~#Jj$x!MHA1tzMgRuT%GY2@nGH#%!gUO za9iDqEgvwQDMISWklRuBBsv9C*dP_R?`lq}Hn*?I&g z^9F{Wah9N%&LXA9q6udLK4MAWEr=7A3~;36rHiGqV95AQ*N4piW@NoLYc7AepqgHm ztWFlHwVlRkJvRUwt;_w~M$#f5xN?(kd)}IR5b+}mig`Gfg+Dy44^N9=VERaW?^0JS zBwcsg{V;#+81WCwhW~WHbTBthN64F{3j4B7`A_*(HB_9aTVy_94h7?F{Q+-BjWL7n zKd1i>Qaf*z_kk=UW_XSoS2XnqR>Ap(UV*;~U*-e@*;SWa6Pu0?A1lu7hknR2cE9b^ zT*!T^%>4>gzOUS*-qZ@#*Y-R0`axX>B$Ojg@8eDaKh4U9J+_U-VGf z_d9*R-XAo6d-p)+_aRr^Sq#=BHon*Yqr#gS9A9mo_-UiZIA7fkO??S*o%__gZvI2; zjI1w&eX}MKx+nJHqJt@@*^p2uy*CALSaQ!1Q}NtR{bDoi&HbYtdN)yduV9tDu;jTi zn&+osYx0ceTnPQ`#HAy^uv$0L)EAJrIrqG`WU;WHGr|ZTQuKtBs4m<>e-P5)vE3`H zhX{Dr^3CB~?r-b+(q?}8{;nSM{+D{;*EBV}0;KszoNAb6M)sZo9UF8Z3!HYxK!B@K zuR~ih&Z2U&X5hZhxq&}0brS9{M~Lw=fIWfRZc&-*#jp^7Flu%4(cbr+pAig zt5$se8lh;dWT~%9cNyV*seRdy-XVK%n(O~2t^*5a`g@0FF2F@*M-r#a2`Al6@*xI< zdSf1ApCkOnR)Tt!`<(x493BcN3G2Q3agkn?cTlbVFi&~8Xpgd~)<^5x$u~Y2i0#uN zCJmpW<++@Rj{)_}+yJl7u%naax!{s#-pBFd6ELx~5bt#OA;=ATvir0S-q^C5eRfu% z#+;geO}{GlhFV;}P~9&^X|^}6)VC_>mh`bL1G}+O$04@O!+T0U^wyjSs9D(?ah+LM z;>=kb!r{0%SPdl*N%y)8ncY|7PHRmXomYjj&iFdqb2smfrsCa2g}s2Nm|Ehe+`$di z;?>7Y-p+2;vjp@gij(Iam}G^((ucfnWe#G`X8eOcoSKM#9eokI#9!up4CoFK_k45L zi7;bHqayV_r3)L-j;+3N>cI}{iUb^bY#05Z<#N4(42f~91q6XWJwB7IJJNzjEJ#a_V0 zB2;5m@JVI4Yjo43VNOYG-<*%`#?U;ZhLrzFxuq~qX|LI#3F-7Te71k@n}xs)xzS!Y zUynZp%A7@l-I-U3>dExLrOv9vT}(*8Sm|)27lP*HYCjFQ)KTkT)}ZWX3jHj=_l0`u zyW8r34?q?DXQ&$7@Ibdwan77N7HIp6%^%AObqDNCTI_Xa&K*=jb|-#S)+gefS@((M zai8#6l!GXi*L|;{z8b)~*7Q+F6~wmmn_rJ2uSE0m-Fqdw;H3Ov$w@^H_o(K#+TMe4 zp4ZuIE^>Zm88;SK0KomW1+>=_YqhsYP z+xagF)4}&~x<~KB)XTqoR2?p-Y3fA>4IfO~dlv!4gB9c(&Ym&8z^kd{FvGlf^z7^e zeDK_xgyLy$@sRL1^c`XnJkVJQ%-2kHp3HR&ZYeQa))k!4hrNqeW#wLwAN;aF0k23@ zJ(uj)&*%m8{?D^xP#&~!+&cX*c>Rp0h&`DQ?EkU}#0PVpkPaukB~A@}gZ+y;jJW53 zf(un{E@Mq+hW3=C^HE{P?NtuUG3L6fUM;qg!kR7@Y&kz6xla(hj{gXDRyCd@lkaOG^5f1}914_u?N? zsi-pO6=+1i*xl3y9doU!vi5#^(}T)u*X(}xNpYhfM($j!RWvm9Y7VQTdiTiaeMp!%fbZOz22mNZ>@@!9MqI@$LgofslIm?w+Ek(dFe?))ik~ z^>pVcwRiJgs3v`usL*Be)nhGZ4HJ4c^_BsFgLVFu&Ud2EfWD?agrA%jiP@HYl5jC& z8u4iIO2Uc=8m5l49e&@{74$@V%=tqzVG#H0spa%XqAvg4QRRl*3_0S9Yqz=ll=8HA zrA}qGSvG<14kiTxob|EGK{eA4AePNzVvDl!h%@KRB8iiViN823?7w&q#IU0StXI3c z^b1?kH?l9<5<$?se1~L+#0Z7vb5%88ocRk9be;jG5QQ zzxf2i8jnxLEDeE_(1OjOHzE&vyL#OiC;+&1wvJt@b+L69I!s6NVLF$0Cskhgxr&WH zd{lsXf9pjWT7=z+18|l5}ZvNeALpcpY^B&4JyA zlC3KD8;PJ{vY0!5l%du{E+Y{ z;uq!&sRusd`V{2QO?H0VTrl|ScZ$XI@s+OVU6~4#`%Iqvh0rZ7U#jdBXX!4P-dHqe6U7{v07K`bL{Juz}lD9My0AV!bJ=RQ8p+tn!yyiSdCspFm;s{ggJ zx9H=j;YMDm`tJw4l2BNrRMyZnH#=S!Gwp!>Rq*A*x2U78F>wmd$eAAym*+jlloRP!eHk8)DMh+JN>Nnvej*0NQ?o)U+_`VjYRv^sQ&`?@LrLRx13 zLB7t6#G2-s2}!9GLS(cGV__w8&v?hky3`BW$-W`v;QF+%h*JsrQirVBEv8hKK~-( z+%|%4>#Ce3{3(NNzdI~XJ{t7YT#$;DTO!AOZjtXU_g6YZCf!xDujLBp?;tE-sXsr*j8o?AR$rgrI`H-jmmby7i1kHEl-?ZH*%qf_j z3>5xR>VJ4p%nZzRaRIV1e>sFX%o3{fy?LWzLoEXu~9$l#s zumu?`bWau$Up$9NJd%6~OW`4Ws zX5k*y^uOn|)DEEWmhD#GX;}U+f_l|ubzC{<`^7#p6c(&1V>t$#eHULl&xtrC#X$Hk>KdlSkAlboID_9CUb$QrScdXT zBl^NWGYsI|PwL3rZpH4;+}0U~880bk7#W0nzo5zCxsfhTIFxu|(php+uk>1+RV(d3!y zwe9WidjiKjng7Dp4NIxnE<%Ba4Ii@jV89pGj5`Q4(3+75d z0zwJ;58`Itmys2JGVSf7FGp<#F|%zB4-zw=&t-bajp` zsk?0Zr>NhwHvg%n^W6lc$NL=l-NL(y#2T(9Qbscx2b24Mct07XGuF6IpA-jCq^(9} zWVzv&WC2K|v@DV)K|z>He~5mCcmVr2u*HMl+3AqgE*Y3uWHkTt;fn5M-f>mkN2a2_ zSgrDIbZ8GLANH&q%doD(MvvsPgs!^DFwe7Tg@~u~_F}x}KET;i&*Exg{$RETlzATq zS3_1?xbE+z31c-?$@Yxz8D?`nS6}n~soM7WhuZ0nM8o7)>xsH6=Dn`dY@diHMz@D~ zyL%+9^iFZPD-I5(TW!*a6*N!9uyFbK4 z^#t|l{p$x;N8E56ner3hKhxWDV3q{lmQs&e5tod<$5?Gwyv0@=v1D}Z3-lZ zGbY0?O)WrOi}k?Rsf)3vkR-Hnbc1)7CIPxsmg;8R zf8?9Jrts>3o)z<)EyXUw^NU)nYf5^|bE_?ed!lfiP6yLsQzKf z7H8E~#*>`_-Pzu`+5&f_?i8-s zm`s0Z8H>JaZ=UpL?Aer)?gf)Lp4zAxh&1X;bRZ@S!*wxWM5g;Fe)}W%^G3d>PsL`p zq~G|FlHZ@K)m6@>?YyTOzO~7Od0^!I?UZIT>XC4V)eNJ zgz_8shH4X0qZwoTXXHh_>pv4$INTY(%JomoC(oIz_lV_w2QWU+W8+mg2p_B?VJ}M) zkoOyodi`6u6mX?%*Vw0uR$FJi*c>O>JN}x}8g=mSQI(UIP*vtzr**KHrW-N;vu%to z8aoo-3FwMh0bR~CqxyW`;ETNulTgEpNjtO#LYQu0l@KEecw+G>eyns|SY8rk6ekt%f z>5l!V&kU867$$y!>1{;A*Ho7Q6RO@i%4!AnApRHAR+&b7(`-;~av{kJk?D$tfHxXA zTVkw_@w4ujxNx*0HWP3uYz_2ta49+lQ%+#I%Se^|>7<7W0D;l62o0%6dlgq*abH&z zGLl$Z*0(?~Utiz#TlvcJqN~P5Bm0JY+~o*ZtYWjn4Cbhh*1*_RV>hFtf#K{{cvIjE z+$>bN&s(=d|Ji-d{ck9i`*eu5;l_Od;i{T0kIGu)sJ-c*{@;>ihIG|qWsYrq*Cl|W zvmA3*HW;*9Nn`W$2P2336w%K|*F^vT9~nPjSA0KU^stLWiv#6b)zj|#xl>QP#~;D4 z>qepL{${!}Yed71+zGu`rDeMFnjXcQK@XV>bhguuU)CK+`K{t|UiZ+VPupk3%ySx! zhyYs{ACY~&D1seo@&}Jq1|;{~B&W$DeBKKrSW*KKI98kIZs8#l8wz6Lc574||Gq9!T_W9S90|rA3fQtvu2+-T)d_ALV(ww$4e_xYD+v zWsPBbmrg-8&+pjg=xLn+OK3gpliBG*yQJLBf%NQ)I5rp%4s*jX;n2~58MuGZbiY4< zDM1hHL`s+@Cn&n@q+dG!BX(6|f!CbI)h_#+U)U!}^#++rt2kx#=}2~iw_?28TUYxD zI|}HH$~aDP&+PDofxDsiT))!Fp(}lQuq)w9eXlzo2{87i1a>MGlk3EG(n4-M3SDmk zPi%PXU^PGLk7@1EJ=7fNzHT$OM*-Hfve2lu5b|%?hmc&&+^~BVc?5D4&WQ!yq)Ct% zA3kX=d_f@AIi2#TcO4a{Fa-8UzWSs$`=RDGegP#nog7^xuv!K?7OBtc?svuy^hljN zK8uRb=OupRTOBOMI;AOehB=&r8E#`v@i-7P%lkGyfH>^AC*bW!3*|x2JBq!lHSmE* z>yyTNfWkFJgCM-aqc6pty{X+q%|sJh_I$Lc^(thxL`ML(IR!85BC}Go8^VtE^@foh zk<3hRO<)oFAoi6{ALw)tYKTj*8rD$|of5LKWh!AK*B3seajlz-M;a&<)fpMx^W+Ci zJ6iRlUqq)NQ(D^b$0WCck~(c6gW8>;*ZNZN6aDht--f4o$@jC}jlVgOgL;+(FqgX6dza4x9~j&o)a}ws zms)`#1htKp*ghcuA*{qb=1Czn&2yZ>M9zK7J0sNhb@w__>~hf!_XmRY-aWz$-~UO9 zD7LO5W}M+VD|O%_1LJ-pFdAXT)sp5wyo1(_9ivB@1q_hl4t2TICv?~*@d5)|WLRG@I{?z2$(W(Ev2)Bt?3z&wV+7O`NI+-eKzOGEtlLO2@6 z&jF^koET1OpV4zmjgxQf+tSK*Y8Tp}5WzJ2nW}I0`6hA%}dP z5yLA0PC4ITksL_ zBx1QB4%RN1?y_Et?|;!*rJ1PP-2TS)r^U<7yLla4-TV*H+EN(wxkJWq*5-sPw4JA^ z-C_a`A;7q5(ly9n@L5MWqqO%4bDye}foewuo^LrufbqXU$$}3~0tvsbz5AS6V*J|S zJX9yT37jLigi;A_`1ML9G?F}%`MBo=Ywz$k1_~$+;G_58-ufp%{HUU_JIpA{F6M3J z|7iDG8_9IxRm{m|3Fx9=$%vCg-1DgWME8F^u96+YVE#N{2rmd#!2h2gOR|`f-)&}C zO&KASky`33aG^g6TZ8@@unx4IF>T}`dzXpJj#GSOgtSEm#I$_Ff`oK%tmw_iw)Q7I zeQHnn|9V@bF^+43ZIEltBHUIXnrvxZLHnef5c1K&U_2kY8f=32`CPz-djBtAihCnH zabP!-qvwWXb&)8G#eAPj0hjSk97m@u+#yAm7*)C_*Vb z{9WR47iLt~&0T-4fyzSg8&FIhSo~Hh3WVXK;Y;4&KDCN5# z7YST_*!iAEGNc_^Bm2m}ZGMbE~K`mclZ(b}Ehtdc$;d#XB~(a_EdOch1o zW(($dt`_baO_au%!n*(MZa1C~iw2vU*?_vHD(^ww5}$ApC&(e|p-(r`=%0qElnbC& zeh)Bu^tXWJU|)uKbZcmm#Uu2aDkenQelAcX2IAx`(>iI z;7dI>@?K;5_=W!8q-5%0`7g#Jvm1jlDh$r|Jm`~)i$zibng9iK)8I?iN#g>hvU@94 zEM@p*3+E$$3BUmVmimF@_H>;}RnnQ#d#6Rk{ft)f4)hzB+2M3zXah_s0#BR(SoPL^>Z~KIrda zf7MQ6mUUKA9*Q-j0^tMr&XyRLd(t)io4Xn697ADS?*Lbr;albS^IV1~?t z5w3q8vUYG9&FqmA@Dh#0v;5nl*c52!Orf##C3Ke|a>@f z#AeFd?zar4X*#`mln{K;GtL)^+kku%=z6muEIwoBwlF#%N}+5$KrjkBMW{m{PEg|&aOZVRS?JRkzYTTAR|$qq{GFwke}zA=;og|yoq z=zz;82mUd63UnGH#knxF&N@3RNc)-fL&l;kle{G!Xj$mh(4uk#wazsk>#mi18G+&z zgHGH5_vD6$h``2C;v&KM07?50b*rwJHfPX1c&9|prj3j^5TVmWK%*UX9yzEMz771ps}uwS>|=B5_!Jmg=GKeo928lf}4zf-t6HQB!*CYx;^N5 zJ;&(_M{Wln@$~cc!OcOc0@ng@Av=dRg{GLuY@^~VV@6vbc|(f zy_;%9N3CV6Fnd(iqyukmypAsCJ@-qO#08Hi=yV^;8`>|Y7eO~*(@6uQkKX;%8jqmR zprPvU^QPFa%gXVL*FGm;v)G2ViH1B@ORER|=?c~*>)7oI>ncIJ^SP#jUg?clIPYdB z{}+-c6s+PsEu(ierP4`9J_<|4&m=8^-ld#%*~7}TP2*s6rRP&FHre(6j*$P z@uO>-)`0Fc6r#Pj3g4SzMsTnkNV{p~($XE@gQB1>e4I%8kQnM^k9DE5hv!8=O;5s| zmAjd*+qHoUB*~Zu;z(eKbaas3<*s|G19hZZLj--!$fi^;m&U2s3f^u12@){HMUh5Z zX!%QNaoR-gf#LBrBnZrp@{em0>$+`>6Q$q9zTPFJ!#;CGA7G`T4yPNfHI_SavRr6TiI)r<;NEllRxg9cHe4Yr;R6E5 zZ7V4MX}HvJMKm}JaNW-pHG~Nwzx4ED3^_bF_xcjUJv95-_c}|d-ck(7SM&zDMr?Jw zZy&W#m4os&^C8LRkrT~ZfUlZ%qo}-CpWgADHr^W1gvJWG-v~DN4EVcm!FW&Q7N`R) zVp2zuod3*2oJFe8kU#AmfnnlRSU}4*pjy0a$hG~gezA()@y&u2^p3(C%RsXm*r<dzJxI;=xE#7~czXn6+#YX}@(U}i-4rO1#ABC; zhI^ zvhvA);;G7e(VsK+<*A)ULVeYr2+Jfo&oGw#)CP zNzhkKA@~*iF0#DsA~jmGg+9qvN4@A?7eGLz;!DYiFpm(Ri!F?7Q%9in*Ep1JZhIj?U6_s)|O6jKasV)?*!ZnxXE`tee^;RzwFnM>BTS|~Z1J5;qD5j+zR zcTSm&r~zi#eV?w9{H*(8+V zLSCDPrU{DN$9?QWY1tmMQMQS8z(}Q)3||gD0lw#3kK2q63Ic<;%nzgghQTbm!yqa- z^J~Y}K#N#~?G?F!xZ;;Xm)qs~5!K>Ox>+r-jkGp4gNXHgsA*0A_$r`>#DPV=Q4+aiMR$w2CeSo9V6N4SHbNW@< zSsl0fV}w|z=}oI3=!O=IfyeZ#7Uu>(l0Ts(TGmnHohAhAg(?WSq-F3`lu@_iY|6m8 zu(<|VXkPaS{dcR#A1o?CqD3)o*Q8gi-^R7FJG$$w-8K+^kqfKwAvC1%5l+Vkk`r1F zQR>zAX*z2SmFm_M07mBFYyI!QycjQCqr<3nVgyuQ&DqzzpMI;g!1swb5P=gfb_r@AmjEBFSvWZpn559pTI;14r5e8P`3zaev5`zWt8OR3`!Xz)&epWjQ=1562-jX!Se!FV;vMx^-FVo$ys4RV zN7x=X*jY#&G90E|8lDh*2u$_m;eyd8gE-(=X4z<8*t%X)SgCp&E48CF=(l78&MKM$ zz9+68-rfN*l&Io5&ztLn8%Amxhk;e~MJQ0yLZ5$Il7qr!a%yqUZR)qtM}acPAJRB- zjZCKO@Tg}0H{1{|F*Cy_DYdMyj)_SCq9!;s%+{I4z1 ze}~u=`9yTaohUtPHOL0kQr(u;0qb2p+WAxC2Cv_Z6x_n*RR2z?gmOt$OuO3OMn$?s z1OUBF_|Ja*ut|*dt{XY+_ULej0l_Kienqcpt@9&_mmmtoi(D?Z4)v{-W0YGBIg+OX zF1%fCtcInq&ke8e^5!38X{(rWO%qHt+5QB7b65B^q1Iu^ zPLuwt(j8F~v|9Ys(cC`S0#tO%x0zhTkB6FgvjJ_5?%oTUE|O*lw+5c?44{@9 z$h4zF<-top6~03_68dit3cQag9NQMw(0euWkQCt$iuQU=lAuNcI}k>e ziY7yttAsTpXPSV(f9qw)&ZbE|Q9}9uadef@aU9LIdln_Fc*QI&3Rf~?j4@Np%n&m( zvtwp<%*+@wv*i^oiJ4i;JKe9|cXIT{(P?+ry>;tW&3Ibkl7CtLuvRQT=&(i+(U=hb zz!}~nWjvuv{A!0&(y{u1Nin4@=`6q%Uc+qW=%>o)ugN57FnZz zWUmW1>Bfm$YOnLA8upv|7KqA2D_dq|8^@));yu4xyADgf>c^%whMzJ_mj#uEE5&APz=(=-Uve>4o!n~3@ z)$24xvHrwD*ysKzK?I+z~+nAJQ{-WeBUP5(LP+CS> zRHxi$@)K1D6s>JB(h*J@!rcAd`@D_PI^T>nk=u!e#wSTV%Om1@<(-ly>k9&!v>#jy z`UuC;Tmjsu&?bLb{l3h6M_+Xt;gVmK-Y3+Y5a-MvQP%wN@^v-$dNE%t&K}CyO$F$7O zjX0^>Exx3^!>cmfFs0_#m5;9EWGjtr(i5;MnRRtf-sGoAJrUkT|3z9^a$nKEsYLdR z;~Y`qW=ww3x4$k)sI3)bieG-uv@xGUVrLlaOP)~HTxDmE^$w&u!j^(qg~*T@Y}Q)cr|3?iw%I=#Iu%bUdQ$tBZk@Ft#mWy%zUleT@3%qAG7d(G zatF!(s^Ti5t$OKPC#NtUzk$BaQ7>J%v7bpn;;$y3qdcFTWVexsr!dwz3idOXtp7K>7nm-#JB?GZ-xd!-pAy%oMqLu9|1 zhmlU6mjle9x$gIrN4Y%J5_5i1RrP%pThtOXGd`?dx5w*+ZW8Bu*8AqUg;z?aRQnj_ zn+KhnwL#Cn2WQ%HRlwrE8Sa_Ww>Qd zOl!@FOg`=QJ^8-%~#md`k}WVt*G0Z_XSRbu#akd{FgQ`Cj`sNq-k^$gTi?u|gUt zBymq2rAd;8u1Q@>EpaDulO^x;FZ|&P?9RRP`F26xxa#R;AM*w`j?U~)dZ<;-vg9s4 zktzP6W3(eBHwz=>pX&_rnWR3di)(F=IVjgFK`!H;j@R1GC7q~KBpxgAh~?z$j69=v z^Z5lmugGxET#)~&qD#fe>@Uq1(s!fnzeS><$%%f_R2=q5S0!Csd_rz-d?R~-^CB4! zb6~g7Iqo$|H*Q~5H_L=1a}6&M7j23DnY}A~neKvjv~D(ca@KRBb78;I&s84{a2ZXS zoY5v*O(7cOAFNKGG;EDlZ;db4OQXbxY;(S|!i-c=WqX;LY^Mk<)W}$%-oq z1gn!Y7{tq4gF=Z}>O42ObF=z?9>!Azne4lh_M_@L!LDSk*T>)b;8mHeqn73kkoT!RD1T|+C7I-WJ><1N5wDg|r=+-j zY{#VT4abrOm-)s$&Sj+``b>Y5w%&P{KFdBauTAx~vK4uo8zVC}u+?g@Q*v^GxJhje zb=5S1XD^hi>ki2$l66s2TptGa54z|zM^?=@#@E_8NtfzoB;GEW9y=xHYh;ez&o@LT z5*##~u(ZfuUU95qMvk<(SNav?|2tkJOzz_QHsy8L6x}1~#NwXv?8XGyN4zPry~nA* z@gb~73q=X{w#v_PAW2{IXJX5u7txK`d&BSQ?t7or4d-6TT4@|r7**D~YI#O?DOdXPbSH-HL z3cf*~)+w~B*6eX!C&k;c!y4BV4KH3(Bi4IZ9;SBV{z{(UF&AbMZ_}?uZq06%x2w3K z*l!sxa}#V1kMNE1n-KXz)GyWpbxM5D+&$@IMO;E;es}paLsC$-cC71H-6--TyS(mP z@sUFJ+IsCs+v^mDUzIHOItBT&BBLqlS6-mPzj}b;oSiG(=sYCM)&H{3KFNM(Ropzn zONwYHO-d@0##Q8=lXlhB2SjR0osGJ!_KP{^sy~-{m-Vgq^nfyx*{YssH1m{?2B+v{CB%LX;oc%qNZd>?A9FjD8A0ccZX)T zAVv4YvO4#CrCZtNoH332(^H7$_av7-$`_}cc~1)AR6Dt%w$_q=aqvn!NYgPT94UBMla zzq{^9KH{H}<{R?HANGJkg_XbQg|Y_09ZuQd-qYRan7# zWe-E=&;^<#4|tM-4f;oo*YjT&->gj54>UbUP2l{MJkjFrhLO9nB(>+ z+*AEdd)ktd(vSB#d8{Y-{XO`2Muy~bZlUs@s<+X{ZO7!rPU?tBex-hTiL0nG32^RhiY{Jr!(8SEYgf~49r?k^QK6hf4TOSW~RM$icrW;elHfL1c%Pj zG)k)r#z*sOA4G3vcgu{T>0!FS-agIJ=T41rSJ>FZSM^^K+n1b-4a+W%YNegwTb(&e zxKlgddND^?)w;x(`@Erh<_Pw;dbjh;-z|LOQ&)y%>AuPSEy|4cX;`j2fuz#jZsj2l zgL`;)k<|+P;z!u#C2p-vQ27^Ki{6-ZH#|p^B96&S;Wg+koBeX@D%{JL^A%rI#$!)^OQ!&QR+YUE|nfExZLnW7thkP!Or_q?)r+-C1D%%sj_~>e#&k2_Y`LGQSwt%AL0@4 z*z1X87(X@Uku4^HQyUfEsVGe;&&ml;)V33^()8uO*K;kaz{fo)|C#Ye#Mmr@e01p{rMl^<;ygA*9d-X5G$44E$9dT@?!eee^Q(m2)uOoX1vdE; z!~M`$%@@y)nwgyE`X=Mid|P?T%9q(z)80%Ej#tWC_k@%;fkByVA`j&JEzd14Q+_h- zk-y|7M>>1G4VVy0-TqMgh0Ei+8~;hLRj_gG^S86u`)K+^<>d`hT&|j{JZDwPJ_}BTZ}%DDCkeN?Tvuk%9`SXJ zSqWFlp2W7w{UJG|yBDxglO!6g-NM#qPpf-Te50sU-AujMz9DUaP@KZ?Hl)IrwX|xf zvf!ptQX8n8;OHr}Ie!kd`1|>UMa^~E5_8y5pYXK)X~OFgd(5Dm<&kMRU%!!>!A{3? z?d{y0q8e%G<@`?#r?o9uN9tVXdFs9OH`x`jxxJ ze$ORRzOE+FRWnm`QoEV(vuD@oi;oqW>!NfI?8DQ3mEkD_3=F08b3hCST+{jrv;hkXC^QyjbZlfoE)u?Y3$| z?fHaV#qFYJXU~Wjrrql!)+`gq^sOyB^F~x2hJU&8tchgaLH$yeiSDYe`{ks2h9?`I zz_YIc<>{tG#dQ2B>XJvxpbf!hk5qX-?yvY@%b%(X)f?ig3lAuAvO+@ZwIZ(xnwMM` z17jSUUkG!kQ-F_u29G(R{^<5ieJfyd1}`!+d%OH-xu5cHW3BuW_d#T^*Vll#fX_jt z2h$7i(Wwe5SI76uFP4uqLU{*T5_m5-Eh+KDm|RnRlU|TBBfu@ z>C976hjLFU`c%GGZnIR#vIXABVD2o3!JH$ zEXvZZA(OMm*V&3E7V&CXT`J58YXsZWZM`R^ibG~=`I2Y(8H)0n)5>A?pVB(#d13AS zqkXnT?RCnDX<#?0W;b+GjVqlV>yy(Q^*}epuU50jxsz^;eSglon(n1j^Ysl=v|jA) z6r+<}-O6W0>ch|m-6rYRBEC{qXHvW)^Ch2MT|;^X_VRX@_7)6^ZMG$=meqbucvn0x z`egRZhusyF)Wg6Exg498`fl3mK> zjdsOqd_L-qdv4IN;B?Ojd1oGuV=b#y->ZKngcsgd3bWdWjnvA#9%)Wd!`xUs$FBk@e{Hgf~Z~p}0*IBKbVheYcysf@v$hGWEmvZaW3p{a3|DZLQ zqobzej#CV(Jf_@X*(EC!B!(M&+W0+;kc!4d_eS0cmzo}`wv?}ki^*Fky`WbFuG7qS zjnQr)r?VsLLyDC}-D}_L^tNZIC4!FXj^6Gm86nP^Pm+`QXA~JVQOfT2`7%G}n6Tk~ zpM7pbO>k}nkB(leIyY=mEh~Kz`$w*GRJv}J{}9bK=l!}Edvea9np>sv0`K}-Z9JQl z8t8OWE%p(oZVvsZ8z#M3cv|UQcS%t}k|Z^v>mh3cy}j2Ma9dYs^~rOq@-O$wt%bYPN@;S+dXY#y-fw)GHhhnvzwAj#59Pte zABrQmXH=^DgP?}s51zB+?z{ozS zR2h{0&iFE;ALFjR?>0bvI-q^}*NFGo9Ql&62g)7BN%A*be&l+uNdd;t9CxnbKc*@H znU<^aDvRQm77UaBG>i@zrTOhKQ|p7xhKiy57DjA*o5^>^{UI|AL1tDZI^z~cML4ltaaV2 z{fnrxZ1wA)k6vFpQP*T!mgX(ss1v+ir#uR-)I5=_%^$9~UtOr2Xzwa(>GUgXwckI! z+^9az^JA{F&8nUa2G!}(?AX6@l@ht`l>cqbOlP%D>}Zp-v8JJT+s&*+WPK|Y% zt#SW!>gu>zv(M{Pe zBR#dZeM&S#1SXx%IwJRLRlBmByo4rIrj4#jS>aNmUgXy@?N<0-26x$iCEs%eq%XHkT5Mb^f!2ih3#wva!p{;H{Ue*f|V6{Xom z(%v&0W3Uzb5@+#Dgred|KHYUJ^GT@3gc*KP)IxGt%{@Hi@># z($%LFT`js-E7cFObxiBVzo~BJbuL96tkE2ojLMfPepG)~uCp0sgPjhBCHu|w?HOrx zz8$lf3{-V%AgaZsj@YTWV{)4h(O)5T0k^%il25|O*t_=As#$d_6N-w>G5qWokzDOf zUr)^l;r~y_hUOlsT2OX1Z)oGEOf!v5IqY&tJ;t{rZC&^udLp}BoUYv3C{cVy8In%! z@xcRw+j`c>3_M+&+S)_)yJlI!f}$kl)~qdIX06J5i)K1cp#&EN#xjsZpncU@)DZ1oq9VxV`rQ&s| zLqhv#o1~KqeH66TsB~i2Nc*_d!k5@4h!v7M!ilj9?U|}Eby^j#Bre7?yF9YLw$yi? z<}cwm-2v;@+#OZ#%4X&L-FRHnme^Bnxb#r};d?!8b2vwzESp%oN4c!Qp?Hs$N!q%V z1aAor^@@@m<_E?-w?0x;)qF@;T(m;@D=RmAf_9|$JIz+!LH!AnF^^X8E2id*Xs*q; zg}bT0x^7o5@;{nBHR8{#$#Q9FopMw2Ub&GI60!MaFK7m@4LvCE`wuw zlXR6w<89T|vJI${Bj7} z&|qzvR9>K0@@lopI5tT-&*eqvtbmc?gOZiPcd;`aBUPL0TdA0mB{3ayIz=AWQs4cW zVZv*=6E<<~fU2^xh`eWw!!;Ah-jp-WHR|EM6VfJ!ozriW#THLh4sW=iIE#EGqum|^ zKMMNfHAps{zas9vjjQ@uD@xc}WKhy<-|*?$&0?ouheF|2D|Q*f?~S2Zc?oY^`3KIb6xyeHH-fju(rMV`-@B>z|uqg-rG zl#l2AirDRK@c$Ox$Muc!9G;%g*BGG6u6Q2zK7WAhfZh;Pqj})ATiXeVvi@y2Q`EY6 zK+OvMBkO{+mAqeSrRSrR^}$XWkElm^(-eKH%9Xurp0e@62jOnM*L~HIlU*jo1W<2P zcw?68Y}v=y&$(7frQRuEsphClo{qRc z-3D7?uC!WG#?Py1Aexz^Q_4H%7wSR2?rE`MEA_Kv5zzB?Xy~GNN{b|`-3A1I4Vvk7 zSk{?;Gj5G7MD?V$N5bu*=4g-X!0-p!!{P;+!~AIdNb`=o4;2q8aL&W#@fpoXox%~Z z>aPB7>ERJf7Dtu^J=L(LDup|}ueS!J z&Ey?~{5hC1J}5KuUDSiTHi}tQ`;?=s*JbC0E5j%G4)fzi%3U7D_|cInrje>HmziU& zd0Z*hnF3yDc8gkRKe4N_uhmJ5s|qL9ZPSI>&!ip`%GC<*@2R4Yd)j&M>e*aHUaedy zah#XlaES{&>;F)kD^WVNj8!?V0X~OSZAx@8n{uW^7V0AXpDKWvu1h16X1QQ5vBK=F&7lWcbL4t501^ZF^1^E2Ys+ZL&6 zYPW)C_mA$KJv>6By)Hhf+0UP^pJ4u#cdFuZ`R|ec97m|vV%gY=~qUD|ryWObBh&lIe2cVyc3ae_ChDE(m?Xhx-`)l#w1TInhmYiHd3Jt|~2$kCWvoq$BkSfo(OX zM7y-F+3M^Yb;paJ!@r0hs2goxlKNPXqQ>4^Q_LYd;oYSV1zg3CngV5Y@U^&q z^zQ7r5iPX$#I>3`{8IgBi#YF}%Bb?6xm}w1nJrL{6kpK>bw9tQX{q4@43}gBN`5O| zH+7Zo!ffOxkMV(TLgGDU%lB|^#dor7QT?oGo8VP+MWM?+9$KwS^XjkL%E`<6V(e8o zv+Q-%+3Y0K=?uioQNMFdRzLPD&gdAHmHk?xFP|veYw9og#jOfE<<0Xu5q83Li!z4! zBf-UFRuxq5i4QEwlSkxegP$5Q+}CAE5u01m_)p29l8D;VhMv~=G&MIt-O}wtN}``F zb7yFA?u97NO0y);8Wiza@FIA&&o}X=i097FqW?vK31!Bks{7U4IM?Da(nWcSz&6>X zqFXuTB%z?G?nC+g!jgt#x~KMQsU>_yJ=XnOYFmGN(j9)!3>QLh@zJnr_4#2-$jRVwB9-q=|E+E$@*|(8{LisJHos|GY(&)+ zdFPUIp~;2V`$2&(|68Hex}j`awW+pqp{HrPfk)3~&Jmu=*yHh0`_6A#?y;b}@{u8# z&3!@wusGnh>uK*gf3s*_L=h)V{@7-X7B^l~tgYG~)wXm*U|G>@4^fc^C% zHB*H>(FFL&?nZx;3lOG5{uUR!b`^BeRLWz|u^Ey~+@n@X2B zdzRX1pNf>`XSKJh1{s}-UOGnQe&jS{r?~j$5YLu{qkKM9jPW1Q*w6o|W1}xzh2&M> zG0(N5|6%^@(8bgv?(N5Ew)?W=pg2bu;i2&`xeWA=;rnUernKR_W>Nw83vWr(4i%$JdbAri;O=8bm9;Gr3fm?Z?ZW;PoX}1g%PHMeWPa zc!bvc?X{;#=iS>r!mArc;(plqkjpAhK7X`N33}-N!|oKY%9!Vu*6^?uN!S8Z~XnYmV{d?Ve&o4%smx2{|6mvVe`MP*G zb3M{{-eN+Z`His6@jGC=<#W2h;Q6o)z7$s5op+`-gIug{FsC)oYWQj?tMO*-m2RAb z3XagD(o>|W32<-Okn53YF88P*2i&*t`iO41tP$SuIKinEw(p(BE;m>6WR%ENKk4 zPp>^eY4t_!-s%~`2Q_w)pdrz%oAHHvE4#|=3v#$3{=d#HE_e8e?w4_zR~$RSJJ1^G z)!Vqo{d;4nOL4}DJgsr3J-xZnbloz!afD-OT`%;x<|&uf{1kqw+vW18@vZA& zv%;;dW0>n6{Kn-n-za?GvXyIebD-azA&!4NpIJV5JTe||Q#K8D9@?0|JJdK7&1w42 z-p|z1bjEt9F^yeU-wq$E6YzG{%@CRz`nc?C-s&1+`RclXJtw-voOQk^7%jNtGKDK} zn~dB&d>xSNtmYW!Z1Vt@0(%RWRJzjn7U!jK zuiz5zrgJ*eTSUoAH?Dn%>sQMVQCAb+>0I-9et2_7CaAfRwVF=aT&HG4y`p ze;nV&75vss%Z1;K$DDUrZnz9}Om_)Flbi~<-36ZnAGvkTd+}}2Ofu9}W><>tSZ2Gp znkEVt8C&wanjN^G@dvxy{ExN3#x?0#Uh@sqqiGXoVbd~x-{$?ogQmyM?$+zhmsy4L zA1Fsy&YjDDFF3?;I6I+omm};Ck=UklS!Amf}vxIP+PU88(7TjBWSHUXID5sNXs&f{*&?Ubi*j;GcD>lgbb^WUVOF#{(Vm7IFx3jQ$D3!&VS?$qAC z-)R-OCDdcBU>Y}r*IO`|dFIra);RZKW1VN%ZaeL>ToD+|{dh}FubE?J4&7}DavZT% zS!*3V%sNtI+K6wMxZF;rh5Y&E7ecP}i!k3YQD~x_h3%OL{uAzR?s0*L@ey97e>*L9 z{BoLXTP0j>xz7J!Udvr+hC!%#1?5;SIfmF)S}l&>mS{S~?29d?RPGe>ME*3(GeN5D zKjB_BUbul42yQUD`BB^^t~tIKRy2aSw}x+^~*w zw6jOsg4x-Y9W>i~f$3#l$=zV_=l8MB7p%9B7CN&J1UeMQuVIezCUQSheG z?`SFbK*k9cp|kwuObWMz`++Is|A8(G637I>Dn}QA*tVSSY>np5v#etlTQ;J;)&vr0 zTjL0F^sucaldXTDQ*&L?cuGoF5)yP^_)hlI z{7-C0ejyF!Pr^c8KPH9qf;$SQ@Yd5${7CjYzn$I2dtuwey>H#k>12(@TdXta16w<` z#=g%nob7A(q<`2t;yda{%*-`NFBki2IAi@Y=Dnc}jae_g~vH&J7!%nPkmIrM8}QvOSS) zaO`y4B`xj$A&y;%zuQHezwMK_FC3w~Gi-YvA;)+c#N#ROLM~$7GAlX1&^zvWin-s} z;oPhCVlG%njuK8-Z&RQ{wzD+RzLza<6gpm!HTF`JV4sH#_EDVi_WRuZjs?7-?0ViA z@`*PU1#oZSshlm$LB@%*9nIjzlK0#NYIAnQ8bMrxkMJydY~h<*XCu zxn09av@^^&+eJLY_8PUa52nG6A;g`%#ww}8u?szMbY$8%x^uQWE^*hh!+36_GcTU@ z=l(`hI0VmO^vqbifa60eIRB7&ocpXBXQkcD)Z4o;(KZuKw1=Ts`wJTDctH}0Gdq#4 zbEF}Y;~!?6<1nmQ$sNmX=cbc!Ts zM&qtb47Q`+%pN+6$suk`l_QUNVYf3q?Mv}#`w*nIpQR0sK{S{hM#ht4>?_*94#0o1 z!OUhhfwP6(!c`Gh?n?5GJA&@xq@hVnGgjbVSc^6?V`&0&ldWT3JF=O*4sRyZehF{4 zA492j6Y_LCrNh}*!2htTnEUKMoYSm<8&8ICr;vJX0=>#Pg@!W^F@tyE zv#2ZMLL5vV_8T+Y@qv*$g!qH~I&N*hg$_D=XqiJxyRfiO0zQru*iM?5B=#qunazkC?eRT(IgYhk(Fw;qYGLE( zc%mX{bOITT4iX-I#uhU#*(T0flE|qb$2o-haURj@9Cy@?k)ls<^I12VfzOj`Si>H} zMUFT4gCh>(RDbtIe9O#kAX zqbZCL^<@O;BdWoP^fTT{F5n03S^U_Mf)6=*;eoJTv79+>|t2*7(6H%CdYFw2k=-ihX* z<>)&dhs9(N?!wN%LmV%0SI2nl;TVj*I8MTS#qr3SrSvgn=rH6*1vrePFy7=Ioc#f3 z6iMgop>CYHbOK|iPnkZ*15ZSY&`6}FgRn0dhP$)t@kmD*?&CO#LmVeiwxbN~W;db) zGK8kmo^&PZL!)tTQpU*O-uQI#jMI($;!Gx1P7Lk9+@X7L6D`6{s5NpyyQl}!5eeqA z6LFv;6NfpDVXor_N@Ka`7<(E0NjA`Cx`f_9i|Ir>hej~n2xW>$Gp8qIIAf`t6AAmg zKriEBT8~)N4)M@dSo0f+Lrv^bEOIo%xnCipBNcsR}|)8%*w{eV^=Aw7)-llSNhOOb(Hgt=@O4rJZ2H~S|tvTx8=@;Ah$J;Ys1%TOgf zi67Iyn32?vc}41(Qo!pMsbl6)XPiR2VG-SlT2l=jhh$_sTEM2F`|J=@#JVGv^~5}O z1TwK1=qK5X4g-q@z^Vv)(q}k>E@9?F{F12;Q%$+dPwLG4O%?bDFp>u`Z$ZmpO%>UL zRk?73_C8#Mg*EkSk~hosT-8uCx|=(6jh69l-oWeVOa9&sRjp93VxE zoO1Cl+6sN6o2ZRuP`Hwl%t6aoHTuB*jcja39KsI4O7;>CCb7su3ejtN2Q5S!Q3&o& ze_#t;#Vn&Onb)w#Z=?#=EMo$Q1@MVP_vmzLpiihP5|W{482bX9g7fMiZz$Uvi(pMI zNkF-z7+t0h(0EwW1^1*caV=fQ%%HK%HNfWvDQ4!80u0wh;t{kZIzd;{Wcrf|P!t)3 zR{d|E%MoG6z(e{?xHDUbW5^=>U41ULqOPOcZD+djs8IC!<<+7?!fzaa*<)$C7Q>opweVBtYBH4-|{n(R4;k zH!`bf8|FN*FuO<^^9NDmccc<~(;zgIPNnFoc=S&={Z(=XafvgU1~<#UWjBD1?7?l=RNRmB!W~H|_M#`zPxKdBfQ85tU!ivy zAIQxy#Lmnm@8R5+u>sZ{2zPQ{qXJq_C(-uw2RViki5EHoXE%b*cVQpkIjkM8Cadra z8iEt(ca)FTq7^t6@$oBqj)|h}V1L=nXmXkf1tot%)`6y8L`z8l{XjcWS9*smK!L0o zZG?T6vqx}y_9>oDobfVp0MDeYaS|l!(Q zJ;_Hj1NQlZ&Vs6yN+3sA7BGJX=e~*iu$g!XiN~wRLp+ua$6<&AHR}!0KxP1W!^DxTIFHPMQ!N4Yy^g|&oi3-7$ZwiXx}iR7 z3GnC%=+R3&fi>doWE|d2D)3ag8wa3P=mp9_eehzM3OYWKi6+fV2Xc||BTMloG8y+I z%g}Z59C4^0ok(|rZer2{t!C>`1N#*ZXEpdJ@yAce7JQfb0UKZ81T-1F2Ojmn2k2L9 zr2Uu#VqjX5Z44JqbB%Pxkz_2|L{8Bx!qT>M8Tpqs5(!$!>QNc&u{WEB_mdEOpBx6( z#Nd_SB@}@9BOHX<;*0bhQ0`}3sgoi@O?RoB_8Mws|9>g@K)9VnL83^5IufPm*CaF9)I*4oyUWaKmJY+GX7Ky z`@GGBkV!a=w8az1ALtjbF_yfe|IkEILm!iws14zv|KQAVu({v4M^TtTjv+C}0yw#Aitm;G=?DM(5Bfl1vBF zArRGU@+X=MIaI;mpH+1j>okm z6X(&t@nulUF6bh9g%eQ{?D_^agHP}St_#Tk{FMaa@x&ixl3u72IS!aRQD=G->Te|Q z=nmU}RluP`1QdeI2e(=YO0fa&K!G?E>cvUi2?_8$x)#?H8{Co$jD=(oCO{6{shPKpNJJM}f9I0~D*ter%$iaP}+sAJhqWl!^A>@zjRjfp4)v z&2=VAa3vslh9E2_p6ECkL@Buq)iM@p&|6^YP|(dhwg&LA0W(_T8gd%kUL^iPpW_v1 z80MlXv>fVM3I0Y$VG6#}iA={uL<-sFhP_}%>&P@(PEzS`I)Z$sW#IN#5--faK35SJ zh-H7+$$z+!_P`&g9(Xh#m0*NM;v3O_Fa9|zgVxKcjcBYzTK zLWwvDeL~l8Z{&_2(q*_2@IhoQ#4;HF3ksXS+R?ux2??MZSwaIzIn9DhfXfvw9Zh-kV z`UdN$1oZb5?6n>K0BcTRYf%w!b10cfpObtlr3=Vah(b?@h6u+)EU%C#+&~sGB2t1` zx){HMoE!n2*e}SUB)pFvhG<|+z&TZtNPL&Agvwe4t~3Z->k@hvw8M=aAcv5Gv;`+3 z#6#fc6=?}<-o*q^hC$E)JVjCXPxK#piaVnKd=0X+f>gmi=Kwxpd=|18<~QgDks@ER zjc%Y$z@$rL9qJ0q(gGtUfH(L?x_~O20=MRe8|Y2IydyY{pXfLqOfC2U9giVTuo>{t zLuUNLmSI0o$9<$dwUG;S233+=`W2LZ7SuI6bj<7EZ_X!!88Lax_yQ8uP#F)Ru@K2h zv=XY39`d|B@aQgRa5ww~n7o+H1!T>Da97aG$KbcRlCRVN+P)eTS_~Ze{~B3Ira*N8 zrG=W71D)MEv=Uh$(;zSAjr6eIbkL+^(gQg3FB3w2u$^AOH=#bG8mo z2Fyzd7pnJAss^+>(~0CI?05`14Qs`N|G!0IL5r3_wJv770G|wM$8*q5&`dX|8tdpe zKuiF8+yp8Zgs(s>`@ot%i3@5^Cege9%gMFm8VZJr^c*VQAc*B>(vES1{80iv9^g5? zLe`8xm(XXdL^9Cf9au+daUGcreq99kQ5?kw&iFUiKiuylOt(M(9Bf8XDN|GwetXcq@YF97&-Y4YYu?AmWvOgdDs;-p*eUq z{SG-9`#*e2AS<4;<#-aC4jpqnng}`h8`QEB9SYva4EP*@{Y678?~x?n`Z6X4@QDI^ z%AlsL27IcpJL-qm(5q05ouKw?g!B6XJ_g*EO+#v^7k`k!^d3n8&74neATb$$9+3c; zJ^|It3)MpZH4qfUd=q~l3Z!O^5XTitBU@d6T zCiWY+{UX3To|eKSa478pKC_&RN4tURGVmNXi3i{_47#S*z|Ah;&@=H~G!GH@Z#>kr z=Qxe}!X7t+kMYGnpkrFhenZWG`4rNH{(`=$9rV4AU|Kr>T?Mu3%37fQ1j2-M2E;Or zQ9|Xeq(;07?LfI$jN0S9^c3J@0acw1r{Uvw>`%z^PvF$d;4??TteJoG>x&;{HZs_-p37V5-X zICmFZ0Qqx*{e%^uN9Twyav|I4GSJKtVCYgb3G#;_9Pn=vK~CmFPX30eSR>%m4b=A~?MO$F z=hOkSj?=JKB5?B_F4qNuJ_kDf6k9@`l<;%RjXEB z_gZ^*H|ozNUV@6XGyIP{Fnke6%_MbKpVfXu z)@ZCvz}zwky~QrnpT{8gLA4dI@H9g+bjz{YRQUw#GZekwF-#Kfl9!;$v8Gi5a}X1* zgKu^Kj@hNgBMQf%npJBSWX=VsY4=GdL2n3f$5CKH2jZup=7KI)0%zWhe)0fvW;ZDc zIP)!_w=j=+8#T>^ocS%Hwmo8KGZ0Teor>PhK#cD}AJ7bazzW#MsVz_!NzK&RaKJuF%@zWI9e1SF%_Nhb#o-Xx8 zA3*!Ofm(T9?E`GI9{8=XT!{($I;p4J5WV?A`3ZRG589K6+Wp9zk0BQY5kJ?kGEs^6 zX|I(5a}2|b=RA%6$i|B$o z!sg%Vb@D*C0+{_8Ci6A0aChwz?9)x_3(Voc1nm>lT)dqU*4Y{(I$j6Pyo}!B1$0p5 zz#OxrGTDJXZ5q7lxRwfg&qJ+jEbl=7^CW!z0(!qk)q$9uT+*6pJ0Ql@7A4g9$9rYq6?3O-MTWXc+YHhgI9P_fjfH_{ngh~NT;sih9r=fb# z&`j%$m5NhX9~~~o>zLyuWV^juC!FyOXtqXv^C7>Tm1@F1X$&w2*6^?f_lSB(b7LMe z7xt+SKl%z<4dqytOeDX{ka~P#(FoUCg(%|c#g4c#vTg}0g_5vn3A!&g6 z1SUJDv=+b|+km{DfPGRiQHqjxt1aQ{lTdrT=zHIhFJc-#8kplECeQ8Vd6-h1SA#&e zW1!P0c|CGwci^{QF%@isdCb>pp_ZV12+Yw4Gq{7mF@qrcDb$~Mb%CKdR^j5&M<2$- zq_4CC^RiA-mb^xL5B=FK$UO|$(1bqVGA1rJrA@F;IxyjfnjPKw24IdJn4IRqhbDmT zb>z1+buDT|Dstv`@;2!qOy5pnUe+J8t*y{TuKFuz_LR>fem;PG;*gK#t9NTb%-}|7 zjZl4$U;;fF_AwwA%|rZ@s)Nx>?t^_g0TccuuLLqkl!~P3SWmnrA4GRug0+fL;LJaf zH^xJkK}@UPLT`Q(6R5|u&cKA(>I;~rWXf5nX=`DpusRa8;SU9HQ470FyVdjC&*6cRTVh%UA_LSN1f~enuk;?<{U3+Ut+~MNt+G(GzBI+ zjQsXAtoRrD=s5LL$ZbbVE|LGjoZ~5JC+yP^9ouT4kXx9l)TqOubu;k6Rm`Do!9FRd zj8nA_fC&SbZOzs($4z9w(TL0Q=mR(bZK`D=4{wyWNS!g;IwySr`&7$Y5I=6zAD}$> zG$x=QU`m}BE|5M3X0L{QUeTJUx!NDF&&#M0GBC_+$nRDM!9III^8vX|`x|=}hGLz; zD@~I}z&`u5hoHx;uumuXDB@=<;-?NX9?aXd>*^-0H)dOZ!%`!VMKe)qKFOGKWXq3Y zb>cAMr=$8ZygXk^(cV+Pz#2nmL{%*2P%)^c?J+BxgZME3Uw7`B<4^la!17Ek7^@>Ssjn~$wvI3Vq?xR7IUaSC>PVu?DlYR^E;3_yAUCzmmHn;=j{g0VX_&nl?bbjQln~d=4-0&PGqw z5Oa=sI%fB4`>=8~1ncBAi1C@wWx;Lx+zI=HwBKN#{_-8t4a|mzXt(5_ff~H9PZjKQ zB3ugloJSw+mZqz%f!V*+o&hF2uU!BpoPcZ<1zj#j9M!4A;OoD`K0Pqcydp0EW;X(} zzk+qYBk~`x4|;I)ye;H?=mSO|CQGp!;3Z&=6F`HVf!PltBM*^22d&nSd#idky1KW~ z@83d9z5>i%gEfX(Qi1HmTH*|3`V-j8P^?ae{Hd_db-6!wEYLn()aQYMuVR&MJmyeI zdLNyPJ~|E){&uK8@1sYphJD^gPZbT!zD7C@MBEIReKxf1fnUCYIC5gneqFvF_SuWs zV{`OWE0EnB+H!R{*3-J7J4nEsBLQm`-LPY4xuGR`Dkrk;9;pS;#(wEL`F_kfR$&fx z4XY0oSeLwrj&@%70_>9~t;Sl2Q=O|#1}3c1enw4u27Ou$VtfXq$phwSfK|P_wU(G+ z@5Q=OFTJOlBM;IF&`0+~2K)*BexLj|>dzG9OgmO!-&dPqcE1{!y)6*eY4p)!QPW}| z$!DlP<%plgSQT#w>w19M7XTAFf!SY`N5MY(wdTleU*Nb4@lycIaZxG{*8;Qm&}aAE zv}a+TI?RTb13|QbF1MrpnAJC-%j>9VBjsDbgzsW@@4bVGG#Dp{+ts zbr&XtyZ>dMtLj&} zk!m+kI-vE!y6h2D%wf_J)UxKNz29SIBx4SB7j`bx$J$p8R(B_1y|Wlr?cVkT)ix{^Vd+UZ(mzc0@Fh1L&#N!y}tZm!-w>Q|K&z#7?&&tTI+& zpTHTcd%X`nqcL;+NNuN8U?wqKYolI6&pQT)yNPT^C7loXeZYkE)n5=l4`V0L8F?Nm zj~SSq_Bjdrv_j5Y11q+c52OCP4*OJs<|y4h`?a3vd5`LI!o^tCxC`F99(GdI(a4#X zP=8)P{FI=lnvPwF3VPltSg|{<#ev=&&~1R3M2qNOasjl#LqO}`;3PN$IBaG^M`@2_hUV+CG4{X znJ6AT?+X0YMLG%Fya3-kr9KGzEP{O$tgS4U51^;&A?=cWz#KOgbN088D=&l3r!jxS ziXMEu3DyI?Qd7}W%|`sht97u?EU6z>M!b-FBCU7;j4k!TVn0&1a_i~LHs!2mkW{KO0kaEMEw;p z*%fn+Q&?LWDr5a#nt-*hGw7*Wqw1|eev8D<8N^Q+y0Ql_ecFlm836lK0uwGqO=J9Q zMt(D@W6=LxK}{Qm-2o-?6lto&T^&!rKHFfQSlvE8c*idI(9@_tmk~d`fjRbI&fZ)b zt8RvU`T!v(%UwZ}_#jH1j+|Krn@^T6NKSdA^aXmV`sk@XMMrc&EeFjv5I@n#Z~w@h z!&hM+JM!DhKyF?wR{I$BrzPso3D6vZ9CrfolZu|VmF55@Tq6I06|cvopQNAV_Lxa5 z*T#b871UnrjmJ)ixyWyKfaV%C0h~?OW}~7RwQsPt@`&0~@B3Z5+~5}ZpHjyWcW08(Z8`aiG7He@wCHa_A6wqHu8s<4L=N;mod|O z4r^c8>QCBetq=UDMEwT4M#jiZ)Mv1c_$GSZ&B&J)*k>Ftdyza{8YWf2j|O2U?+*06 ziKu+@u!`9jJmzA3;heM+_UWPy!o=hZW+$W7ASP#aEuQUl2=sNcBG{em3Y0Pn7fu;rmNi`1R6%xR2lhISf zsnfKr*dy{d=Ik}7ng^vk>~|iIY3fz1$EKp5-K7mf&wEhbidD3>(p+TXTR^dQV2;~U zJqkqHSMCJNfwzj6_F;ZNgl* z1}$C2-W?8r|=hPh16F12RYM(Je+_v zhA4F;R*mk%zKi>@J~tE=`3C!U7k~A3?L3mMX10xF*#{ z9`ayU(01)7ZJOlL21~=WF5vSaDTr0QW?1L!h}v_Pb^<&aursE;Gy(lznzUT|L;67* zC;g%|#o9-yv{t={9Yt3VEmcwsD&#e7thPb>O?wZ!qK8PYXpc%iX^%)Hh>&E=92;mG zWS91jlqb2QP0~Zq<(sh2XWCwAGj=Hdq&1f|Y7%-KWRIL?YH*SLTiPRmsd_${~=4sm{tVv7jwHDx6K`#}Q z25DyODsQZXv}d)`+FHb=8?v{;S?_AkgXVBpbOLBCm1?wKrJJzw4k;Z|qetQEZ)nBR zTIYtUD`9)Lpoi{(KcgW?oIHSsC_K;h5S>snTX9#;eFpqd$ps| zChWnU2b#k{^BzP*P#UG3fYw)m?pSF8UW@U()<^0J+6}drB}to)efqy6hAN<)dfEcq zZLTy$n~x}23Hi53-)pB~g$ik!6oZ|QEum3lMQJ2<62GObfz0nnuW2v9-b1AOwHKvy z?3@j0Ye4e^WUm5G^^g(zg1-s)xd2zJ(sqFMC1|ZqdJBHkQ)&&%KaSTx4A%}zuWGA7 zZ<_QHblMMAZ4I6ik=X*;CeS<&Z&&e(ie}p9kZdXLz7jOQ#}4(w_?Zm}gOD40Z4j4H zpy`%|X}=*dR)O~Wu+3Z2qp)gocy|mY5?GPYE@-#3UnGmRNxB=n^~2p?h5yWeM}MLn z!(RS;=^af&#!Q1Y+u>CoJvEOsL^}fC`C1wZPk9m+?WRqanrQQ2b9&?-h@JxNAYRk3 zU1|aO`$Mm0r2*P< zsfV@*(YHcM!aYpd9{BrZXtM&ZzHn+-iGxmiK#zm9pP{Wo@Vcw;l1iyJJhHWvDJ4qx zLbE-zo4E5K=?QHc=zodWSq^U2BK!QH;Wbg3SIYyRLBw;swiA~75!&7fE)GKbr==Gl zC3b(IN=6}q8X+sS(`xWKi5sAG2s+p z+TIPVABHtAf|DXxB!Jj)Ne%F@;WZjnh~8_UcLc{C{JsU8d;uNe%E@8))}I=(DSK9LF!P4c5jWU7EH}QnbId z8u(BFba?@ObXdyJ_QUQ6aMmGc>~C;!4U(0?Ck;{)WQ`d3iU!$BrTZXzXT;{ikgh$h zY6>nA5y58dtX2(O=4-XudEDVo+zG2aINBoW9>jAGLznk~t9w8x6BO;p)&Z#{IPZws z_MmnK|NRq^9RmMH;p?X$?KRLW)^cH~^YEj;A^Ran@ds!g$5mHw6zSS)iq|0}B8DvB zGYs98LXw-HcOE`)9FiT8GV#*^X(cUND~H^-B!hMqG>_@rHw2F@K)QojzhxJpm`lMi?lMGri42^>A*EQ!iD=J2Og07Aq}c`)v?a9G3}t37}>NO&K&*Xe9(%mEhF}o(pm30%VCIWJx#bg%?z- z;hP#XEQ2>Q=tV;hNw`M}&Po9{$)J>o2zNoFvMxL0=uYI2W{{!@_{>1Qj|N>6=mo)L z8SGPldO?d_#+@z!dtC*u*^tJIyVpQw8T9OsJ|48{fk*1I8Sd5;c4`RulR#U+VbH17 zA`6E>GmOZUz^fUD6Tipfu1ScLczAa-{KyHaR-NN4$bJVjd^tD+*V-z?~C(nsKcPp8>Ckr3T>j4$#a5zj5#Z1(6}c z;&qU_6k08W>^F6~Dr{qdpF1J96K7jtWgEQG27fm~yBc(-fj2}Ic+J9*3c9i2)dIVO zL9rT#55Li?uH)ww&?e1WxNANlw;XiCsE-C5PS8z(W+{6^@Yx7Q7I-Dic<^a~Z9=+d z1`tI7WV#^uRCS%+gst+xAGKbi^JxZ$X6VzT=MTnF{oA}|fM$}eof=$Kqw`q<%0AE{ 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�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⪚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 diff --git a/iphone/ZXingWidget/exportList b/iphone/ZXingWidget/exportList deleted file mode 100644 index 560070991..000000000 --- a/iphone/ZXingWidget/exportList +++ /dev/null @@ -1 +0,0 @@ -.objc_class_name_MultiFormatReader diff --git a/objc/.gitignore b/objc/.gitignore deleted file mode 100644 index 52e2f9203..000000000 --- a/objc/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/build -/osx.xcodeproj/*.pbxuser -/osx.xcodeproj/*.mode1v3 -/osx.xcodeproj/xcuserdata -/ios.xcodeproj/*.pbxuser -/ios.xcodeproj/*.mode1v3 -xcuserdata -contents.xcworkspacedata \ No newline at end of file diff --git a/objc/README b/objc/README deleted file mode 100644 index 8207d22b2..000000000 --- a/objc/README +++ /dev/null @@ -1,4 +0,0 @@ -No docs at this point. - -There are examples in examples directory and also a macruby example at -https://github.com/smparkes/zxing.app. diff --git a/objc/examples/ios/bare/Default-568h@2x.png b/objc/examples/ios/bare/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/objc/examples/ios/bare/bare.xcodeproj/project.pbxproj b/objc/examples/ios/bare/bare.xcodeproj/project.pbxproj deleted file mode 100644 index 2243602f4..000000000 --- a/objc/examples/ios/bare/bare.xcodeproj/project.pbxproj +++ /dev/null @@ -1,433 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3BA99657159122210056A230 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA99656159122210056A230 /* UIKit.framework */; }; - 3BA99659159122210056A230 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA99658159122210056A230 /* Foundation.framework */; }; - 3BA9965B159122210056A230 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA9965A159122210056A230 /* CoreGraphics.framework */; }; - 3BA99661159122210056A230 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3BA9965F159122210056A230 /* InfoPlist.strings */; }; - 3BA99667159122210056A230 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA99666159122210056A230 /* AppDelegate.m */; }; - 3BA9966A159122210056A230 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA99669159122210056A230 /* ViewController.m */; }; - 3BA9966D159122210056A230 /* ViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3BA9966B159122210056A230 /* ViewController_iPhone.xib */; }; - 3BA99670159122210056A230 /* ViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3BA9966E159122210056A230 /* ViewController_iPad.xib */; }; - 3BA9968C15913D0D0056A230 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA9968B15913D0D0056A230 /* AVFoundation.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 3BA9968E15913D4A0056A230 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA9968D15913D4A0056A230 /* CoreVideo.framework */; }; - 3BA9969015913D730056A230 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA9968F15913D730056A230 /* QuartzCore.framework */; }; - 3BA9969415913DCE0056A230 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA9969315913DCE0056A230 /* libiconv.dylib */; }; - 3BA9969615913DFB0056A230 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA9969515913DFB0056A230 /* CoreMedia.framework */; }; - 3BA996C5159165330056A230 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BA996C4159165330056A230 /* main.mm */; }; - 3BBC20A5161BCA03002885A0 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3BBC20A4161BCA03002885A0 /* Default-568h@2x.png */; }; - 3BF2C0BF161BD54700DA3C5C /* libzxing-objc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA9968315913CE50056A230 /* libzxing-objc.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3BA9968215913CE50056A230 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3BA9967615913CE40056A230 /* zxing-objc.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B83EB25158E6C5100A3B31F; - remoteInfo = "zxing-objc"; - }; - 3BA9968415913CE50056A230 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3BA9967615913CE40056A230 /* zxing-objc.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B83EB90158E71AD00A3B31F; - remoteInfo = "zxing-objc-framework"; - }; - 3BA9968815913CEB0056A230 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3BA9967615913CE40056A230 /* zxing-objc.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 3B83EB24158E6C5100A3B31F; - remoteInfo = "zxing-objc"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 3BA99652159122210056A230 /* bare.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = bare.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3BA99656159122210056A230 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 3BA99658159122210056A230 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 3BA9965A159122210056A230 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 3BA9965E159122210056A230 /* bare-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "bare-Info.plist"; sourceTree = ""; }; - 3BA99660159122210056A230 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 3BA99664159122210056A230 /* bare-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "bare-Prefix.pch"; sourceTree = ""; }; - 3BA99665159122210056A230 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 3BA99666159122210056A230 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 3BA99668159122210056A230 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 3BA99669159122210056A230 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 3BA9966C159122210056A230 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPhone.xib; sourceTree = ""; }; - 3BA9966F159122210056A230 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPad.xib; sourceTree = ""; }; - 3BA9967615913CE40056A230 /* zxing-objc.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "zxing-objc.xcodeproj"; path = "../../../zxing-objc.xcodeproj"; sourceTree = ""; }; - 3BA9968B15913D0D0056A230 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - 3BA9968D15913D4A0056A230 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 3BA9968F15913D730056A230 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 3BA9969315913DCE0056A230 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; - 3BA9969515913DFB0056A230 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; - 3BA996C4159165330056A230 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - 3BBC20A4161BCA03002885A0 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3BA9964F159122210056A230 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BF2C0BF161BD54700DA3C5C /* libzxing-objc.a in Frameworks */, - 3BA9969615913DFB0056A230 /* CoreMedia.framework in Frameworks */, - 3BA9969415913DCE0056A230 /* libiconv.dylib in Frameworks */, - 3BA9969015913D730056A230 /* QuartzCore.framework in Frameworks */, - 3BA9968E15913D4A0056A230 /* CoreVideo.framework in Frameworks */, - 3BA9968C15913D0D0056A230 /* AVFoundation.framework in Frameworks */, - 3BA99657159122210056A230 /* UIKit.framework in Frameworks */, - 3BA99659159122210056A230 /* Foundation.framework in Frameworks */, - 3BA9965B159122210056A230 /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3BA99647159122210056A230 = { - isa = PBXGroup; - children = ( - 3BBC20A4161BCA03002885A0 /* Default-568h@2x.png */, - 3BA9967615913CE40056A230 /* zxing-objc.xcodeproj */, - 3BA9965C159122210056A230 /* bare */, - 3BA99655159122210056A230 /* Frameworks */, - 3BA99653159122210056A230 /* Products */, - ); - sourceTree = ""; - }; - 3BA99653159122210056A230 /* Products */ = { - isa = PBXGroup; - children = ( - 3BA99652159122210056A230 /* bare.app */, - ); - name = Products; - sourceTree = ""; - }; - 3BA99655159122210056A230 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3BA9969515913DFB0056A230 /* CoreMedia.framework */, - 3BA9969315913DCE0056A230 /* libiconv.dylib */, - 3BA9968F15913D730056A230 /* QuartzCore.framework */, - 3BA9968D15913D4A0056A230 /* CoreVideo.framework */, - 3BA9968B15913D0D0056A230 /* AVFoundation.framework */, - 3BA99656159122210056A230 /* UIKit.framework */, - 3BA99658159122210056A230 /* Foundation.framework */, - 3BA9965A159122210056A230 /* CoreGraphics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3BA9965C159122210056A230 /* bare */ = { - isa = PBXGroup; - children = ( - 3BA99665159122210056A230 /* AppDelegate.h */, - 3BA99666159122210056A230 /* AppDelegate.m */, - 3BA99668159122210056A230 /* ViewController.h */, - 3BA99669159122210056A230 /* ViewController.m */, - 3BA9966B159122210056A230 /* ViewController_iPhone.xib */, - 3BA9966E159122210056A230 /* ViewController_iPad.xib */, - 3BA9965D159122210056A230 /* Supporting Files */, - ); - path = bare; - sourceTree = ""; - }; - 3BA9965D159122210056A230 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 3BA9965E159122210056A230 /* bare-Info.plist */, - 3BA9965F159122210056A230 /* InfoPlist.strings */, - 3BA996C4159165330056A230 /* main.mm */, - 3BA99664159122210056A230 /* bare-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 3BA9967715913CE40056A230 /* Products */ = { - isa = PBXGroup; - children = ( - 3BA9968315913CE50056A230 /* libzxing-objc.a */, - 3BA9968515913CE50056A230 /* zxing-objc-framework.framework */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 3BA99651159122210056A230 /* bare */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3BA99673159122210056A230 /* Build configuration list for PBXNativeTarget "bare" */; - buildPhases = ( - 3BA9964E159122210056A230 /* Sources */, - 3BA9964F159122210056A230 /* Frameworks */, - 3BA99650159122210056A230 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 3BA9968915913CEB0056A230 /* PBXTargetDependency */, - ); - name = bare; - productName = bare; - productReference = 3BA99652159122210056A230 /* bare.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3BA99649159122210056A230 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - }; - buildConfigurationList = 3BA9964C159122210056A230 /* Build configuration list for PBXProject "bare" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 3BA99647159122210056A230; - productRefGroup = 3BA99653159122210056A230 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 3BA9967715913CE40056A230 /* Products */; - ProjectRef = 3BA9967615913CE40056A230 /* zxing-objc.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 3BA99651159122210056A230 /* bare */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 3BA9968315913CE50056A230 /* libzxing-objc.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libzxing-objc.a"; - remoteRef = 3BA9968215913CE50056A230 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3BA9968515913CE50056A230 /* zxing-objc-framework.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = "zxing-objc-framework.framework"; - remoteRef = 3BA9968415913CE50056A230 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 3BA99650159122210056A230 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BA99661159122210056A230 /* InfoPlist.strings in Resources */, - 3BA9966D159122210056A230 /* ViewController_iPhone.xib in Resources */, - 3BA99670159122210056A230 /* ViewController_iPad.xib in Resources */, - 3BBC20A5161BCA03002885A0 /* Default-568h@2x.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 3BA9964E159122210056A230 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BA99667159122210056A230 /* AppDelegate.m in Sources */, - 3BA9966A159122210056A230 /* ViewController.m in Sources */, - 3BA996C5159165330056A230 /* main.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 3BA9968915913CEB0056A230 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "zxing-objc"; - targetProxy = 3BA9968815913CEB0056A230 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 3BA9965F159122210056A230 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 3BA99660159122210056A230 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 3BA9966B159122210056A230 /* ViewController_iPhone.xib */ = { - isa = PBXVariantGroup; - children = ( - 3BA9966C159122210056A230 /* en */, - ); - name = ViewController_iPhone.xib; - sourceTree = ""; - }; - 3BA9966E159122210056A230 /* ViewController_iPad.xib */ = { - isa = PBXVariantGroup; - children = ( - 3BA9966F159122210056A230 /* en */, - ); - name = ViewController_iPad.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 3BA99671159122210056A230 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv7, - armv7s, - ); - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "armv7 armv7s"; - WARNING_CFLAGS = "-Wall"; - }; - name = Debug; - }; - 3BA99672159122210056A230 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv7, - armv7s, - ); - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "armv7 armv7s"; - WARNING_CFLAGS = "-Wall"; - }; - name = Release; - }; - 3BA99674159122210056A230 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "bare/bare-Prefix.pch"; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - HEADER_SEARCH_PATHS = ( - objc/cpp/core/src, - objc/src, - ); - INFOPLIST_FILE = "bare/bare-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../../../../../../Library/Developer/Xcode/DerivedData/bare-ceenmvkaxbzcsubayrtaunypjmgx/Build/Products/Debug-iphoneos\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 3BA99675159122210056A230 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "bare/bare-Prefix.pch"; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - HEADER_SEARCH_PATHS = ( - objc/cpp/core/src, - objc/src, - ); - INFOPLIST_FILE = "bare/bare-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/../../../../../../Library/Developer/Xcode/DerivedData/bare-ceenmvkaxbzcsubayrtaunypjmgx/Build/Products/Debug-iphoneos\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3BA9964C159122210056A230 /* Build configuration list for PBXProject "bare" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3BA99671159122210056A230 /* Debug */, - 3BA99672159122210056A230 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3BA99673159122210056A230 /* Build configuration list for PBXNativeTarget "bare" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3BA99674159122210056A230 /* Debug */, - 3BA99675159122210056A230 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3BA99649159122210056A230 /* Project object */; -} diff --git a/objc/examples/ios/bare/bare/AppDelegate.h b/objc/examples/ios/bare/bare/AppDelegate.h deleted file mode 100644 index 8fb8d905e..000000000 --- a/objc/examples/ios/bare/bare/AppDelegate.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// AppDelegate.h -// bare -// -// Created by Steven Parkes on 6/19/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#import - -@class ViewController; - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@property (strong, nonatomic) ViewController *viewController; - -@end diff --git a/objc/examples/ios/bare/bare/AppDelegate.m b/objc/examples/ios/bare/bare/AppDelegate.m deleted file mode 100644 index 732acbe7a..000000000 --- a/objc/examples/ios/bare/bare/AppDelegate.m +++ /dev/null @@ -1,62 +0,0 @@ -// -// AppDelegate.m -// bare -// -// Created by Steven Parkes on 6/19/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#import "AppDelegate.h" - -#import "ViewController.h" - -@implementation AppDelegate - -@synthesize window = _window; -@synthesize viewController = _viewController; - -- (void)dealloc -{ - [_window release]; - [_viewController release]; - [super dealloc]; -} - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; - // Override point for customization after application launch. - self.viewController = [[[ViewController alloc] init] autorelease]; - self.window.rootViewController = self.viewController; - [self.window makeKeyAndVisible]; - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/objc/examples/ios/bare/bare/ViewController.h b/objc/examples/ios/bare/bare/ViewController.h deleted file mode 100644 index 0573d63fb..000000000 --- a/objc/examples/ios/bare/bare/ViewController.h +++ /dev/null @@ -1,27 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import - -@class ZXCapture; - -@interface ViewController : UIViewController { - ZXCapture* capture; - UIButton* swap; -} -@end diff --git a/objc/examples/ios/bare/bare/ViewController.m b/objc/examples/ios/bare/bare/ViewController.m deleted file mode 100644 index d5f9d46d2..000000000 --- a/objc/examples/ios/bare/bare/ViewController.m +++ /dev/null @@ -1,152 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import "ViewController.h" -#import // seems not included by default in the sim -#import -#import - -@interface View : UIView @end -@implementation View - -- (UIView*)swap_view { - if ([[self subviews] count]) { - return [[self subviews] objectAtIndex:0]; - } else { - return nil; - } -} - -- (void)layoutSubviews { - [super layoutSubviews]; - CGRect bounds = self.bounds; - for(int i=0; i < [[[self layer] sublayers] count]; ++i) { - CALayer* layer = (CALayer*)[[self.layer sublayers] objectAtIndex:i]; - if (layer != [self swap_view].layer) { - layer.frame = bounds; - } - } - CGRect frame = self.swap_view.bounds; - frame.origin.x = bounds.size.width - frame.size.width - 10; - frame.origin.y = 10; - self.swap_view.frame = frame; -} - -@end - -@implementation ViewController - -- (void)dealloc { - [swap release]; - [capture release]; - [super dealloc]; -} - -- (ZXCapture*)capture { - if (!capture) { - capture = [[ZXCapture alloc] init]; - capture.delegate = self; - } - return capture; -} - -- (void)loadView { - self.view = [[[View alloc] init] autorelease]; - [self.view.layer addSublayer:self.capture.layer]; - - // self.capture.luminance = true; - // [self.view.layer addSublayer:self.capture.luminance]; - - // self.capture.binary = true; - //[ self.view.layer addSublayer:self.capture.binary]; - - if (!swap && self.capture.hasFront && self.capture.hasBack) { - swap = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - [swap setTitle:@"swap" forState:UIControlStateNormal]; - [swap sizeToFit]; - [swap addTarget:self action:@selector(swap) forControlEvents:UIControlEventTouchUpInside]; - [self.view addSubview:swap]; - } - [self swap]; - [self.capture start]; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return YES; -} - -- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - CGAffineTransform t = CGAffineTransformIdentity; - CGSize size = self.capture.layer.bounds.size; - (void)size; - switch(toInterfaceOrientation) { - case UIInterfaceOrientationPortraitUpsideDown: - t = CGAffineTransformMakeRotation(M_PI); - break; - - case UIInterfaceOrientationLandscapeLeft: - t = CGAffineTransformMakeRotation(M_PI/2); - break; - - case UIInterfaceOrientationLandscapeRight: - t = CGAffineTransformMakeRotation(-M_PI/2); - break; - - default: - break; - } - if (self.capture.camera == self.capture.front) { - t.a = -t.a; - } - self.capture.layer.affineTransform = t; - [self.view setNeedsLayout]; -} - -- (void)didReceiveMemoryWarning { - if (swap && !swap.window) { - [swap release]; - swap = nil; - } -} - -- (void)swap { - self.capture.camera = - self.capture.camera == self.capture.front ? - self.capture.back : self.capture.front; -} - -- (void)captureResult:(ZXCapture*)capture result:(ZXResult*)result { - // NSLog(@"%@", result.text); - UILabel* label = [[[UILabel alloc] init] autorelease]; - label.font = [UIFont systemFontOfSize:36]; - label.text = result.text; - label.textColor = [UIColor yellowColor]; - label.backgroundColor = - [[UIColor blackColor] colorWithAlphaComponent:0.5]; - [label sizeToFit]; - label.center = CGPointMake(self.view.bounds.size.width/2, - self.view.bounds.size.height/2); - [self.view addSubview:label]; - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationDuration:1.0]; - [UIView setAnimationDelegate:label]; - [UIView setAnimationDidStopSelector:@selector(removeFromSuperview)]; - label.alpha = 0; - [UIView commitAnimations]; -} - -@end diff --git a/objc/examples/ios/bare/bare/bare-Info.plist b/objc/examples/ios/bare/bare/bare-Info.plist deleted file mode 100644 index 3cf3fee73..000000000 --- a/objc/examples/ios/bare/bare/bare-Info.plist +++ /dev/null @@ -1,43 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - zxing.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/objc/examples/ios/bare/bare/bare-Prefix.pch b/objc/examples/ios/bare/bare/bare-Prefix.pch deleted file mode 100644 index 41e9c6ac3..000000000 --- a/objc/examples/ios/bare/bare/bare-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'bare' target in the 'bare' project -// - -#import - -#ifndef __IPHONE_4_0 -#warning "This project uses features only available in iOS SDK 4.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/objc/examples/ios/bare/bare/en.lproj/InfoPlist.strings b/objc/examples/ios/bare/bare/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28ff8..000000000 --- a/objc/examples/ios/bare/bare/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/objc/examples/ios/bare/bare/en.lproj/ViewController_iPad.xib b/objc/examples/ios/bare/bare/en.lproj/ViewController_iPad.xib deleted file mode 100644 index cd02abedb..000000000 --- a/objc/examples/ios/bare/bare/en.lproj/ViewController_iPad.xib +++ /dev/null @@ -1,120 +0,0 @@ - - - - 1280 - 11C25 - 1919 - 1138.11 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 916 - - - IBProxyObject - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - {{0, 20}, {768, 1004}} - - - - 3 - MQA - - 2 - - - - 2 - - IBIPadFramework - - - - - - - view - - - - 3 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - - - ViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 3 - - - - - ViewController - UIViewController - - IBProjectSource - ./Classes/ViewController.h - - - - - 0 - IBIPadFramework - YES - 3 - 916 - - diff --git a/objc/examples/ios/bare/bare/en.lproj/ViewController_iPhone.xib b/objc/examples/ios/bare/bare/en.lproj/ViewController_iPhone.xib deleted file mode 100644 index e7178e4d5..000000000 --- a/objc/examples/ios/bare/bare/en.lproj/ViewController_iPhone.xib +++ /dev/null @@ -1,119 +0,0 @@ - - - - 1280 - 11C25 - 1919 - 1138.11 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 916 - - - IBProxyObject - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {{0, 20}, {320, 460}} - - - - 3 - MC43NQA - - 2 - - - NO - - IBCocoaTouchFramework - - - - - - - view - - - - 7 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - - - - - ViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 7 - - - - - ViewController - UIViewController - - IBProjectSource - ./Classes/ViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 916 - - diff --git a/objc/examples/ios/bare/bare/main.mm b/objc/examples/ios/bare/bare/main.mm deleted file mode 100644 index 2034f8b04..000000000 --- a/objc/examples/ios/bare/bare/main.mm +++ /dev/null @@ -1,27 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/objc/examples/osx/bare/bare.xcodeproj/project.pbxproj b/objc/examples/osx/bare/bare.xcodeproj/project.pbxproj deleted file mode 100644 index 1a049cfb6..000000000 --- a/objc/examples/osx/bare/bare.xcodeproj/project.pbxproj +++ /dev/null @@ -1,364 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B5D0F191590F12B00C33931 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0F181590F12B00C33931 /* Cocoa.framework */; }; - 3B5D0F251590F12B00C33931 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B5D0F241590F12B00C33931 /* main.mm */; }; - 3B5D0F2C1590F12C00C33931 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B5D0F2B1590F12C00C33931 /* AppDelegate.mm */; }; - 3B5D0F541590F31A00C33931 /* zxing-objc-framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0F3E1590F2C400C33931 /* zxing-objc-framework.framework */; }; - 3B5D0F641590FF2E00C33931 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0F631590FF2E00C33931 /* QuartzCore.framework */; }; - 3B5D0F66159100A700C33931 /* zxing-objc-framework.framework in Copy Files */ = {isa = PBXBuildFile; fileRef = 3B5D0F3E1590F2C400C33931 /* zxing-objc-framework.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3B5D0F3B1590F2C400C33931 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3B5D0F351590F2C400C33931 /* zxing-objc.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B83EB25158E6C5100A3B31F; - remoteInfo = "zxing-objc"; - }; - 3B5D0F3D1590F2C400C33931 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3B5D0F351590F2C400C33931 /* zxing-objc.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B83EB90158E71AD00A3B31F; - remoteInfo = "zxing-objc-framework"; - }; - 3B5D0F521590F2F900C33931 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3B5D0F351590F2C400C33931 /* zxing-objc.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 3B83EB8F158E71AD00A3B31F; - remoteInfo = "zxing-objc-framework"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 3B5D0F651591006000C33931 /* Copy Files */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B5D0F66159100A700C33931 /* zxing-objc-framework.framework in Copy Files */, - ); - name = "Copy Files"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B5D0F141590F12B00C33931 /* bare.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = bare.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B5D0F181590F12B00C33931 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 3B5D0F1B1590F12B00C33931 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - 3B5D0F1D1590F12B00C33931 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 3B5D0F201590F12B00C33931 /* bare-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "bare-Info.plist"; sourceTree = ""; }; - 3B5D0F241590F12B00C33931 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - 3B5D0F261590F12B00C33931 /* bare-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "bare-Prefix.pch"; sourceTree = ""; }; - 3B5D0F2A1590F12B00C33931 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 3B5D0F2B1590F12C00C33931 /* AppDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegate.mm; sourceTree = ""; }; - 3B5D0F351590F2C400C33931 /* zxing-objc.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "zxing-objc.xcodeproj"; path = "../../../zxing-objc.xcodeproj"; sourceTree = ""; }; - 3B5D0F631590FF2E00C33931 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3B5D0F111590F12B00C33931 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5D0F641590FF2E00C33931 /* QuartzCore.framework in Frameworks */, - 3B5D0F541590F31A00C33931 /* zxing-objc-framework.framework in Frameworks */, - 3B5D0F191590F12B00C33931 /* Cocoa.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3B5D0F091590F12B00C33931 = { - isa = PBXGroup; - children = ( - 3B5D0F351590F2C400C33931 /* zxing-objc.xcodeproj */, - 3B5D0F1E1590F12B00C33931 /* bare */, - 3B5D0F171590F12B00C33931 /* Frameworks */, - 3B5D0F151590F12B00C33931 /* Products */, - ); - sourceTree = ""; - }; - 3B5D0F151590F12B00C33931 /* Products */ = { - isa = PBXGroup; - children = ( - 3B5D0F141590F12B00C33931 /* bare.app */, - ); - name = Products; - sourceTree = ""; - }; - 3B5D0F171590F12B00C33931 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3B5D0F631590FF2E00C33931 /* QuartzCore.framework */, - 3B5D0F181590F12B00C33931 /* Cocoa.framework */, - 3B5D0F1A1590F12B00C33931 /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3B5D0F1A1590F12B00C33931 /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 3B5D0F1B1590F12B00C33931 /* AppKit.framework */, - 3B5D0F1D1590F12B00C33931 /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 3B5D0F1E1590F12B00C33931 /* bare */ = { - isa = PBXGroup; - children = ( - 3B5D0F2A1590F12B00C33931 /* AppDelegate.h */, - 3B5D0F2B1590F12C00C33931 /* AppDelegate.mm */, - 3B5D0F1F1590F12B00C33931 /* Supporting Files */, - ); - path = bare; - sourceTree = ""; - }; - 3B5D0F1F1590F12B00C33931 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 3B5D0F201590F12B00C33931 /* bare-Info.plist */, - 3B5D0F241590F12B00C33931 /* main.mm */, - 3B5D0F261590F12B00C33931 /* bare-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 3B5D0F361590F2C400C33931 /* Products */ = { - isa = PBXGroup; - children = ( - 3B5D0F3C1590F2C400C33931 /* libzxing-objc.a */, - 3B5D0F3E1590F2C400C33931 /* zxing-objc-framework.framework */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 3B5D0F131590F12B00C33931 /* bare */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3B5D0F321590F12C00C33931 /* Build configuration list for PBXNativeTarget "bare" */; - buildPhases = ( - 3B5D0F101590F12B00C33931 /* Sources */, - 3B5D0F111590F12B00C33931 /* Frameworks */, - 3B5D0F121590F12B00C33931 /* Resources */, - 3B5D0F651591006000C33931 /* Copy Files */, - ); - buildRules = ( - ); - dependencies = ( - 3B5D0F531590F2F900C33931 /* PBXTargetDependency */, - ); - name = bare; - productName = bare; - productReference = 3B5D0F141590F12B00C33931 /* bare.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3B5D0F0B1590F12B00C33931 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - }; - buildConfigurationList = 3B5D0F0E1590F12B00C33931 /* Build configuration list for PBXProject "bare" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 3B5D0F091590F12B00C33931; - productRefGroup = 3B5D0F151590F12B00C33931 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 3B5D0F361590F2C400C33931 /* Products */; - ProjectRef = 3B5D0F351590F2C400C33931 /* zxing-objc.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 3B5D0F131590F12B00C33931 /* bare */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 3B5D0F3C1590F2C400C33931 /* libzxing-objc.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libzxing-objc.a"; - remoteRef = 3B5D0F3B1590F2C400C33931 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3B5D0F3E1590F2C400C33931 /* zxing-objc-framework.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = "zxing-objc-framework.framework"; - remoteRef = 3B5D0F3D1590F2C400C33931 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 3B5D0F121590F12B00C33931 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 3B5D0F101590F12B00C33931 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5D0F251590F12B00C33931 /* main.mm in Sources */, - 3B5D0F2C1590F12C00C33931 /* AppDelegate.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 3B5D0F531590F2F900C33931 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "zxing-objc-framework"; - targetProxy = 3B5D0F521590F2F900C33931 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 3B5D0F301590F12C00C33931 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 3B5D0F311590F12C00C33931 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; - SDKROOT = macosx; - }; - name = Release; - }; - 3B5D0F331590F12C00C33931 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COMBINE_HIDPI_IMAGES = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "bare/bare-Prefix.pch"; - HEADER_SEARCH_PATHS = ( - objc/src, - objc/cpp/src, - ); - INFOPLIST_FILE = "bare/bare-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - USER_HEADER_SEARCH_PATHS = "objc/src objc/cpp/core/src"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 3B5D0F341590F12C00C33931 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - COMBINE_HIDPI_IMAGES = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "bare/bare-Prefix.pch"; - HEADER_SEARCH_PATHS = ( - objc/src, - objc/cpp/src, - ); - INFOPLIST_FILE = "bare/bare-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - USER_HEADER_SEARCH_PATHS = "objc/src objc/cpp/core/src"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3B5D0F0E1590F12B00C33931 /* Build configuration list for PBXProject "bare" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B5D0F301590F12C00C33931 /* Debug */, - 3B5D0F311590F12C00C33931 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3B5D0F321590F12C00C33931 /* Build configuration list for PBXNativeTarget "bare" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B5D0F331590F12C00C33931 /* Debug */, - 3B5D0F341590F12C00C33931 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3B5D0F0B1590F12B00C33931 /* Project object */; -} diff --git a/objc/examples/osx/bare/bare/AppDelegate.h b/objc/examples/osx/bare/bare/AppDelegate.h deleted file mode 100644 index 0cf0e055d..000000000 --- a/objc/examples/osx/bare/bare/AppDelegate.h +++ /dev/null @@ -1,44 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2012 ZXing authors - * - * 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. - */ - -#import - -@class ZXCapture; - -@interface AppDelegate : NSObject - -@property (retain) NSWindow* window; -@property (retain) NSUserDefaults* prefs; -@property (retain) ZXCapture* capture; -@property (retain) CALayer* layer; -@property (retain) NSTextView* text; -@property (assign) CGRect text_frame; -@property (assign) double width; -@property (assign) double height; -@property (readonly) BOOL show_luminance; -@property (readonly) BOOL show_binary; - -- (void)cancel; - -- (void)captureResult:(ZXCapture*)capture result:(ZXResult*)result; -- (void)captureSize:(ZXCapture*)capture - width:(NSNumber*)width - height:(NSNumber*)height; - -@end diff --git a/objc/examples/osx/bare/bare/AppDelegate.mm b/objc/examples/osx/bare/bare/AppDelegate.mm deleted file mode 100644 index bec165a08..000000000 --- a/objc/examples/osx/bare/bare/AppDelegate.mm +++ /dev/null @@ -1,675 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2012 ZXing authors - * - * 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. - */ - -#import "AppDelegate.h" -#import -#import - -#if DEBUG -#include -using std::cerr; -using std::endl; -using std::ostream; -ostream& operator << (ostream& os, id object) { - os << [[NSString stringWithFormat:@"%@", object] UTF8String]; - return os; -} -ostream& operator << (ostream& os, CGPoint const& p) { - os << '{' << p.x << "," << p.y << '}'; - return os; -} -ostream& operator << (ostream& os, CGSize const& s) { - os << '{' << s.width << "," << s.height << '}'; - return os; -} -ostream& operator << (ostream& os, CGRect const& r) { - os << '{' << r.origin << "," << r.size << '}'; - return os; -} -#endif - -namespace { - double height(NSString* string, NSFont* font, double width) { - NSTextStorage* ts = - [[[NSTextStorage alloc] initWithString:string] autorelease]; - NSTextContainer* tc = - [[[NSTextContainer alloc] - initWithContainerSize:CGSizeMake(width, 9999999)] autorelease]; - NSLayoutManager* lm = [[[NSLayoutManager alloc] init] autorelease]; - [lm addTextContainer:tc]; - [ts addLayoutManager:lm]; - [ts addAttribute:NSFontAttributeName - value:font - range:NSMakeRange(0, ts.length)]; - [tc setLineFragmentPadding:0]; - [lm glyphRangeForTextContainer:tc]; - return [lm usedRectForTextContainer:tc].size.height; - } -} - -@interface WindowView : NSView @end -@interface Menu : NSMenu -- (void)items:(id)items; -@end -@interface MainMenu : Menu @end -@interface Item : NSMenuItem -- (id)initWithMenu:(Menu*)parent arg:(id)arg; -@end - -@implementation AppDelegate - -@synthesize window = window_; -@synthesize prefs = prefs_; -@synthesize capture = capture_; -@synthesize layer = layer_; -@synthesize text = text_; -@synthesize text_frame = text_frame_; -@synthesize height = height_; -@synthesize width = width_; - -- (void)dealloc { - self.window = nil; - self.prefs = nil; - self.capture = nil; - self.layer = nil; - self.text = nil; - [super dealloc]; -} - --(void)preferences { - self.prefs = [NSUserDefaults standardUserDefaults]; - [self.prefs registerDefaults: - [NSDictionary dictionaryWithObjects: - [NSArray arrayWithObjects: - [NSNumber numberWithBool:NO], - [NSNumber numberWithBool:NO], - [NSNumber numberWithBool:NO], - [NSNumber numberWithBool:YES], - nil] - forKeys: - [NSArray arrayWithObjects: - @"show_luminance", - @"show_binary", - @"fullscreen", - @"continuous", - nil]]]; -} - -- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication { - return YES; -} - -- (CGSize)resize:(CGSize)size { - CGRect frame = CGRectMake(0, 0, size.width, size.height); - frame = self.layer.bounds; - - double window_ar = frame.size.width/frame.size.height; - double video_ar = 1.0*self.width/self.height; - - if (fabs(video_ar-window_ar) > 0.001) { - if (video_ar > window_ar) { - frame.origin.y = (frame.size.height-frame.size.width/video_ar)/2; - frame.size.height = frame.size.width/video_ar; - } else { - frame.origin.x = (frame.size.width-frame.size.height*video_ar)/2; - frame.size.width = frame.size.height*video_ar; - } - } - - self.capture.layer.frame = frame; - - frame = CGRectMake(0, 0, size.width, size.height); - frame = self.layer.bounds; - self.text_frame = self.text.frame = CGRectMake(0.1*frame.size.width, - 0.05*frame.size.height, - 0.8*frame.size.width, - 0.45*frame.size.height); - - if ([self.prefs boolForKey:@"show_luminance"]) { - frame = CGRectMake(0, 0, size.width, size.height); - frame = [self.window contentRectForFrameRect:frame]; - frame = self.layer.bounds; - double width = frame.size.width; - frame.size.height *= 1/3.0; - frame.size.width *= 1/3.0; - - double window_ar = frame.size.width/frame.size.height; - double video_ar = 1.0*self.width/self.height; - - if (fabs(video_ar-window_ar) > 0.001) { - if (video_ar > window_ar) { - frame.size.height = frame.size.width/video_ar; - } else { - frame.size.width = frame.size.height*video_ar; - } - - frame.origin.x = width - frame.size.width; - - self.capture.luminance = true; - self.capture.luminance.frame = frame; - } - } - - if ([self.prefs boolForKey:@"show_binary"]) { - frame = CGRectMake(0, 0, size.width, size.height); - frame = [self.window contentRectForFrameRect:frame]; - frame = self.layer.bounds; - frame.size.height *= 1/3.0; - frame.size.width *= 1/3.0; - - window_ar = frame.size.width/frame.size.height; - video_ar = 1.0*self.width/self.height; - - if (fabs(video_ar-window_ar) > 0.001) { - if (video_ar > window_ar) { - frame.size.height = frame.size.width/video_ar; - } else { - frame.size.width = frame.size.height*video_ar; - } - } - - self.capture.binary = true; - self.capture.binary.frame = frame; - } - - return size; -} - -- (void)quit:(id)item { - [NSApp terminate:self]; -} - -- (BOOL)show_luminance { - return [self.prefs boolForKey:@"show_luminance"]; -} - -- (BOOL)show_binary { - return [self.prefs boolForKey:@"show_binary"]; -} - -- (void)cancel { - [self.prefs setBool:NO forKey:@"fullscreen"]; - [self.window.contentView exitFullScreenModeWithOptions:nil]; -} - -- (void)luminance:(id)item { - [self.prefs setBool:![self.prefs boolForKey:@"show_luminance"] - forKey:@"show_luminance"]; - [item setState:[self.prefs boolForKey:@"show_luminance"]]; - if ([self.prefs boolForKey:@"show_luminance"]) { - self.capture.luminance = true; - [self.layer addSublayer:self.capture.luminance]; - [self resize:self.window.frame.size]; - } else { - [self.capture.luminance removeFromSuperlayer]; - self.capture.luminance = false; - } -} - -- (void)binary:(id)item { - [self.prefs setBool:![self.prefs boolForKey:@"show_binary"] - forKey:@"show_binary"]; - [item setState:[self.prefs boolForKey:@"show_binary"]]; - if ([self.prefs boolForKey:@"show_binary"]) { - self.capture.binary = true; - [self.layer addSublayer:self.capture.binary]; - [self resize:self.window.frame.size]; - } else { - [self.capture.binary removeFromSuperlayer]; - self.capture.binary = false; - } -} - -- (void)capture:(id)item { - NSDate* date = [NSDate date]; - time_t time = [date timeIntervalSince1970]; - struct tm timeStruct; - localtime_r(&time, &timeStruct); - char buffer[80]; - strftime(buffer, 80, "%Y-%m-%d at %I.%M.%S %p", &timeStruct); - NSString* now = - [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding]; - self.capture.captureToFilename = - [NSString stringWithFormat:@"%s/Desktop/ZXing capture %@.png", - getenv("HOME"), now]; -} - -- (void)fullscreen:(id)item { - [self.prefs setBool:![self.prefs boolForKey:@"fullscreen"] - forKey:@"fullscreen"]; - if ([self.prefs boolForKey:@"fullscreen"]) { - NSDictionary* options = - [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] - forKey:NSFullScreenModeAllScreens]; - [self.window.contentView - enterFullScreenMode:self.window.screen - withOptions:options]; - } else { - [self.window.contentView exitFullScreenModeWithOptions:nil]; - } -} - -- (void)resizeNotification:(NSNotification*)notification { - WindowView* wv = (WindowView*)notification.object; - [self resize:[self.window frameRectForContentRect:wv.bounds].size]; -} - -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - [self preferences]; - NSUInteger mask = - NSTitledWindowMask| - NSClosableWindowMask| - NSMiniaturizableWindowMask| - NSResizableWindowMask; - CGRect frame = - [NSWindow frameRectForContentRect:CGRectMake(0, 0, 640, 480) - styleMask:mask]; - self.window = - [[[NSWindow alloc] - initWithContentRect:frame - styleMask:mask - backing:NSBackingStoreBuffered - defer:NO] autorelease]; - - [self.window center]; - - [self.window setFrameAutosaveName:@"SomeWindow"]; - [self.window setFrameUsingName:@"SomeWindow"]; - - [NSApp setMainMenu:[[[Menu alloc] init] autorelease]]; - - self.capture = [[[ZXCapture alloc] init] autorelease]; - - self.window.title = @"ZXing"; - self.window.level = NSNormalWindowLevel; - self.window.delegate = self; - - self.window.contentView = [[[WindowView alloc] init] autorelease]; - - [NSNotificationCenter.defaultCenter - addObserver:self - selector:@selector(resizeNotification:) - name:NSViewFrameDidChangeNotification - object:self.window.contentView]; - - self.layer = CALayer.layer; - self.layer.frame = [self.window contentRectForFrameRect:self.window.frame]; - self.layer.backgroundColor = CGColorGetConstantColor(kCGColorBlack); - - [self.layer addSublayer:self.capture.layer]; - - if ([self.prefs boolForKey:@"show_luminance"]) { - self.capture.luminance = true; - [self.layer addSublayer:self.capture.luminance]; - } - - if ([self.prefs boolForKey:@"show_binary"]) { - self.capture.binary = true; - [self.layer addSublayer:self.capture.binary]; - } - - [self.window.contentView setLayer:self.layer]; - [self.window.contentView setWantsLayer:YES]; - CGRect contents = [self.window contentRectForFrameRect:self.window.frame]; - - self.text = - [[[NSTextView alloc] - initWithFrame:CGRectMake(0.1*contents.size.width, - 0.05*contents.size.height, - 0.8*contents.size.width, - 0.45*contents.size.height)] autorelease]; - self.text.horizontallyResizable = NO; - self.text.verticallyResizable = NO; - self.text.textContainerInset = CGSizeMake(10, 10); - self.text.textColor = [NSColor yellowColor]; - self.text.editable = NO; - self.text.font = [NSFont systemFontOfSize:36]; - self.text.alignment = NSCenterTextAlignment; - - [self.window.contentView addSubview:self.text]; - - self.text.backgroundColor = NSColor.clearColor; - self.text.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 1, 0.4); - self.text.layer.borderColor = CGColorCreateGenericRGB(1, 1, 1, 0.4); - self.text.layer.borderWidth = 2; - self.text.layer.cornerRadius = 10; - - [self.text setAlphaValue:0]; - - self.capture.delegate = self; - - [self.window orderFront:self.window]; - // [self.window makeKeyAndOrderFront:NSApp]; -} - -- (void)captureResult:(ZXCapture*)capture_ result:(ZXResult*)result { - NSString* value = result.text; - if (result.text != self.text.string) { - dispatch_async(dispatch_get_main_queue(), ^{ - self.text.string = result.text; - self.text.frame = self.text_frame; - double h = - height(result.text, self.text.font, self.text.frame.size.width); - h += 2*self.text.textContainerInset.height; - if (h <= [self.text frame].size.height) { - CGRect f = self.text.frame; - f.size.height = h; - self.text.frame = f; - } - [NSAnimationContext beginGrouping]; - NSAnimationContext.currentContext.duration = 0.8; - [self.text.animator setAlphaValue:0.9]; - [NSAnimationContext endGrouping]; - - dispatch_after( - dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), - dispatch_get_main_queue(), - ^{ - if ([self.text.string isEqualToString:value] || - [self.text.string isEqualToString:@""]) { - [NSAnimationContext beginGrouping]; - NSAnimationContext.currentContext.duration = 0.8; - [self.text.animator setAlphaValue:0]; - [NSAnimationContext endGrouping]; - dispatch_after( - dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), - dispatch_get_main_queue(), - ^{ - if (self.text.string == value) { - self.text.string = @""; - } - }); - } - }); - NSLog(@"%@", result.text); - }); - if (![self.prefs boolForKey:@"continuous"]) { - [self.capture stop]; - [NSApp - performSelectorOnMainThread:@selector(terminate:) - withObject:self - waitUntilDone:false]; - } - } -} - -- (void)captureSize:(ZXCapture*)capture_ - width:(NSNumber*)width - height:(NSNumber*)height { - self.width = [width doubleValue]; - self.height = [height doubleValue]; - dispatch_async(dispatch_get_main_queue(), ^{ - [self resize:self.window.frame.size]; - [self.window orderFrontRegardless]; - }); -} - -@end - -@implementation WindowView -- (void)cancelOperation:(id)sender { - AppDelegate* d = (AppDelegate*)[NSApp delegate]; - [d cancel]; -} -@end - -@implementation Menu -- (id)init { - if ((self = [super initWithTitle:@""])) { - NSString* name = NSRunningApplication.currentApplication.localizedName; - - NSMutableArray* items = [NSMutableArray arrayWithCapacity:0]; - - { NSMutableArray* apple = [NSMutableArray arrayWithCapacity:0]; - - { NSMutableDictionary* about = [NSMutableDictionary dictionaryWithCapacity:0]; - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:[NSString stringWithFormat:@"About %@", name] - forKey:@"title"]; - [about setObject:contents forKey:@"about"]; } - [apple addObject:about]; } - - [apple addObject:@"separator"]; - - { NSMutableDictionary* services = [NSMutableDictionary dictionaryWithCapacity:0]; - [apple addObject:services]; } - - [apple addObject:@"separator"]; - - { NSMutableDictionary* hide = [NSMutableDictionary dictionaryWithCapacity:0]; - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:[NSString stringWithFormat:@"Hide %@", name] - forKey:@"title"]; - [contents setObject:@"cmd:h" forKey:@"key"]; - [hide setObject:contents forKey:@"hide"]; } - [apple addObject:hide]; } - - { NSMutableDictionary* hide_others = [NSMutableDictionary dictionaryWithCapacity:0]; - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:@"cmd:opt:h" forKey:@"key"]; - [hide_others setObject:contents forKey:@"hide_others"]; } - [apple addObject:hide_others]; } - - [apple addObject:@"show_all"]; - - [apple addObject:@"separator"]; - - { NSMutableDictionary* quit = [NSMutableDictionary dictionaryWithCapacity:0]; - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:[NSString stringWithFormat:@"Quit %@", name] - forKey:@"title"]; - [contents setObject:@"cmd:q" forKey:@"key"]; - [quit setObject:contents forKey:@"quit"]; } - [apple addObject:quit]; } - - [items addObject:[NSDictionary dictionaryWithObject:apple forKey:@"apple"]]; } - - { NSMutableDictionary* view = [NSMutableDictionary dictionaryWithCapacity:0]; - - { NSMutableDictionary* key = [NSMutableDictionary dictionaryWithCapacity:0]; - [key setObject:@"View" forKey:@"title"]; - - NSMutableArray* contents = [NSMutableArray arrayWithCapacity:0]; - - { NSMutableDictionary* fullscreen = [NSMutableDictionary dictionaryWithCapacity:0]; - - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:@"cmd:f" forKey:@"key"]; - [fullscreen setObject:contents forKey:@"fullscreen"]; } - - [contents addObject:fullscreen]; } - - { NSMutableDictionary* capture = [NSMutableDictionary dictionaryWithCapacity:0]; - - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:@"cmd:c" forKey:@"key"]; - [capture setObject:contents forKey:@"capture"]; } - [contents addObject:capture]; } - - AppDelegate* ad = (AppDelegate*)[NSApp delegate]; - - { NSMutableDictionary* luminance = [NSMutableDictionary dictionaryWithCapacity:0]; - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:@"cmd:l" forKey:@"key"]; - [contents setObject:[NSNumber numberWithBool:ad.show_luminance] - forKey:@"state"]; - [luminance setObject:contents forKey:@"luminance"]; } - [contents addObject:luminance]; } - - { NSMutableDictionary* binary = [NSMutableDictionary dictionaryWithCapacity:0]; - { NSMutableDictionary* contents = [NSMutableDictionary dictionaryWithCapacity:0]; - [contents setObject:@"cmd:b" forKey:@"key"]; - [contents setObject:[NSNumber numberWithBool:ad.show_binary] - forKey:@"state"]; - [binary setObject:contents forKey:@"binary"]; } - [contents addObject:binary]; } - - [view setObject:contents forKey:key]; } - - [items addObject:[NSDictionary dictionaryWithObject:view forKey:@"view"]]; } - - [items addObject:[NSDictionary dictionaryWithObject:[NSArray array] forKey:@"window"]]; - [items addObject:[NSDictionary dictionaryWithObject:[NSArray array] forKey:@"help"]]; - - [self items:items]; - } - - return self; -} - -- (void)items:(id)args_ { - NSArray* args = nil; - if ([args_ isKindOfClass:[NSArray class]]) { - args = args_; - } else { - args = [NSArray arrayWithObject:args_]; - } - - for (id arg in args) { - if ([arg isKindOfClass:[NSArray class]]) { - [[[Item alloc] initWithMenu:self arg:arg] autorelease]; - } else if ([arg isKindOfClass:[NSDictionary class]]) { - for(id key in arg) { - id value = [arg objectForKey:key]; - [[[Item alloc] initWithMenu:self - arg:[NSDictionary dictionaryWithObject:value forKey:key]] autorelease]; - } - } - } - [self update]; -} -@end - -@implementation Item - -- (void)params:(NSDictionary*)params { - for(id key_ in params) { - if (![key_ isKindOfClass:[NSString class]]) { - throw "don't understand param"; - } - NSString* key = (NSString*)key_; - id value = [params objectForKey:key]; - if ([key isEqualToString:@"title"]) { - self.title = value; - } else if ([key isEqualToString:@"key"]) { - if (![value isKindOfClass:[NSString class]]) { - throw "don't understand value"; - } - NSString* string = (NSString*)value; - NSString* ke = nil; - NSUInteger m = 0; - for(id v in [string componentsSeparatedByString: @":"]) { - NSString* string = (NSString*)v; - if ([string isEqualToString:@"cmd"]) { - m |= NSCommandKeyMask; - } else if ([string isEqualToString:@"ctl"]) { - m |= NSControlKeyMask; - } else if ([string isEqualToString:@"shift"]) { - m |= NSShiftKeyMask; - } else if ([string isEqualToString:@"opt"]) { - m |= NSAlternateKeyMask; - } else { - ke = string; - } - } - self.keyEquivalent = ke; - self.keyEquivalentModifierMask = m; - } else if ([key isEqualToString:@"state"]) { - if (![value isKindOfClass:[NSNumber class]]) { - throw "don't understand param #{key}: #{value}"; - } - self.state = [(NSNumber*)value boolValue]; - } else { - throw "don't understand param #{key}: #{value}"; - } - } -} - - -- (id)initWithMenu:(Menu*)parent arg:(id)arg { - if ((self = [super initWithTitle:@"" action:nil keyEquivalent:@""])) { - self.target = [NSApp delegate]; - self.enabled = true; - Menu* menu = nil; - NSDictionary* dict = nil; - if ([arg isKindOfClass:[NSDictionary class]]) { - dict = (NSDictionary*)arg; - } - if (dict) { - if ([dict count] != 1) { - throw "not sure what #{arg} means 0"; - } - id key = [[dict keyEnumerator] nextObject]; - id value = [dict objectForKey:key]; - if ([key isKindOfClass:[NSString class]]) { - NSString* s = (NSString*)key; - self.action = NSSelectorFromString([NSString stringWithFormat:@"%@:", s]); - self.title = - [[s stringByReplacingOccurrencesOfString:@"_" withString:@" "] capitalizedString]; - } else if ([key isKindOfClass:[NSDictionary class]]) { - [self params:key]; - } else { - throw "not sure what #{key} means 1"; - } - if ([value isKindOfClass:[NSString class]]) { - throw "oops"; - } else if ([value isKindOfClass:[NSArray class]]) { - menu = [[[Menu alloc] initWithTitle:self.title] autorelease]; - [menu items:value]; - } else if ([value isKindOfClass:[NSDictionary class]]) { - NSDictionary* dict = (NSDictionary*)value; - if ([dict count] == 1 && - [[[dict keyEnumerator] nextObject] - isKindOfClass:[NSDictionary class]]) { - [self params:[[dict keyEnumerator] nextObject]]; - menu = [[[Menu alloc] initWithTitle:self.title] autorelease]; - [menu items:[dict objectForKey:[[dict keyEnumerator] nextObject]]]; - } else { - [self params:value]; - } - } else { - throw "not sure what #{value} means 2"; - } - } else { - throw "implement #{arg.class} item arg #{arg}"; - } - [parent addItem:self]; - if (dict && menu) { - NSString* first = nil; - if ([[dict objectForKey:[[dict keyEnumerator] nextObject]] - isKindOfClass:[NSString class]]) { - first = (NSString*)[dict objectForKey:[[dict keyEnumerator] nextObject]]; - } - if (first) { - if ([first isEqualToString:@"apple"]) { - // [NSApp setAppleMenu:menu]; - [NSApp performSelector:@selector(setAppleMenu:) withObject:menu]; - } else if ([first isEqualToString:@"services"]) { - [NSApp setServicesMenu:menu]; - } else if ([first isEqualToString:@"window"]) { - [NSApp setWindowsMenu:menu]; - } - } - self.action = nil; - self.target = nil; - [parent setSubmenu:menu forItem:self]; - } - } - return self; -} - -@end diff --git a/objc/examples/osx/bare/bare/bare-Info.plist b/objc/examples/osx/bare/bare/bare-Info.plist deleted file mode 100644 index 2c55d7fba..000000000 --- a/objc/examples/osx/bare/bare/bare-Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - zxing.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} - NSHumanReadableCopyright - Copyright 2012 ZXing authors. Licensed under Apache Public License 2.0. - NSPrincipalClass - NSApplication - - diff --git a/objc/examples/osx/bare/bare/bare-Prefix.pch b/objc/examples/osx/bare/bare/bare-Prefix.pch deleted file mode 100644 index 138a17ae9..000000000 --- a/objc/examples/osx/bare/bare/bare-Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'bare' target in the 'bare' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/objc/examples/osx/bare/bare/main.mm b/objc/examples/osx/bare/bare/main.mm deleted file mode 100644 index e1933512d..000000000 --- a/objc/examples/osx/bare/bare/main.mm +++ /dev/null @@ -1,34 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2012 ZXing authors - * - * 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. - */ - -#import -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - // return NSApplicationMain(argc, (const char **)argv); - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - [NSApplication sharedApplication]; - - AppDelegate *appDelegate = [[AppDelegate alloc] init]; - [NSApp setDelegate:appDelegate]; - [NSApp run]; - [pool release]; - return 0; - -} diff --git a/objc/examples/osx/demo/demo.xcodeproj/project.pbxproj b/objc/examples/osx/demo/demo.xcodeproj/project.pbxproj deleted file mode 100644 index ac165d052..000000000 --- a/objc/examples/osx/demo/demo.xcodeproj/project.pbxproj +++ /dev/null @@ -1,422 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B5D0F77159101EE00C33931 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0F76159101EE00C33931 /* Cocoa.framework */; }; - 3B5D0F81159101EE00C33931 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B5D0F7F159101EE00C33931 /* InfoPlist.strings */; }; - 3B5D0F83159101EE00C33931 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B5D0F82159101EE00C33931 /* main.m */; }; - 3B5D0F87159101EE00C33931 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 3B5D0F85159101EE00C33931 /* Credits.rtf */; }; - 3B5D0F8A159101EE00C33931 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B5D0F89159101EE00C33931 /* AppDelegate.m */; }; - 3B5D0F8D159101EF00C33931 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B5D0F8B159101EF00C33931 /* MainMenu.xib */; }; - 3B5D0FA61591143900C33931 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0FA51591143900C33931 /* QTKit.framework */; }; - 3B5D0FA71591144700C33931 /* zxing-objc-framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0FA21591090C00C33931 /* zxing-objc-framework.framework */; }; - 3B5D0FC6159117C200C33931 /* applogo.icns in Resources */ = {isa = PBXBuildFile; fileRef = 3B5D0FBE159117C200C33931 /* applogo.icns */; }; - 3B5D0FC7159117C200C33931 /* beepbeep.aif in Resources */ = {isa = PBXBuildFile; fileRef = 3B5D0FC0159117C200C33931 /* beepbeep.aif */; }; - 3B5D0FC8159117C200C33931 /* zxinglogo.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B5D0FC2159117C200C33931 /* zxinglogo.png */; }; - 3B5D0FC9159117C200C33931 /* ZXingType.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B5D0FC4159117C200C33931 /* ZXingType.png */; }; - 3B5D0FE815911BFF00C33931 /* zxing-objc-framework.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3B5D0FA21591090C00C33931 /* zxing-objc-framework.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3B5D0F9F1591090C00C33931 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3B5D0F931591090B00C33931 /* zxing-objc.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B83EB25158E6C5100A3B31F; - remoteInfo = "zxing-objc"; - }; - 3B5D0FA11591090C00C33931 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3B5D0F931591090B00C33931 /* zxing-objc.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B83EB90158E71AD00A3B31F; - remoteInfo = "zxing-objc-framework"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 3B5D0FE715911BF100C33931 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B5D0FE815911BFF00C33931 /* zxing-objc-framework.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B5D0F72159101EE00C33931 /* demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B5D0F76159101EE00C33931 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 3B5D0F79159101EE00C33931 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - 3B5D0F7B159101EE00C33931 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 3B5D0F7E159101EE00C33931 /* demo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "demo-Info.plist"; sourceTree = ""; }; - 3B5D0F80159101EE00C33931 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 3B5D0F82159101EE00C33931 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 3B5D0F84159101EE00C33931 /* demo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "demo-Prefix.pch"; sourceTree = ""; }; - 3B5D0F86159101EE00C33931 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; - 3B5D0F88159101EE00C33931 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 3B5D0F89159101EE00C33931 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 3B5D0F8C159101EF00C33931 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; - 3B5D0F931591090B00C33931 /* zxing-objc.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "zxing-objc.xcodeproj"; path = "../../../zxing-objc.xcodeproj"; sourceTree = ""; }; - 3B5D0FA51591143900C33931 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; - 3B5D0FBF159117C200C33931 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = en; path = en.lproj/applogo.icns; sourceTree = ""; }; - 3B5D0FC1159117C200C33931 /* en */ = {isa = PBXFileReference; lastKnownFileType = file; name = en; path = en.lproj/beepbeep.aif; sourceTree = ""; }; - 3B5D0FC3159117C200C33931 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = en.lproj/zxinglogo.png; sourceTree = ""; }; - 3B5D0FC5159117C200C33931 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = en.lproj/ZXingType.png; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3B5D0F6F159101EE00C33931 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5D0FA71591144700C33931 /* zxing-objc-framework.framework in Frameworks */, - 3B5D0FA61591143900C33931 /* QTKit.framework in Frameworks */, - 3B5D0F77159101EE00C33931 /* Cocoa.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3B5D0F67159101EE00C33931 = { - isa = PBXGroup; - children = ( - 3B5D0F931591090B00C33931 /* zxing-objc.xcodeproj */, - 3B5D0F7C159101EE00C33931 /* demo */, - 3B5D0F75159101EE00C33931 /* Frameworks */, - 3B5D0F73159101EE00C33931 /* Products */, - ); - sourceTree = ""; - }; - 3B5D0F73159101EE00C33931 /* Products */ = { - isa = PBXGroup; - children = ( - 3B5D0F72159101EE00C33931 /* demo.app */, - ); - name = Products; - sourceTree = ""; - }; - 3B5D0F75159101EE00C33931 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3B5D0F76159101EE00C33931 /* Cocoa.framework */, - 3B5D0F78159101EE00C33931 /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3B5D0F78159101EE00C33931 /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 3B5D0FA51591143900C33931 /* QTKit.framework */, - 3B5D0F79159101EE00C33931 /* AppKit.framework */, - 3B5D0F7B159101EE00C33931 /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 3B5D0F7C159101EE00C33931 /* demo */ = { - isa = PBXGroup; - children = ( - 3B5D0F88159101EE00C33931 /* AppDelegate.h */, - 3B5D0F89159101EE00C33931 /* AppDelegate.m */, - 3B5D0F8B159101EF00C33931 /* MainMenu.xib */, - 3B5D0F7D159101EE00C33931 /* Supporting Files */, - ); - path = demo; - sourceTree = ""; - }; - 3B5D0F7D159101EE00C33931 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 3B5D0FBE159117C200C33931 /* applogo.icns */, - 3B5D0FC0159117C200C33931 /* beepbeep.aif */, - 3B5D0FC2159117C200C33931 /* zxinglogo.png */, - 3B5D0FC4159117C200C33931 /* ZXingType.png */, - 3B5D0F7E159101EE00C33931 /* demo-Info.plist */, - 3B5D0F7F159101EE00C33931 /* InfoPlist.strings */, - 3B5D0F82159101EE00C33931 /* main.m */, - 3B5D0F84159101EE00C33931 /* demo-Prefix.pch */, - 3B5D0F85159101EE00C33931 /* Credits.rtf */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 3B5D0F941591090B00C33931 /* Products */ = { - isa = PBXGroup; - children = ( - 3B5D0FA01591090C00C33931 /* libzxing-objc.a */, - 3B5D0FA21591090C00C33931 /* zxing-objc-framework.framework */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 3B5D0F71159101EE00C33931 /* demo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3B5D0F90159101EF00C33931 /* Build configuration list for PBXNativeTarget "demo" */; - buildPhases = ( - 3B5D0F6E159101EE00C33931 /* Sources */, - 3B5D0F6F159101EE00C33931 /* Frameworks */, - 3B5D0F70159101EE00C33931 /* Resources */, - 3B5D0FE715911BF100C33931 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = demo; - productName = demo; - productReference = 3B5D0F72159101EE00C33931 /* demo.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3B5D0F69159101EE00C33931 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0450; - }; - buildConfigurationList = 3B5D0F6C159101EE00C33931 /* Build configuration list for PBXProject "demo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 3B5D0F67159101EE00C33931; - productRefGroup = 3B5D0F73159101EE00C33931 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 3B5D0F941591090B00C33931 /* Products */; - ProjectRef = 3B5D0F931591090B00C33931 /* zxing-objc.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 3B5D0F71159101EE00C33931 /* demo */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 3B5D0FA01591090C00C33931 /* libzxing-objc.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libzxing-objc.a"; - remoteRef = 3B5D0F9F1591090C00C33931 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3B5D0FA21591090C00C33931 /* zxing-objc-framework.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = "zxing-objc-framework.framework"; - remoteRef = 3B5D0FA11591090C00C33931 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 3B5D0F70159101EE00C33931 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5D0F81159101EE00C33931 /* InfoPlist.strings in Resources */, - 3B5D0F87159101EE00C33931 /* Credits.rtf in Resources */, - 3B5D0F8D159101EF00C33931 /* MainMenu.xib in Resources */, - 3B5D0FC6159117C200C33931 /* applogo.icns in Resources */, - 3B5D0FC7159117C200C33931 /* beepbeep.aif in Resources */, - 3B5D0FC8159117C200C33931 /* zxinglogo.png in Resources */, - 3B5D0FC9159117C200C33931 /* ZXingType.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 3B5D0F6E159101EE00C33931 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5D0F83159101EE00C33931 /* main.m in Sources */, - 3B5D0F8A159101EE00C33931 /* AppDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 3B5D0F7F159101EE00C33931 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 3B5D0F80159101EE00C33931 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 3B5D0F85159101EE00C33931 /* Credits.rtf */ = { - isa = PBXVariantGroup; - children = ( - 3B5D0F86159101EE00C33931 /* en */, - ); - name = Credits.rtf; - sourceTree = ""; - }; - 3B5D0F8B159101EF00C33931 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 3B5D0F8C159101EF00C33931 /* en */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; - 3B5D0FBE159117C200C33931 /* applogo.icns */ = { - isa = PBXVariantGroup; - children = ( - 3B5D0FBF159117C200C33931 /* en */, - ); - name = applogo.icns; - sourceTree = ""; - }; - 3B5D0FC0159117C200C33931 /* beepbeep.aif */ = { - isa = PBXVariantGroup; - children = ( - 3B5D0FC1159117C200C33931 /* en */, - ); - name = beepbeep.aif; - sourceTree = ""; - }; - 3B5D0FC2159117C200C33931 /* zxinglogo.png */ = { - isa = PBXVariantGroup; - children = ( - 3B5D0FC3159117C200C33931 /* en */, - ); - name = zxinglogo.png; - sourceTree = ""; - }; - 3B5D0FC4159117C200C33931 /* ZXingType.png */ = { - isa = PBXVariantGroup; - children = ( - 3B5D0FC5159117C200C33931 /* en */, - ); - name = ZXingType.png; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 3B5D0F8E159101EF00C33931 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - objc/cpp/core/src, - objc/src, - ); - MACOSX_DEPLOYMENT_TARGET = 10.7; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 3B5D0F8F159101EF00C33931 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - objc/cpp/core/src, - objc/src, - ); - MACOSX_DEPLOYMENT_TARGET = 10.7; - SDKROOT = macosx; - }; - name = Release; - }; - 3B5D0F91159101EF00C33931 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "demo/demo-Prefix.pch"; - INFOPLIST_FILE = "demo/demo-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 3B5D0F92159101EF00C33931 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "demo/demo-Prefix.pch"; - INFOPLIST_FILE = "demo/demo-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3B5D0F6C159101EE00C33931 /* Build configuration list for PBXProject "demo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B5D0F8E159101EF00C33931 /* Debug */, - 3B5D0F8F159101EF00C33931 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3B5D0F90159101EF00C33931 /* Build configuration list for PBXNativeTarget "demo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B5D0F91159101EF00C33931 /* Debug */, - 3B5D0F92159101EF00C33931 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3B5D0F69159101EE00C33931 /* Project object */; -} diff --git a/objc/examples/osx/demo/demo/AppDelegate.h b/objc/examples/osx/demo/demo/AppDelegate.h deleted file mode 100644 index c48bdb9a0..000000000 --- a/objc/examples/osx/demo/demo/AppDelegate.h +++ /dev/null @@ -1,124 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011-2012 ZXing authors - * - * 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. - */ - -#import - -#import "Defs.h" -#import -#import -//#import - -// -------------------------------------------------------------------- - -@interface AppDelegate : NSObject -{ -@private - - IBOutlet NSWindow* mainWindow; - IBOutlet NSView* mainView; - IBOutlet NSView* previewView; - IBOutlet NSView* binaryView; - IBOutlet NSView* luminanceView; - IBOutlet NSTextField* resultsText; - IBOutlet NSPopUpButton* sourceSelectPopupMenu; - IBOutlet NSButton* mirrorVideoCheckbox; - IBOutlet NSButton* soundsCheckbox; - IBOutlet NSButton* appLogoButton; - IBOutlet NSButton* captureButton; - IBOutlet NSBox* previewBox; - IBOutlet NSBox* binaryBox; - IBOutlet NSBox* luminanceBox; - - ZXCapture* zxingEngine; - CALayer* captureLayer; - //ZXOverlay* resultsLayer; - QTCaptureDevice* captureDevice; - NSUserDefaults* userdefaults; - NSMutableArray* allVideoDevices; - CVImageBufferRef currentImageBuffer; - NSString* currentVideoSourceName; - BOOL mirrorVideoMode; - NSSound* resultsSound; -} - -// -------------------------------------------------------------------- - -@property (nonatomic, retain) IBOutlet NSWindow* mainWindow; -@property (nonatomic, retain) IBOutlet NSTextField* resultsText; - -@property (nonatomic, retain) IBOutlet NSView* mainView; - -@property (nonatomic, retain) IBOutlet NSView* binaryView; -@property (nonatomic, retain) IBOutlet NSView* luminanceView; -@property (nonatomic, retain) IBOutlet NSView* previewView; - -@property (nonatomic, retain) IBOutlet NSBox* previewBox; -@property (nonatomic, retain) IBOutlet NSBox* binaryBox; -@property (nonatomic, retain) IBOutlet NSBox* luminanceBox; - - -@property (nonatomic, retain) IBOutlet NSPopUpButton* sourceSelectPopupMenu; -@property (nonatomic, retain) IBOutlet NSButton* mirrorVideoCheckbox; -@property (nonatomic, retain) IBOutlet NSButton* soundsCheckbox; -@property (nonatomic, retain) IBOutlet NSButton* appLogoButton; -@property (nonatomic, retain) IBOutlet NSButton* captureButton; - -@property (nonatomic, retain) NSUserDefaults* userdefaults; -@property (nonatomic, retain) ZXCapture* zxingEngine; -//@property (nonatomic, retain) ZXOverlay* resultsLayer; - -@property (nonatomic, retain) CALayer* captureLayer; -@property (nonatomic, retain) QTCaptureDevice* captureDevice; - -@property (nonatomic, assign) CVImageBufferRef currentImageBuffer; -@property (nonatomic, retain) NSArray* allVideoDevices; -@property (nonatomic, retain) NSString* currentVideoSourceName; -@property (nonatomic, assign) BOOL mirrorVideoMode; -@property (nonatomic, retain) NSSound* resultsSound; - -// -------------------------------------------------------------------- - -- (IBAction) windowWillClose:(NSNotification *)notification; -- (IBAction) selectedVideoSourceChange:(id) sender; -- (IBAction) captureButtonPressed:(id) sender; -- (IBAction) mirrorCheckboxPressed:(id) sender; -- (IBAction) soundsCheckboxPressed:(id) sender; -- (IBAction) zxingImagePressed:(id) sender; -- (IBAction) configureForVideoSource:(id) sender; -- (void) awakeFromNib; - -- (void) applicationDidFinishLaunching:(NSNotification *)notification; -- (void) applicationWillTerminate:(NSNotification *)notification; -- (void) setupPreferences:(BOOL) forceReset; -- (void) setupSound; - -- (ZXCapture*) createZXcapture; - -- (void) performVideoSourceScan; - -- (CGRect) shrinkContentRect:(NSRect) inRect; -- (void) manageOverlay:(ZXResult*) inResult; -- (void) presentOverlayForPoints:(CGPoint)point0 - pt1:(CGPoint)point1 - pt2:(CGPoint)point2; - -//- (void) setupVideoSourceMenuForName:(NSString*) displayName; - -- (void) exitTheApp; - -// --------------------------------------------------------------------- -@end diff --git a/objc/examples/osx/demo/demo/AppDelegate.m b/objc/examples/osx/demo/demo/AppDelegate.m deleted file mode 100644 index 7eb1bbf75..000000000 --- a/objc/examples/osx/demo/demo/AppDelegate.m +++ /dev/null @@ -1,736 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011-2012 ZXing authors - * - * 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. - */ - - -#import "AppDelegate.h" -#import - -@implementation AppDelegate - -@synthesize mainWindow; -@synthesize mainView; -@synthesize binaryView; -@synthesize luminanceView; -@synthesize previewBox; -@synthesize binaryBox; -@synthesize luminanceBox; - -@synthesize previewView; -@synthesize userdefaults; -@synthesize zxingEngine; -@synthesize captureLayer; -//@synthesize resultsLayer; -@synthesize captureDevice; -@synthesize mirrorVideoMode; -@synthesize resultsText; -@synthesize captureButton; - -@synthesize sourceSelectPopupMenu; -@synthesize mirrorVideoCheckbox; -@synthesize soundsCheckbox; -@synthesize appLogoButton; -@synthesize currentImageBuffer; -@synthesize allVideoDevices; -@synthesize currentVideoSourceName; -@synthesize resultsSound; - - -// ---------------------------------------------------------------------------------------- - -- (void) awakeFromNib -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::awakeFromNib - ENTER"); -#endif - - allVideoDevices = [[NSMutableArray alloc] init]; - [self setUserdefaults:[NSUserDefaults standardUserDefaults]]; -} - -// ---------------------------------------------------------------------------------------- - -- (void)applicationDidFinishLaunching:(NSNotification*) aNotification -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::applicationDidFinishLaunching - ENTER"); -#endif - - BOOL forcePrefsReset = NO; - - [self setupPreferences:forcePrefsReset]; - [self setupSound]; - - zxingEngine = [self createZXcapture]; - - NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; - if(nil != nc) - { - [nc addObserver: self - selector: @selector(windowWillClose:) - name: @"NSWindowWillCloseNotification" - object: nil]; - } - - - // NSRect NSRectFromCGRect(CGRect cgrect); - // CGRect NSRectToCGRect(NSrect nsrect); - - if(nil != zxingEngine) - { - CALayer* layertemp = nil; // this is used for debugging - NSRect nsRect; - CGRect cgRect; - - zxingEngine.binary = YES; - zxingEngine.luminance = YES; - - // create a layer where the raw video will appear - captureLayer = [zxingEngine layer]; - - if(nil != captureLayer) - { - // CALayer CGRect for capturePayer is going to be all ZEROES - nsRect = [[previewBox contentView] frame]; - cgRect = [self shrinkContentRect:nsRect]; - - [captureLayer setFrame:cgRect]; - [captureLayer setBackgroundColor:kBACKGROUNDCOLOR]; - [previewView setLayer:captureLayer]; - [previewView setWantsLayer:YES]; - - layertemp = zxingEngine.luminance; - if((nil != layertemp) && (nil != luminanceView)) - { - nsRect = [[luminanceBox contentView] frame]; - cgRect = [self shrinkContentRect:nsRect]; - [layertemp setFrame:cgRect]; - [luminanceView setLayer:layertemp]; - } - - layertemp = zxingEngine.binary; - if((nil != layertemp) & (nil != binaryView)) - { - nsRect = [[binaryBox contentView] frame]; - cgRect = [self shrinkContentRect:nsRect]; - [layertemp setFrame:cgRect]; - [binaryView setLayer:layertemp]; - } - - [self performVideoSourceScan]; - - [captureButton setTitle:kCANCELTITLE]; - - if((nil == captureDevice) && (nil != allVideoDevices) && (0 < [allVideoDevices count])) - { - [self setCaptureDevice:(QTCaptureDevice*)[allVideoDevices objectAtIndex:0]]; - } - - - zxingEngine.captureDevice = captureDevice; - zxingEngine.delegate = self; - zxingEngine.mirror = mirrorVideoMode; - [zxingEngine start]; - } - } -} - -// ------------------------------------------------------------------------------------- - -- (void) applicationWillTerminate:(NSNotification *)notification -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::applicationWillTerminate - ENTER"); -#endif - - // anything needed to be done on the way out? -} - -// ------------------------------------------------------------------------------------- - -- (IBAction) windowWillClose:(NSNotification *)notification -{ - static Boolean beenhere = FALSE; - - NSWindow* theWindow = (NSWindow*)[notification object]; - - if(((mainWindow == theWindow) || (nil == notification)) && (beenhere == FALSE)) - { -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::windowWillClose - ENTER"); -#endif - - beenhere = TRUE; - [self exitTheApp]; // call this from here? - } -} - -// ------------------------------------------------------------------------------------- - -- (void) dealloc -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::dealloc - ENTER"); -#endif - - [allVideoDevices removeAllObjects]; - [allVideoDevices release]; - - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [super dealloc]; -} - -// ------------------------------------------------------------------------------------ - -- (void) exitTheApp -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::exitTheApp - ENTER"); -#endif - - static Boolean beenhere = FALSE; - - if(FALSE == beenhere) - { - // shutdown all of the open windows, resources, streams, etc. - - beenhere = TRUE; - [NSApp terminate:nil]; - } -} - -// ------------------------------------------------------------------------------------------ -// Find all video input devices for DISPLAY IN POPUP MENU - This does not initialize anything - -- (void) performVideoSourceScan -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"ZXSourceSelect::performVideoSourceScan - ENTER"); -#endif - - NSUInteger dex = 0; - OSErr err = noErr; - NSString* theitemtitle = nil; - NSMenuItem* themenuitem = nil; - NSArray* theQTarray = nil; - - if(nil != sourceSelectPopupMenu) - { - NSUInteger count; - [sourceSelectPopupMenu removeAllItems]; // wipe popup menu clean - - [sourceSelectPopupMenu addItemWithTitle:kIMAGESOURCESELECTIONPOPUPTITLE]; // always the top item - - [allVideoDevices removeAllObjects]; // wipe array of video devices clean - - // acquire unmuxed devices - theQTarray = [NSArray arrayWithArray:[QTCaptureDevice inputDevicesWithMediaType:QTMediaTypeVideo]]; - if((nil != theQTarray) && (0 < [theQTarray count])) - [allVideoDevices addObjectsFromArray:theQTarray]; - - // acquire muxed devices - theQTarray = [NSArray arrayWithArray:[QTCaptureDevice inputDevicesWithMediaType:QTMediaTypeMuxed]]; - if((nil != theQTarray) && (0 < [theQTarray count])) - [allVideoDevices addObjectsFromArray:theQTarray]; - - // did anything show up? - count = [allVideoDevices count]; - if(0 < count) - { - for(dex = 0; dex < count; dex++) - { - QTCaptureDevice* aVideoDevice = (QTCaptureDevice*)[allVideoDevices objectAtIndex:dex]; - if(nil != aVideoDevice) - { - theitemtitle = [aVideoDevice localizedDisplayName]; - [sourceSelectPopupMenu addItemWithTitle:theitemtitle]; // NSPopUpButton - - themenuitem = [sourceSelectPopupMenu itemWithTitle:theitemtitle]; - [themenuitem setTag:(dex+kVIDEOSOURCEOFFSET)]; - } - } - } - else // reset the menu - { - err = fnfErr; - [sourceSelectPopupMenu removeAllItems]; - [sourceSelectPopupMenu addItemWithTitle:kIMAGESOURCESELECTIONPOPUPTITLE]; - [sourceSelectPopupMenu addItemWithTitle:kIMAGESOURCESELECTIONRESCANTITLE]; - [self setCurrentVideoSourceName:kBLANKSTR]; - [userdefaults setObject:(id)kBLANKSTR forKey:kVIDEOSOURCETITLE]; - } - - if(noErr == err) - { - [sourceSelectPopupMenu addItemWithTitle:kIMAGESOURCESELECTIONRESCANTITLE]; - [sourceSelectPopupMenu addItemWithTitle:kIMAGESOURCESELECTIONDISCONNECT]; // Disconnect video Source - } - } -} - -// ------------------------------------------------------------------------------------------ -// called when user clicks in or selects an item in the popup menu - -- (IBAction) selectedVideoSourceChange:(id)sender -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"ZXSourceSelect::selectedVideoSourceChange - ENTER"); -#endif - - [self performSelectorOnMainThread:@selector(configureForVideoSource:) withObject:sender waitUntilDone:NO]; -} - -// ------------------------------------------------------------------------------------------ - -- (IBAction) configureForVideoSource:(id) sender -{ - NSPopUpButton* videoselections = (id) sender; - - if(nil != videoselections) - { - NSInteger numberOfItems = [videoselections numberOfItems]; - if(1 < numberOfItems) - { - NSMenuItem* selectedItem = [videoselections selectedItem]; - if(nil != selectedItem) - { - NSInteger tag = [selectedItem tag]; - - // See if it's a source or command that the user has selected - - if(kVIDEOSOURCEOFFSET > tag) // in this case, the user wants to rescan or disable - { - NSString* selectedItemTitle = [selectedItem title]; - if(nil != selectedItemTitle) - { - BOOL isDisableVideoRequest = (NSOrderedSame == [selectedItemTitle compare:kIMAGESOURCESELECTIONDISCONNECT]); - if(YES == isDisableVideoRequest) - { - [sourceSelectPopupMenu removeAllItems]; - [sourceSelectPopupMenu addItemWithTitle:kIMAGESOURCESELECTIONPOPUPTITLE]; - [sourceSelectPopupMenu addItemWithTitle:kIMAGESOURCESELECTIONRESCANTITLE]; - } - else - { - BOOL isRescanRequest = (NSOrderedSame == [selectedItemTitle compare:kIMAGESOURCESELECTIONRESCANTITLE]); - if(YES == isRescanRequest) - { - [self performVideoSourceScan]; - } - else - { - ; // nothing... - } - } - } - } - else // changing the selected video to a source that is (or was) known to exist - { - NSInteger devicecount = [allVideoDevices count]; - NSInteger tagindex = (tag - kVIDEOSOURCEOFFSET); - - if((0 <= tagindex) && (tagindex < devicecount)) - { - QTCaptureDevice* aCaptureDevice = (QTCaptureDevice*)[allVideoDevices objectAtIndex:tagindex]; - - if(nil != aCaptureDevice) - { - currentVideoSourceName = [aCaptureDevice localizedDisplayName]; - if(nil != currentVideoSourceName) - { - if(0 < [currentVideoSourceName length]) - { - [userdefaults setObject:kZXING_VIDEOSOURCENAME forKey:currentVideoSourceName]; - [userdefaults synchronize]; - - [zxingEngine stop]; - zxingEngine.captureDevice = aCaptureDevice; - zxingEngine.delegate = self; - zxingEngine.mirror = mirrorVideoMode; - [zxingEngine start]; - } - } - [self setCaptureDevice:aCaptureDevice]; // releases existing and retains the new device - } - } - else - { -#ifdef __DEBUG_LOGGING__ - NSLog(@"ERROR ZXSourceSelect::presentSourceSelectSheet - tag [%d] for [%@] outside bounds of allVideoDevices count [%d]", - (int)tag, [selectedItem title], (int)devicecount); -#endif - } - } - } - } - } -} - -// ------------------------------------------------------------------------------------------ - -- (IBAction) captureButtonPressed:(id) sender -{ -#pragma unused(sender) - -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::captureButtonPressed - ENTER"); -#endif - - if(!zxingEngine.running) - { - // Remove the RESULTS layer if it's there... - //if(nil != resultsLayer) - // { - // [resultsLayer removeFromSuperlayer]; - // [resultsLayer release]; - // resultsLayer = nil; - // } - -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::captureButtonPressed - zxingEngine was not running"); -#endif - - - [captureButton setTitle:kCANCELTITLE]; - [resultsText setStringValue:kBLANKSTR]; // NSTextField - - zxingEngine.captureDevice = captureDevice ; - zxingEngine.delegate = self; - zxingEngine.mirror = mirrorVideoMode; - - [zxingEngine start]; -} - else // isRunning - { - [zxingEngine stop]; - [captureButton setTitle:kCAPTURETITLE]; -} -} - -// ------------------------------------------------------------------------------------------ - -- (IBAction) mirrorCheckboxPressed:(id) sender -{ -#pragma unused(sender) - -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::mirrorCheckboxPressed - ENTER"); -#endif - - [self setMirrorVideoMode:[mirrorVideoCheckbox state]]; - - [userdefaults setBool:[self mirrorVideoMode] forKey:KZXING_MIRROR_VIDEO]; -} - -// ------------------------------------------------------------------------------------------ - -- (IBAction) soundsCheckboxPressed:(id) sender -{ -#pragma unused(sender) - -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::soundsCheckboxPressed - ENTER"); -#endif - - [userdefaults setBool:[soundsCheckbox state] forKey:KZXING_SOUND_ON_RESULT]; -} - -// ------------------------------------------------------------------------------------------ - -- (IBAction) zxingImagePressed:(id) sender -{ -#pragma unused(sender) - - BOOL success = NO; - NSURL* zxingweblink = [NSURL URLWithString:kZXINGWEBURL]; - - success = [[NSWorkspace sharedWorkspace] openURL:zxingweblink]; - -#ifdef __DEBUG_LOGGING__ - if (YES == success) - NSLog(@"AppDelegate::zxingImagePressed - ZXing website access successful."); - else - NSLog(@"AppDelegate::zxingImagePressed - ZXing website access failed."); -#endif -} - -// ------------------------------------------------------------------------------------------ -// The name of the video source saved into prefs is compared to the names in the popup menu -// if a match can be made, the menu is set so that item is the selected item and the actual -// captureDevice object reference is sent to the ZXCapture object -/* - - (void) setupVideoSourceMenuForName:(NSString*) inDisplayName - { - NSString* displayName = inDisplayName; - - if((nil == displayName) && (nil != allVideoDevices)) - { - NSString* savedName = [userdefaults objectForKey:kZXING_VIDEOSOURCENAME]; - if(nil == savedName) - { - NSInteger devicecount = [allVideoDevices count]; - if(0 < devicecount) - { - QTCaptureDevice* thedevice = [allVideoDevices objectAtIndex:0]; - if(nil != thedevice) - { - NSString* thelocalizedDisplayName = [thedevice localizedDisplayName]; - if(nil != thelocalizedDisplayName) - { - displayName = thelocalizedDisplayName; - [userdefaults setObject:displayName forKey:kZXING_VIDEOSOURCENAME]; - [userdefaults synchronize]; - } - } - } - } - else - { - displayName = savedName; - } - } - - if(nil != displayName) - { - NSInteger menuitemindex = [sourceSelectPopupMenu indexOfItemWithTitle:displayName]; - - if(kNO_SUCH_MENU_ITEM != menuitemindex) - { - if(nil != allVideoDevices) - { - // there is always a first item = 'Video Source Select' above the actual sources. - NSInteger adjustedindex = (menuitemindex - 1); - - if((0 <= adjustedindex) && (adjustedindex < [allVideoDevices count])) - { - QTCaptureDevice* aCaptureDevice = [allVideoDevices objectAtIndex:adjustedindex]; - if(nil != aCaptureDevice) - { - // double check - NSString* captureDeviceDisplayName = [aCaptureDevice localizedDisplayName]; - if(NSOrderedSame == [displayName compare:captureDeviceDisplayName]) - { - NSMenuItem* themenuitem = [sourceSelectPopupMenu itemWithTitle:displayName]; - [sourceSelectPopupMenu selectItemWithTitle:displayName]; - - [userdefaults setObject:displayName forKey:kZXING_VIDEOSOURCENAME]; - [userdefaults synchronize]; - [self setCurrentVideoSourceName:displayName]; - [self setCaptureDevice:aCaptureDevice]; - if(nil != themenuitem) - { - [themenuitem setTag:(menuitemindex+kVIDEOSOURCEOFFSET)]; - } - } - else - { - #ifdef __DEBUG_LOGGING__ - NSLog(@"ERROR ZXSourceSelect::setupVideoSourceMenuForName - Can't match [%@] in allVideoDevices", - displayName); - #endif - } - } - } - else - { - #ifdef __DEBUG_LOGGING__ - NSLog(@"ERROR ZXSourceSelect::setupVideoSourceMenuForName - 'adjustedindex' [%d] into allvideo Devices array", - (int)adjustedindex); - #endif - } - } - } - } - } -*/ -// ------------------------------------------------------------------------------------------ - -- (CGRect) shrinkContentRect:(NSRect) inRect -{ - CGRect result; - - result.origin.x = (inRect.origin.x + kLEFTVIDEOEASE); - result.origin.y = (inRect.origin.y + kTOPVIDEOEASE); - result.size.width = (inRect.size.width - kWIDTHVIDEOEASE); - result.size.height = (inRect.size.height - kHEIGHTVIDEOEASE); - - return(result); -} - -// ------------------------------------------------------------------------------------------ - -- (void) setupPreferences:(BOOL) forceReset -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::setupPerferences - ENTER - forceReset [%@]", ((YES == forceReset)?@"YES":@"NO")); -#endif - - // If there was nothing there, init - else leave previous settings in place - NSString* zxinglibsupport = (NSString*)[userdefaults objectForKey:kZXING_LIBSUPPORT]; - - if((nil == zxinglibsupport) || (YES == forceReset)) - { - [userdefaults setObject:kZXING_LIBSUPPORT forKey:kZXING_LIBSUPPORT]; - [userdefaults setBool:NO forKey:KZXING_MIRROR_VIDEO]; - [userdefaults setBool:YES forKey:KZXING_SOUND_ON_RESULT]; - - [userdefaults synchronize]; - } - - [self setMirrorVideoMode:(BOOL)[userdefaults boolForKey:KZXING_MIRROR_VIDEO]]; -} - -- (void) setMirrorVideoMode:(BOOL)mirror { - mirrorVideoMode = mirror; - zxingEngine.mirror = mirror; -} - - -// ----------------------------------------------------------------------------------------- - -- (ZXCapture*) createZXcapture -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::createZXcapture - ENTER"); -#endif - - ZXCapture* thecaptureobject = [[ZXCapture alloc] init]; - - return(thecaptureobject); -} - -// ----------------------------------------------------------------------------------------- - -- (void) setupSound -{ - BOOL playsounds = (BOOL)[userdefaults boolForKey:KZXING_SOUND_ON_RESULT]; - - [soundsCheckbox setState:playsounds]; - - NSSound* thesound = [NSSound soundNamed:kCAPTURESUCCESSSOUNDFILENAME]; - if(nil != thesound) - { - [self setResultsSound:thesound]; - } -} - -// ========================================================================================== -// -// ZXCaptureDelegate functions: - -- (void)captureResult:(ZXCapture*)zxCapture - result:(ZXResult*) inResult -{ -#ifdef __DEBUG_LOGGING_CAPTURE__ - NSLog(@"AppDelegate::captureResult - ENTER"); -#endif - - if(nil != inResult) - { - NSString* resultText = [inResult text]; - - if(nil != resultText) - { - [resultsText setStringValue:resultText]; - [self manageOverlay:inResult]; - - [zxingEngine stop]; // stop and wait for user to want to "Capture" again - - [captureButton setTitle:kCAPTURETITLE]; - -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::captureResult - inResult text[%@]", resultText); -#endif - - BOOL playSound = [soundsCheckbox state]; - if(YES == playSound) - { - if(nil != resultsSound) - { - [resultsSound play]; - } - } - } - } -} - -// ------------------------------------------------------------------------------------------ - -- (void) presentOverlayForPoints:(CGPoint)point0 - pt1:(CGPoint)point1 - pt2:(CGPoint)point2 -{ -#ifdef __DEBUG_LOGGING__ - NSLog(@"AppDelegate::presentOverlayForPoints - ENTER pt0X[%d] pt0Y[%d] pt1X[%d] pt1Y[%d] pt2X[%d] pt2Y[%d]", - (int)point0.x, (int)point0.y, (int)point1.x, (int)point1.y, (int)point2.x, (int)point2.y); -#endif - - -} - -// ------------------------------------------------------------------------------------------ - -- (void) manageOverlay:(ZXResult*) inResult -{ -#ifdef __DEBUG_LOGGING_CAPTURE__ - NSLog(@"AppDelegate::manageOverlay - ENTER"); -#endif - /* - #ifdef __SHOW_OVERLAY_LAYER__ - if(nil != resultsLayer) - { - [resultsLayer removeFromSuperlayer]; - [resultsLayer release]; - resultsLayer = nil; - } - - resultsLayer = [[ZXOverlay alloc] init]; - - // NSRect NSRectFromCGRect(CGRect cgrect); <- handy reference - // CGRect NSRectToCGRect(NSrect nsrect); - - NSRect resultsRect = [[previewBox contentView] frame]; // [self shrinkContentRect: - [resultsLayer setFrame:NSRectToCGRect(resultsRect)]; - [resultsLayer plotPointsOnLayer:inResult]; - [captureLayer addSublayer:resultsLayer]; - #endif - */ - -} - -// ------------------------------------------------------------------------------------------ -// This interface doesn't do anything with this... - -- (void)captureSize:(ZXCapture*) inCapture - width:(NSNumber*) inWidth - height:(NSNumber*) inHeight -{ -#pragma unused (inCapture, inWidth, inHeight) - -#ifdef __DEBUG_LOGGING__ - if((0 != [inWidth intValue]) && (0 != [inHeight intValue])) - { - NSLog(@"AppDelegate::captureSize - ENTER - inWidth [%d] inHeight [%d]", - [inWidth intValue], [inHeight intValue]); - } -#endif -} - - -// finish: ZXCaptureDelegate functions: -// ========================================================================================== - -@end diff --git a/objc/examples/osx/demo/demo/Defs.h b/objc/examples/osx/demo/demo/Defs.h deleted file mode 100644 index be663c3dd..000000000 --- a/objc/examples/osx/demo/demo/Defs.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __DEFS_H__ -#define __DEFS_H__ - - -#define kZXING_LIBSUPPORT @"dflts_zxing_libsupport" -#define KZXING_MIRROR_VIDEO @"dflts_zxing_mirrorvideo" -#define KZXING_SOUND_ON_RESULT @"dflts_zxing_soundonresult" -#define kZXING_VIDEOSOURCENAME @"dflts_zxing_videosourcename" -#define kVIDEOSOURCETITLE @"dflts_videosourcetitle" - -#define kIMAGESOURCESELECTIONPOPUPTITLE @"Select video source" -#define kIMAGESOURCESELECTIONRESCANTITLE @"ReScan for video Sources" -#define kIMAGESOURCESELECTIONDISCONNECT @"Disconnect video source" - -#define kCAPTURESUCCESSSOUNDFILENAME @"beepbeep.aif" - - -#define kBACKGROUNDCOLOR CGColorCreateGenericRGB(0.4,0.4,0.4,1.0) -#define kWHITEHAZECOLOR CGColorCreateGenericRGB(0.4,0.4,0.4,1.0) - -#define kLEFTVIDEOEASE 8.0 -#define kTOPVIDEOEASE 8.0 -#define kWIDTHVIDEOEASE (kLEFTVIDEOEASE*2) -#define kHEIGHTVIDEOEASE (kTOPVIDEOEASE*2) - -#define kZXINGWEBURL @"http://code.google.com/p/zxing/" - -#define kCANCELTITLE @"Cancel" -#define kCAPTURETITLE @"Capture" - -#define kVIDEOSOURCEOFFSET 1001 -#define kBLANKSTR @"" -#define kNO_SUCH_MENU_ITEM -1 - -#endif // __DEFS_H__ diff --git a/objc/examples/osx/demo/demo/demo-Info.plist b/objc/examples/osx/demo/demo/demo-Info.plist deleted file mode 100644 index b4bdafc4c..000000000 --- a/objc/examples/osx/demo/demo/demo-Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - applogo.icns - CFBundleIdentifier - zxing.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} - NSHumanReadableCopyright - Copyright 2012 ZXing authors. Licensed under Apache Public License 2.0. - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/objc/examples/osx/demo/demo/demo-Prefix.pch b/objc/examples/osx/demo/demo/demo-Prefix.pch deleted file mode 100644 index 903961fe2..000000000 --- a/objc/examples/osx/demo/demo/demo-Prefix.pch +++ /dev/null @@ -1,23 +0,0 @@ -// -// Prefix header for all source files of the 'demo' target in the 'demo' project -// - -#ifdef __OBJC__ - #import -#endif - -#ifndef __DEBUG_LOGGING__ -#define __DEBUG_LOGGING__ -#endif - -#ifdef __DEBUG_LOGGING_CAPTURE__ -#undef __DEBUG_LOGGING_CAPTURE__ -#endif - -#ifdef __SHOW_OVERLAY_LAYER__ -#undef __SHOW_OVERLAY_LAYER__ -#endif - -#ifndef __SEE_INTERMEDIATE_LAYERS__ -#define __SEE_INTERMEDIATE_LAYERS__ -#endif diff --git a/objc/examples/osx/demo/demo/en.lproj/Credits.rtf b/objc/examples/osx/demo/demo/en.lproj/Credits.rtf deleted file mode 100644 index 6ae0516f6..000000000 --- a/objc/examples/osx/demo/demo/en.lproj/Credits.rtf +++ /dev/null @@ -1,33 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\vieww9600\viewh8400\viewkind0 -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural - -\f0\b\fs24 \cf0 \ -\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 -\cf0 Engineering: -\b0 \ - The ZXing authors - plus Lance Drake\ -\ - -\b Human Interface Design: -\b0 \ - The ZXing authors - plus Lance Drake\ -\ - -\b Testing:\ - -\b0 The ZXing authors - plus Lance Drake\ -\ - -\b Documentation: -\b0 \ - visit http://code.google.com/p/zxing/\ -\ - -\b With special thanks to: -\b0 \ - Carl Barks & The Junior Woodchucks\ -\ -} \ No newline at end of file diff --git a/objc/examples/osx/demo/demo/en.lproj/InfoPlist.strings b/objc/examples/osx/demo/demo/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28ff8..000000000 --- a/objc/examples/osx/demo/demo/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/objc/examples/osx/demo/demo/en.lproj/MainMenu.xib b/objc/examples/osx/demo/demo/en.lproj/MainMenu.xib deleted file mode 100644 index 50e9f35f1..000000000 --- a/objc/examples/osx/demo/demo/en.lproj/MainMenu.xib +++ /dev/null @@ -1,1996 +0,0 @@ - - - - 1070 - 11E53 - 2182 - 1138.47 - 569.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2182 - - - YES - NSPopUpButton - NSMenuItem - NSMenu - NSButtonCell - NSButton - NSTextFieldCell - NSBox - NSImageView - NSImageCell - NSCustomObject - NSView - NSWindowTemplate - NSTextField - NSPopUpButtonCell - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AppDelegate - - - AMainMenu - - YES - - - ZXingMacOSX - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - ZXingMacOSX - - YES - - - About ZXingMacOSX - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide ZXingMacOSX - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit ZXingMacOSX - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - YES - - - ZXingMacOSX Help - ? - 1048576 - 2147483647 - - - - - _NSHelpMenu - - - - _NSMainMenu - - - 271 - 2 - {{100, 500}, {823, 584}} - 1954022400 - - NSWindow - - - {823, 584} - {823, 584} - - - 4108 - - YES - - - 4364 - - YES - - - 274 - - YES - - - 4108 - {{18, 14}, {480, 324}} - - - 2 - - - {{1, 1}, {516, 361}} - - - 2 - - - {{26, 177}, {518, 380}} - - - 2 - {0, 0} - - 67239424 - 0 - ICA - - TektonPro-BoldExt - 16 - 16 - - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 0 - 2 - NO - - - - 12 - - YES - - - 274 - - YES - - - 268 - {{4, 5}, {611, 79}} - - - 2 - YES - - -2073952767 - 272662528 - - - LucidaGrande - 13 - 1044 - - - YES - - - 1 - MC4wMzc0NDg0MDY0NyAwLjE5OTIwNjg2MzEgMC4zOTI4NTcxNDI5AA - - - - - {{3, 3}, {619, 87}} - - - 2 - - - {{26, 20}, {625, 108}} - - - 2 - {0, 0} - - 67239424 - 0 - QRcode Results - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 2 - 0 - 2 - NO - - - - 4108 - - YES - - - 274 - - YES - - - 4108 - {{5, 7}, {218, 150}} - - - 2 - - - {{3, 3}, {231, 162}} - - - 2 - - - {{556, 374}, {237, 183}} - - - 2 - {0, 0} - - 67239424 - 0 - Binary Intermediate - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 2 - 1 - 2 - NO - - - - 4108 - - YES - - - 274 - - YES - - - 4108 - {{4, 7}, {225, 150}} - - - 2 - - - {{3, 3}, {233, 163}} - - - 2 - - - {{556, 177}, {239, 184}} - - - 2 - {0, 0} - - 67239424 - 0 - Luminance Intermediate - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 2 - 1 - 2 - NO - - - - 268 - {{27, 137}, {266, 26}} - - - 2 - YES - - -2076049856 - 134219776 - - - 109199615 - 129 - - - 400 - 75 - - - Select Video Source - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - --- - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - --- - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 1 - YES - YES - 2 - - - - - 268 - {{313, 142}, {113, 18}} - - - 2 - YES - - 67239424 - 0 - Video Mirror - - Helvetica - 12 - 16 - - - 1211912703 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - - - - 268 - {{430, 142}, {126, 18}} - - - 2 - YES - - 67239424 - 0 - Sound on Result - - - 1211912703 - 2 - - - - - 200 - 25 - - - - - 268 - {{556, 133}, {240, 32}} - - - 2 - YES - - -2080244224 - 134217728 - Capture - - - -2038284033 - 129 - - DQ - 200 - 25 - - - - - 268 - {{671, 23}, {104, 87}} - - 2 - YES - - -2080244224 - 134217728 - - - - -2041822977 - 129 - - NSImage - zxinglogo - - - - 200 - 25 - - - - - 268 - - YES - - YES - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple PNG pasteboard type - NSFilenamesPboardType - NeXT Encapsulated PostScript v1.2 pasteboard type - NeXT TIFF v4.0 pasteboard type - - - {{136, 544}, {318, 48}} - - - 2 - YES - - 130560 - 33554432 - - NSImage - ZXingType - - 0 - 0 - 0 - NO - - YES - - - {{7, 11}, {823, 584}} - - YES - 2 - - {{0, 0}, {1920, 1178}} - {823, 606} - {823, 606} - YES - - - - - YES - - - terminate: - - - - 449 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - delegate - - - - 495 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - performClose: - - - - 193 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - showHelp: - - - - 493 - - - - delegate - - - - 588 - - - - mainWindow - - - - 533 - - - - binaryView - - - - 634 - - - - captureButton - - - - 635 - - - - luminanceView - - - - 636 - - - - mirrorVideoCheckbox - - - - 637 - - - - sourceSelectPopupMenu - - - - 639 - - - - previewView - - - - 640 - - - - selectedVideoSourceChange: - - - - 642 - - - - mainView - - - - 643 - - - - captureButtonPressed: - - - - 644 - - - - mirrorCheckboxPressed: - - - - 645 - - - - binaryBox - - - - 646 - - - - luminanceBox - - - - 647 - - - - previewBox - - - - 648 - - - - zxingImagePressed: - - - - 654 - - - - appLogoButton - - - - 655 - - - - soundsCheckbox - - - - 659 - - - - soundsCheckboxPressed: - - - - 660 - - - - resultsText - - - - 663 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - 56 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - - - 80 - - - - - 78 - - - - - 72 - - - - - 82 - - - - - 124 - - - YES - - - - - - 77 - - - - - 73 - - - - - 79 - - - - - 112 - - - - - 74 - - - - - 125 - - - YES - - - - - - 126 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 371 - - - YES - - - - Main Window - - - 372 - - - YES - - - - - - - - - - - - - mainView - - - 490 - - - YES - - - - - - 491 - - - YES - - - - - - 492 - - - - - 494 - - - App Delegate - - - 614 - - - YES - - - - - - 609 - - - previewView - - - 615 - - - YES - - - - - - 616 - - - YES - - - - - - 617 - - - YES - - - - - - 618 - - - YES - - - - sourceSelect POPUP - - - 619 - - - YES - - - - - - 620 - - - YES - - - - - - - - 621 - - - - - 622 - - - - - 623 - - - - - 627 - - - binaryView - - - 628 - - - luminanceView - - - 625 - - - YES - - - - mirrorVideo CHECKBOX - - - 626 - - - - - 631 - - - YES - - - - Capture BUTTON - - - 632 - - - - - 652 - - - YES - - - - appLogo BUTTON - - - 653 - - - - - 656 - - - YES - - - - sounds CHECKBOX - - - 657 - - - - - 661 - - - YES - - - - - - 662 - - - - - 664 - - - YES - - - - - - 665 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 112.IBPluginDependency - 124.IBPluginDependency - 125.IBPluginDependency - 126.IBPluginDependency - 129.IBPluginDependency - 130.IBPluginDependency - 131.IBPluginDependency - 134.IBPluginDependency - 136.IBPluginDependency - 143.IBPluginDependency - 144.IBPluginDependency - 145.IBPluginDependency - 149.IBPluginDependency - 150.IBPluginDependency - 236.IBPluginDependency - 29.IBPluginDependency - 371.IBPluginDependency - 371.IBWindowTemplateEditedContentRect - 371.NSWindowTemplate.visibleAtLaunch - 372.IBPluginDependency - 490.IBPluginDependency - 491.IBPluginDependency - 492.IBPluginDependency - 494.IBPluginDependency - 56.IBPluginDependency - 57.IBPluginDependency - 58.IBPluginDependency - 609.IBAttributePlaceholdersKey - 609.IBPluginDependency - 614.IBPluginDependency - 615.IBPluginDependency - 616.IBPluginDependency - 617.IBPluginDependency - 618.IBAttributePlaceholdersKey - 618.IBPluginDependency - 619.IBPluginDependency - 620.IBPluginDependency - 621.IBPluginDependency - 622.IBPluginDependency - 623.IBPluginDependency - 625.IBPluginDependency - 626.IBPluginDependency - 627.IBAttributePlaceholdersKey - 627.IBPluginDependency - 628.IBAttributePlaceholdersKey - 628.IBPluginDependency - 631.IBPluginDependency - 632.IBPluginDependency - 652.IBPluginDependency - 653.IBPluginDependency - 656.IBPluginDependency - 657.IBPluginDependency - 661.IBPluginDependency - 662.IBPluginDependency - 664.IBPluginDependency - 665.IBPluginDependency - 72.IBPluginDependency - 73.IBPluginDependency - 74.IBPluginDependency - 75.IBPluginDependency - 77.IBPluginDependency - 78.IBPluginDependency - 79.IBPluginDependency - 80.IBPluginDependency - 81.IBPluginDependency - 82.IBPluginDependency - 83.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{380, 496}, {480, 360}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Preview window for ZXing capture input - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Select the video source fed to the ZXing engine - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Preview window for ZXing capture input - - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Preview window for ZXing capture input - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 665 - - - - YES - - AppDelegate - NSObject - - YES - - YES - captureButtonPressed: - configureForVideoSource: - mirrorCheckboxPressed: - selectedVideoSourceChange: - soundsCheckboxPressed: - windowWillClose: - zxingImagePressed: - - - YES - id - id - id - id - id - NSNotification - id - - - - YES - - YES - captureButtonPressed: - configureForVideoSource: - mirrorCheckboxPressed: - selectedVideoSourceChange: - soundsCheckboxPressed: - windowWillClose: - zxingImagePressed: - - - YES - - captureButtonPressed: - id - - - configureForVideoSource: - id - - - mirrorCheckboxPressed: - id - - - selectedVideoSourceChange: - id - - - soundsCheckboxPressed: - id - - - windowWillClose: - NSNotification - - - zxingImagePressed: - id - - - - - YES - - YES - appLogoButton - binaryBox - binaryView - captureButton - luminanceBox - luminanceView - mainView - mainWindow - mirrorVideoCheckbox - previewBox - previewView - resultsText - soundsCheckbox - sourceSelectPopupMenu - - - YES - NSButton - NSBox - NSView - NSButton - NSBox - NSView - NSView - NSWindow - NSButton - NSBox - NSView - NSTextField - NSButton - NSPopUpButton - - - - YES - - YES - appLogoButton - binaryBox - binaryView - captureButton - luminanceBox - luminanceView - mainView - mainWindow - mirrorVideoCheckbox - previewBox - previewView - resultsText - soundsCheckbox - sourceSelectPopupMenu - - - YES - - appLogoButton - NSButton - - - binaryBox - NSBox - - - binaryView - NSView - - - captureButton - NSButton - - - luminanceBox - NSBox - - - luminanceView - NSView - - - mainView - NSView - - - mainWindow - NSWindow - - - mirrorVideoCheckbox - NSButton - - - previewBox - NSBox - - - previewView - NSView - - - resultsText - NSTextField - - - soundsCheckbox - NSButton - - - sourceSelectPopupMenu - NSPopUpButton - - - - - IBProjectSource - ./Classes/AppDelegate.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - NSSwitch - ZXingType - zxinglogo - - - YES - {11, 11} - {10, 3} - {15, 15} - {300, 33} - {104, 84} - - - - diff --git a/objc/examples/osx/demo/demo/en.lproj/ZXingType.png b/objc/examples/osx/demo/demo/en.lproj/ZXingType.png deleted file mode 100644 index 7e11fbcd040f6a0ccaadda8bea273b458ba0064c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12085 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 YU7Zl}AO-Kj_TT}EvS67iDM;Y|0K}mRZvX%Q diff --git a/objc/examples/osx/demo/demo/en.lproj/applogo.icns b/objc/examples/osx/demo/demo/en.lproj/applogo.icns deleted file mode 100644 index 8a058cdcd836c9c579ddcc8d848a54f8546eeec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30327 zcmeHQ30zLu`+x4cuf1>E+b*S&Hbpebk}V>PY>mjSM9HK@jNbOmQg&sF24gH4%P7WR zFh7il6j^34lS*QU$=3Zp_pSG>w@rxO^6&WQ-h1w|o#&kMoO8bS-22X&<{tT9kGs8?_nva#E8G5$0JNl_B5{vM+qf)bDoHNs z;~y+21>j0S%oq@smXR78R8EpNdOP-?6j}_xiU78q@A6G)%cGx4N#<0SK91c7J^-NHZULx80{jwBGONNuBVsm2leA=3=R$yX zQ2=K!`|U)}SwU-KNcvS1qIUs+XB5!YkG_5#^$N@Nwx82b&v+@xt$Oq3^&9eS80h7L z4%a6(HYs^SY;R`=OCvpPExi(wd~0KD(>qW~@*afG^Xwa0Re2Ot^FUWa^Uj}T&#TCX z-E551c?<&JFQn}t)-jzZCHa4RJ=?=6psMoedFY=9s!Q$^J+36l%U#X&L~J?%j8ZAd zXvY?)yCLoG-rk=5rR2+Jx{P@A2c7{gp0Fh&-f;$iXeoc~>EDb3oQiwo4 z8iV7Ee1-1g#|(%jUq63*T`dhn;Q@X1%d|=1cO)hwlWKkb_LgO?u#KP^UNe?jz$pR36Hu!#8NYf@6{Y~~LK4jwvq@Q2LZJGQJ{67KKmVyDjo-*sSM zBL3-YPQjh~uUwFJ4z+@4HCQ*dl!^=h2Zd zB;&}YjT`suBw&%*nCD3;zSZUMDwY0-Z%8J9aG}J^Mv!_n@%F$?& zpNguwrqAyWE3g2R3LA=Q5UJ|k`I3z94yH>|%?H(Se2)@AV| zuYCTr!6pmKi?)DP3V;K)yotAOU7Z*KoWA3}>@A?t+J6-R!l761%SwlWX{_i3l5uS3 zuHD%vbbHJKKd-+@@{jh~ssav+K_mX8gpM3!&Gsz2f78|og<7D{NoP+T9vcDNUPG*b z4Zt*GOF=mN%=MzbD_>V#1hh8*rEZN)T(TvG6r@ZTIiT+olq%pb=~99Q><95AzpRg= z8Dm!I9|fMkP6p_VV!d{zuNoc!^xhW0lmbl!7$|ns;S0A*pS^rjj$(;$6ze~B{KNqC z#MfOdjrA~WqLl>3M6{G&Vr|t9!b)!E`GF4ci5{vDHf3m8(9pHL^THJyiUN0M^~c+ zd(@MORK7@k1dr2@x`@Z6A+;a{eb2%$LC`^%fSgEfmXHflBpW8pg%~^zj>(0GIBpcN znK3|cv{Qh~V*>DXbQr)*LY_$A8f-my`cnSQ+jsPK10+S0f+8jzB^>y6^8jG!tOS;j z%hga3(3j$nitV67=GnrMidR)t#z?-DB4^M5LLL<6cmrK~muwv6w%dN}%KaymZ>tQE zC`CquEQX>W!Uv7qHmDsE`dZN%6`A z%MdJ`1bt&HAQaDUO4EoqW2prUN=SpFF(hZb7QfHJ-_A@CQfjbXY-M6aSoy2alIzkc zn2a^t9VrE1190(N91pEmNt987DXOtV+O0@iAbkUVNINnTqanwF)(O_6no(HYYFnk&7=xVw)UHG1@(Aegjk+}P3Xmvg`Y zi=>94ET26sJBt4Al^iSWp9b2qZr!z|XCKT60oi$00GYodA!MZNueeKw73pW(F+G%)(u zN>^;lx_7VOYc}PZ{NxLWnZdPj5g4@EIJVZOa_C+X4B&^d`5zB_QitRBLIwGXTkLX z8|(_YQeaIC4h1V6qdg$zVV7H;e)z(TTUSr*O#VCmuX;b`Tf*w5p+*A8DMvCajq>aw(=c5M3sIq^s|1>TO&E^@d^Kwrg*t%Fm zAQdwjm@b9G1wfMm)BjA?cM}*{AmsBFC#3EFHSfyV!`qjt;6xO4Gc7MAv8YuR%k#vK z-^KHZY~YWMTes)*)x3kl2Xz%~04+Ad*3sEz@Zf+`+l3&~@6#vh=)v#Ov_)CKVOwBv zPUT)pNB4*~f<$%A?qlaJ{_FS;Yt=z$k+J*0q5V73Y1N?Vi0m zHwjgdklimi)pm|QbqreuKCU4EkxxN=8 zj|zdM*1^ChiNaos_qZC%)3b7J?8AF}Cf?J>xR3P=Y`m|A_i6k%ykB@2?+X}sUl#{w z4&GD2)~<03Sj_S1S(k2OL?U?fYKKxo325SNontr_6E<17(ZLIR$BWo$z!9+ngZ!s@ zm|^c^(Ou`w4=~b1A_<6&UiF-kcVeF=1Bv*(3a_2nwcL;$1I#tK`8gwKlpxUmDSwpb zjniAzSsQ@4|8Bv_43Ah~(WKXJ=M7>Y1rOSvESxjx_P&jxYV`HM z(TC!S`=`(u6wT7ovOBdjQyyH((qOL#78@QsEj+@EM~dX~@;k0*aJ3Y_lFQjWCF_9G z9~k#bF6?5e#9_fx|1Q5hfP*v~N|VQ#jMd{9>wv8SoLhxi{&Y%A!rx`r9Vq{*(zJJH zpPY)(n#Ryt0~}kdnoDOgjOhu$99MS#l08La59WnMCG*kema74*u*tKs_F$DD&4|1C zr+V_SBDJ|-l9QJ^3W@YrVGyE1*VfgY81cZ?g;BX@GI*-Tfnk)Ly&l)?AXo)76PBqI z7{r4{W*a*YY;dGG(z$HR>w;?Ss3JSvS!&CMtF?b3dU|@^JVl%q>P3E#t z8a6*JPmRrMXVgxciIY=~j{f2W{stJ#l7OwxpaWNnBg_UB4L$&kj#EN9!DbK)T)nb* zD%zTCCVMF`IXoJ{pdSMUhsR)!znC4UxpC@n?_9Lk8~w59QQ>hYa2y z9{NoV4_SQ_Jan!V;2{peLpYC=!9%~|Nb*te5H$mAU3iF#@X(R}C-Bhs9{~^j`0s^> z_SS)i<XtMhPBzh)B*O3LXl3Z+PfvU3dr~x>|VXz8oGJ|Nih$dR=&kk}8LXSVeMp z$mav#p*fAiLuhF=JhY$zJfvO^9vU%rlDA(#2%=_;E(=2fQxG0ni15%@3LRRK7#}Bt zhvtSYP{2do(6{^t)$q{t|G)5%+YcF=`nMb&3RZ@P3>$@qyjubf4R0DAa%%z}dejU& zbf;N(NL&XVI`Ka6(2ws051o4#JhV>2@BLo^53vy*s-)ndzm(x2=o+IyhxRL>LpeAU zI!f0vD0Jv5!ZPDz=+F{5IuxI@JZ1H|^=WCT>zhS~=Cl|cn)V-p4$WyTbZGbcqeJSS z8yycxa9rArYbf^f?Ap}~QL5Jw~5FKJPj}EbKHh~UJsf!M=avDd60_&hd%p)y8hnNa< z$h}c?h*=LE8r=XL`l72G9rA23I@FCqhtyk!4%yV8Lyj#(hq|<(L+`VBs0|%@+lCIw zHxIR;L;q8ohuYAghMR|)M~5C!n}^!aA=&1k&U2^F_)u2N+S`!^wv3gzV2F2bX^~U!OeF!?#XYapr?@%o|r2cVxhduxuYQf&24j;aE zNTcE2p^rg_di{^>9r{3Yhy!}UruPp0+tDH1NmFYV$yw2iiQ)=7IkV4-m5S@3MuU(HWxxSWE^TU$7!RyA=eD z$;B6t6U3{331{Q0YM#IiBjM96{TO6hN!SVuLtnuOGkVK zS)QIwmA#1k**t)6)@q)RE0-M)8FN2lBOut~_V<ete}qlK)wH0#j_#r?e6MB>7u!9`n<81(v$`0Nh#GXj-F(TlYV4 zGhl04y1#8yJ7$)L@UbC&%DzZ&wL2ecN8yu>W}YIk6%UT%KapDfUoU~XTMuLes5qh|5Nltf+^I+FO0M#`3hOB z9tsFLPvX}SkiPa{=!qcSPoEKcvpqrc-;dReMCJx4+fUX7C18bB~bM*CZ= zzr3>!k6z1Mb4Cz!2HRrh)|>U@lx^|UqCU;goCyR+V%c!uttUuvS?XY@f-gxbB`i7H zD&o9?M(O17&M{nObCU?VK!2DLN3$1C`gK%i*PWbW(V1MA%;uO119)hGlF79f1XI;y zS##X=?&WO>ay1vQagiWPOg7hIW^)6FjQxyZlcNW^-|AjH9q+oVD!!bRkrMSy_~NLv zA8+B8N8Xtpbir=Zm**~7(iCN?QmSCxwKKOX?@0L)g(U<`Qov*v(-OQ~) z@x3~ZUbXG6`i#a_b8HRaEs-%vwZV#tU1dXe!zZne`k%5R?#t}0o70;JruAvx^V+Na*umAZ z`M#cv^6yq9#V4)C50$lkN-+{Ew*bDreTuT0+o=f){Cxw$cPeMM&ee|=n#vU*FmRZm zB>J~C(Q_w!Ic$t~c#cwj>s;j7>GG6jPXdGPV=1&no=&a^pXKgs-=*i5vtvI&4V3gS z6e>*~c)DFihREkDBzb&!*mO6Cjs^xDoyN}JAvdb^jxUFph?OP}IQ1ChvlhSiM5Wh< zmxfFp+|^i9MWk)ff6C%()!D82*V9~`RW}5)#Kw*uK}*lxds6Y_`nL&z69(EEs^P2X zLVdeov*TL724+}l;y18r6N9f~HE>c$;@XXyQd1)5di1l_7voF;M+IZYaq~C4Y|XM$ zvKH8Aaq5O(1by1s4VpN2QB-tz&~ zu(R_B&#BYA#<)0i)Dcz>QMe+~w;Spmne~BsnqoU>M4%^_0`s16AY2D(**oxW^1Nr^+$kO zeGSfNI69Bs+nU-@)(q474X}Y;c?QAJvK~6G4kX_irfj#+P@V$FwKY5vEOoPf(>An* z)>;`4>qWqZY85#IL&eZxZ1CY)=GHh1H54{nhA4C@ozQp^OPA@9$6G_KLPm)>uHTi^ zGxWbU9Pu_IroqnHYsN zI4x{~K(N)#`%nM1mX|tvv3=XNZ;ur`toH8fiqc!>GB>V_Ul`!yJtri-4w`v?yQ1pe z?ogbPiTZ*T_Cf3eLc=dS@C(XyQ)TM1CCgT(ZrOeyD=X{J?u;!P)+~z(p5-~h#l_8Y zZfxz6>Q!p(GUmXx8WCk1U5x83M4M`Wm`~$s+YI$nUW`=6%?}6&4v$@uymHm570Z+2 zA{NY@KGwCTorQ&+^VoodVui7pYw)ws)#={4)72+;Cpnv{)t?46X#v4fHSIGgRW3z# z{3qDceZ;7VGv>?-3Jwkom@{({e%jZ;%2-EJQ@@k*_~6=yDR-CFM$a`XkChf*ID9hI zvzLi#%k?8bYwsSYv>19meNc}s_D=l<4;wLZ1ryNm;A;}U~D+#rbl|AK=Yp&s>A*eF0_HkBa^mYZ~vR*c(hWgrS0(_j@h@K|1 z=mLXoV-gf%DE;*o(sft~1U20MP!N|yCgO+ltJ8{Z2rdY)rkZ;mQAd>glzK$s>RVf; z=Jj*5I}fWJgf1+KRK!DHJ3YaN>@6a2b3pG&wL=M6Jh++ivn5tTYIl;P28G5vsxJPu z5iOs5%8Ooo#1PPJOl>`qWzF~>SQ?#N6sTfp$SmK`gVp-CjIh<=zE{P|t&lARB5P_9 z4^P~hEE3Qmj)SLGKVVAjYpUAv zu&ZQ&Y%N$jl2o``%KE<&jr;=3Kcpu96o-2Bw6^Z)kuS4+WiMmu19%^jumRY(ZBdl} zpE1?(r!i5uY%`a~{|p~joA$zlz4n>x=|=zl!ix+(t?*jEE;2)FyVT5F3Xom{G$!>an| zQ+*}PT+^`u&Qgpj1Mg>ZkK`#@7^o zi;t_77LTLeu@&?aJiV^t6;Fk#zOre;{}`%`bF1}Z}$!%};i2k=tsc|fI z@NF!V;XWpHIb!%SY`mjvl|cEZPi{zs5_+(H+9F3r}ML`OhxCy;Fh;fmDk-M*~-BcYI zjp+M_l^^TXv@R0*X1Oa4K+01IR4?A7P=Ca4n5_;Ui_Z`mR8NK~13!5BgHH)Gs)w)| z`L7pH6EG$Hl=^gq`fH24dYh^t1>y%z)wyrO(B?)v?Yk;~`biq8LbUAUl1qIcoyJxf zsi3(P=j&#xi)(CjobJ~(*-`z>TE6P6YZLV}rn&_y6kMgI5=u1qyg;!+xV1EJoTD+d zQHqKOD{8prIvT0G-@ISm_z;7su0#A`ESa#^i9PE*$UsF#X*G)SlNWgPvyd(EaP4Rw zA_GreA9w%I=7;Mq>j_lruPnQ^_ow{A+yfC~91uoTDnCcVe2@$!d3bdBg2^s6`YO~4 z8&?h%1N~CI+w*Ob&mb$U51akc`8u85LiQfZ-k-iPb^ZD^OBT%>(pi_U^dy(YrLfv9 z$4_UaCI(L$WYD$;5KZ?z&=hrdN|nInCgn_ZRWv_CNZ_|H+1+AXL~apk$ioPQ9(u0-rU;8 z(nMd4*C1lQLvhV*?EfMiV+)(k*5)QghK7dvI_mfXILh0(F!l>kk&UgjsewkFjk@@w z83M7UmX<^f;gR>i9F#1hgs4iibtLLy6`>G+vIu{iNm)I%bUK?a)}&~Z6v?(lB22+~ z??rbV3n(EdqZ;U-)2W|7YS@rv`!5j!*7 NX!Agu2mT{H@PE?&zt8{x diff --git a/objc/examples/osx/demo/demo/en.lproj/beepbeep.aif b/objc/examples/osx/demo/demo/en.lproj/beepbeep.aif deleted file mode 100644 index cba7d4c1679fc2148bd4927902ae13b001e035fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59870 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 - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **)argv); -} diff --git a/objc/ios.xcodeproj/.gitignore b/objc/ios.xcodeproj/.gitignore deleted file mode 100644 index 367f348e5..000000000 --- a/objc/ios.xcodeproj/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/*.mode1v3 -/*.pbxuser \ No newline at end of file diff --git a/objc/ios.xcodeproj/project.pbxproj b/objc/ios.xcodeproj/project.pbxproj deleted file mode 100644 index 554d80a00..000000000 --- a/objc/ios.xcodeproj/project.pbxproj +++ /dev/null @@ -1,422 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B15E6FE12CE970000DC7062 /* ZXLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B15E6FD12CE970000DC7062 /* ZXLuminanceSource.mm */; }; - 3B15E70012CE971100DC7062 /* CGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B15E6FF12CE971100DC7062 /* CGImageLuminanceSource.mm */; }; - 3BBCB5B312DD018600B5936D /* ZXCaptureView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB5B212DD018600B5936D /* ZXCaptureView.mm */; }; - 3BBCB60A12DD084000B5936D /* ZXCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB60912DD084000B5936D /* ZXCapture.mm */; }; - 3BBCB6A912DD0B1900B5936D /* ZXBinaryBitmap.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6A812DD0B1900B5936D /* ZXBinaryBitmap.mm */; }; - 3BBCB6B112DD0B4C00B5936D /* ZXDecodeHints.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6AC12DD0B4C00B5936D /* ZXDecodeHints.mm */; }; - 3BBCB6B212DD0B4C00B5936D /* ZXHybridBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6AD12DD0B4C00B5936D /* ZXHybridBinarizer.mm */; }; - 3BBCB6B312DD0B4C00B5936D /* ZXIllegalArgumentException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6AE12DD0B4C00B5936D /* ZXIllegalArgumentException.mm */; }; - 3BBCB6B412DD0B4C00B5936D /* ZXQRCodeReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6AF12DD0B4C00B5936D /* ZXQRCodeReader.mm */; }; - 3BBCB6B512DD0B4C00B5936D /* ZXReaderException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6B012DD0B4C00B5936D /* ZXReaderException.mm */; }; - 3BBCB6BB12DD0B8100B5936D /* ZXBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6B812DD0B8100B5936D /* ZXBinarizer.mm */; }; - 3BBCB6BC12DD0B8100B5936D /* ZXCGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6B912DD0B8100B5936D /* ZXCGImageLuminanceSource.mm */; }; - 3BBCB6BD12DD0B8100B5936D /* ZXReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB6BA12DD0B8100B5936D /* ZXReader.mm */; }; - 3BBCB71512DD105C00B5936D /* ZXResult.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BBCB71412DD105C00B5936D /* ZXResult.mm */; }; - AA747D9F0F9514B9006C5449 /* ios_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* ios_Prefix.pch */; }; - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 3B15E6FD12CE970000DC7062 /* ZXLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXLuminanceSource.mm; path = src/zxing/ZXLuminanceSource.mm; sourceTree = ""; }; - 3B15E6FF12CE971100DC7062 /* CGImageLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CGImageLuminanceSource.mm; path = src/zxing/CGImageLuminanceSource.mm; sourceTree = ""; }; - 3BBCB5B212DD018600B5936D /* ZXCaptureView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXCaptureView.mm; path = src/zxing/ZXCaptureView.mm; sourceTree = ""; }; - 3BBCB60912DD084000B5936D /* ZXCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXCapture.mm; path = src/zxing/ZXCapture.mm; sourceTree = ""; }; - 3BBCB6A812DD0B1900B5936D /* ZXBinaryBitmap.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXBinaryBitmap.mm; path = src/zxing/ZXBinaryBitmap.mm; sourceTree = ""; }; - 3BBCB6AC12DD0B4C00B5936D /* ZXDecodeHints.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXDecodeHints.mm; path = src/zxing/ZXDecodeHints.mm; sourceTree = ""; }; - 3BBCB6AD12DD0B4C00B5936D /* ZXHybridBinarizer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXHybridBinarizer.mm; path = src/zxing/ZXHybridBinarizer.mm; sourceTree = ""; }; - 3BBCB6AE12DD0B4C00B5936D /* ZXIllegalArgumentException.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXIllegalArgumentException.mm; path = src/zxing/ZXIllegalArgumentException.mm; sourceTree = ""; }; - 3BBCB6AF12DD0B4C00B5936D /* ZXQRCodeReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXQRCodeReader.mm; path = src/zxing/ZXQRCodeReader.mm; sourceTree = ""; }; - 3BBCB6B012DD0B4C00B5936D /* ZXReaderException.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXReaderException.mm; path = src/zxing/ZXReaderException.mm; sourceTree = ""; }; - 3BBCB6B812DD0B8100B5936D /* ZXBinarizer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXBinarizer.mm; path = src/zxing/ZXBinarizer.mm; sourceTree = ""; }; - 3BBCB6B912DD0B8100B5936D /* ZXCGImageLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXCGImageLuminanceSource.mm; path = src/zxing/ZXCGImageLuminanceSource.mm; sourceTree = ""; }; - 3BBCB6BA12DD0B8100B5936D /* ZXReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXReader.mm; path = src/zxing/ZXReader.mm; sourceTree = ""; }; - 3BBCB71412DD105C00B5936D /* ZXResult.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXResult.mm; path = src/zxing/ZXResult.mm; sourceTree = ""; }; - AA747D9E0F9514B9006C5449 /* ios_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios_Prefix.pch; sourceTree = SOURCE_ROOT; }; - AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - D2AAC07E0554694100DB518D /* libzxingmm.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libzxingmm.a; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* libzxingmm.a */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* zxingmm */ = { - isa = PBXGroup; - children = ( - 08FB77AEFE84172EC02AAC07 /* Classes */, - 32C88DFF0371C24200C91783 /* Other Sources */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - name = zxingmm; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - AACBBE490F95108600F1A2B1 /* Foundation.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 08FB77AEFE84172EC02AAC07 /* Classes */ = { - isa = PBXGroup; - children = ( - 3BBCB71412DD105C00B5936D /* ZXResult.mm */, - 3BBCB6B812DD0B8100B5936D /* ZXBinarizer.mm */, - 3BBCB6B912DD0B8100B5936D /* ZXCGImageLuminanceSource.mm */, - 3BBCB6BA12DD0B8100B5936D /* ZXReader.mm */, - 3BBCB6AC12DD0B4C00B5936D /* ZXDecodeHints.mm */, - 3BBCB6AD12DD0B4C00B5936D /* ZXHybridBinarizer.mm */, - 3BBCB6AE12DD0B4C00B5936D /* ZXIllegalArgumentException.mm */, - 3BBCB6AF12DD0B4C00B5936D /* ZXQRCodeReader.mm */, - 3BBCB6B012DD0B4C00B5936D /* ZXReaderException.mm */, - 3BBCB6A812DD0B1900B5936D /* ZXBinaryBitmap.mm */, - 3BBCB60912DD084000B5936D /* ZXCapture.mm */, - 3BBCB5B212DD018600B5936D /* ZXCaptureView.mm */, - 3B15E6FF12CE971100DC7062 /* CGImageLuminanceSource.mm */, - 3B15E6FD12CE970000DC7062 /* ZXLuminanceSource.mm */, - ); - name = Classes; - sourceTree = ""; - }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { - isa = PBXGroup; - children = ( - AA747D9E0F9514B9006C5449 /* ios_Prefix.pch */, - ); - name = "Other Sources"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - AA747D9F0F9514B9006C5449 /* ios_Prefix.pch in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - D2AAC07D0554694100DB518D /* zxingmm */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "zxingmm" */; - buildPhases = ( - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = zxingmm; - productName = zxingmm; - productReference = D2AAC07E0554694100DB518D /* libzxingmm.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0450; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ios" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* zxingmm */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* zxingmm */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B15E6FE12CE970000DC7062 /* ZXLuminanceSource.mm in Sources */, - 3B15E70012CE971100DC7062 /* CGImageLuminanceSource.mm in Sources */, - 3BBCB5B312DD018600B5936D /* ZXCaptureView.mm in Sources */, - 3BBCB60A12DD084000B5936D /* ZXCapture.mm in Sources */, - 3BBCB6A912DD0B1900B5936D /* ZXBinaryBitmap.mm in Sources */, - 3BBCB6B112DD0B4C00B5936D /* ZXDecodeHints.mm in Sources */, - 3BBCB6B212DD0B4C00B5936D /* ZXHybridBinarizer.mm in Sources */, - 3BBCB6B312DD0B4C00B5936D /* ZXIllegalArgumentException.mm in Sources */, - 3BBCB6B412DD0B4C00B5936D /* ZXQRCodeReader.mm in Sources */, - 3BBCB6B512DD0B4C00B5936D /* ZXReaderException.mm in Sources */, - 3BBCB6BB12DD0B8100B5936D /* ZXBinarizer.mm in Sources */, - 3BBCB6BC12DD0B8100B5936D /* ZXCGImageLuminanceSource.mm in Sources */, - 3BBCB6BD12DD0B8100B5936D /* ZXReader.mm in Sources */, - 3BBCB71512DD105C00B5936D /* ZXResult.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/zxingmm.dst; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxingmm; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - DSTROOT = /tmp/zxingmm.dst; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxingmm; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv6, - armv7, - ); - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../cpp/core/src, - src, - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wextra", - "-Werror", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv6, - armv7, - ); - GCC_C_LANGUAGE_STANDARD = c99; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../cpp/core/src, - src, - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wextra", - "-Werror", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = Release; - }; - 3B6E553F1491B88400C0C401 /* Ad Hoc Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv6, - armv7, - ); - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../cpp/core/src, - src, - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wextra", - "-Werror", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = "Ad Hoc Debug"; - }; - 3B6E55401491B88400C0C401 /* Ad Hoc Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/zxingmm.dst; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxingmm; - }; - name = "Ad Hoc Debug"; - }; - 3B6E55411491B88C00C0C401 /* Ad Hoc Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - armv6, - armv7, - ); - GCC_C_LANGUAGE_STANDARD = c99; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvmgcc42; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - ../cpp/core/src, - src, - ); - IPHONEOS_DEPLOYMENT_TARGET = 4.0; - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - WARNING_CFLAGS = ( - "-Wextra", - "-Werror", - "-Wall", - "-Wno-unused-parameter", - ); - }; - name = "Ad Hoc Release"; - }; - 3B6E55421491B88C00C0C401 /* Ad Hoc Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - DSTROOT = /tmp/zxingmm.dst; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ios_Prefix.pch; - GCC_SYMBOLS_PRIVATE_EXTERN = YES; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxingmm; - }; - name = "Ad Hoc Release"; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "zxingmm" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 3B6E55401491B88400C0C401 /* Ad Hoc Debug */, - 1DEB922008733DC00010E9CD /* Release */, - 3B6E55421491B88C00C0C401 /* Ad Hoc Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ios" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 3B6E553F1491B88400C0C401 /* Ad Hoc Debug */, - 1DEB922408733DC00010E9CD /* Release */, - 3B6E55411491B88C00C0C401 /* Ad Hoc Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/objc/ios_Prefix.pch b/objc/ios_Prefix.pch deleted file mode 100644 index db6c00f52..000000000 --- a/objc/ios_Prefix.pch +++ /dev/null @@ -1,8 +0,0 @@ -// -// Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project. -// - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/objc/osx.xcodeproj/project.pbxproj b/objc/osx.xcodeproj/project.pbxproj deleted file mode 100644 index d8fdf7948..000000000 --- a/objc/osx.xcodeproj/project.pbxproj +++ /dev/null @@ -1,469 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 45; - objects = { - -/* Begin PBXBuildFile section */ - 3B0BF98C1221ED4500F0BD0F /* ZXBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0BF9821221ED4500F0BD0F /* ZXBinarizer.h */; }; - 3B0BF98D1221ED4500F0BD0F /* ZXBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B0BF9831221ED4500F0BD0F /* ZXBinarizer.mm */; }; - 3B0BF98E1221ED4500F0BD0F /* ZXBinaryBitmap.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0BF9841221ED4500F0BD0F /* ZXBinaryBitmap.h */; }; - 3B0BF98F1221ED4500F0BD0F /* ZXBinaryBitmap.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B0BF9851221ED4500F0BD0F /* ZXBinaryBitmap.mm */; }; - 3B0BF9901221ED4500F0BD0F /* ZXDecodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0BF9861221ED4500F0BD0F /* ZXDecodeHints.h */; }; - 3B0BF9911221ED4500F0BD0F /* ZXDecodeHints.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B0BF9871221ED4500F0BD0F /* ZXDecodeHints.mm */; }; - 3B0BF9921221ED4500F0BD0F /* ZXHybridBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0BF9881221ED4500F0BD0F /* ZXHybridBinarizer.h */; }; - 3B0BF9931221ED4500F0BD0F /* ZXHybridBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B0BF9891221ED4500F0BD0F /* ZXHybridBinarizer.mm */; }; - 3B0BF9941221ED4500F0BD0F /* ZXResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B0BF98A1221ED4500F0BD0F /* ZXResult.h */; }; - 3B0BF9951221ED4500F0BD0F /* ZXResult.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B0BF98B1221ED4500F0BD0F /* ZXResult.mm */; }; - 3B1E842A1222D432000D7528 /* ZXCaptureDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B1E84291222D432000D7528 /* ZXCaptureDelegate.h */; }; - 3B1E84591222DBBE000D7528 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B1E84581222DBBE000D7528 /* QuartzCore.framework */; }; - 3B98744E12235C340013711B /* ZXQRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B98744C12235C340013711B /* ZXQRCodeReader.h */; }; - 3B98744F12235C340013711B /* ZXQRCodeReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B98744D12235C340013711B /* ZXQRCodeReader.mm */; }; - 3B98746C12235EC40013711B /* ZXIllegalArgumentException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B98746A12235EC40013711B /* ZXIllegalArgumentException.h */; }; - 3B98746D12235EC40013711B /* ZXReaderException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B98746B12235EC40013711B /* ZXReaderException.h */; }; - 3B98747912235FEE0013711B /* ZXIllegalArgumentException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B98747712235FEE0013711B /* ZXIllegalArgumentException.mm */; }; - 3B98747A12235FEE0013711B /* ZXReaderException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B98747812235FEE0013711B /* ZXReaderException.mm */; }; - 3BB8D3C31222172900F86718 /* ZXCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB8D3BF1222172900F86718 /* ZXCapture.h */; }; - 3BB8D3C41222172900F86718 /* ZXCaptureView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB8D3C01222172900F86718 /* ZXCaptureView.h */; }; - 3BB8D3C51222172900F86718 /* ZXCaptureView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BB8D3C11222172900F86718 /* ZXCaptureView.mm */; }; - 3BB8D3C61222172900F86718 /* ZXView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB8D3C21222172900F86718 /* ZXView.h */; }; - 3BCF09731221957200C3E580 /* ZXMultiFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BCF096F1221957200C3E580 /* ZXMultiFormatReader.h */; }; - 3BCF09741221957200C3E580 /* ZXMultiFormatReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BCF09701221957200C3E580 /* ZXMultiFormatReader.mm */; }; - 3BCF09751221957200C3E580 /* ZXReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BCF09711221957200C3E580 /* ZXReader.h */; }; - 3BCF09761221957200C3E580 /* ZXReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BCF09721221957200C3E580 /* ZXReader.mm */; }; - 3BE809B512221C7D00AA1B63 /* ZXCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BE809B412221C7D00AA1B63 /* ZXCapture.mm */; }; - 3BE809D1122221CF00AA1B63 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BE809D0122221CF00AA1B63 /* QTKit.framework */; }; - 3BE809D71222222800AA1B63 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BE809D61222222800AA1B63 /* CoreVideo.framework */; }; - 3BED8A3E122198540016F4E8 /* libzxing.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BED8A39122198210016F4E8 /* libzxing.a */; }; - 3BED8A42122198850016F4E8 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BED8A41122198850016F4E8 /* libiconv.dylib */; }; - 3BED8A4E12219CB10016F4E8 /* ZXInit.c in Sources */ = {isa = PBXBuildFile; fileRef = 3BED8A4D12219CB10016F4E8 /* ZXInit.c */; }; - 3BED8A5F1221B0270016F4E8 /* ZXImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BED8A5D1221B0270016F4E8 /* ZXImage.h */; }; - 3BED8A601221B0270016F4E8 /* ZXImage.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BED8A5E1221B0270016F4E8 /* ZXImage.mm */; }; - 3BED8A831221B7870016F4E8 /* ZXCGImageLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BED8A811221B7870016F4E8 /* ZXCGImageLuminanceSource.h */; }; - 3BED8A841221B7870016F4E8 /* ZXCGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BED8A821221B7870016F4E8 /* ZXCGImageLuminanceSource.mm */; }; - 3BED8A8E1221B84E0016F4E8 /* CGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BED8A8C1221B84E0016F4E8 /* CGImageLuminanceSource.mm */; }; - 3BED8A8F1221B84E0016F4E8 /* CGImageLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BED8A8D1221B84E0016F4E8 /* CGImageLuminanceSource.h */; }; - 3BED8A9A1221B92B0016F4E8 /* ZXLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BED8A981221B92B0016F4E8 /* ZXLuminanceSource.h */; }; - 3BED8A9B1221B92B0016F4E8 /* ZXLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3BED8A991221B92B0016F4E8 /* ZXLuminanceSource.mm */; }; - D2AAC0CC05546C4400DB518D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3BED8A38122198210016F4E8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3BED8A31122198210016F4E8 /* osx.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B5B0DFF121C525D005698F8; - remoteInfo = zxing; - }; - 3BED8A3A122198300016F4E8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3BED8A31122198210016F4E8 /* osx.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 3B5B0DFE121C525D005698F8; - remoteInfo = zxing; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; - 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - 3B0BF9821221ED4500F0BD0F /* ZXBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXBinarizer.h; path = src/zxing/ZXBinarizer.h; sourceTree = ""; }; - 3B0BF9831221ED4500F0BD0F /* ZXBinarizer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXBinarizer.mm; path = src/zxing/ZXBinarizer.mm; sourceTree = ""; }; - 3B0BF9841221ED4500F0BD0F /* ZXBinaryBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXBinaryBitmap.h; path = src/zxing/ZXBinaryBitmap.h; sourceTree = ""; }; - 3B0BF9851221ED4500F0BD0F /* ZXBinaryBitmap.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXBinaryBitmap.mm; path = src/zxing/ZXBinaryBitmap.mm; sourceTree = ""; }; - 3B0BF9861221ED4500F0BD0F /* ZXDecodeHints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXDecodeHints.h; path = src/zxing/ZXDecodeHints.h; sourceTree = ""; }; - 3B0BF9871221ED4500F0BD0F /* ZXDecodeHints.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXDecodeHints.mm; path = src/zxing/ZXDecodeHints.mm; sourceTree = ""; }; - 3B0BF9881221ED4500F0BD0F /* ZXHybridBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXHybridBinarizer.h; path = src/zxing/ZXHybridBinarizer.h; sourceTree = ""; }; - 3B0BF9891221ED4500F0BD0F /* ZXHybridBinarizer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXHybridBinarizer.mm; path = src/zxing/ZXHybridBinarizer.mm; sourceTree = ""; }; - 3B0BF98A1221ED4500F0BD0F /* ZXResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXResult.h; path = src/zxing/ZXResult.h; sourceTree = ""; }; - 3B0BF98B1221ED4500F0BD0F /* ZXResult.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXResult.mm; path = src/zxing/ZXResult.mm; sourceTree = ""; }; - 3B1E84291222D432000D7528 /* ZXCaptureDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXCaptureDelegate.h; path = src/zxing/ZXCaptureDelegate.h; sourceTree = ""; }; - 3B1E84581222DBBE000D7528 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 3B98744C12235C340013711B /* ZXQRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeReader.h; path = src/zxing/ZXQRCodeReader.h; sourceTree = ""; }; - 3B98744D12235C340013711B /* ZXQRCodeReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXQRCodeReader.mm; path = src/zxing/ZXQRCodeReader.mm; sourceTree = ""; }; - 3B98746A12235EC40013711B /* ZXIllegalArgumentException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXIllegalArgumentException.h; path = src/zxing/ZXIllegalArgumentException.h; sourceTree = ""; }; - 3B98746B12235EC40013711B /* ZXReaderException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXReaderException.h; path = src/zxing/ZXReaderException.h; sourceTree = ""; }; - 3B98747712235FEE0013711B /* ZXIllegalArgumentException.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXIllegalArgumentException.mm; path = src/zxing/ZXIllegalArgumentException.mm; sourceTree = ""; }; - 3B98747812235FEE0013711B /* ZXReaderException.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXReaderException.mm; path = src/zxing/ZXReaderException.mm; sourceTree = ""; }; - 3BB8D3BF1222172900F86718 /* ZXCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXCapture.h; path = src/zxing/ZXCapture.h; sourceTree = ""; }; - 3BB8D3C01222172900F86718 /* ZXCaptureView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXCaptureView.h; path = src/zxing/ZXCaptureView.h; sourceTree = ""; }; - 3BB8D3C11222172900F86718 /* ZXCaptureView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXCaptureView.mm; path = src/zxing/ZXCaptureView.mm; sourceTree = ""; }; - 3BB8D3C21222172900F86718 /* ZXView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXView.h; path = src/zxing/ZXView.h; sourceTree = ""; }; - 3BCF096F1221957200C3E580 /* ZXMultiFormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXMultiFormatReader.h; path = src/zxing/ZXMultiFormatReader.h; sourceTree = ""; }; - 3BCF09701221957200C3E580 /* ZXMultiFormatReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXMultiFormatReader.mm; path = src/zxing/ZXMultiFormatReader.mm; sourceTree = ""; }; - 3BCF09711221957200C3E580 /* ZXReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXReader.h; path = src/zxing/ZXReader.h; sourceTree = ""; }; - 3BCF09721221957200C3E580 /* ZXReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXReader.mm; path = src/zxing/ZXReader.mm; sourceTree = ""; }; - 3BE809B412221C7D00AA1B63 /* ZXCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXCapture.mm; path = src/zxing/ZXCapture.mm; sourceTree = ""; }; - 3BE809D0122221CF00AA1B63 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; - 3BE809D61222222800AA1B63 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - 3BED8A31122198210016F4E8 /* osx.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = osx.xcodeproj; path = ../cpp/osx.xcodeproj; sourceTree = SOURCE_ROOT; }; - 3BED8A41122198850016F4E8 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; - 3BED8A4D12219CB10016F4E8 /* ZXInit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ZXInit.c; path = src/zxing/ZXInit.c; sourceTree = ""; }; - 3BED8A5D1221B0270016F4E8 /* ZXImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXImage.h; path = src/zxing/ZXImage.h; sourceTree = ""; }; - 3BED8A5E1221B0270016F4E8 /* ZXImage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXImage.mm; path = src/zxing/ZXImage.mm; sourceTree = ""; }; - 3BED8A811221B7870016F4E8 /* ZXCGImageLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXCGImageLuminanceSource.h; path = src/zxing/ZXCGImageLuminanceSource.h; sourceTree = ""; }; - 3BED8A821221B7870016F4E8 /* ZXCGImageLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXCGImageLuminanceSource.mm; path = src/zxing/ZXCGImageLuminanceSource.mm; sourceTree = ""; }; - 3BED8A8C1221B84E0016F4E8 /* CGImageLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CGImageLuminanceSource.mm; path = src/zxing/CGImageLuminanceSource.mm; sourceTree = ""; }; - 3BED8A8D1221B84E0016F4E8 /* CGImageLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CGImageLuminanceSource.h; path = src/zxing/CGImageLuminanceSource.h; sourceTree = ""; }; - 3BED8A981221B92B0016F4E8 /* ZXLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZXLuminanceSource.h; path = src/zxing/ZXLuminanceSource.h; sourceTree = ""; }; - 3BED8A991221B92B0016F4E8 /* ZXLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZXLuminanceSource.mm; path = src/zxing/ZXLuminanceSource.mm; sourceTree = ""; }; - D2AAC0C705546C1D00DB518D /* zxing.bundle */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = zxing.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - D2AAC0C505546C1D00DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BED8A3E122198540016F4E8 /* libzxing.a in Frameworks */, - D2AAC0CC05546C4400DB518D /* Cocoa.framework in Frameworks */, - 3BED8A42122198850016F4E8 /* libiconv.dylib in Frameworks */, - 3BE809D1122221CF00AA1B63 /* QTKit.framework in Frameworks */, - 3BE809D71222222800AA1B63 /* CoreVideo.framework in Frameworks */, - 3B1E84591222DBBE000D7528 /* QuartzCore.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC0C705546C1D00DB518D /* zxing.bundle */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* zxing */ = { - isa = PBXGroup; - children = ( - 3BED8A31122198210016F4E8 /* osx.xcodeproj */, - 08FB77AEFE84172EC02AAC07 /* Classes */, - 32C88DFF0371C24200C91783 /* Other Sources */, - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, - 034768DFFF38A50411DB9C8B /* Products */, - 3BED8A41122198850016F4E8 /* libiconv.dylib */, - 3BE809D0122221CF00AA1B63 /* QTKit.framework */, - 3BE809D61222222800AA1B63 /* CoreVideo.framework */, - 3B1E84581222DBBE000D7528 /* QuartzCore.framework */, - ); - name = zxing; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { - isa = PBXGroup; - children = ( - 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, - 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, - ); - name = "External Frameworks and Libraries"; - sourceTree = ""; - }; - 08FB77AEFE84172EC02AAC07 /* Classes */ = { - isa = PBXGroup; - children = ( - 3B98747712235FEE0013711B /* ZXIllegalArgumentException.mm */, - 3B98747812235FEE0013711B /* ZXReaderException.mm */, - 3B98746A12235EC40013711B /* ZXIllegalArgumentException.h */, - 3B98746B12235EC40013711B /* ZXReaderException.h */, - 3B98744C12235C340013711B /* ZXQRCodeReader.h */, - 3B98744D12235C340013711B /* ZXQRCodeReader.mm */, - 3B1E84291222D432000D7528 /* ZXCaptureDelegate.h */, - 3BE809B412221C7D00AA1B63 /* ZXCapture.mm */, - 3BB8D3BF1222172900F86718 /* ZXCapture.h */, - 3BB8D3C01222172900F86718 /* ZXCaptureView.h */, - 3BB8D3C11222172900F86718 /* ZXCaptureView.mm */, - 3BB8D3C21222172900F86718 /* ZXView.h */, - 3B0BF9821221ED4500F0BD0F /* ZXBinarizer.h */, - 3B0BF9831221ED4500F0BD0F /* ZXBinarizer.mm */, - 3B0BF9841221ED4500F0BD0F /* ZXBinaryBitmap.h */, - 3B0BF9851221ED4500F0BD0F /* ZXBinaryBitmap.mm */, - 3B0BF9861221ED4500F0BD0F /* ZXDecodeHints.h */, - 3B0BF9871221ED4500F0BD0F /* ZXDecodeHints.mm */, - 3B0BF9881221ED4500F0BD0F /* ZXHybridBinarizer.h */, - 3B0BF9891221ED4500F0BD0F /* ZXHybridBinarizer.mm */, - 3B0BF98A1221ED4500F0BD0F /* ZXResult.h */, - 3B0BF98B1221ED4500F0BD0F /* ZXResult.mm */, - 3BED8A981221B92B0016F4E8 /* ZXLuminanceSource.h */, - 3BED8A991221B92B0016F4E8 /* ZXLuminanceSource.mm */, - 3BED8A8C1221B84E0016F4E8 /* CGImageLuminanceSource.mm */, - 3BED8A8D1221B84E0016F4E8 /* CGImageLuminanceSource.h */, - 3BED8A811221B7870016F4E8 /* ZXCGImageLuminanceSource.h */, - 3BED8A821221B7870016F4E8 /* ZXCGImageLuminanceSource.mm */, - 3BED8A5D1221B0270016F4E8 /* ZXImage.h */, - 3BED8A5E1221B0270016F4E8 /* ZXImage.mm */, - 3BCF096F1221957200C3E580 /* ZXMultiFormatReader.h */, - 3BCF09701221957200C3E580 /* ZXMultiFormatReader.mm */, - 3BCF09711221957200C3E580 /* ZXReader.h */, - 3BCF09721221957200C3E580 /* ZXReader.mm */, - ); - name = Classes; - sourceTree = ""; - }; - 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { - isa = PBXGroup; - children = ( - 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */, - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 0867D6A5FE840307C02AAC07 /* AppKit.framework */, - 0867D69BFE84028FC02AAC07 /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 32C88DFF0371C24200C91783 /* Other Sources */ = { - isa = PBXGroup; - children = ( - 3BED8A4D12219CB10016F4E8 /* ZXInit.c */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 3BED8A32122198210016F4E8 /* Products */ = { - isa = PBXGroup; - children = ( - 3BED8A39122198210016F4E8 /* libzxing.a */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - D2AAC0C305546C1D00DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BCF09731221957200C3E580 /* ZXMultiFormatReader.h in Headers */, - 3BCF09751221957200C3E580 /* ZXReader.h in Headers */, - 3BED8A5F1221B0270016F4E8 /* ZXImage.h in Headers */, - 3BED8A831221B7870016F4E8 /* ZXCGImageLuminanceSource.h in Headers */, - 3BED8A8F1221B84E0016F4E8 /* CGImageLuminanceSource.h in Headers */, - 3BED8A9A1221B92B0016F4E8 /* ZXLuminanceSource.h in Headers */, - 3B0BF98C1221ED4500F0BD0F /* ZXBinarizer.h in Headers */, - 3B0BF98E1221ED4500F0BD0F /* ZXBinaryBitmap.h in Headers */, - 3B0BF9901221ED4500F0BD0F /* ZXDecodeHints.h in Headers */, - 3B0BF9921221ED4500F0BD0F /* ZXHybridBinarizer.h in Headers */, - 3B0BF9941221ED4500F0BD0F /* ZXResult.h in Headers */, - 3BB8D3C31222172900F86718 /* ZXCapture.h in Headers */, - 3BB8D3C41222172900F86718 /* ZXCaptureView.h in Headers */, - 3BB8D3C61222172900F86718 /* ZXView.h in Headers */, - 3B1E842A1222D432000D7528 /* ZXCaptureDelegate.h in Headers */, - 3B98744E12235C340013711B /* ZXQRCodeReader.h in Headers */, - 3B98746C12235EC40013711B /* ZXIllegalArgumentException.h in Headers */, - 3B98746D12235EC40013711B /* ZXReaderException.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - D2AAC0C605546C1D00DB518D /* zxing */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB917D08733D990010E9CD /* Build configuration list for PBXNativeTarget "zxing" */; - buildPhases = ( - D2AAC0C305546C1D00DB518D /* Headers */, - D2AAC0C405546C1D00DB518D /* Sources */, - D2AAC0C505546C1D00DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 3BED8A3B122198300016F4E8 /* PBXTargetDependency */, - ); - name = zxing; - productName = zxing; - productReference = D2AAC0C705546C1D00DB518D /* zxing.bundle */; - productType = "com.apple.product-type.library.dynamic"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - buildConfigurationList = 1DEB918108733D990010E9CD /* Build configuration list for PBXProject "osx" */; - compatibilityVersion = "Xcode 3.1"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - en, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* zxing */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 3BED8A32122198210016F4E8 /* Products */; - ProjectRef = 3BED8A31122198210016F4E8 /* osx.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - D2AAC0C605546C1D00DB518D /* zxing */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 3BED8A39122198210016F4E8 /* libzxing.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libzxing.a; - remoteRef = 3BED8A38122198210016F4E8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXSourcesBuildPhase section */ - D2AAC0C405546C1D00DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BCF09741221957200C3E580 /* ZXMultiFormatReader.mm in Sources */, - 3BCF09761221957200C3E580 /* ZXReader.mm in Sources */, - 3BED8A4E12219CB10016F4E8 /* ZXInit.c in Sources */, - 3BED8A601221B0270016F4E8 /* ZXImage.mm in Sources */, - 3BED8A841221B7870016F4E8 /* ZXCGImageLuminanceSource.mm in Sources */, - 3BED8A8E1221B84E0016F4E8 /* CGImageLuminanceSource.mm in Sources */, - 3BED8A9B1221B92B0016F4E8 /* ZXLuminanceSource.mm in Sources */, - 3B0BF98D1221ED4500F0BD0F /* ZXBinarizer.mm in Sources */, - 3B0BF98F1221ED4500F0BD0F /* ZXBinaryBitmap.mm in Sources */, - 3B0BF9911221ED4500F0BD0F /* ZXDecodeHints.mm in Sources */, - 3B0BF9931221ED4500F0BD0F /* ZXHybridBinarizer.mm in Sources */, - 3B0BF9951221ED4500F0BD0F /* ZXResult.mm in Sources */, - 3BB8D3C51222172900F86718 /* ZXCaptureView.mm in Sources */, - 3BE809B512221C7D00AA1B63 /* ZXCapture.mm in Sources */, - 3B98744F12235C340013711B /* ZXQRCodeReader.mm in Sources */, - 3B98747912235FEE0013711B /* ZXIllegalArgumentException.mm in Sources */, - 3B98747A12235FEE0013711B /* ZXReaderException.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 3BED8A3B122198300016F4E8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = zxing; - targetProxy = 3BED8A3A122198300016F4E8 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1DEB917E08733D990010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - EXECUTABLE_EXTENSION = bundle; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = osx_Prefix.pch; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxing; - }; - name = Debug; - }; - 1DEB917F08733D990010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - EXECUTABLE_EXTENSION = bundle; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = osx_Prefix.pch; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = zxing; - }; - name = Release; - }; - 1DEB918208733D990010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_GC = supported; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - src, - ../cpp/core/src, - ); - ONLY_ACTIVE_ARCH = YES; - PREBINDING = NO; - SDKROOT = macosx10.6; - WARNING_CFLAGS = ( - "-Wall", - "-Wextra", - ); - }; - name = Debug; - }; - 1DEB918308733D990010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_GC = supported; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - src, - ../cpp/core/src, - ); - PREBINDING = NO; - SDKROOT = macosx10.6; - WARNING_CFLAGS = ( - "-Wall", - "-Wextra", - ); - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB917D08733D990010E9CD /* Build configuration list for PBXNativeTarget "zxing" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB917E08733D990010E9CD /* Debug */, - 1DEB917F08733D990010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB918108733D990010E9CD /* Build configuration list for PBXProject "osx" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB918208733D990010E9CD /* Debug */, - 1DEB918308733D990010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/objc/osx_Prefix.pch b/objc/osx_Prefix.pch deleted file mode 100644 index 7c0c7a4de..000000000 --- a/objc/osx_Prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ - #import - #import -#endif diff --git a/objc/src/Prefix.pch b/objc/src/Prefix.pch deleted file mode 100644 index bf4aa339e..000000000 --- a/objc/src/Prefix.pch +++ /dev/null @@ -1,13 +0,0 @@ -#ifdef __OBJC__ - -#import - -#include - -#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR -#import -#else -#import -#endif - -#endif diff --git a/objc/src/ZXing/CGImageLuminanceSource.mm b/objc/src/ZXing/CGImageLuminanceSource.mm deleted file mode 100644 index 30fc8c448..000000000 --- a/objc/src/ZXing/CGImageLuminanceSource.mm +++ /dev/null @@ -1,233 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors All rights reserved. - * - * 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. - */ - -#import -#include -#include - -using std::string; -using std::ostringstream; -using zxing::CGImageLuminanceSource; -using zxing::ArrayRef; -using zxing::Ref; -using zxing::LuminanceSource; - -CGImageRef CGImageLuminanceSource::createImageFromBuffer - (CVPixelBufferRef buffer, int left, int top, int width, int height) -{ - int bytesPerRow = (int)CVPixelBufferGetBytesPerRow(buffer); - int dataWidth = (int)CVPixelBufferGetWidth(buffer); - int dataHeight = (int)CVPixelBufferGetHeight(buffer); - - if (left + width > dataWidth || - top + height > dataHeight || - top < 0 || - left < 0) { - throw - IllegalArgumentException("Crop rectangle does not fit within image data."); - } - - int newBytesPerRow = ((width*4+0xf)>>4)<<4; - - CVPixelBufferLockBaseAddress(buffer,0); - - unsigned char* baseAddress = - (unsigned char*)CVPixelBufferGetBaseAddress(buffer); - - int size = newBytesPerRow*height; - unsigned char* bytes = (unsigned char*)malloc(size); - if (newBytesPerRow == bytesPerRow) { - memcpy(bytes, baseAddress+top*bytesPerRow, size); - } else { - for(int y=0; y dataWidth_ || - top_ + getHeight() > dataHeight_ || - top_ < 0 || - left_ < 0) { - throw IllegalArgumentException - ("Crop rectangle does not fit within image data."); - } - - CGColorSpaceRef space = CGImageGetColorSpace(image_); - CGColorSpaceModel model = CGColorSpaceGetModel(space); - - if (model != kCGColorSpaceModelMonochrome || - CGImageGetBitsPerComponent(image_) != 8 || - CGImageGetBitsPerPixel(image_) != 8) { - - CGColorSpaceRef gray = CGColorSpaceCreateDeviceGray(); - - CGContextRef ctx = CGBitmapContextCreate(0, - getWidth(), - getHeight(), - 8, - getWidth(), - gray, - kCGImageAlphaNone); - - CGColorSpaceRelease(gray); - - if (top || left) { - CGContextClipToRect(ctx, CGRectMake(0, 0, getWidth(), getHeight())); - } - - CGContextDrawImage(ctx, CGRectMake(-left, -top, getWidth(), getHeight()), image_); - - image_ = CGBitmapContextCreateImage(ctx); - - bytesPerRow_ = getWidth(); - top_ = 0; - left_ = 0; - dataWidth_ = getWidth(); - dataHeight_ = getHeight(); - - CGContextRelease(ctx); - } else { - CGImageRetain(image_); - } - - CGDataProviderRef provider = CGImageGetDataProvider(image_); - data_ = CGDataProviderCopyData(provider); -} - -CGImageLuminanceSource::~CGImageLuminanceSource() { - if (image_) { - CGImageRelease(image_); - } - if (data_) { - CFRelease(data_); - } -} - -ArrayRef CGImageLuminanceSource::getRow(int y, ArrayRef row) const { - if (y < 0 || y >= this->getHeight()) { - ostringstream msg; - msg << "Requested row is outside the image: " << y; - throw IllegalArgumentException(msg.str().c_str()); - } - int width = getWidth(); - // TODO(flyashi): determine if row has enough size. - if (!row) { - row = ArrayRef(getWidth()); - } - int offset = (y + top_) * dataWidth_ + left_; - char* v = &row->values()[0]; - CFDataGetBytes(data_, CFRangeMake(offset, width), (unsigned char*)v); - return row; -} - -ArrayRef CGImageLuminanceSource::getMatrix() const { - int size = getWidth() * getHeight(); - ArrayRef result (size); - if (left_ == 0 && - top_ == 0 && - dataWidth_ == getWidth() && - dataHeight_ == getHeight()) { - char* v = &result->values()[0]; - CFDataGetBytes(data_, CFRangeMake(0, size), (unsigned char*)v); - } else { - for (int row = 0; row < getHeight(); row++) { - char* v = &result->values()[0]; - CFDataGetBytes(data_, - CFRangeMake((top_ + row) * dataWidth_ + left_, getWidth()), - (unsigned char*)v + row * getWidth()); - } - } - return result; -} diff --git a/objc/src/ZXing/ZXBinarizer.h b/objc/src/ZXing/ZXBinarizer.h deleted file mode 100644 index 20f0daaa9..000000000 --- a/objc/src/ZXing/ZXBinarizer.h +++ /dev/null @@ -1,29 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 -#import - -@interface ZXBinarizer : NSObject { - zxing::Ref native; -} - -- (ZXBinarizer*)initWithNative:(zxing::Binarizer*)native; -- (zxing::Binarizer*)native; -- (CGImageRef)createImage; - -@end diff --git a/objc/src/ZXing/ZXBinarizer.mm b/objc/src/ZXing/ZXBinarizer.mm deleted file mode 100644 index f52a35f73..000000000 --- a/objc/src/ZXing/ZXBinarizer.mm +++ /dev/null @@ -1,88 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR -#define ZXBlack [[UIColor blackColor] CGColor] -#define ZXWhite [[UIColor whiteColor] CGColor] -#else -#define ZXBlack CGColorGetConstantColor(kCGColorBlack) -#define ZXWhite CGColorGetConstantColor(kCGColorWhite) -#endif - -@implementation ZXBinarizer - -- (id)initWithNative:(zxing::Binarizer*)binarizer { - if ((self = [super init])) { - native = binarizer; - } - return self; -} - -- (zxing::Binarizer*)native { - return native; -} - -- (CGImageRef)createImage { - zxing::BitMatrix& matrix (*native->getBlackMatrix()); - zxing::LuminanceSource& source (*native->getLuminanceSource()); - - int width = source.getWidth(); - int height = source.getHeight(); - - int bytesPerRow = ((width&0xf)>>4)<<4; - - CGColorSpaceRef gray = CGColorSpaceCreateDeviceGray(); - CGContextRef context = CGBitmapContextCreate ( - 0, - width, - height, - 8, // bits per component - bytesPerRow, - gray, - kCGImageAlphaNone); - CGColorSpaceRelease(gray); - - CGRect r = CGRectZero; - r.size.width = width; - r.size.height = height; - CGContextSetFillColorWithColor(context, ZXBlack); - CGContextFillRect(context, r); - - r.size.width = 1; - r.size.height = 1; - - CGContextSetFillColorWithColor(context, ZXWhite); - for(int y=0; y - -@class ZXBinarizer; - -@interface ZXBinaryBitmap : NSObject { - zxing::Ref native; -} - -- (ZXBinaryBitmap*)initWithBinarizer:(ZXBinarizer*)binarizer; -- (zxing::BinaryBitmap*)native; - - -@end diff --git a/objc/src/ZXing/ZXBinaryBitmap.mm b/objc/src/ZXing/ZXBinaryBitmap.mm deleted file mode 100644 index 4134984bd..000000000 --- a/objc/src/ZXing/ZXBinaryBitmap.mm +++ /dev/null @@ -1,38 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import - -@implementation ZXBinaryBitmap - -- (ZXBinaryBitmap*)initWithBinarizer:(ZXBinarizer*)binarizer { - native = - new zxing::BinaryBitmap(zxing::Ref([binarizer native])); - return self; -} - -- (zxing::BinaryBitmap*)native { - return native; -} - -- (void)dealloc { - native = 0; - [super dealloc]; -} - -@end diff --git a/objc/src/ZXing/ZXCGImageLuminanceSource.h b/objc/src/ZXing/ZXCGImageLuminanceSource.h deleted file mode 100644 index 9ee62d0d3..000000000 --- a/objc/src/ZXing/ZXCGImageLuminanceSource.h +++ /dev/null @@ -1,110 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import - -namespace zxing { - -class CGImageLuminanceSource : public LuminanceSource { - private: - typedef LuminanceSource Super; - CGImageRef image_; - CFDataRef data_; - int left_; - int top_; - int dataWidth_; - int dataHeight_; - int bytesPerRow_; - - public: - - static CGImageRef createImageFromBuffer(CVImageBufferRef); - static CGImageRef createImageFromBuffer(CVImageBufferRef, - int left, - int top, - int width, - int height); - - static CGImageLuminanceSource* create(CVPixelBufferRef buffer); - - CGImageLuminanceSource(CVPixelBufferRef buffer, - int left, - int top, - int width, - int height); - - CGImageLuminanceSource(CGImageRef image, - int left, - int top, - int width, - int height); - CGImageLuminanceSource(CGImageRef image); - ~CGImageLuminanceSource(); - - CGImageRef image() { return image_; } - CGImageRef image(size_t width, size_t height); - - ArrayRef getRow(int y, ArrayRef row) const; - ArrayRef getMatrix() const; - - private: - void init(CGImageRef image); - void init(CGImageRef image, int left, int top); -}; - -} /* namespace */ - -@class ZXImage; - -@interface ZXCGImageLuminanceSource : ZXLuminanceSource { -} - -+ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer; -+ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height; - -- (id)initWithZXImage:(ZXImage*)image - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height; - -- (id)initWithZXImage:(ZXImage*)image; - -- (id)initWithCGImage:(CGImageRef)image - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height; - -- (id)initWithCGImage:(CGImageRef)image; - -- (id)initWithBuffer:(CVPixelBufferRef)buffer - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height; - -- (id)initWithBuffer:(CVPixelBufferRef)buffer; - -- (CGImageRef)image; - -@end diff --git a/objc/src/ZXing/ZXCGImageLuminanceSource.mm b/objc/src/ZXing/ZXCGImageLuminanceSource.mm deleted file mode 100644 index 1f980d6fa..000000000 --- a/objc/src/ZXing/ZXCGImageLuminanceSource.mm +++ /dev/null @@ -1,91 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#import - -@implementation ZXCGImageLuminanceSource - -+ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer { - return zxing::CGImageLuminanceSource::createImageFromBuffer(buffer); -} - -+ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height { - return zxing::CGImageLuminanceSource::createImageFromBuffer( - buffer, (int)left, (int)top, (int)width, (int)height - ); -} - -- (id)initWithZXImage:(ZXImage*)image - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height { - self = [super initWithNative:new zxing::CGImageLuminanceSource( - image.cgimage, (int)left, (int)top, (int)width, (int)height - )]; - return self; -} - -- (id)initWithZXImage:(ZXImage*)image { - self = [super initWithNative:new zxing::CGImageLuminanceSource(image.cgimage)]; - return self; -} - -- (id)initWithCGImage:(CGImageRef)image - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height { - self = [super initWithNative:new zxing::CGImageLuminanceSource( - image, (int)left, (int)top, (int)width, (int)height - )]; - return self; -} - -- (id)initWithCGImage:(CGImageRef)image { - self = [super initWithNative:new zxing::CGImageLuminanceSource(image)]; - return self; -} - -- (id)initWithBuffer:(CVPixelBufferRef)buffer - left:(size_t)left - top:(size_t)top - width:(size_t)width - height:(size_t)height { - self = [super initWithNative:new zxing::CGImageLuminanceSource( - buffer, (int)left, (int)top, (int)width, (int)height - )]; - return self; -} - -- (id)initWithBuffer:(CVPixelBufferRef)buffer { - self = [super initWithNative:zxing::CGImageLuminanceSource::create(buffer)]; - return self; -} - -- (CGImageRef)image { - zxing::LuminanceSource* source = native; - zxing::CGImageLuminanceSource* typed = (zxing::CGImageLuminanceSource*)source; - return typed->image(); -} - -@end diff --git a/objc/src/ZXing/ZXCapture.h b/objc/src/ZXing/ZXCapture.h deleted file mode 100644 index 0af847819..000000000 --- a/objc/src/ZXing/ZXCapture.h +++ /dev/null @@ -1,142 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -#if !TARGET_IPHONE_SIMULATOR -#if TARGET_OS_EMBEDDED -#include -#define ZX(x) x -#define ZXAV(x) x -#define ZXAVC(x) ,x -#define ZXQT(x) -#define ZXCaptureSession AVCaptureSession -#define ZXCaptureVideoPreviewLayer AVCaptureVideoPreviewLayer -#define ZXCaptureDevice AVCaptureDevice -#define ZXCaptureDeviceInput AVCaptureDeviceInput -#define ZXCaptureVideoOutput AVCaptureVideoDataOutput -#else -#import -#define ZX(x) x -#define ZXAV(x) -#define ZXAVC(x) -#define ZXQT(x) x -#define ZXCaptureSession QTCaptureSession -#define ZXCaptureVideoPreviewLayer QTCaptureLayer -#define ZXCaptureDevice QTCaptureDevice -#define ZXCaptureDeviceInput QTCaptureDeviceInput -#define ZXCaptureVideoOutput QTCaptureDecompressedVideoOutput -#endif - -@interface ZXCapture - : NSObject -ZX() { - ZX( - ZXCaptureSession* session; - ZXCaptureVideoPreviewLayer* layer; - ZXCaptureDevice* capture_device; - ZXCaptureDeviceInput* input; - ZXCaptureVideoOutput* output; - id delegate; - ) - - int order_in_skip; - int order_out_skip; - BOOL running; - BOOL on_screen; - CALayer* luminance; - CALayer* binary; - size_t width; - size_t height; - size_t reported_width; - size_t reported_height; - NSString* captureToFilename; - BOOL hard_stop; - int camera; - BOOL torch; - BOOL mirror; - int capture_device_index; - CGAffineTransform transform; -} - -@property (nonatomic, assign) id delegate; -@property (nonatomic, copy) NSString* captureToFilename; -@property (nonatomic) CGAffineTransform transform; -@property (nonatomic, readonly) ZXCaptureVideoOutput* output; -@property (nonatomic, readonly) CALayer* layer; -@property (nonatomic, retain) ZXCaptureDevice* captureDevice; -@property (nonatomic, assign) BOOL mirror; -@property (nonatomic, readonly) BOOL running; - -- (id)init; -- (CALayer*)luminance; -- (void)setLuminance:(BOOL)on_off; -- (CALayer*)binary; -- (void)setBinary:(BOOL)on_off; -- (void)start; -- (void)stop; -- (void)hard_stop; -- (void)order_skip; - -@property (nonatomic, readonly) BOOL hasFront; -@property (nonatomic, readonly) BOOL hasBack; -@property (nonatomic, readonly) BOOL hasTorch; - -@property (nonatomic, readonly) int front; -@property (nonatomic, readonly) int back; - -@property (nonatomic) int camera; -@property (nonatomic) BOOL torch; - -@end - -#else - -@interface ZXCapture : NSObject { -} - -@property (nonatomic,assign) id delegate; -@property (nonatomic,copy) NSString* captureToFilename; -@property (nonatomic) CGAffineTransform transform; -@property (nonatomic, readonly) void* output; -@property (nonatomic, readonly) CALayer* layer; - -- (id)init; -- (CALayer*)luminance; -- (void)setLuminance:(BOOL)on_off; -- (CALayer*)binary; -- (void)setBinary:(BOOL)on_off; -- (void)start; -- (void)stop; -- (void)hard_stop; -- (void)order_skip; - -@property (nonatomic,readonly) BOOL hasFront; -@property (nonatomic,readonly) BOOL hasBack; -@property (nonatomic,readonly) BOOL hasTorch; - -@property (nonatomic,readonly) int front; -@property (nonatomic,readonly) int back; - -@property (nonatomic) int camera; -@property (nonatomic) BOOL torch; - -@property (nonatomic, assign) BOOL mirror; - -@end - -#endif diff --git a/objc/src/ZXing/ZXCapture.mm b/objc/src/ZXing/ZXCapture.mm deleted file mode 100644 index 75db15e4e..000000000 --- a/objc/src/ZXing/ZXCapture.mm +++ /dev/null @@ -1,734 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 - -#if !TARGET_IPHONE_SIMULATOR -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR -#define ZXCaptureOutput AVCaptureOutput -#define ZXMediaTypeVideo AVMediaTypeVideo -#define ZXCaptureConnection AVCaptureConnection -#else -#define ZXCaptureOutput QTCaptureOutput -#define ZXCaptureConnection QTCaptureConnection -#define ZXMediaTypeVideo QTMediaTypeVideo -#endif - -namespace { - -const bool ZX_MULTI_READER = true; - -} - -#if ZXAV(1)+0 -static bool isIPad(); -#endif - -@implementation ZXCapture - -@synthesize delegate; -@synthesize transform; -@synthesize captureToFilename; - -- (ZXCapture*)init { - if ((self = [super init])) { - on_screen = running = NO; - reported_width = 0; - reported_height = 0; - width = 1920; - height = 1080; - hard_stop = false; - capture_device = 0; - capture_device_index = -1; - order_in_skip = 0; - order_out_skip = 0; - transform = CGAffineTransformIdentity; - ZXQT({ - transform.a = -1; - }); - } - return self; -} - -- (BOOL)running {return running;} - -- (BOOL)mirror { - return mirror; -} - -- (void)setMirror:(BOOL)mirror_ { - if (mirror != mirror_) { - mirror = mirror_; - if (layer) { - transform.a = -transform.a; - [layer setAffineTransform:transform]; - } - } -} - -- (void)order_skip { - order_out_skip = order_in_skip = 1; -} - -- (ZXCaptureDevice*)device { - if (capture_device) { - return capture_device; - } - - ZXCaptureDevice* zxd = nil; - -#if ZXAV(1)+0 - NSArray* devices = - [ZXCaptureDevice - ZXAV(devicesWithMediaType:) - ZXQT(inputDevicesWithMediaType:) ZXMediaTypeVideo]; - - if ([devices count] > 0) { - if (capture_device_index == -1) { - AVCaptureDevicePosition position = AVCaptureDevicePositionBack; - if (camera == self.front) { - position = AVCaptureDevicePositionFront; - } - - for(unsigned int i=0; i < [devices count]; ++i) { - ZXCaptureDevice* dev = [devices objectAtIndex:i]; - if (dev.position == position) { - capture_device_index = i; - zxd = dev; - break; - } - } - } - - if (!zxd && capture_device_index != -1) { - zxd = [devices objectAtIndex:capture_device_index]; - } - } -#endif - - if (!zxd) { - zxd = - [ZXCaptureDevice - ZXAV(defaultDeviceWithMediaType:) - ZXQT(defaultInputDeviceWithMediaType:) ZXMediaTypeVideo]; - } - - capture_device = [zxd retain]; - - return zxd; -} - -- (ZXCaptureDevice*)captureDevice { - return capture_device; -} - -- (void)setCaptureDevice:(ZXCaptureDevice*)device { - if (device == capture_device) { - return; - } - - if(capture_device) { - ZXQT({ - if ([capture_device isOpen]) { - [capture_device close]; - }}); - [capture_device release]; - } - - capture_device = [device retain]; -} - -- (void)replaceInput { - if (session && input) { - [session removeInput:input]; - [input release]; - input = nil; - } - - ZXCaptureDevice* zxd = [self device]; - ZXQT([zxd open:nil]); - - if (zxd) { - input = - [ZXCaptureDeviceInput deviceInputWithDevice:zxd - ZXAV(error:nil)]; - [input retain]; - } - - if (input) { - ZXAV({ - NSString* preset = 0; - if (!preset && - NSClassFromString(@"NSOrderedSet") && // Proxy for "is this iOS 5" ... - [UIScreen mainScreen].scale > 1 && - isIPad() && - [zxd supportsAVCaptureSessionPreset:AVCaptureSessionPresetiFrame960x540]) { - preset = AVCaptureSessionPresetiFrame960x540; - } - if (!preset) { - preset = AVCaptureSessionPresetMedium; - } - session.sessionPreset = preset; - }); - [session addInput:input ZXQT(error:nil)]; - } -} - -- (ZXCaptureSession*)session { - if (session == 0) { - session = [[ZXCaptureSession alloc] init]; - [self replaceInput]; - } - return session; -} - -- (void)stop { - // NSLog(@"stop"); - - if (!running) { - return; - } - - if (true ZXAV(&& self.session.running)) { - // NSLog(@"stop running"); - [self.session stopRunning]; - } else { - // NSLog(@"already stopped"); - } - running = false; -} - -- (void)setOutputAttributes { - NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; - NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; - NSMutableDictionary* attributes = - [NSMutableDictionary dictionaryWithObject:value forKey:key]; - ZXQT({ - key = (NSString*)kCVPixelBufferWidthKey; - value = [NSNumber numberWithUnsignedLong:width]; - [attributes setObject:value forKey:key]; - key = (NSString*)kCVPixelBufferHeightKey; - value = [NSNumber numberWithUnsignedLong:height]; - [attributes setObject:value forKey:key]; - }); - [output ZXQT(setPixelBufferAttributes:)ZXAV(setVideoSettings:)attributes]; -} - -- (ZXCaptureVideoOutput*)output { - if (!output) { - output = [[ZXCaptureVideoOutput alloc] init]; - [self setOutputAttributes]; - [output ZXQT(setAutomaticallyDropsLateVideoFrames:) - ZXAV(setAlwaysDiscardsLateVideoFrames:)YES]; - [output ZXQT(setDelegate:)ZXAV(setSampleBufferDelegate:)self - ZXAV(queue:dispatch_get_main_queue())]; - [self.session addOutput:output ZXQT(error:nil)]; - } - return output; -} - -- (void)start { - // NSLog(@"start %@ %d %@ %@", self.session, running, output, delegate); - - if (hard_stop) { - return; - } - - if (delegate || luminance || binary) { - // for side effects - [self output]; - } - - if (false ZXAV(|| self.session.running)) { - // NSLog(@"already running"); - } else { - - static int i = 0; - if (++i == -2) { - abort(); - } - - // NSLog(@"start running"); - [self.session startRunning]; - } - running = true; -} - -- (void)start_stop { - // NSLog(@"ss %d %@ %d %@ %@ %@", running, delegate, on_screen, output, luminanceLayer, binary); - if ((!running && (delegate || on_screen)) || - (!output && - (delegate || - (on_screen && (luminance || binary))))) { - [self start]; - } - if (running && !delegate && !on_screen) { - [self stop]; - } -} - -- (void)setDelegate:(id)_delegate { - delegate = _delegate; - if (delegate) { - hard_stop = false; - } - [self start_stop]; -} - -- (void)hard_stop { - hard_stop = true; - if (running) { - [self stop]; - } -} - -- (void)setLuminance:(BOOL)on { - if (on && !luminance) { - [luminance release]; - luminance = [[CALayer layer] retain]; - } else if (!on && luminance) { - [luminance release]; - luminance = nil; - } -} - -- (CALayer*)luminance { - return luminance; -} - -- (void)setBinary:(BOOL)on { - if (on && !binary) { - [binary release]; - binary = [[CALayer layer] retain]; - } else if (!on && binary) { - [binary release]; - binary = nil; - } -} - -- (CALayer*)binary { - return binary; -} - -- (CALayer*)layer { - if (!layer) { - layer = [[ZXCaptureVideoPreviewLayer alloc] initWithSession:self.session]; - - ZXAV(layer.videoGravity = AVLayerVideoGravityResizeAspect); - ZXAV(layer.videoGravity = AVLayerVideoGravityResizeAspectFill); - - [layer setAffineTransform:transform]; - layer.delegate = self; - - ZXQT({ - ProcessSerialNumber psn; - GetCurrentProcess(&psn); - TransformProcessType(&psn, 1); - }); - } - return layer; -} - -- (void)runActionForKey:(NSString *)key - object:(id)anObject - arguments:(NSDictionary *)dict { - // NSLog(@" rAFK %@ %@ %@", key, anObject, dict); - (void)anObject; - (void)dict; - if ([key isEqualToString:kCAOnOrderIn]) { - - if (order_in_skip) { - --order_in_skip; - // NSLog(@"order in skip"); - return; - } - - // NSLog(@"order in"); - - on_screen = true; - if (luminance && luminance.superlayer != layer) { - // [layer addSublayer:luminance]; - } - if (binary && binary.superlayer != layer) { - // [layer addSublayer:binary]; - } - [self start_stop]; - } else if ([key isEqualToString:kCAOnOrderOut]) { - if (order_out_skip) { - --order_out_skip; - // NSLog(@"order out skip"); - return; - } - - on_screen = false; - // NSLog(@"order out"); - [self start_stop]; - } -} - -- (id)actionForLayer:(CALayer*)_layer forKey:(NSString*)event { - (void)_layer; - - // NSLog(@"layer event %@", event); - - // never animate - [CATransaction setValue:[NSNumber numberWithFloat:0.0f] - forKey:kCATransactionAnimationDuration]; - - // NSLog(@"afl %@ %@", _layer, event); - if ([event isEqualToString:kCAOnOrderIn] - || [event isEqualToString:kCAOnOrderOut] - // || ([event isEqualToString:@"bounds"] && (binary || luminance)) - // || ([event isEqualToString:@"onLayout"] && (binary || luminance)) - ) { - return self; - } else if ([event isEqualToString:@"contents"] ) { - } else if ([event isEqualToString:@"sublayers"] ) { - } else if ([event isEqualToString:@"onLayout"] ) { - } else if ([event isEqualToString:@"position"] ) { - } else if ([event isEqualToString:@"bounds"] ) { - } else if ([event isEqualToString:@"layoutManager"] ) { - } else if ([event isEqualToString:@"transform"] ) { - } else { - NSLog(@"afl %@ %@", _layer, event); - } - return nil; -} - -- (void)dealloc { - if (input && session) { - [session removeInput:input]; - } - if (output && session) { - [session removeOutput:output]; - } - [captureToFilename release]; - [binary release]; - [luminance release]; - [output release]; - [input release]; - [layer release]; - [session release]; - [super dealloc]; -} - -- (void)captureOutput:(ZXCaptureOutput*)captureOutput -ZXQT(didOutputVideoFrame:(CVImageBufferRef)videoFrame - withSampleBuffer:(QTSampleBuffer*)sampleBuffer) -ZXAV(didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer) - fromConnection:(ZXCaptureConnection*)connection { - - if (!captureToFilename && !luminance && !binary && !delegate) { - // NSLog(@"skipping capture"); - return; - } - - // NSLog(@"received frame"); - - ZXAV(CVImageBufferRef videoFrame = CMSampleBufferGetImageBuffer(sampleBuffer)); - - // NSLog(@"%ld %ld", CVPixelBufferGetWidth(videoFrame), CVPixelBufferGetHeight(videoFrame)); - // NSLog(@"delegate %@", delegate); - - ZXQT({ - if (!reported_width || !reported_height) { - NSSize size = - [[[[input.device.formatDescriptions objectAtIndex:0] - formatDescriptionAttributes] objectForKey:@"videoEncodedPixelsSize"] sizeValue]; - width = size.width; - height = size.height; - // NSLog(@"reported: %f x %f", size.width, size.height); - [self performSelectorOnMainThread:@selector(setOutputAttributes) withObject:nil waitUntilDone:NO]; - reported_width = size.width; - reported_height = size.height; - if ([delegate respondsToSelector:@selector(captureSize:width:height:)]) { - [delegate captureSize:self - width:[NSNumber numberWithFloat:size.width] - height:[NSNumber numberWithFloat:size.height]]; - } - }}); - - (void)sampleBuffer; - - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - - (void)captureOutput; - (void)connection; - -#if !TARGET_OS_EMBEDDED - // The routines don't exist in iOS. There are alternatives, but a good - // solution would have to figure out a reasonable path and might be - // better as a post to url - - if (captureToFilename) { - CGImageRef image = - [ZXCGImageLuminanceSource createImageFromBuffer:videoFrame]; - NSURL* url = [NSURL fileURLWithPath:captureToFilename]; - CGImageDestinationRef dest = - CGImageDestinationCreateWithURL((CFURLRef)url, kUTTypePNG, 1, nil); - CGImageDestinationAddImage(dest, image, nil); - CGImageDestinationFinalize(dest); - CGImageRelease(image); - CFRelease(dest); - self.captureToFilename = nil; - } -#endif - - ZXCGImageLuminanceSource* source - = [[[ZXCGImageLuminanceSource alloc] - initWithBuffer:videoFrame] - autorelease]; - - if (luminance) { - CGImageRef image = source.image; - CGImageRetain(image); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ - luminance.contents = (id)image; - CGImageRelease(image); - }); - } - - if (binary || delegate) { - - // compiler issue? - ZXHybridBinarizer* binarizer = [ZXHybridBinarizer alloc]; - [[binarizer initWithSource:source] autorelease]; - - if (binary) { - CGImageRef image = binarizer.createImage; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ - binary.contents = (id)image; - CGImageRelease(image); - }); - } - - if (delegate) { - - ZXDecodeHints* hints = [[[ZXDecodeHints alloc] init] autorelease]; - ZXBinaryBitmap* bitmap = - [[[ZXBinaryBitmap alloc] initWithBinarizer:binarizer] autorelease]; - - @try { - ZXReader* reader = nil; - if (ZX_MULTI_READER) { - reader = [[[ZXMultiFormatReader alloc] init] autorelease]; - } else { - reader = [[[ZXQRCodeReader alloc] init] autorelease]; - } - // NSLog(@"started decode"); - ZXResult* result = [reader decode:bitmap hints:hints]; - // NSLog(@"finished decode"); - [delegate captureResult:self result:result]; - } @catch (ZXReaderException* rex) { - if (![rex.reason isEqualToString:@"Could not find three finder patterns"]) { - // NSLog(@"failed to decode, caught ReaderException '%@'", rex.reason); - } - } @catch (ZXIllegalArgumentException* iex) { - // NSLog(@"failed to decode, caught IllegalArgumentException '%@'", iex.reason); - } @catch (id ue) { - NSLog(@"Caught unknown exception: %@", ue); - } - } - // NSLog(@"finished frame"); - } - - [pool drain]; -} - -- (BOOL)hasFront { - NSArray* devices = - [ZXCaptureDevice - ZXAV(devicesWithMediaType:) - ZXQT(inputDevicesWithMediaType:) ZXMediaTypeVideo]; - return [devices count] > 1; -} - -- (BOOL)hasBack { - NSArray* devices = - [ZXCaptureDevice - ZXAV(devicesWithMediaType:) - ZXQT(inputDevicesWithMediaType:) ZXMediaTypeVideo]; - return [devices count] > 0; -} - -- (BOOL)hasTorch { - if ([self device]) { - return false ZXAV(|| [self device].hasTorch); - } else { - return NO; - } -} - -- (int)front { - return 0; -} - -- (int)back { - return 1; -} - -- (int)camera { - return camera; -} - -- (BOOL)torch { - return torch; -} - -- (void)setCamera:(int)camera_ { - if (camera != camera_) { - camera = camera_; - capture_device_index = -1; - [capture_device release]; - capture_device = 0; - if (running) { - [self replaceInput]; - } - } -} - -- (void)setTorch:(BOOL)torch_ { - (void)torch_; - ZXAV({ - [input.device lockForConfiguration:nil]; - switch(input.device.torchMode) { - case AVCaptureTorchModeOff: - case AVCaptureTorchModeAuto: - default: - input.device.torchMode = AVCaptureTorchModeOn; - break; - case AVCaptureTorchModeOn: - input.device.torchMode = AVCaptureTorchModeOff; - break; - } - [input.device unlockForConfiguration]; - }); -} - -- (void)setTransform:(CGAffineTransform)transform_ { - transform = transform_; - [layer setAffineTransform:transform]; -} - -@end - -// If you try to define this higher, there (seem to be) clashes with something(s) defined -// in the includes ... - -#if ZXAV(1)+0 -#include -#include -// Gross, I know, but ... -static bool isIPad() { - static int is_ipad = -1; - if (is_ipad < 0) { - size_t size; - sysctlbyname("hw.machine", NULL, &size, NULL, 0); // Get size of data to be returned. - char* name = (char*)malloc(size); - sysctlbyname("hw.machine", name, &size, NULL, 0); - NSString *machine = [NSString stringWithCString:name encoding:NSASCIIStringEncoding]; - free(name); - is_ipad = [machine hasPrefix:@"iPad"]; - } - return !!is_ipad; -} -#endif - -#else - -@implementation ZXCapture - -@synthesize delegate; -@synthesize transform; -@synthesize captureToFilename; -@synthesize mirror; - -- (id)init { - if ((self = [super init])) { - [self release]; - } - return 0; -} - -- (BOOL)running {return NO;} - -- (CALayer*)layer { - return 0; -} - -- (CALayer*)luminance { - return 0; -} - -- (CALayer*)binary { - return 0; -} - -- (void)setLuminance:(BOOL)on {} -- (void)setBinary:(BOOL)on {} - -- (void)hard_stop { -} - -- (BOOL)hasFront { - return YES; -} - -- (BOOL)hasBack { - return NO; -} - -- (BOOL)hasTorch { - return NO; -} - -- (int)front { - return 0; -} - -- (int)back { - return 1; -} - -- (int)camera { - return self.front; -} - -- (BOOL)torch { - return NO; -} - -- (void)setCamera:(int)camera_ {} -- (void)setTorch:(BOOL)torch {} -- (void)order_skip {} -- (void)start {} -- (void)stop {} -- (void*)output {return 0;} - -@end - -#endif diff --git a/objc/src/ZXing/ZXCaptureDelegate.h b/objc/src/ZXing/ZXCaptureDelegate.h deleted file mode 100644 index c4b75c3e9..000000000 --- a/objc/src/ZXing/ZXCaptureDelegate.h +++ /dev/null @@ -1,30 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -@class ZXCapture; -@class ZXResult; - -@protocol ZXCaptureDelegate - -- (void)captureResult:(ZXCapture*)capture result:(ZXResult*)result; - -@optional -- (void)captureSize:(ZXCapture*)capture - width:(NSNumber*)width - height:(NSNumber*)height; - -@end diff --git a/objc/src/ZXing/ZXCaptureView.h b/objc/src/ZXing/ZXCaptureView.h deleted file mode 100644 index fadcb1999..000000000 --- a/objc/src/ZXing/ZXCaptureView.h +++ /dev/null @@ -1,25 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 - -@interface ZXCaptureView : ZXView { -} - -- (ZXCaptureView*)init; - -@end diff --git a/objc/src/ZXing/ZXCaptureView.mm b/objc/src/ZXing/ZXCaptureView.mm deleted file mode 100644 index 7979c89f1..000000000 --- a/objc/src/ZXing/ZXCaptureView.mm +++ /dev/null @@ -1,33 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 - -@implementation ZXCaptureView { -} - -- (ZXCaptureView*)init { - if ((self = [super init])) { - } - return self; -} - -- (void) dealloc { - [super dealloc]; -} - -@end diff --git a/objc/src/ZXing/ZXDecodeHints.h b/objc/src/ZXing/ZXDecodeHints.h deleted file mode 100644 index c3a83041d..000000000 --- a/objc/src/ZXing/ZXDecodeHints.h +++ /dev/null @@ -1,28 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 - -@interface ZXDecodeHints : NSObject { - zxing::DecodeHints* native; -} - -@property (readonly) zxing::DecodeHints* native; - -- (ZXDecodeHints*)init; - -@end diff --git a/objc/src/ZXing/ZXDecodeHints.mm b/objc/src/ZXing/ZXDecodeHints.mm deleted file mode 100644 index 208cc17ab..000000000 --- a/objc/src/ZXing/ZXDecodeHints.mm +++ /dev/null @@ -1,36 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -@implementation ZXDecodeHints - -@synthesize native; - -- (ZXDecodeHints*)init { - if ((self = [super init])) { - native = new zxing::DecodeHints; - } - return self; -} - -- (void)dealloc { - delete native; - [super dealloc]; -} - -@end diff --git a/objc/src/ZXing/ZXHybridBinarizer.h b/objc/src/ZXing/ZXHybridBinarizer.h deleted file mode 100644 index 79aa9900a..000000000 --- a/objc/src/ZXing/ZXHybridBinarizer.h +++ /dev/null @@ -1,26 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 -#import - -@interface ZXHybridBinarizer : ZXBinarizer { -} - -- (ZXHybridBinarizer*)initWithSource:(ZXLuminanceSource*)source; - -@end diff --git a/objc/src/ZXing/ZXHybridBinarizer.mm b/objc/src/ZXing/ZXHybridBinarizer.mm deleted file mode 100644 index 61a1792b9..000000000 --- a/objc/src/ZXing/ZXHybridBinarizer.mm +++ /dev/null @@ -1,29 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -@implementation ZXHybridBinarizer - -- (ZXHybridBinarizer*)initWithSource:(ZXLuminanceSource*)source { - zxing::HybridBinarizer* hybrid = - new zxing::HybridBinarizer(zxing::Ref([source native])); - [super initWithNative:hybrid]; - return self; -} - -@end diff --git a/objc/src/ZXing/ZXIllegalArgumentException.h b/objc/src/ZXing/ZXIllegalArgumentException.h deleted file mode 100644 index f5cb712e6..000000000 --- a/objc/src/ZXing/ZXIllegalArgumentException.h +++ /dev/null @@ -1,21 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -@interface ZXIllegalArgumentException : NSException { -} - -@end diff --git a/objc/src/ZXing/ZXIllegalArgumentException.mm b/objc/src/ZXing/ZXIllegalArgumentException.mm deleted file mode 100644 index d52707cb7..000000000 --- a/objc/src/ZXing/ZXIllegalArgumentException.mm +++ /dev/null @@ -1,23 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -@implementation ZXIllegalArgumentException { -} - -@end diff --git a/objc/src/ZXing/ZXImage.h b/objc/src/ZXing/ZXImage.h deleted file mode 100644 index a059750fd..000000000 --- a/objc/src/ZXing/ZXImage.h +++ /dev/null @@ -1,28 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -@interface ZXImage : NSObject { - CGImageRef cgimage; -} - -@property (readonly) CGImageRef cgimage; - -- (ZXImage*)initWithURL:(NSURL const*)url; -- (size_t)width; -- (size_t)height; - -@end diff --git a/objc/src/ZXing/ZXImage.mm b/objc/src/ZXing/ZXImage.mm deleted file mode 100644 index 4de2c77e4..000000000 --- a/objc/src/ZXing/ZXImage.mm +++ /dev/null @@ -1,65 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR -#import -#endif - -@implementation ZXImage - -@synthesize cgimage; - -- (ZXImage*)initWithURL:(NSURL const*)url { - - CGDataProviderRef provider = CGDataProviderCreateWithURL((CFURLRef)url); - - if (provider) { - CGImageSourceRef source = CGImageSourceCreateWithDataProvider(provider, 0); - - if (source) { - cgimage = CGImageSourceCreateImageAtIndex(source, 0, 0); - - CFRelease(source); - } - - CGDataProviderRelease(provider); - } - - if (cgimage) { - return self; - } else { - return 0; - } -} - -- (size_t)width { - return CGImageGetWidth(cgimage); -} - -- (size_t)height { - return CGImageGetHeight(cgimage); -} - -- (void)dealloc { - if (cgimage) { - CGImageRelease(cgimage); - } - [super dealloc]; -} - -@end diff --git a/objc/src/ZXing/ZXInit.c b/objc/src/ZXing/ZXInit.c deleted file mode 100644 index 42f1f0f12..000000000 --- a/objc/src/ZXing/ZXInit.c +++ /dev/null @@ -1,18 +0,0 @@ -// -*- mode:c; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -void Init_zxing(void){} diff --git a/objc/src/ZXing/ZXLuminanceSource.h b/objc/src/ZXing/ZXLuminanceSource.h deleted file mode 100644 index 71eb1d6bc..000000000 --- a/objc/src/ZXing/ZXLuminanceSource.h +++ /dev/null @@ -1,27 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 - -@interface ZXLuminanceSource : NSObject { - zxing::Ref native; -} - -- (id)initWithNative:(zxing::LuminanceSource*)native; -- (zxing::LuminanceSource*)native; - -@end diff --git a/objc/src/ZXing/ZXLuminanceSource.mm b/objc/src/ZXing/ZXLuminanceSource.mm deleted file mode 100644 index 0d45beaec..000000000 --- a/objc/src/ZXing/ZXLuminanceSource.mm +++ /dev/null @@ -1,36 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -@implementation ZXLuminanceSource - -- (id)initWithNative:(zxing::LuminanceSource*)_native { - native = _native; - return self; -} - -- (zxing::LuminanceSource*)native { - return native; -} - -- (void)dealloc { - native = 0; - [super dealloc]; -} - -@end diff --git a/objc/src/ZXing/ZXMultiFormatReader.h b/objc/src/ZXing/ZXMultiFormatReader.h deleted file mode 100644 index 823474747..000000000 --- a/objc/src/ZXing/ZXMultiFormatReader.h +++ /dev/null @@ -1,25 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -@interface ZXMultiFormatReader : ZXReader { -} - -- (ZXMultiFormatReader*)init; - -@end diff --git a/objc/src/ZXing/ZXMultiFormatReader.mm b/objc/src/ZXing/ZXMultiFormatReader.mm deleted file mode 100644 index 992b5eb3a..000000000 --- a/objc/src/ZXing/ZXMultiFormatReader.mm +++ /dev/null @@ -1,29 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#include - -@implementation ZXMultiFormatReader - -- (ZXMultiFormatReader*)init { - zxing::MultiFormatReader* multi = new zxing::MultiFormatReader(); - [super initWithReader:multi]; - return self; -} - -@end diff --git a/objc/src/ZXing/ZXQRCodeReader.h b/objc/src/ZXing/ZXQRCodeReader.h deleted file mode 100644 index 1f2ff81ef..000000000 --- a/objc/src/ZXing/ZXQRCodeReader.h +++ /dev/null @@ -1,25 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -@interface ZXQRCodeReader : ZXReader { -} - -- (id)init; - -@end diff --git a/objc/src/ZXing/ZXQRCodeReader.mm b/objc/src/ZXing/ZXQRCodeReader.mm deleted file mode 100644 index 5d48bdd76..000000000 --- a/objc/src/ZXing/ZXQRCodeReader.mm +++ /dev/null @@ -1,29 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#include - -@implementation ZXQRCodeReader - -- (id)init { - zxing::qrcode::QRCodeReader* multi = new zxing::qrcode::QRCodeReader(); - self = [super initWithReader:multi]; - return self; -} - -@end diff --git a/objc/src/ZXing/ZXReader.h b/objc/src/ZXing/ZXReader.h deleted file mode 100644 index 91de7dc1b..000000000 --- a/objc/src/ZXing/ZXReader.h +++ /dev/null @@ -1,31 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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 - -@class ZXBinaryBitmap; -@class ZXDecodeHints; -@class ZXResult; - -@interface ZXReader : NSObject { - zxing::Ref reader; -} - -- (id)initWithReader:(zxing::Reader*)reader; -- (ZXResult*)decode:(ZXBinaryBitmap*)bitmap hints:(ZXDecodeHints*)hints; - -@end diff --git a/objc/src/ZXing/ZXReader.mm b/objc/src/ZXing/ZXReader.mm deleted file mode 100644 index a82439129..000000000 --- a/objc/src/ZXing/ZXReader.mm +++ /dev/null @@ -1,58 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#include -#include -#import -#import -#import -#import -#import - -@implementation ZXReader - -- (ZXReader*)initWithReader:(zxing::Reader*)_reader { - reader = _reader; - return self; -} - -- (ZXResult*)decode:(ZXBinaryBitmap*)bitmap hints:(ZXDecodeHints*)hints { - try { - zxing::Ref result (reader->decode( - zxing::Ref([bitmap native]), - *[hints native])); - return [[[ZXResult alloc] initWithNative:result] autorelease]; - } catch (zxing::ReaderException const& re) { - NSString* s = [NSString stringWithCString:re.what() encoding:NSUTF8StringEncoding]; - NSException* e = [[[ZXReaderException alloc] initWithName:@"ZXReaderException" - reason:s - userInfo:nil] autorelease]; - @throw e; - } catch (zxing::IllegalArgumentException const& iae) { - NSString* s = [NSString stringWithCString:iae.what() encoding:NSUTF8StringEncoding]; - NSException* e = [[[ZXIllegalArgumentException alloc] - initWithName:@"ZXIllegalArgumntException" - reason:s - userInfo:nil] autorelease]; - @throw e; - } - /* not reachable */ - return nil; -} - -@end diff --git a/objc/src/ZXing/ZXReaderException.h b/objc/src/ZXing/ZXReaderException.h deleted file mode 100644 index b54974678..000000000 --- a/objc/src/ZXing/ZXReaderException.h +++ /dev/null @@ -1,21 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -@interface ZXReaderException : NSException { -} - -@end diff --git a/objc/src/ZXing/ZXReaderException.mm b/objc/src/ZXing/ZXReaderException.mm deleted file mode 100644 index 140f86a9a..000000000 --- a/objc/src/ZXing/ZXReaderException.mm +++ /dev/null @@ -1,23 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import - -@implementation ZXReaderException { -} - -@end diff --git a/objc/src/ZXing/ZXResult.h b/objc/src/ZXing/ZXResult.h deleted file mode 100644 index b6342afe8..000000000 --- a/objc/src/ZXing/ZXResult.h +++ /dev/null @@ -1,28 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -@class ZXResultInternal; - -@interface ZXResult : NSObject { - ZXResultInternal* state_; -} - -@property (readonly) NSString* text; - -- (ZXResult*)initWithNative:(void*)native; - -@end diff --git a/objc/src/ZXing/ZXResult.mm b/objc/src/ZXing/ZXResult.mm deleted file mode 100644 index a68e54dba..000000000 --- a/objc/src/ZXing/ZXResult.mm +++ /dev/null @@ -1,59 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#import -#include - -@interface ZXResultInternal : NSObject { - zxing::Ref native; -} -- (id)init:(void*)native; -- (zxing::Ref const&) native; -@end -@implementation ZXResultInternal -- (id)init:(void*)native_ { - if ((self = [super init])) { - native = (zxing::Result*)native_; - } - return self; -} -- (zxing::Ref const&)native { - return native; -} -@end - -@implementation ZXResult - -- (ZXResult*)initWithNative:(void*)native { - if ((self = [super init])) { - state_ = [[ZXResultInternal alloc] init:native]; - } - return self; -} - -- (void)dealloc { - [state_ release]; - [super dealloc]; -} - -- (NSString*)text { - return [NSString - stringWithCString:[state_ native]->getText()->getText().c_str() - encoding:NSUTF8StringEncoding]; -} - -@end diff --git a/objc/src/ZXing/ZXView.h b/objc/src/ZXing/ZXView.h deleted file mode 100644 index fd36f7e0f..000000000 --- a/objc/src/ZXing/ZXView.h +++ /dev/null @@ -1,22 +0,0 @@ -// -*- mode:objc; c-basic-offset:2; indent-tabs-mode:nil -*- -/* - * Copyright 2011 ZXing authors - * - * 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. - */ - -#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR -#define ZXView UIView -#else -#define ZXView NSView -#endif diff --git a/objc/zxing-objc-framework/en.lproj/InfoPlist.strings b/objc/zxing-objc-framework/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28ff8..000000000 --- a/objc/zxing-objc-framework/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/objc/zxing-objc-framework/zxing-objc-framework-Info.plist b/objc/zxing-objc-framework/zxing-objc-framework-Info.plist deleted file mode 100644 index b08021538..000000000 --- a/objc/zxing-objc-framework/zxing-objc-framework-Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - zxing.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSHumanReadableCopyright - Copyright © 2012 __MyCompanyName__. All rights reserved. - NSPrincipalClass - - - diff --git a/objc/zxing-objc-framework/zxing-objc-framework-Prefix.pch b/objc/zxing-objc-framework/zxing-objc-framework-Prefix.pch deleted file mode 100644 index 5492cb075..000000000 --- a/objc/zxing-objc-framework/zxing-objc-framework-Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'zxing-objc-framework' target in the 'zxing-objc-framework' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/objc/zxing-objc-framework/zxing_objc_framework.h b/objc/zxing-objc-framework/zxing_objc_framework.h deleted file mode 100644 index f3087f3a9..000000000 --- a/objc/zxing-objc-framework/zxing_objc_framework.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// zxing_objc_framework.h -// zxing-objc-framework -// -// Created by Steven Parkes on 6/17/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#import - -@interface zxing_objc_framework : NSObject - -@end diff --git a/objc/zxing-objc-framework/zxing_objc_framework.m b/objc/zxing-objc-framework/zxing_objc_framework.m deleted file mode 100644 index 5ce928e3e..000000000 --- a/objc/zxing-objc-framework/zxing_objc_framework.m +++ /dev/null @@ -1,13 +0,0 @@ -// -// zxing_objc_framework.m -// zxing-objc-framework -// -// Created by Steven Parkes on 6/17/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#import "zxing_objc_framework.h" - -@implementation zxing_objc_framework - -@end diff --git a/objc/zxing-objc.xcodeproj/project.pbxproj b/objc/zxing-objc.xcodeproj/project.pbxproj deleted file mode 100644 index 00237b530..000000000 --- a/objc/zxing-objc.xcodeproj/project.pbxproj +++ /dev/null @@ -1,694 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B1C7FDE15916B770074F246 /* libzxing-cpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0F601590F9CF00C33931 /* libzxing-cpp.a */; }; - 3B5D0F621590FB5000C33931 /* libzxing-cpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B5D0F601590F9CF00C33931 /* libzxing-cpp.a */; }; - 3B83EB5C158E6CAB00A3B31F /* CGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB3A158E6CAB00A3B31F /* CGImageLuminanceSource.mm */; }; - 3B83EB5D158E6CAB00A3B31F /* ZXBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB3B158E6CAB00A3B31F /* ZXBinarizer.h */; }; - 3B83EB5E158E6CAB00A3B31F /* ZXBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB3C158E6CAB00A3B31F /* ZXBinarizer.mm */; }; - 3B83EB5F158E6CAB00A3B31F /* ZXBinaryBitmap.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB3D158E6CAB00A3B31F /* ZXBinaryBitmap.h */; }; - 3B83EB60158E6CAB00A3B31F /* ZXBinaryBitmap.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB3E158E6CAB00A3B31F /* ZXBinaryBitmap.mm */; }; - 3B83EB61158E6CAB00A3B31F /* ZXCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB3F158E6CAB00A3B31F /* ZXCapture.h */; }; - 3B83EB62158E6CAB00A3B31F /* ZXCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB40158E6CAB00A3B31F /* ZXCapture.mm */; }; - 3B83EB63158E6CAB00A3B31F /* ZXCaptureDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB41158E6CAB00A3B31F /* ZXCaptureDelegate.h */; }; - 3B83EB64158E6CAB00A3B31F /* ZXCaptureView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB42158E6CAB00A3B31F /* ZXCaptureView.h */; }; - 3B83EB65158E6CAB00A3B31F /* ZXCaptureView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB43158E6CAB00A3B31F /* ZXCaptureView.mm */; }; - 3B83EB66158E6CAB00A3B31F /* ZXCGImageLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB44158E6CAB00A3B31F /* ZXCGImageLuminanceSource.h */; }; - 3B83EB67158E6CAB00A3B31F /* ZXCGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB45158E6CAB00A3B31F /* ZXCGImageLuminanceSource.mm */; }; - 3B83EB68158E6CAB00A3B31F /* ZXDecodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB46158E6CAB00A3B31F /* ZXDecodeHints.h */; }; - 3B83EB69158E6CAB00A3B31F /* ZXDecodeHints.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB47158E6CAB00A3B31F /* ZXDecodeHints.mm */; }; - 3B83EB6A158E6CAB00A3B31F /* ZXHybridBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB48158E6CAB00A3B31F /* ZXHybridBinarizer.h */; }; - 3B83EB6B158E6CAB00A3B31F /* ZXHybridBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB49158E6CAB00A3B31F /* ZXHybridBinarizer.mm */; }; - 3B83EB6C158E6CAB00A3B31F /* ZXIllegalArgumentException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB4A158E6CAB00A3B31F /* ZXIllegalArgumentException.h */; }; - 3B83EB6D158E6CAB00A3B31F /* ZXIllegalArgumentException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB4B158E6CAB00A3B31F /* ZXIllegalArgumentException.mm */; }; - 3B83EB6E158E6CAB00A3B31F /* ZXImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB4C158E6CAB00A3B31F /* ZXImage.h */; }; - 3B83EB6F158E6CAB00A3B31F /* ZXImage.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB4D158E6CAB00A3B31F /* ZXImage.mm */; }; - 3B83EB70158E6CAB00A3B31F /* ZXInit.c in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB4E158E6CAB00A3B31F /* ZXInit.c */; }; - 3B83EB71158E6CAB00A3B31F /* ZXLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB4F158E6CAB00A3B31F /* ZXLuminanceSource.h */; }; - 3B83EB72158E6CAB00A3B31F /* ZXLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB50158E6CAB00A3B31F /* ZXLuminanceSource.mm */; }; - 3B83EB73158E6CAB00A3B31F /* ZXMultiFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB51158E6CAB00A3B31F /* ZXMultiFormatReader.h */; }; - 3B83EB74158E6CAB00A3B31F /* ZXMultiFormatReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB52158E6CAB00A3B31F /* ZXMultiFormatReader.mm */; }; - 3B83EB75158E6CAB00A3B31F /* ZXQRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB53158E6CAB00A3B31F /* ZXQRCodeReader.h */; }; - 3B83EB76158E6CAB00A3B31F /* ZXQRCodeReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB54158E6CAB00A3B31F /* ZXQRCodeReader.mm */; }; - 3B83EB77158E6CAB00A3B31F /* ZXReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB55158E6CAB00A3B31F /* ZXReader.h */; }; - 3B83EB78158E6CAB00A3B31F /* ZXReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB56158E6CAB00A3B31F /* ZXReader.mm */; }; - 3B83EB79158E6CAB00A3B31F /* ZXReaderException.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB57158E6CAB00A3B31F /* ZXReaderException.h */; }; - 3B83EB7A158E6CAB00A3B31F /* ZXReaderException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB58158E6CAB00A3B31F /* ZXReaderException.mm */; }; - 3B83EB7B158E6CAB00A3B31F /* ZXResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB59158E6CAB00A3B31F /* ZXResult.h */; }; - 3B83EB7C158E6CAB00A3B31F /* ZXResult.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB5A158E6CAB00A3B31F /* ZXResult.mm */; }; - 3B83EB7D158E6CAB00A3B31F /* ZXView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B83EB5B158E6CAB00A3B31F /* ZXView.h */; }; - 3B83EB92158E71AD00A3B31F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B83EB91158E71AD00A3B31F /* Cocoa.framework */; }; - 3B83EB9C158E71AD00A3B31F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B83EB9A158E71AD00A3B31F /* InfoPlist.strings */; }; - 3BC3D66E158E83B00037CE30 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BC3D66D158E83B00037CE30 /* ImageIO.framework */; }; - 3BC3D681158E8BE80037CE30 /* CGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB3A158E6CAB00A3B31F /* CGImageLuminanceSource.mm */; }; - 3BC3D682158E8BEF0037CE30 /* ZXBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB3C158E6CAB00A3B31F /* ZXBinarizer.mm */; }; - 3BC3D683158E8C030037CE30 /* ZXBinaryBitmap.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB3E158E6CAB00A3B31F /* ZXBinaryBitmap.mm */; }; - 3BC3D684158E8C070037CE30 /* ZXCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB40158E6CAB00A3B31F /* ZXCapture.mm */; }; - 3BC3D685158E8C0B0037CE30 /* ZXCaptureView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB43158E6CAB00A3B31F /* ZXCaptureView.mm */; }; - 3BC3D686158E8C0F0037CE30 /* ZXCGImageLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB45158E6CAB00A3B31F /* ZXCGImageLuminanceSource.mm */; }; - 3BC3D687158E8C120037CE30 /* ZXDecodeHints.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB47158E6CAB00A3B31F /* ZXDecodeHints.mm */; }; - 3BC3D688158E8C160037CE30 /* ZXHybridBinarizer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB49158E6CAB00A3B31F /* ZXHybridBinarizer.mm */; }; - 3BC3D689158E8C190037CE30 /* ZXIllegalArgumentException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB4B158E6CAB00A3B31F /* ZXIllegalArgumentException.mm */; }; - 3BC3D68A158E8C1D0037CE30 /* ZXImage.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB4D158E6CAB00A3B31F /* ZXImage.mm */; }; - 3BC3D68B158E8C200037CE30 /* ZXLuminanceSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB50158E6CAB00A3B31F /* ZXLuminanceSource.mm */; }; - 3BC3D68C158E8C240037CE30 /* ZXMultiFormatReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB52158E6CAB00A3B31F /* ZXMultiFormatReader.mm */; }; - 3BC3D68D158E8C280037CE30 /* ZXQRCodeReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB54158E6CAB00A3B31F /* ZXQRCodeReader.mm */; }; - 3BC3D68E158E8C2C0037CE30 /* ZXReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB56158E6CAB00A3B31F /* ZXReader.mm */; }; - 3BC3D68F158E8C2F0037CE30 /* ZXReaderException.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB58158E6CAB00A3B31F /* ZXReaderException.mm */; }; - 3BC3D690158E8C330037CE30 /* ZXResult.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3B83EB5A158E6CAB00A3B31F /* ZXResult.mm */; }; - 3BC3D693158E8CA90037CE30 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BC3D692158E8CA90037CE30 /* libiconv.dylib */; }; - 3BC3D695158E8CCD0037CE30 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BC3D694158E8CCD0037CE30 /* CoreVideo.framework */; }; - 3BC3D697158E8CFD0037CE30 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BC3D696158E8CFD0037CE30 /* QuartzCore.framework */; }; - 3BC3D69B158E8D5B0037CE30 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BC3D69A158E8D5B0037CE30 /* QTKit.framework */; }; - 3BC3D69D158E8E7F0037CE30 /* zxing_objc_framework.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BC3D69C158E8E7F0037CE30 /* zxing_objc_framework.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3BC3D69F158E8E880037CE30 /* zxing_objc_framework.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC3D69E158E8E880037CE30 /* zxing_objc_framework.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3B5D0F5F1590F9CF00C33931 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3B5D0F581590F9CE00C33931 /* zxing-cpp.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3B83E98E158E66C600A3B31F; - remoteInfo = "zxing-cpp"; - }; - 3B83EBA4158E71CA00A3B31F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3B83EB1C158E6C5100A3B31F /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3B83EB24158E6C5100A3B31F; - remoteInfo = "zxing-objc"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 3B5D0F581590F9CE00C33931 /* zxing-cpp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "zxing-cpp.xcodeproj"; path = "../cpp/zxing-cpp.xcodeproj"; sourceTree = ""; }; - 3B83EB25158E6C5100A3B31F /* libzxing-objc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libzxing-objc.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B83EB28158E6C5100A3B31F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 3B83EB3A158E6CAB00A3B31F /* CGImageLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CGImageLuminanceSource.mm; sourceTree = ""; }; - 3B83EB3B158E6CAB00A3B31F /* ZXBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXBinarizer.h; sourceTree = ""; }; - 3B83EB3C158E6CAB00A3B31F /* ZXBinarizer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXBinarizer.mm; sourceTree = ""; }; - 3B83EB3D158E6CAB00A3B31F /* ZXBinaryBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXBinaryBitmap.h; sourceTree = ""; }; - 3B83EB3E158E6CAB00A3B31F /* ZXBinaryBitmap.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXBinaryBitmap.mm; sourceTree = ""; }; - 3B83EB3F158E6CAB00A3B31F /* ZXCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXCapture.h; sourceTree = ""; }; - 3B83EB40158E6CAB00A3B31F /* ZXCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXCapture.mm; sourceTree = ""; }; - 3B83EB41158E6CAB00A3B31F /* ZXCaptureDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXCaptureDelegate.h; sourceTree = ""; }; - 3B83EB42158E6CAB00A3B31F /* ZXCaptureView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXCaptureView.h; sourceTree = ""; }; - 3B83EB43158E6CAB00A3B31F /* ZXCaptureView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXCaptureView.mm; sourceTree = ""; }; - 3B83EB44158E6CAB00A3B31F /* ZXCGImageLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXCGImageLuminanceSource.h; sourceTree = ""; }; - 3B83EB45158E6CAB00A3B31F /* ZXCGImageLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXCGImageLuminanceSource.mm; sourceTree = ""; }; - 3B83EB46158E6CAB00A3B31F /* ZXDecodeHints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXDecodeHints.h; sourceTree = ""; }; - 3B83EB47158E6CAB00A3B31F /* ZXDecodeHints.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXDecodeHints.mm; sourceTree = ""; }; - 3B83EB48158E6CAB00A3B31F /* ZXHybridBinarizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXHybridBinarizer.h; sourceTree = ""; }; - 3B83EB49158E6CAB00A3B31F /* ZXHybridBinarizer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXHybridBinarizer.mm; sourceTree = ""; }; - 3B83EB4A158E6CAB00A3B31F /* ZXIllegalArgumentException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXIllegalArgumentException.h; sourceTree = ""; }; - 3B83EB4B158E6CAB00A3B31F /* ZXIllegalArgumentException.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXIllegalArgumentException.mm; sourceTree = ""; }; - 3B83EB4C158E6CAB00A3B31F /* ZXImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXImage.h; sourceTree = ""; }; - 3B83EB4D158E6CAB00A3B31F /* ZXImage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXImage.mm; sourceTree = ""; }; - 3B83EB4E158E6CAB00A3B31F /* ZXInit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ZXInit.c; sourceTree = ""; }; - 3B83EB4F158E6CAB00A3B31F /* ZXLuminanceSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXLuminanceSource.h; sourceTree = ""; }; - 3B83EB50158E6CAB00A3B31F /* ZXLuminanceSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXLuminanceSource.mm; sourceTree = ""; }; - 3B83EB51158E6CAB00A3B31F /* ZXMultiFormatReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXMultiFormatReader.h; sourceTree = ""; }; - 3B83EB52158E6CAB00A3B31F /* ZXMultiFormatReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXMultiFormatReader.mm; sourceTree = ""; }; - 3B83EB53158E6CAB00A3B31F /* ZXQRCodeReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXQRCodeReader.h; sourceTree = ""; }; - 3B83EB54158E6CAB00A3B31F /* ZXQRCodeReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXQRCodeReader.mm; sourceTree = ""; }; - 3B83EB55158E6CAB00A3B31F /* ZXReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXReader.h; sourceTree = ""; }; - 3B83EB56158E6CAB00A3B31F /* ZXReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXReader.mm; sourceTree = ""; }; - 3B83EB57158E6CAB00A3B31F /* ZXReaderException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXReaderException.h; sourceTree = ""; }; - 3B83EB58158E6CAB00A3B31F /* ZXReaderException.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXReaderException.mm; sourceTree = ""; }; - 3B83EB59158E6CAB00A3B31F /* ZXResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXResult.h; sourceTree = ""; }; - 3B83EB5A158E6CAB00A3B31F /* ZXResult.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZXResult.mm; sourceTree = ""; }; - 3B83EB5B158E6CAB00A3B31F /* ZXView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZXView.h; sourceTree = ""; }; - 3B83EB90158E71AD00A3B31F /* zxing-objc-framework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "zxing-objc-framework.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B83EB91158E71AD00A3B31F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; - 3B83EB94158E71AD00A3B31F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - 3B83EB95158E71AD00A3B31F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; - 3B83EB96158E71AD00A3B31F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 3B83EB99158E71AD00A3B31F /* zxing-objc-framework-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "zxing-objc-framework-Info.plist"; sourceTree = ""; }; - 3B83EB9B158E71AD00A3B31F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 3B83EB9D158E71AD00A3B31F /* zxing-objc-framework-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "zxing-objc-framework-Prefix.pch"; sourceTree = ""; }; - 3BC3D66D158E83B00037CE30 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; - 3BC3D692158E8CA90037CE30 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/usr/lib/libiconv.dylib; sourceTree = DEVELOPER_DIR; }; - 3BC3D694158E8CCD0037CE30 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/CoreVideo.framework; sourceTree = DEVELOPER_DIR; }; - 3BC3D696158E8CFD0037CE30 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 3BC3D698158E8D150037CE30 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/QuickTime.framework; sourceTree = DEVELOPER_DIR; }; - 3BC3D69A158E8D5B0037CE30 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/QTKit.framework; sourceTree = DEVELOPER_DIR; }; - 3BC3D69C158E8E7F0037CE30 /* zxing_objc_framework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zxing_objc_framework.h; sourceTree = ""; }; - 3BC3D69E158E8E880037CE30 /* zxing_objc_framework.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = zxing_objc_framework.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3B83EB22158E6C5100A3B31F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B1C7FDE15916B770074F246 /* libzxing-cpp.a in Frameworks */, - 3BC3D66E158E83B00037CE30 /* ImageIO.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3B83EB8C158E71AD00A3B31F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B5D0F621590FB5000C33931 /* libzxing-cpp.a in Frameworks */, - 3BC3D69B158E8D5B0037CE30 /* QTKit.framework in Frameworks */, - 3BC3D697158E8CFD0037CE30 /* QuartzCore.framework in Frameworks */, - 3BC3D695158E8CCD0037CE30 /* CoreVideo.framework in Frameworks */, - 3BC3D693158E8CA90037CE30 /* libiconv.dylib in Frameworks */, - 3B83EB92158E71AD00A3B31F /* Cocoa.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3B5D0F591590F9CE00C33931 /* Products */ = { - isa = PBXGroup; - children = ( - 3B5D0F601590F9CF00C33931 /* libzxing-cpp.a */, - ); - name = Products; - sourceTree = ""; - }; - 3B83EB1A158E6C5100A3B31F = { - isa = PBXGroup; - children = ( - 3B5D0F581590F9CE00C33931 /* zxing-cpp.xcodeproj */, - 3B83EB39158E6CAB00A3B31F /* ZXing */, - 3B83EB97158E71AD00A3B31F /* zxing-objc-framework */, - 3B83EB27158E6C5100A3B31F /* Frameworks */, - 3B83EB26158E6C5100A3B31F /* Products */, - ); - sourceTree = ""; - }; - 3B83EB26158E6C5100A3B31F /* Products */ = { - isa = PBXGroup; - children = ( - 3B83EB25158E6C5100A3B31F /* libzxing-objc.a */, - 3B83EB90158E71AD00A3B31F /* zxing-objc-framework.framework */, - ); - name = Products; - sourceTree = ""; - }; - 3B83EB27158E6C5100A3B31F /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3BC3D69A158E8D5B0037CE30 /* QTKit.framework */, - 3BC3D698158E8D150037CE30 /* QuickTime.framework */, - 3BC3D696158E8CFD0037CE30 /* QuartzCore.framework */, - 3BC3D694158E8CCD0037CE30 /* CoreVideo.framework */, - 3BC3D692158E8CA90037CE30 /* libiconv.dylib */, - 3BC3D66D158E83B00037CE30 /* ImageIO.framework */, - 3B83EB28158E6C5100A3B31F /* Foundation.framework */, - 3B83EB91158E71AD00A3B31F /* Cocoa.framework */, - 3B83EB93158E71AD00A3B31F /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3B83EB39158E6CAB00A3B31F /* ZXing */ = { - isa = PBXGroup; - children = ( - 3B83EB3A158E6CAB00A3B31F /* CGImageLuminanceSource.mm */, - 3B83EB3B158E6CAB00A3B31F /* ZXBinarizer.h */, - 3B83EB3C158E6CAB00A3B31F /* ZXBinarizer.mm */, - 3B83EB3D158E6CAB00A3B31F /* ZXBinaryBitmap.h */, - 3B83EB3E158E6CAB00A3B31F /* ZXBinaryBitmap.mm */, - 3B83EB3F158E6CAB00A3B31F /* ZXCapture.h */, - 3B83EB40158E6CAB00A3B31F /* ZXCapture.mm */, - 3B83EB41158E6CAB00A3B31F /* ZXCaptureDelegate.h */, - 3B83EB42158E6CAB00A3B31F /* ZXCaptureView.h */, - 3B83EB43158E6CAB00A3B31F /* ZXCaptureView.mm */, - 3B83EB44158E6CAB00A3B31F /* ZXCGImageLuminanceSource.h */, - 3B83EB45158E6CAB00A3B31F /* ZXCGImageLuminanceSource.mm */, - 3B83EB46158E6CAB00A3B31F /* ZXDecodeHints.h */, - 3B83EB47158E6CAB00A3B31F /* ZXDecodeHints.mm */, - 3B83EB48158E6CAB00A3B31F /* ZXHybridBinarizer.h */, - 3B83EB49158E6CAB00A3B31F /* ZXHybridBinarizer.mm */, - 3B83EB4A158E6CAB00A3B31F /* ZXIllegalArgumentException.h */, - 3B83EB4B158E6CAB00A3B31F /* ZXIllegalArgumentException.mm */, - 3B83EB4C158E6CAB00A3B31F /* ZXImage.h */, - 3B83EB4D158E6CAB00A3B31F /* ZXImage.mm */, - 3B83EB4E158E6CAB00A3B31F /* ZXInit.c */, - 3B83EB4F158E6CAB00A3B31F /* ZXLuminanceSource.h */, - 3B83EB50158E6CAB00A3B31F /* ZXLuminanceSource.mm */, - 3B83EB51158E6CAB00A3B31F /* ZXMultiFormatReader.h */, - 3B83EB52158E6CAB00A3B31F /* ZXMultiFormatReader.mm */, - 3B83EB53158E6CAB00A3B31F /* ZXQRCodeReader.h */, - 3B83EB54158E6CAB00A3B31F /* ZXQRCodeReader.mm */, - 3B83EB55158E6CAB00A3B31F /* ZXReader.h */, - 3B83EB56158E6CAB00A3B31F /* ZXReader.mm */, - 3B83EB57158E6CAB00A3B31F /* ZXReaderException.h */, - 3B83EB58158E6CAB00A3B31F /* ZXReaderException.mm */, - 3B83EB59158E6CAB00A3B31F /* ZXResult.h */, - 3B83EB5A158E6CAB00A3B31F /* ZXResult.mm */, - 3B83EB5B158E6CAB00A3B31F /* ZXView.h */, - ); - name = ZXing; - path = src/ZXing; - sourceTree = ""; - }; - 3B83EB93158E71AD00A3B31F /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 3B83EB94158E71AD00A3B31F /* AppKit.framework */, - 3B83EB95158E71AD00A3B31F /* CoreData.framework */, - 3B83EB96158E71AD00A3B31F /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 3B83EB97158E71AD00A3B31F /* zxing-objc-framework */ = { - isa = PBXGroup; - children = ( - 3BC3D69E158E8E880037CE30 /* zxing_objc_framework.m */, - 3BC3D69C158E8E7F0037CE30 /* zxing_objc_framework.h */, - 3B83EB98158E71AD00A3B31F /* Supporting Files */, - ); - path = "zxing-objc-framework"; - sourceTree = ""; - }; - 3B83EB98158E71AD00A3B31F /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 3B83EB99158E71AD00A3B31F /* zxing-objc-framework-Info.plist */, - 3B83EB9A158E71AD00A3B31F /* InfoPlist.strings */, - 3B83EB9D158E71AD00A3B31F /* zxing-objc-framework-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 3B83EB23158E6C5100A3B31F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B83EB5D158E6CAB00A3B31F /* ZXBinarizer.h in Headers */, - 3B83EB5F158E6CAB00A3B31F /* ZXBinaryBitmap.h in Headers */, - 3B83EB61158E6CAB00A3B31F /* ZXCapture.h in Headers */, - 3B83EB63158E6CAB00A3B31F /* ZXCaptureDelegate.h in Headers */, - 3B83EB64158E6CAB00A3B31F /* ZXCaptureView.h in Headers */, - 3B83EB66158E6CAB00A3B31F /* ZXCGImageLuminanceSource.h in Headers */, - 3B83EB68158E6CAB00A3B31F /* ZXDecodeHints.h in Headers */, - 3B83EB6A158E6CAB00A3B31F /* ZXHybridBinarizer.h in Headers */, - 3B83EB6C158E6CAB00A3B31F /* ZXIllegalArgumentException.h in Headers */, - 3B83EB6E158E6CAB00A3B31F /* ZXImage.h in Headers */, - 3B83EB71158E6CAB00A3B31F /* ZXLuminanceSource.h in Headers */, - 3B83EB73158E6CAB00A3B31F /* ZXMultiFormatReader.h in Headers */, - 3B83EB75158E6CAB00A3B31F /* ZXQRCodeReader.h in Headers */, - 3B83EB77158E6CAB00A3B31F /* ZXReader.h in Headers */, - 3B83EB79158E6CAB00A3B31F /* ZXReaderException.h in Headers */, - 3B83EB7B158E6CAB00A3B31F /* ZXResult.h in Headers */, - 3B83EB7D158E6CAB00A3B31F /* ZXView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3B83EB8D158E71AD00A3B31F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BC3D69D158E8E7F0037CE30 /* zxing_objc_framework.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 3B83EB24158E6C5100A3B31F /* zxing-objc */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3B83EB32158E6C5100A3B31F /* Build configuration list for PBXNativeTarget "zxing-objc" */; - buildPhases = ( - 3B83EB21158E6C5100A3B31F /* Sources */, - 3B83EB22158E6C5100A3B31F /* Frameworks */, - 3B83EB23158E6C5100A3B31F /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "zxing-objc"; - productName = "zxing-objc"; - productReference = 3B83EB25158E6C5100A3B31F /* libzxing-objc.a */; - productType = "com.apple.product-type.library.static"; - }; - 3B83EB8F158E71AD00A3B31F /* zxing-objc-framework */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3B83EBA1158E71AD00A3B31F /* Build configuration list for PBXNativeTarget "zxing-objc-framework" */; - buildPhases = ( - 3B83EB8B158E71AD00A3B31F /* Sources */, - 3B83EB8C158E71AD00A3B31F /* Frameworks */, - 3B83EB8D158E71AD00A3B31F /* Headers */, - 3B83EB8E158E71AD00A3B31F /* Resources */, - 3B5D0F571590F45000C33931 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 3B83EBA5158E71CA00A3B31F /* PBXTargetDependency */, - ); - name = "zxing-objc-framework"; - productName = "zxing-objc-framework"; - productReference = 3B83EB90158E71AD00A3B31F /* zxing-objc-framework.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3B83EB1C158E6C5100A3B31F /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - }; - buildConfigurationList = 3B83EB1F158E6C5100A3B31F /* Build configuration list for PBXProject "zxing-objc" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 3B83EB1A158E6C5100A3B31F; - productRefGroup = 3B83EB26158E6C5100A3B31F /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 3B5D0F591590F9CE00C33931 /* Products */; - ProjectRef = 3B5D0F581590F9CE00C33931 /* zxing-cpp.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 3B83EB24158E6C5100A3B31F /* zxing-objc */, - 3B83EB8F158E71AD00A3B31F /* zxing-objc-framework */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 3B5D0F601590F9CF00C33931 /* libzxing-cpp.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libzxing-cpp.a"; - remoteRef = 3B5D0F5F1590F9CF00C33931 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 3B83EB8E158E71AD00A3B31F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B83EB9C158E71AD00A3B31F /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B5D0F571590F45000C33931 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -x\n(cd src && pwd && rsync -arv --include ZXing '--include=*.h' '--exclude=*' ZXing ${BUILT_PRODUCTS_DIR}/${PUBLIC_HEADERS_FOLDER_PATH})\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 3B83EB21158E6C5100A3B31F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B83EB5C158E6CAB00A3B31F /* CGImageLuminanceSource.mm in Sources */, - 3B83EB5E158E6CAB00A3B31F /* ZXBinarizer.mm in Sources */, - 3B83EB60158E6CAB00A3B31F /* ZXBinaryBitmap.mm in Sources */, - 3B83EB62158E6CAB00A3B31F /* ZXCapture.mm in Sources */, - 3B83EB65158E6CAB00A3B31F /* ZXCaptureView.mm in Sources */, - 3B83EB67158E6CAB00A3B31F /* ZXCGImageLuminanceSource.mm in Sources */, - 3B83EB69158E6CAB00A3B31F /* ZXDecodeHints.mm in Sources */, - 3B83EB6B158E6CAB00A3B31F /* ZXHybridBinarizer.mm in Sources */, - 3B83EB6D158E6CAB00A3B31F /* ZXIllegalArgumentException.mm in Sources */, - 3B83EB6F158E6CAB00A3B31F /* ZXImage.mm in Sources */, - 3B83EB70158E6CAB00A3B31F /* ZXInit.c in Sources */, - 3B83EB72158E6CAB00A3B31F /* ZXLuminanceSource.mm in Sources */, - 3B83EB74158E6CAB00A3B31F /* ZXMultiFormatReader.mm in Sources */, - 3B83EB76158E6CAB00A3B31F /* ZXQRCodeReader.mm in Sources */, - 3B83EB78158E6CAB00A3B31F /* ZXReader.mm in Sources */, - 3B83EB7A158E6CAB00A3B31F /* ZXReaderException.mm in Sources */, - 3B83EB7C158E6CAB00A3B31F /* ZXResult.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3B83EB8B158E71AD00A3B31F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BC3D681158E8BE80037CE30 /* CGImageLuminanceSource.mm in Sources */, - 3BC3D682158E8BEF0037CE30 /* ZXBinarizer.mm in Sources */, - 3BC3D683158E8C030037CE30 /* ZXBinaryBitmap.mm in Sources */, - 3BC3D684158E8C070037CE30 /* ZXCapture.mm in Sources */, - 3BC3D685158E8C0B0037CE30 /* ZXCaptureView.mm in Sources */, - 3BC3D686158E8C0F0037CE30 /* ZXCGImageLuminanceSource.mm in Sources */, - 3BC3D687158E8C120037CE30 /* ZXDecodeHints.mm in Sources */, - 3BC3D688158E8C160037CE30 /* ZXHybridBinarizer.mm in Sources */, - 3BC3D689158E8C190037CE30 /* ZXIllegalArgumentException.mm in Sources */, - 3BC3D68A158E8C1D0037CE30 /* ZXImage.mm in Sources */, - 3BC3D68B158E8C200037CE30 /* ZXLuminanceSource.mm in Sources */, - 3BC3D68C158E8C240037CE30 /* ZXMultiFormatReader.mm in Sources */, - 3BC3D68D158E8C280037CE30 /* ZXQRCodeReader.mm in Sources */, - 3BC3D68E158E8C2C0037CE30 /* ZXReader.mm in Sources */, - 3BC3D68F158E8C2F0037CE30 /* ZXReaderException.mm in Sources */, - 3BC3D690158E8C330037CE30 /* ZXResult.mm in Sources */, - 3BC3D69F158E8E880037CE30 /* zxing_objc_framework.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 3B83EBA5158E71CA00A3B31F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3B83EB24158E6C5100A3B31F /* zxing-objc */; - targetProxy = 3B83EBA4158E71CA00A3B31F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 3B83EB9A158E71AD00A3B31F /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 3B83EB9B158E71AD00A3B31F /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 3B83EB30158E6C5100A3B31F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - i386, - armv7s, - armv7, - x86_64, - ); - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - src, - ../cpp/core/src, - ); - INSTALL_PATH = "@executable_path/../Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; - VALID_ARCHS = "armv7 armv7s x86_64 i386"; - "VALID_ARCHS[sdk=iphoneos*]" = "armv7 armv7s"; - "VALID_ARCHS[sdk=iphonesimulator*]" = i386; - "VALID_ARCHS[sdk=macosx*]" = "x86_64 i386"; - WARNING_CFLAGS = "-Wall"; - }; - name = Debug; - }; - 3B83EB31158E6C5100A3B31F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = ( - i386, - armv7s, - armv7, - x86_64, - ); - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - src, - ../cpp/core/src, - ); - INSTALL_PATH = "@executable_path/../Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = ""; - "VALID_ARCHS[sdk=iphoneos*]" = "armv7 armv7s"; - "VALID_ARCHS[sdk=iphonesimulator*]" = i386; - "VALID_ARCHS[sdk=macosx*]" = "x86_64 i386"; - WARNING_CFLAGS = "-Wall"; - }; - name = Release; - }; - 3B83EB33158E6C5100A3B31F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/zxing_objc.dst; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = src/Prefix.pch; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 3B83EB34158E6C5100A3B31F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DSTROOT = /tmp/zxing_objc.dst; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = src/Prefix.pch; - "GCC_THUMB_SUPPORT[arch=armv6]" = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - 3B83EBA2158E71AD00A3B31F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"", - ); - FRAMEWORK_VERSION = A; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "zxing-objc-framework/zxing-objc-framework-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - INFOPLIST_FILE = "zxing-objc-framework/zxing-objc-framework-Info.plist"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = macosx; - WRAPPER_EXTENSION = framework; - }; - name = Debug; - }; - 3B83EBA3158E71AD00A3B31F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"", - ); - FRAMEWORK_VERSION = A; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "zxing-objc-framework/zxing-objc-framework-Prefix.pch"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - INFOPLIST_FILE = "zxing-objc-framework/zxing-objc-framework-Info.plist"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = macosx; - WRAPPER_EXTENSION = framework; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3B83EB1F158E6C5100A3B31F /* Build configuration list for PBXProject "zxing-objc" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B83EB30158E6C5100A3B31F /* Debug */, - 3B83EB31158E6C5100A3B31F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3B83EB32158E6C5100A3B31F /* Build configuration list for PBXNativeTarget "zxing-objc" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B83EB33158E6C5100A3B31F /* Debug */, - 3B83EB34158E6C5100A3B31F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3B83EBA1158E71AD00A3B31F /* Build configuration list for PBXNativeTarget "zxing-objc-framework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B83EBA2158E71AD00A3B31F /* Debug */, - 3B83EBA3158E71AD00A3B31F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3B83EB1C158E6C5100A3B31F /* Project object */; -} diff --git a/qt/README.txt b/qt/README.txt deleted file mode 100644 index 7f8e00173..000000000 --- a/qt/README.txt +++ /dev/null @@ -1 +0,0 @@ -For a port to the Qt framework, see the QZXing project at https://sourceforge.net/projects/qzxing